MMC/SD/SDIO介绍
<h2>1. 前言</h2>
<p>熟悉Linux kernel的人都知道,kernel使用MMC subsystem统一管理MMC、SD、SDIO等设备,为什么呢?到底什么是MMC?SD和SDIO又是什么?为什么可以用MMC统称呢?
在分析Linux kernel的MMC subsystem之前,有必要先介绍一些概念,以便对MMC/SD/SDIO有一个大致的了解,这就是本文的目的。</p>
<h2>2. 基本概念</h2>
<p>MMC是MultiMediaCard的简称,从本质上看,它是一种用于固态非易失性存储的内存卡(memory card)规范[1],定义了诸如卡的形态、尺寸、容量、电气信号、和主机之间的通信协议等方方面面的内容。
从1997年MMC规范发布至今,基于不同的考量(物理尺寸、电压范围、管脚数量、最大容量、数据位宽、clock频率、安全特性、是否支持SPI mode、是否支持DDR mode、等等),进化出了MMC、SD、microSD、SDIO、eMMC等不同的规范(如下面图片1所示)。虽然乱花迷人,其本质终究还是一样的,丝毫未变,这就是Linux kernel将它们统称为MMC的原因。</p>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/3101a533ab2747fe82177e68f562434f?showdoc=.jpg" alt="" /></p>
<p>关于该图片,这里强调几点(其它的,大家可参考[1][2],不再详细介绍):</p>
<ul>
<li>MMC、SD、SDIO的技术本质是一样的(使用相同的总线规范,等等),都是从MMC规范演化而来;</li>
<li>MMC强调的是多媒体存储(MM,MultiMedia);</li>
<li>SD强调的是安全和数据保护(S,Secure);</li>
<li>SDIO是从SD演化出来的,强调的是接口(IO,Input/Output),不再关注另一端的具体形态(可以是WIFI设备、Bluetooth设备、GPS等等)。</li>
</ul>
<h2>3. 规范简介</h2>
<p>MMC分别从卡(Card Concept)、总线(Bus Concept)以及控制器(Host Controller)三个方面,定义MMC system的行为,如下面图片2所示:
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/467ad4ac0de08f196de6ce72ea58bb2d?showdoc=.jpg" alt="" /></p>
<h3>3.1 卡的规范</h3>
<p>卡的规范主要规定卡的形状、物理尺寸、管脚,内部block组成、寄存器等等,以eMMC为例[3]:
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/e37015ebd7119e03795e97cf1508d59a?showdoc=.jpg" alt="" /></p>
<p>1)有关形状、尺寸的内容,这里不再介绍,感兴趣的同学可参考[1]。
2)卡的内部由如下几个block组成:</p>
<ul>
<li>Memory core,存储介质,一般是NAND flash、NOR flash等;</li>
<li>Memory core interface,管理存储介质的接口,用于访问(读、写、擦出等操作)存储介质;</li>
<li>Card interface(CMD、CLK、DATA),总线接口,外界访问卡内部存储介质的接口,和具体的管脚相连;</li>
<li>Card interface controller,将总线接口上的协议转换为Memory - core interface的形式,用于访问内部存储介质;</li>
<li>Power模块,提供reset、上电检测等功能;
寄存器(图片1中位于Card interface controller的左侧,那些小矩形),用于提供卡的信息、参数、访问控制等功能。</li>
</ul>
<p>3)卡的管脚有VDD、GND、RST、CLK、CMD和DATA等,VDD和GND提供power,RST用于复位,CLK、CMD和DATA为MMC总线协议(具体可参考3.2小节)的物理通道:
CLK有一条,提供同步时钟,可以在CLK的上升沿(或者下降沿,或者上升沿和下降沿)采集数据;
CMD有一条,用于传输双向的命令。
DATA用于传说双向的数据,根据MMC的类型,可以有一条(1-bit)、四条(4-bit)或者八条(8-bit)。
4)以eMMC为例,规范定义了OCR, CID, CSD, EXT_CSD, RCA 以及DSR 6组寄存器,具体含义后面再介绍。</p>
<p>3.2 总线规范</p>
<p>前面我们提到过,MMC的本质是提供一套可以访问固态非易失性存储介质的通信协议,从产业化的角度看,这些存储介质一般集成在一个独立的外部模块中(卡、WIFI模组等),通过物理总线和CPU连接。对任何有线的通信协议来说,总线规范都是非常重要的。关于MMC总线规范,简单总结如下:
1)物理信号有CLK、CMD和DATA三类。
2)电压范围为1.65V和3.6V(参考上面图片2),根据工作电压的不同,MMC卡可以分为两类:
High Voltage MultiMediaCard,工作电压为2.7V~3.6V。
Dual Voltage MultiMediaCard,工作电压有两种,1.70V~1.95V和2.7V~3.6V,CPU可以根据需要切换。
3)数据传输的位宽(称作data bus width mode)是允许动态配置的,包括1-bit (默认)模式、4-bit模式和8-bit模式。
注1:不使用的数据线,需要保持上拉状态,这就是图片2中的DATA中标出上拉的原因。另外,由于数据线宽度是动态可配的,这要求CPU可以动态的enable/disable数据线的那些上拉电阻。
4)MMC规范定义了CLK的频率范围,包括0-20MHz、0-26MHz、0-52MHz等几种,结合数据线宽度,基本决定了MMC的访问速度。
5)总线规范定义了一种简单的、主从式的总线协议,MMC卡位从机(slave),CPU为主机(Host)。
6)协议规定了三种可以在总线上传输的信标(token):
Command,Host通过CMD线发送给Slave的,用于启动(或结束)一个操作(后面介绍);
Response,Slave通过CMD线发送给Host,用于回应Host发送的Command;
Data,Host和Slave之间通过数据线传说的数据。方向可以是Host到Slave,也可以是Slave到Host。数据线的个数可以是1、4或者8。在每一个时钟周期,每根数据线上可以传输1bit或者2bits的数据。
7)一次数据传输过程,需要涉及所有的3个信标。一次数据传输的过程也称作Bus Operation,根据场景的不同,MMC协议规定了很多类型的Bus Operation(具体可参考相应的规范)。
3.3 控制器规范</p>
<p>Host控制器是MMC总线规范在Host端的实现,也是Linux驱动工程师比较关注的地方,后面将会结合Linux MMC framework的有关内容,再详细介绍。</p>
<h2>4. 总结</h2>
<p>本文对MMC/SD/SDIO等做了一个简单的介绍,有了这些基本概念之后,在Linux kernel中编写MMC驱动将不再是一个困难的事情(因为MMC是一个协议,所有有关协议的事情,都很简单,因为协议是固定的),我们只需要如下步骤即可完成:
1)结合MMC的规范,阅读Host MMC controller的spec,理解有关的功能和操作方法。
2)根据Linux MMC framework的框架,将MMC bus有关的操作方法通过MMC controller实现。
具体可参考后续MMC framework的分析文档。</p>
<h2>eMMC</h2>
<p>emmc:全称为embeded MultiMedia Card,是一种嵌入式非易失性存储器系统,由Nand flash和Nand flash控制器组成,以BGA方式封装在一款chip上。</p>
<p>这里主要重点讲的是emmc 和Nand flash 之间的区别,主要区别如下:</p>
<p>(1)、在组成结构上:emmc存储芯片简化了存储器的设计,将NAND Flash芯片和控制芯片以MCP技术封装在一起,省去零组件耗用电路板的面积,同时也让手机厂商或是计算机厂商在设计新产品时的便利性大大提高。而NAND Flash仅仅只是一块存储设备,若要进行数据传输的话,只能通过主机端的控制器来进行操作,两者的结构图如下:
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/8b68749821278c404a9831703db070ba?showdoc=.jpg" alt="" /></p>
<p>(2)、在功能上:eMMC则在其内部集成了 Flash Controller,包括了协议、擦写均衡、坏块管理、ECC校验、电源管理、时钟管理、数据存取等功能。相比于直接将NAND Flash接入到Host 端,eMMC屏蔽了 NAND Flash 的物理特性,可以减少 Host 端软件的复杂度,让 Host 端专注于上层业务,省去对 NAND Flash 进行特殊的处理。同时,eMMC通过使用Cache、Memory Array 等技术,在读写性能上也比 NAND Flash要好很多。而NAND Flash 是直接接入 Host 端的,Host 端通常需要有 NAND Flash Translation Layer,即 NFTL 或者 NAND Flash 文件系统来做坏块管理、ECC等的功能。另一方面,emmc的读写速度也比NAND Flash的读写速度快,emmc的读写可高达每秒50MB到100MB以上;
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/6f4fe1f0d3caacd2298a162fa9ada2fe?showdoc=.jpg" alt="" /></p>
<ul>
<li>
<p>CID: 卡身份识别寄存器 128bit,只读, 厂家号,产品号,串号,生产日期。</p>
</li>
<li>
<p>RCA: 卡地址寄存器,可写的16bit寄存器,存有Device identification模式由host分配的通信地址,host会在代码里面记录这个地址,MMC则存入RCA寄存器,默认值为0x0001。保留0x0000以用来将all device设置为等待CMD7命令状态。</p>
</li>
<li>
<p>CSD: 卡专有数据寄存器部分可读写128bit,卡容量,最大传输速率,读写操作的最大电流、电压,读写擦出块的最大长度等。</p>
</li>
<li>
<p>SCR: 卡配置寄存器, 可写的 64bit 是否用Security特性(LINUX不支持),以及数据位宽(1bit或4bit)。</p>
</li>
<li>OCR: 卡操作电压寄存器 32位, 只读,每隔0.1V占1位, 第31位卡上电过程是否完成。</li>
</ul>
<p>Device Identification Mode和初始化
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/46d0b93551547d4421b8a9048faf8f5d?showdoc=.jpg" alt="" /></p>
<p>MMC通过发CMD的方式来实现卡的初始化和数据通信</p>
<p>Device Identification Mode包括3个阶段Idle State、Ready State、Identification State。</p>
<p>Idle State下,eMMC Device会进行内部初始化,Host需要持续发送CMD1命令,查询eMMC Device是否已经完成初始化,同时进行工作电压和寻址模式协商:eMMC Device 在接收到这些信息后,会将OCR的内容(MMC出厂就烧录在里面的卡的操作电压值)通过 Response 返回给 Host,其中包含了 eMMC Device 是否完成初始化的标志位、设备工作电压范围 Voltage Range 和存储访问模式 Memory Access Mode 信息。</p>
<p>如果 eMMC Devcie 和 Host 所支持的工作电压和寻址模式不匹配,那么 eMMC Device 会进入Inactive State。</p>
<p>Ready State,MMC完成初始化后,就会进入该阶段。</p>
<p>在该 State 下,Host 会发送 CMD2命令,获取eMMC Device 的CID。</p>
<p>CID,即 Device identification number,用于标识一个 eMMC Device。它包含了 eMMC Device 的制造商、OEM、设备名称、设备序列号、生产年份等信息,每一个 eMMC Device 的 CID 都是唯一的,不会与其他的 eMMC Device 完全相同。</p>
<p>eMMC Device 接收到CMD2后,会将 127 Bits 的CID的内容通过 Response返回给 Host。</p>
<p>Identification State,发送完 CID 后,eMMC Device就会进入该阶段。</p>
<p>Host 会发送参数包含 16 Bits RCA 的CMD3命令,为eMMC Device 分配 RCA。设定完 RCA 后,eMMC Devcie 就完成了 Devcie Identification,进入 Data Transfer Mode。</p>
<p>注:emmc初始化和数据通信的过程,有点类似USB协议,USB控制器去发送请求给USB设备,以IN包和OUT包的形式去建立与USB设备之间的通信,默认状态下,USB设备也是0地址的,与控制器分配设备地址。(感兴趣的可以看一下USB2.0的协议,主要是第8和9章内容)</p>
<p>三、eMMC工作电压和上电过程</p>
<p>根据工作电压的不同,MMC卡可以分为两类:</p>
<p>High Voltage MultiMediaCard,工作电压为3.3V左右。</p>
<p>Dual Voltage MultiMediaCard,工作电压有两种,1.70V~1.95V和2.7V~3.6V,CPU可以根据需要切换</p>
<p>我所使用的eMMC实测工作电压VCC为2.80V~2.96V,VCCQ为1.70V~1.82V。</p>
<p>其中VCC为MMC Controller/Flash Controller的供电电压,VCCQ为Memory和Controller之间I/O的供电。</p>
<p>上电初始化阶段MMC时钟频率为400KHz,需要等电压调整到它要求的VCC时(host去获取OCR中记录的电压值,上面有说),MMC时钟才会调整到更高的正常工作频率。</p>
<h3>UHS</h3>
<p>UHS-I使用的金手指与SD卡相同
<img src="https://www.showdoc.cc/server/api/attachment/visitfile/sign/f59d7b56df6407a445bf5513a066166a?showdoc=.jpg" alt="" />
Speed Class 与 UHS* Speed Class 代表最低写入性能,以保证数据流内容的顺利写入。Speed Class 表示记录视频是的最低写入性能。SD Association 为Speed Class规定了 Class 2,4,6,10的等级。UHS Speed Class 是为UHS设备设计的,代表了UHS设备记录视频时的最低写入速度。 SD Association 为UHS Speed Class规定了 U1和U3等级。
<img src="https://www.showdoc.cc/server/api/attachment/visitfile/sign/2ff6eb23ea668812d60d14055234b8fd?showdoc=.jpg" alt="" />
下面是速度等级与实际写入速度详细。
<img src="https://www.showdoc.cc/server/api/attachment/visitfile/sign/ef859ce62daddbd79ef9d00ea9ddb589?showdoc=.jpg" alt="" /></p>
<p>UHS-II
不过支持UHS-II(第二代超高速)的SD卡产品就第一代有所不同,无论是传输速度还是金手指结构均有所不同,支持UHS-II的SD卡产品理论传输速度可达312MB/s,速度翻了三倍,在金手指结构上也有所改变,启用了额外的一排的金手指,有效提升了数据传输速度,不过在价格上也有着显著的提升。
<img src="https://www.showdoc.cc/server/api/attachment/visitfile/sign/1dd6e4d3c8e824f7d0271271fb17776d?showdoc=.jpg" alt="" /></p>