目录
1. 背景
1.1基本概念
1.2 规范简介
1.2.1 卡的规范
1.2.2 总线规范
2. eMMC原理介绍
2.1 eMMC内部结构简介
2.1.2 Flash Controller
2.1.3 Host Interface
2.2分区管理
2.3总线协议
3. Linux MMC软件框架流程
3.1软件架构
3.2工作流程
参考文档
本文参考资料主要来源于网络,原文网址会在文末附上。整理本文的原因,一是为了自己学习记录;二也是为了分享出来帮助别人。如有打扰,尽请谅解。
MMC是MultiMediaCard的简称,从本质上看,它是一种用于固态非易失性存储的内存卡(memory card)规范,定义了诸如卡的形态、尺寸、容量、电气信号、和主机之间的通信协议等方方面面的内容。
从1997年MMC规范发布至今,基于不同的考量(物理尺寸、电压范围、管脚数量、最大容量、数据位宽、clock频率、安全特性、是否支持SPI mode、是否支持DDR mode、等等),进化出了MMC、SD、microSD、SDIO、eMMC等不同的规范(如下面图片1所示)。虽然乱花迷人,其本质终究还是一样的,丝毫未变,这就是Linux kernel将它们统称为MMC的原因。
图1.MMC/SD/SDIO演进图
关于该图片,这里强调几点(其它的,大家可参考[1][2],不再详细介绍):
MMC分别从卡(Card Concept)、总线(Bus Concept)以及控制器(Host Controller)三个方面,定义MMC system的行为,如下所示:
图2.MMC/SD/SDIO硬件框图
卡的规范主要规定卡的形状、物理尺寸、管脚,内部block组成、寄存器等等,以eMMC为例[3]:
图3.Card Concept(eMMC)
1)有关形状、尺寸的内容,这里不再介绍,感兴趣的同学可参考[1]。
2)卡的内部由如下几个block组成:
3)卡的管脚有VDD、GND、RST、CLK、CMD和DATA等,VDD和GND提供power,RST用于复位,CLK、CMD和DATA为MMC总线协议(具体可参考下一小节)的物理通道:
4)以eMMC为例,规范定义了OCR, CID, CSD, EXT_CSD, RCA 以及DSR 6组寄存器,具体含义请参考手册[3]。
前面我们提到过,MMC的本质是提供一套可以访问固态非易失性存储介质的通信协议,从产业化的角度看,这些存储介质一般集成在一个独立的外部模块中(卡、WIFI模组等),通过物理总线和CPU连接。对任何有线的通信协议来说,总线规范都是非常重要的。关于MMC总线规范,简单总结如下:
1)物理信号有CLK、CMD和DATA三类。
2)电压范围为1.65V和3.6V(参考上面图片2),根据工作电压的不同,MMC卡可以分为两类:
3)数据传输的位宽(称作data bus width mode)是允许动态配置的,包括1-bit (默认)模式、4-bit模式和8-bit模式。
注:不使用的数据线,需要保持上拉状态,这就是图片2中的DATA中标出上拉的原因。另外,由于数据线宽度是动态可配的,这要求CPU可以动态的enable/disable数据线的那些上拉电阻。
4)MMC规范定义了CLK的频率范围,包括0-20MHz、0-26MHz、0-52MHz等几种,结合数据线宽度,基本决定了MMC的访问速度。
5)总线规范定义了一种简单的、主从式的总线协议,MMC卡为从机(slave),CPU为主机(Host)。
6)协议规定了三种可以在总线上传输的信标(token):
7)一次数据传输过程,需要涉及所有的3个信标。一次数据传输的过程也称作Bus Operation,根据场景的不同,MMC协议规定了很多类型的Bus Operation(具体可参考相应的规范)。
eMMC 是 embedded MultiMediaCard 的简称。MultiMediaCard,即 MMC, 是一种闪存卡(Flash Memory Card)标准,它定义了 MMC 的架构以及访问 Flash Memory 的接口和协议。而 eMMC 则是对 MMC 的一个拓展,以满足更高标准的性能、成本、体积、稳定、易用等的需求。
eMMC 的整体架构如下图片所示:
图4. eMMC 整体框图
eMMC 内部主要可以分为 Flash Memory、Flash Controller 以及 Host Interface 三大部分。
2.1.1 Flash Memory
Flash Memory 是一种非易失性的存储器,通常在嵌入式系统中用于存放系统、应用和数据等,类似与 PC 系统中的硬盘。
目前,绝大部分手机和平板等移动设备中所使用的 eMMC 内部的 Flash Memory 都属于 NAND Flash。eMMC 标准中,将内部的 Flash Memory 划分为 4 类区域,最多可以支持 8 个硬件分区,如下图所示:
图5.eMMC分区图
NAND Flash 直接接入 Host 时,Host 端通常需要有 NAND Flash Translation Layer,即 NFTL 或者 NAND Flash 文件系统来做坏块管理、ECC等的功能。
eMMC 则在其内部集成了 Flash Controller,用于完成擦写均衡、坏块管理、ECC校验等功能。相比于直接将 NAND Flash 接入到 Host 端,eMMC 屏蔽了 NAND Flash 的物理特性,可以减少 Host 端软件的复杂度,让 Host 端专注于上层业务,省去对 NAND Flash 进行特殊的处理。同时,eMMC 通过使用 Cache、Memory Array 等技术,在读写性能上也比 NAND Flash 要好很多。
图6. Flash Controller图
eMMC 与 Host 之间的连接如下图所示:
图7. eMMC Interface
各个信号的用途如下所示:
Host 与 eMMC 之间的通信都是 Host 以一个 Command 开始发起的。针对不同的 Command,Device 会做出不同的响应。详细的通信协议相关内容,请参考 2.3总线协议 章节。
参考“eMMC分区管理”一文。
参考“eMMC总线协议简析”一文。
Linux kernel的驱动框架有两个要点:
1)抽象硬件(硬件架构是什么样子,驱动框架就应该是什么样子)。
2)向“客户”提供使用该硬件的API(之前我们提到最多的客户是“用户空间的Application”,不过也有其它“客户”,例如内核空间的其它driver、其它framework)。
MMC framework的软件架构如下图8所示:
图8.Linux MMC软件框架图
MMC framework分别有“从左到右”和“从下到上”两种层次结构。
1) 从左到右
MMC协议是一个总线协议,因此包括Host controller、Bus、Card三类实体(从左到右)。相应的,MMC framework抽象出了host、bus、card三个软件实体,以便和硬件一一对应:
2)从下到上
MMC framework从下到上也有3个层次(老生常谈了):
MMC core位于中间,是MMC framework的核心实现,负责抽象host、bus、card等软件实体,负责向底层提供统一、便利的编写Host controller driver的API;
MMC host controller driver位于底层,基于MMC core提供的框架,驱动具体的硬件(MMC controller);
MMC card driver位于最上面,负责驱动MMC core抽象出来的虚拟的card设备,并对接内核其它的framework(例如块设备、TTY、wireless等),实现具体的功能。
基于上图8的软件架构,Linux MMC framework的初始化流程如下图9:
图9. MMC初始化流程图
其实,互联网上对Linux mmc软件框架的介绍已经非常多。本小节主要再以mmc的rescan初始化流程及request流程进行说明。参考Linux版本为4.17,mmc host驱动为瑞萨的rcar-M3。Block层的相关处理流程及驱动的具体实现流程本小节不涉及。
如下图16所示,在瑞萨mmc驱动在执行probe流程时,首先会通过mmc_alloc_host函数分配一个struct mmc_host结构体,并初始化相关成员。同时,还会初始化一个卡检测任务——INIT_DELAYED_WORK(&host->detect, mmc_rescan);当有mmc卡插入时,会触发mmc_rescan流程。另外如下图10右面部分,当mmc的probe驱动初始化完成,调用mmc_add_host流程中也会触发mmc_rescan流程,下面我们就来详细分析下这个流程(忽略部分次要步骤)。
上述流程为了方便主线的描述,忽略了一些特殊场景的处理及特性的支持,大家可以结合具体代码和下图来进行理解。
图10. Linux MMC协议框架probe流程图
Request流程其实相对简单,block层的bio转化后封装成request,层层调用传递到mmc core层的mmc_start_request,并最终调用host驱动程序注册的request方法执行硬件操作。这中间的流程在linux的不同版本之间变动非常大,不过万变不离其中,大的流程框架还是没有变。
图11. request调用流程图
[1] https://en.wikipedia.org/wiki/MultiMediaCard
[2] https://en.wikipedia.org/wiki/Secure_Digital
[3] eMMC spec:http://www.jedec.org/standards-documents/results/jesd84-b51(注册后可免费下载)。
[4] http://www.wowotech.net/basic_tech/mmc_sd_sdio_intro.html
[5] http://www.wowotech.net/basic_tech/emmc_intro.html
[6] http://www.wowotech.net/basic_tech/emmc_partitions.html
[7] http://www.wowotech.net/basic_tech/emmc_bus_protocol.html