eMMC识别流程简介

之前文章介绍了 Boot mode,eMMC操作模式-Boot mode,这次介绍 Device identification modeData transfer mode,即 Normal mode。

Normal mode涉及到的速度模式主要包括:High-speed、HS200和 HS400。

Device identification mode

1、Power-up,向器件 VCC(3.3V)和 VCCQ(3.3V / 1.8V)提供电源。设置时钟最大到 400KHz,host等待 74 clock cycles或者是电源电压上升至 3.3V,最大等待 1ms;

Power-up

2、进入 Idle State,Power on后有 4种情况进入 Idle State:a. Boot mode完成后,b. Pre-boot state下 CMD拉低的时间少于 74 clock cycle或 Boot sequence失败,c. EXT_CSD[179] BOOT_PARTITION_ENABLE = 0,d. host发送 GO_PRE_IDLE_STATE(CMD0 with 0xF0F0F0F0);

Device identification mode

3、访问模式确认,CMD1,host发送 CMD1(SEND_OP_COND),参数为 OCR寄存器,device并不需要理会里面的电压相关值,bit [23:7]。host会不断的发送 CMD1,直到 device完成初始化,容量小于或等于 2GB的 device会返回 R3 = 0x80FF8080,容量大于 2GB的 device返回 R3 = 0xC0FF8080,并且 device将会进入 Ready State;

循环的最后一次交互是有意义的,用于双方确认访问模式 bit [30:29] Access Mode,host不支持 Sector access Mode而 device只能使用该模式,则 device进入 Inactive State;

4、获取 CID,CMD2,host发送 CMD2(ALL_SEND_CID)获取 device的 CID,device进入Identification State;

5、分配 RCA,CMD3,host发送 CMD3(SET_RELATIVE_ADDR)给 device分配一个 RCA,device进入 Standy-by State,kernel一般分配是从 0x1开始的。

完成 Device identification mode后,device处于 Backward Compatible,即 DS速度模式。

Data transfer mode

1、读取 CSD寄存器,CMD9,host不知道 device的 CSD寄存器值前,fpp(Clock frequency Data Transfer Mode,详见 Table 208,下图)应该要小于等于 fod(400KHz),host 发送 CMD9(SEND_CSD)获取 CSD寄存器,根据返回的信息对 host参数进行调整。例如,通过 TRAN_SPEED确定 device支持的最大时钟频率 fpp,CCC确定是否支持 CMD6(SWITCH)和 CMD8(SEND_EXT_CSD);

High-speed Device interface timing

High-speed识别流程

High speed Selection flow diagram

2、发送选卡命令,CMD7,host发送 CMD7,device进入 Transfer State,如果 device返回了 R1b响应,bit25 DEVICE_IS_LOCKED = 1,则 device已经锁定,需要在下一步操作前发送 CMD42解锁 device;

3、获取 EXT_CSD寄存器,CMD8,host发送 CMD8(SEND_EXT_CSD)获取 EXT_CSD寄存器,根据 EXT_CSD[196] DEVICE_TYPE,确认 device在 HS模式下的最高时钟频率;

4、切换到 high speed模式,CMD6,host发送 CMD6(SWITCH)将 EXT_CSD[185] HS_TIMING的值设置为 0x1,device返回 R1b响应,host需要等待 BUSY signal(DAT0为低)解除,device从 BUSY恢复后,速度模式已经为 high speed(一定不能用 CMD13确认 device状态,uboot 2020掉过的坑);

HS_TIMING Interface values

5、切换时钟频率,host将自身的时钟频率切换到最大不超过 26/52MHz/TRAN_SPEED;

6、设置电源等级,CMD6,host发送 CMD6(SWITCH)将 EXT_CSD[187] POWER_CLASS的值设置为 host能为 device提供的最大能力值;

7、切换总线宽度,CMD6,host发送 CMD6(SWITCH)将 EXT_CSD[183] BUS_WIDTH的 bit [3:0]值设置所需的宽度,0x1为 4-bit,0x2为 8-bit。

BUS_WIDTH

HS200识别流程

HS200 Selection flow diagram

8、发送选卡命令,CMD7,host发送 CMD7,device进入 Transfer State,如果 device返回了 R1b响应,bit25 DEVICE_IS_LOCKED = 1,则 device已经锁定,需要在下一步操作前发送 CMD42解锁 device;

9、host IO电压确认,HS200 IO(VCCQ)只支持 1.8V/1.2V电压,host需要能提供相关电压;

10、获取 EXT_CSD寄存器,CMD8,host发送 CMD8(SEND_EXT_CSD)获取 EXT_CSD寄存器,根据 EXT_CSD[196] DEVICE_TYPE,确认 device是否支持 HS200和 IO电压;

DEVICE_TYPE

11、切换总线宽度,CMD6,host发送 CMD6(SWITCH)将 EXT_CSD[183] BUS_WIDTH的 bit [3:0]值设置所需的宽度,0x1为 4-bit,0x2为 8-bit。

12、读取设备支持的驱动能力,查询 EXT_CSD[197] DRIVER_STRENGTH,获得 device支持的驱动能力;

