eMMC的五种操作模式:开机模式、ID辨识模式、中断模式、数据传输模式、无效模式。
开机模式 Boot mode | Power ON后,卡若收到CMD0(GO_Idle_State)并带argument(0xF0F0F0F0),此时Card若支持Boot Mode则会进入Boot Mode,否则进入identification mode。 |
ID辨识模式 Card identification | Power ON 后,经过 Boot mode 完成或不支持Bootmode,Card都将会进入此模式持续等待收到Host下CMD3(Send_Relative_Address)。 |
中断模式 Interrupt mode | Host和Card会同时进入此模式,此模式中不会做Data Transfer ,只允许Host or Card 送出 interruptservice request。 |
数据传输模式 Data transfer mode | 当卡收到由Host所给予的RCA ,这时卡便会进入Data transfer mode,等待读写动作指令。 |
无效模式 Inactive mode | 当Card若为电压不符规定或插入方式无效时便会进入此模式,亦可使用CMD1(GO_INACTIVE_STATE )命令使一个已标识的Card进入非活动状态。 |
表1eMMC五种工作模式
1.1 Boot mode
1.1.1 boot partition分区
eMMC能够使主机通过在正确的时间按顺序发送一系列指令来读取引导启动区的代码来达到启动一个系统的目的。
eMMC提供了两个Boot寄存器,如图所示,每个寄存器都有独立的物理地址,大小是128KB的倍数,倍数可以通过查看ECSD[226]来获取。并且可以设置上电写保护和永久写保护,这是通过设置ECSD[173]来实现的。通过改变ECSD寄存器中相关位的值来选中响应的寄存器并且读取。用户启动系统的代码通常放在Boot Area中,但也可以从User Area启动系统,但这样会带来一些不稳定和其他一些问题。
图15Boot寄存器
1.1.2 状态图
图16 Boot Mode流程图
- 当系统上电,或者硬件复位,或者主机发出CMD0指令并带0xF0F0F0F0,系统就会进入Pre-Idle State。
- 设备会自动检测BOOT_PARTITION_ENABLE是否为1,若为0则退出Boot模式,进入Card-identification Mode。若为1,则进入下一步pre-boot state。
- CMD线要至少保持74个时钟周期的低电平,或者主机发送CMD0并带0xFFFFFFFA,此时设备就会发出主机要读的数据,主机接收完毕,就跳转到Card-identification Mode的Idle State。否则若拉低时间少于74个时钟周期,就结束Boot模式,进入Card-identification Mode的Idle State。
下图为传送数据时序图:
图17等待至少74个时钟周期后,设备发送数据时序图
图18送入CMD0并带0xFFFFFFFA后,设备发送数据时序图
1.2 Device identification mode
eMMC卡想要正常工作,必须先完成初始化过程,在初始化过程中,系统会完成对eMMC卡的识别,确定设备工作的电压范围和使用模式,向设备分配关联卡地址(RCA,一个系统可能有多块eMMC)。在初始化过程中所有的数据通信都只在CMD信号线上。下图为设备初始化流程图:
图22设备初始化流程图
初始化详细过程:
进入Idle State的方式只有两种,一种是通过Power On即上电进入,另外一种是通过CMD0切换。不过需要注意的是,CMD0无法让卡从Inactive State进入Idle State。进入Idle后,所有的寄存器都复位成默认值,RCA也变成了0x0001。而此时,CLK需要设置成fOD 的范围,即0-400kHz,以进行下面的流程。
虽然进入到了Idle State,但是上电复位过程并不一定完成了,这主要靠读取OCR的busy位来判断。
在Idle State只有CMD1和CMD58是合法指令。所以在进入Idle State之后,除了让卡从Idle State转变成Ready State,别无他途。
Idle State进入Ready State是通过CMD1完成的,只有发送带有OCR格式电压参数的CMD1给MMC卡后,busy位为1且电压匹配,才进入Ready State。
如果回复的OCR中的busy位一直为0,则说明上电复位仍没有完成,则需要一直发送CMD1,直到busy位为1。
如果MMC卡收到CMD1的电压参数不匹配,则进入Inactive State,不会对后续过程进行任何响应。
如果Host的IO电压可调整,那调整前需要读取OCR。为了不使卡误进入Inactive State,可以给MMC卡发送不带参数的CMD1,这样可以仅获取OCR寄存器,而不会改变卡的状态。
在识别过程中,Host不能改变电压范围,如果需要修改,则修改之后必须重新启动识别流程。
在Ready State下,发送CMD2指令,可以使MMC卡则进入Identification State。
CMD2如果发送成功,Host得到CID寄存器的值,而MMC卡则进入Identification State。若不成功,则卡状态不变。
在单卡识别的情况下,只要fOD 在范围内,且上拉正确,应该可以准确无误的收到CID的值,并进入Identification State。
这一节最复杂之处在于多卡识别:
MMC卡的多卡CMD和DATA是共用的,它们采用一种特殊的方式来完成识别和操作。过程如下:
在idle->ready过程中,Host用电压范围这一条件,首先让不符合电压条件的卡进入Inactive State。
在ready->ident过程中,CMD2指令可以让所有的卡发送CID值,所有卡的CMD都接在一起,这样回传CID的时候,相当于做了一个或操作,与CMD上或出来的结果不一致的卡就不会继续发送(这里是需要卡的硬件有识别支持),而停留在ready。这里CID的唯一性发挥了作用,这样每次CMD2操作之后,仅有一张卡进入ident,其余的都停留在ready而不能响应CMD3。
在ident->stby过程中,上述过程中筛选出的唯一卡独占了CMD线,完成了RCA分配,进入stby。进入stby的卡不再响应CMD2和CMD3。
识别完一张卡之后,因为其他的卡还停留在ready,这样就可以继续上面的步骤来一张一张的识别卡,最后直到CMD2再没有回应,说明卡都识别完了。
完成上面的过程后,每张识别好的卡都进入了stby,而且每张都有自己的RCA,这样之后的操作只需要在命令中带入相应的RCA,就可以对任意的卡进行独立操作了,别的卡是不会响应的。
1.3 Data ransfer mode
数据传输模式即eMMC的工作模式,在此模式下可实现对eMMC的编程,对存储区属性的设计,数据的读写,擦除,总线的测试等等功能。是eMMC最核心的模式。在此模式工作下的工作框图如下图所示。
图23数据传输模式工作流程图
1.3.1 总线测试及线宽选择
总线测试功能只有在SDR模式下有效,在DDR模式下无效。
进入数据传输模式后,需要对总线进行传输测试以便检查总线是否工作正常。在Transfer Mode下,主机通过发出CMD19(BUSTEST_W)和CMD14(BUSTEST_R)命令来检测总线上引脚的工作状态。首先,主机向设备发送CMD19指令,跟随着一种特殊的数据格式。这些数据会在每一条DAT线上传送。然后,主机发送CMD14命令去要求设备传回刚才数据求反所得的新数据。主机通过比较接受的数据与发送的数据,就可检测出总线工作是否正常。
表11 总线测试数据格式
设备在接收数据时,检测到开始位后,只接收数据前两位数据,忽略后面所有位,也包括忽略CRC16校验位。
同时主机接收数据时,检测到开始位后,只接收数据前两位数据。忽略后面所有位,也包括忽略CRC16校验位。下图是八位总线测试数据及正常结果。
表12 8位总线测试范例
图24 总线测试时序图
在总线测试完毕后,主机可以选择使用信号线的个数,是通过CMD6(SWITCH)去配置ECSD[183]来实现的,复位后默认值是0x00,是一位总线模式。
1.3.2 读操作
当没有数据传输时,DAT0-DAT7处于高电平状态,数据传输封包结构是一位开始位0,接着是数据流,包含了数据和CRC校验码,最后是一位结束位1。数据传输是和时钟同步的。
数据阅读可以发生在单数据速率模式SDR,或者也可以发生在双数据速率模式DDR。
- SDR模式
在单数据速率模式SDR下,设备将数据与时钟同步输出,主机在时钟上升沿将数据采样,并且每一条数据线有单独的一个CRC。
在SDR模式下,基本的传输单元是Block,它的最大长度被定义在CSD中的READ_BL_LEN。如果READ_BL_PARTIAL被置位,则更小的Block(PARTIAL BLOCK)被允许传输。CMD17指令用来读取一个块的数据,完成后返回Transfer mode模式。
- DDR模式
在DDR模式中,读取数据块的大小总是512字节,部分块的读取则不被允许。
主机可以通过CMD6(SWITCH)更改ECSD[196]的值来选择SDR模式还是DDR模式。
CMD18(READ_MULTIPLE_BLOCK)指令用来读取多块数据,这条指令有两种用法:一种是开放式读取,即不设置结束标志;一种是预先指定了要读取块的个数,读取完自动结束回到Transfer mode。
1.开放式读取,即要读取的数据块个数不被定义,设备会持续读取数据直到收到停止传输指令。
2.预先指定数据块个数,设备会传输要求传输的数据块,传输完毕后自动结束并回到Transfer Mode,一般情况下没有必要使用停止传输指令。
在双数据速率模式DDR下,数据在时钟上升沿和下降沿都会被同步输出,并且每条数据线会有两个CRC。在这个模式下,块长度总是512bytes,且bytes总是交叉在4-bit或者8-bit的宽度配置。奇数(1,3,5…511)的bytes主机在时钟上升沿采样,偶数(2,4,6…512)的bytes主机在时钟下降沿采样。设备将会在每一个有效的数据线上附加两个CRC16。一个对应着前面说的256个奇数位的bytes的上升沿时钟采样,另一个对应着剩余的256个偶数位bytes的下降沿时钟采样。
备注:
1.只有数据块和两个CRC在时钟上升或者下降边沿上都可以使用。
2.开始bits和结束bits都只能在时钟上升沿有效。
3.下降沿上的值是不被保证的。(由于以前版本的标准模糊,开始和结束位可能是上升和下降沿都有效,或着仅为上升沿有效。为了确保向后兼容,标准允许两种解释,并且不要求在下降沿上的值。)
- 单个块阅读
图25 读单块数据
读单块操作开始时,主机先发送CMD16(SET_BLOCKLEN)设置块长度。设备接收后,再发送CMD17(READ_SINGLE_BLOCK)读取数据。
具体步骤:主机通过CMD7(SELECT_CARD)选择一个设备做读数据操作。通过CMD16(SET_BLOCKLEN)设置有效的块长度实现面向块的数据传输,CMD16只能应用在单数据速率模式。顺序开始于一个单块阅读命令CMD17(READ_SINGLE_BLOCK),它指定了参数字段的起始地址。响应会照样被发送传输在CMD线上。一个读数据的基本总线时序操作被列举在图42中。
图26 单块数据时序图
- 多个块阅读
图27读多块数据流程图
读多块操作开始时,主机先发送CMD16(SET_BLOCKLEN)设置块长度,接着发送CMD23(SET_BLOCK_COUNT)指令设置读取块个数,若不设置则为开放式读取,接着发送CMD18(READ_MULTIPLE_BLOCK)指令开始读数据。直到停止传输指令到来。
图28 多块读取时序图
注意:
CMD17(READ_SINGLE_BLOCK),CMD18(READ_MULTIPLE_BLOCK)设置读取块开始地址时,地址只有32位(4G),对于容量小于2G的卡来说,地址即为每一位地址。对于容量大于2G的卡来说,地址为扇区地址,每个扇区为512B。
如果用户要用局部块读操作,则必须事先看CSD寄存器中的READ_BLK_MISALIGNED和READ_BL_PARTIAL是否为0,若不为0则系统不允许局部块读,读数据时读出块大小必须为512B或者CSD中READ_BL_LEN[83:80]设置的值。
1.3.3 写操作
- 数据传输格式
写数据可以在单数据速率模式SDR下,也可以在双数据速率模式DDR下。
写数据可以在单数据速率模式下也可以在双数据速率模式下。
在单数据速率模式下,数据被主机同步时钟输出,并且被设备在时钟上升沿采样,每根数据线上将会有一个单独的CRC。
在双数据速率模式下,数据在时钟上升沿和下降沿同步时钟输出,每条数据线有两个CRC。在这个DDR模式下,块长度总是512bytes,bytes以4-bit或8-bit宽度的配置交叉到来。奇数位的bytes(1,3,5…..511)将会被设备在时钟上升沿采样,偶数位的bytes(2,4,6…512)会被设备在时钟下降沿采样。主机在每一条有效数据线上会添加两个CRC16。一个与被设备在时钟上升沿采样的奇数位的256个bytes对应一致,另一个与被设备在时钟下降沿采样的偶数位256个bytes对应一致。
备注:
- 以类似的方式读取数据,只有数据块和2个CRC使用两个边缘的时钟。
- 开始,结束,3-bit CRC令牌状态位是只有在时钟的上升沿有效。
- 在下降沿上的值不能保证。由于以前版本的标准模糊,开始和结束位可能是上升和下降沿都有效或仅为上升沿有效。为了确保向后兼容,标准允许两种解释,并且不要求在下降沿上的值。
写操作的数据传输格式与读操作相同,在SDR模式下每个数据块后有一字节的CRC校验,DDR模式下有两字节。设备通过检查CRC校验位来判断接收到的数据是否正确,所以一些传输错误的数据将被舍弃。通常情况下,打断正在写入的过程不会对其他地址中的数据造成影响,但是掉电的风险确实不可控的会造成一定的损失。然而,eMMC应用了一些技术,来平衡写入性能和正在写入过程中掉电的数据保护(我的理解是若不管掉电的风险,则会增强写入性能;若要保持稳定,则会一定程度上降低写入性能)。
在DDR模式中,写入数据块大小只能为512B,不支持局部块写入。
- 写入方式
单块写入方式与读数据类似。
多块写入方式有三种,开放式写入,确定块数写入和可靠写入(Reliable Write)。
开放式写入:要写入的数据块个数不被定义,设备会持续写入数据直到收到停止传输指令。
确定块数写入:设备会传输要求传输的数据块,传输完毕后自动结束并回到Transfer Mode,一般情况下没有必要使用停止传输指令。
前两种写入方式与读数据类似,不再赘述。可靠写入是事先定义好要写入的块数和可靠写入参数。它与前面的区别是,如果一个数据要写入一个物理地址中,这个物理地址中之前存在数据,那么这个之前存在的数据在新数据没有写完毕前是不会改变的。这个技术确保了物理地址中数据的更新不会留下没有定义的数据。在编程过程中,即使掉电,数据也必须保持有效。这个功能的使用是依靠发送CMD23中设置bit31为1来实现的。
在可靠性写入中:
所有块长度均为512B,不受设置块长度影响。
可靠性写入必须是与扇区对齐的,不能任意指定地址,如果没有对齐,则bit19错误位将会置1并且终止写入操作。
如果用户要用局部块写入操作,则必须事先看CSD寄存器中的WRITE_BLK_MISALIGNED是否为0,若不为0则系统不允许局部块写入,写入时写入块必须与物理地址对齐。
- 单个块写入
主机位发送CMD7(SWITCH_CARD)选择设备开始写数据操作。主机发送CMD16(SET_BLOCKLEN)设置面向数据传输的有效块长度。CMD16只运用在单数据速率传输模式下。
图45描述了一个写操作的基本总线时序。它开始于一个块写命令CMD24(WRITE_BLOCK),这个命令决定起始地址。它会在CMD线上被设备响应。host接收到设备响应后,数据传输从NWR时钟周期开始。直到CMD12(STOP_TRANSMISSION)停止命令来临则停止写入数据。
数据被添加CRC校验位的后缀,后缀可验证传输错误。在DTA0线上,设备将CRC校验结果作为一个CRC状态令牌送回。传输发生错误(可能发生在任何一条正活动的数据线上),设备发送一个消极CRC状态(‘101’)在DTA0线上.数据成功传输,也发生在任一条正活动的数据线上,设备发送一个积极的CRC状态(‘010’)在DAT0线上,并且启动数据编程程序。
NCRC,是一个定义给HS200和HS400的时序参数。HS200和HS400设备支持NCRC。Ncrc从一个写操作的数据块的结束位指定时序,直到CRC状态的开始位。
对于HS400,在CRC状态响应后,设备在DTA0输出BUSY信号在tPH_DATASTROBE+tPERIOD+tRQ后从CLK上升沿,它也是结束位的参考。这样之后,主机开始安全采样BUSY信号。
当设备在编程写操作中,通过下拉DAT0线表明忙。忙状态直接相关编程状态。一旦设备结束编程即写操作完成,也就是设备不忙时,它就会停止下拉DAT0线。
- 多块写入
写多块数据的顺序为,首先,主机发送CMD16(SET_BLOCKLEN)指令设置块长度,如果块长度不需要改变,则这步可以省略。如果是确定块数写入,则发送CMD23(SET_BLOCK_COUNT)确定要写入的块数。接着发送CMD25(WRITE_ MULTIPLE_BLOCK),如果这几步设备均接收不响应错误,则进入数据传输模式。在每个块传输完毕后,设备会向主机发送回复供主机检测CRC,如果CRC正确,且设备处于不忙状态,主机将会发送下一块数据。当发送数据块时,主机也可以查询设备的状态寄存器去对设备存在的任何新的状态信息进行检测。最后结束需要停止指令。直到CMD12(STOP_TRANSMISSION)停止命令来临则停止写入数据。
图29 多块写入流程图
图30 多块写入时序图
1.3.4 擦除操作(Erase、Trim、Discard、Santize)
设备的擦除操作也是写操作中必不可少的一部分。eMMC中可擦除单元叫做“Erase Group”。Erase Group的大小是每个设备特殊的参数,如果ERASE_GROUP_DEF不使能,它就被定义在CSD寄存器中,如果ERASE_GROUP_DEF使能,则它被定义在ECSD中。被擦除后的单元可能被擦除成0,也可能被擦除成1,这依赖于不同的存储技术,这个值在ECSD中会被定义。
表11 ERASE_GROUP_DEF寄存器定义
当ERASE_GROUP_DEF(EXT_CSD[175])=0时
size of erasable unit = (ERASE_GRP_SIZE + 1) * (ERASE_GRP_MULT + 1)
size of write protect = (WP_GRP_SIZE+1)
当ERASE_GROUP_DEF(EXT_CSD[175])=1时
size of erasable unit = 512Kbyte × HC_ERASE_GRP_SIZE
size of write protect = 512KB * HC_ERASE_GRP_SIZE * HC_WP_GRP_SIZE
一旦擦除指令完成,设备中相应的地址范围中的单元将会被擦除成0或者1,这依赖于不同的存储技术。
主机能够擦除一连串的Erase Group。开始擦除工作分为三个步骤:
- 第一步,主机发送CMD35(ERASE_GROUP_START)命令来确定擦除的开始地址;
- 第二步发送CMD36(ERASE_GROUP_END)定义结束地址;
- 第三步,发送CMD38(ERASE)命令开始擦除操作。地址范围与写入时定义相同,在容量小于2GB时,地址范围指的是字节范围,在容量大于2GB时,地址范围指的是扇区范围。擦除命令CMD38,一旦被发布,将会擦除所有被选择的擦除组。设备将会在擦除或编程操作时通过拉DAT0线到low来标记为忙。
如果设备没有按照这三步的顺序接收到指令,设备就会将ERASE_SEQ_ERROR 位置为1(这位在状态寄存器中),然后重置擦除过程。如果主机提供的地址超出地址范围,设备将会拒绝擦除命令,并将ADDRESS_OUT_OF_RANGE位置1,并且重置擦除过程。
如果在擦除过程中一个不是擦除操作命令被主机发出,则设备会将ERASE_RESET位置为1,并且重置擦除过程,执行最后一条指令。不过,没有被设备编址的指令是不会结束擦除操作的,即此命令无效。
如果擦除操作地址包含了写保护的地址,这些地址上的数据将会被保护,只有那些没有写保护的块会被擦除。此时状态寄存器中的WP_ERASE_SKIP位将会置1.擦除操作像写操作一样,在进行过程中设备会将DAT0置low 状态(有些翻译为0状态).擦除操作耗时较长,所以主机可以发送CMD7命令对该设备取消选中。
图31 擦除操作流程图
eMMC的擦除操作分为四种方式,ERASE,TRIM,DISCARD,SANTIZE四种,这四种方式有一定的区别。
| 擦除命令 | |||
| Erase | Trim | Discard | Sanitize |
argument 参数 | 0x00000000 | 0x00000001 | 0x00000003 | N/A |
Unit单元 | Erase group | Write block | Write block | N/A |
Operation操作 | moving the mapped host address range to the unmapped host address range | moving the mapped host address range to the unmapped host address range | moving the mapped host address range to the unmapped host address range | Removed from unmapped user address space |
Read the region applied | All 0 or 1 (depending on memory tech.) | All 0 or 1 (depending on memory tech.) | Don’t care (Some or all of the original data) | N/A |
Interrupt中断 | N/A | 重置Device(使CMD0,CMD15,或使用eMMC的硬件重置)或电源故障将终止任何挂起和运行中的Trim命令,这样将会导致在这样操作中的数据处在一个未知的状态。 | 重置Device(使CMD0,CMD15,或使用eMMC的硬件重置)或电源故障将终止任何挂起和运行中的Discard命令,这样将会导致在这样操作中的数据处在一个未知的状态。 | 当Sanitize操作完成了之后,在未映射的host地址空间内将不会有数据存在。当Sanitize操作被HPI或Power failure中断后,未映射的host地址空间状态将无法得到保护,Host必须写入extended CSD[165] SANITIZE_START来重新初始化Sanitize操作并允许Sanitize操作来确保未映射的host地址空间里的数据已被清除。 |
表12 四种擦除方式的区别
1.4 Interrupt mode
中断模式使主机保证了主机与设备之间定量的同步传输。这个模式减少了主机查询设备的次数,因此,降低了系统功耗。主机与设备两者都需要选择来是否支持中断模式。
设备处于中断模式中的转换行为如图32所示。
图32 中断模式状态转换图
主机在发送GO_IRQ_STATE(CMD40)指令使设备进入中断模式时需要先确保设备处于StandBy状态下。当等待设备的中断响应时,主机必须保持时钟信号存在。
设备处于中断模式下时,将会等待内部的中断触发事件或者CMD信号线上的开始位’0’。当有内部触发时,设备就开始发送响应给主机;当接收到信号线上的开始位’0’时,设备就会结束中断模式返回StandBy状态。设备在响应指令CMD40时,不管赢得还是失去总线控制,设备都会转到StandBy状态(与CMD2相反)。