13、切换到 HS200模式,CMD6,host发送 CMD6(SWITCH)将 EXT_CSD[185] HS_TIMING的 bit[3:0]设置为 0x2,bit[7:4] Driver Strength根据实际情况确定是否修改。device返回 R1b响应,host需要等待 BUSY signal(DAT0为低)解除;

14、查询状态,CMD13,host发送 CMD13(SEND_STATUS),device返回 R1响应,host确认 device已经处于 Transfer State且无错误状态,则表示速度模式成功切为 HS200;

15、切换时钟频率,host将自身的时钟频率切换到最大不超过 200MHz;

16、tuning of sampling point,CMD21,采样点优化,host将不同的采样相位设置给数字逻辑并发送 CMD21,从而确认最佳的采样相位,host可以在 CMD21失败的情况下发送 CMD12去停止该笔传输,再发送下一个采样点的 CMD21;

17、到此 HS200的识别流程就走完了。

HS400识别流程

HS400 Selection flow diagram

18、HS400是在 HS200完成的基础上进行的,HS400 IO只支持 1.8V/1.2V电压,总线宽度只支持 DDR 8bit;

19、获取 EXT_CSD寄存器,CMD8,host发送 CMD8(SEND_EXT_CSD)获取 EXT_CSD寄存器,根据 EXT_CSD[196] DEVICE_TYPE,确认 device是否支持 HS400和 IO电压,这步在 linux中可能是在步骤 10阶段完成;

20、切换到 high speed模式,CMD6,host发送 CMD6(SWITCH)将 EXT_CSD[185] HS_TIMING的值设置为 0x1;

21、切换时钟频率,切换时钟频率到小于或等于 52MHz;

22、切换总线宽度,CMD6,host发送 CMD6(SWITCH)将 EXT_CSD[183] BUS_WIDTH的 bit [3:0]值设置为 0x6,DDR 8-bit;

23、读取设备支持的驱动能力,查询 EXT_CSD[197] DRIVER_STRENGTH,获得 device支持的驱动能力;

24、切换到 HS400模式,CMD6,host发送 CMD6(SWITCH)将 EXT_CSD[185] HS_TIMING的 bit[3:0]设置为 0x3,bit[7:4] Driver Strength根据实际情况确定是否修改,device返回 R1b响应,host需要等待 BUSY signal(DAT0为低)解除;

25、查询状态,CMD13,host发送 CMD13(SEND_STATUS),device返回 R1响应,host确认 device已经处于 Transfer State且无错误状态,则表示速度模式成功切为 HS400;

26、切换时钟频率,host将自身的时钟频率切换到最大不超过 200MHz;

27、因为采样相位使用的是 HS200的,所以 HS400就不用 tuning,到此 HS400的识别流程就走完了。

HS400ES识别流程

28、HS400ES即 HS400 Enhanced Strobe,HS400模式,引入了 Data Strobe线,使得数字逻辑在 Data Out、CRC response上不依赖 tuning流程就可以确认最佳采样相位,但 CMD Response没有这个机制,Enhanced Strobe就是用来弥补这个事情的。

HS400ES Selection flow diagram

29、发送选卡命令,CMD7,上接步骤 “1、读取 CSD寄存器”,host发送 CMD7,device进入 Transfer State,如果 device返回了 R1b响应,bit25 DEVICE_IS_LOCKED = 1,则 device已经锁定,需要在下一步操作前发送 CMD42解锁 device;

30、获取 EXT_CSD寄存器,CMD8,host发送 CMD8(SEND_EXT_CSD)获取 EXT_CSD寄存器,根据 EXT_CSD[196] DEVICE_TYPE,确认 device是否支持 HS400和对应的 IO工作电压;

31、确认是否支持 Enhanced Strobe,根据 EXT_CSD[184] STROBE_SUPPORT,确认 device是否 Enhanced Strobe,支持为 0x1;

32、切换到 high speed模式,CMD6,host发送 CMD6(SWITCH)将 EXT_CSD[185] HS_TIMING的值设置为 0x1;

33、切换时钟频率,切换时钟频率到小于或等于 52MHz;

34、切换总线宽度,CMD6,host发送 CMD6(SWITCH)将 EXT_CSD[183] BUS_WIDTH的 bit [7]值设置为 0x1,bit [3:0]值设置为 0x6,使能 Enhanced Strobe和 DDR 8-bit;

35、读取设备支持的驱动能力,查询 EXT_CSD[197] DRIVER_STRENGTH,获得 device支持的驱动能力;

36、切换到 HS400模式,CMD6,host发送 CMD6(SWITCH)将 EXT_CSD[185] HS_TIMING的 bit[3:0]设置为 0x3,bit[7:4] Driver Strength根据实际情况确定是否修改,device返回 R1b响应,host需要等待 BUSY signal(DAT0为低)解除;

37、切换时钟频率,host将自身的时钟频率切换到最大不超过 200MHz;

38、HS400 Enhanced Strobe的识别流程也介绍了。

详细的流程详见 6.6.2 High-speed modes selection和 A.6 High-speed e•MMC bus functions,以及 Linux和 u-boot的代码,毕竟有很多兼容性的点是协议不会描述的。


eMMC识别流程简介
http://xxxdk.xyz/xxx/2021/04/eMMC识别流程简介/
作者
sni
发布于
2021年4月17日
许可协议