eMMC命令简介
eMMC命令详细介绍网上有很多资料,具体协议可以查看 JESD84-B51的 6.10 Commands,本文仅为笔记用途。
命令类型
类型 | 描述 |
---|---|
bc | 没有 response的广播命令 |
bcr | 有 response的广播命令 |
ac | 点对点(指定地址)无数据传输 |
adtc | 点对点数据传输 |
命令格式
命令长度为 48 bits,结构如下图。软件主要配置 Transmission Bit(读/写),Command Index(命令序号),Argument(命令参数),其余由逻辑处理。
命令集
eMMC的命令集总共有 12种,每种 class代表一类功能,包含相关命令,每个命令只会属于一种 class。class 0是所有 devices必须支持的,其余的可以通过 CSD寄存器的 bit [95:84],CCC field来确定 device支持的命令集。
命令分类 | 描述 |
---|---|
class 0 | basic,基础命令,如 CMD0、CMD1、CMD2、CMD3、CMD6、CMD8、CMD12、CMD13 |
class 1 | Obsolete,废弃 |
class 2 | block read,读取单块、多块数据、设置块长度、发送 tuning数据块,如 CMD16、CMD17、CMD18、CMD21 |
class 3 | Obsolete,废弃 |
class 4 | block write,写取单块、多块数据、设置块长度,如 CMD23、CMD24、CMD25 |
class 5 | erase,擦除操作、设置擦除开始、结束地址,如 CMD35、CMD36、CMD38 |
class 6 | write protection,设置写保护、清除写保护、获取 device写保护状态、获取写保护类型,如 CMD 28、CMD29、CMD30、CMD31 |
class 7 | lock Device,device 上锁、解锁,如 CMD42 |
class 8 | Application-specific,表示下一个命令是一个特定应用命令,如 CMD55 |
class 9 | I/O mode,读写 device特定的寄存器(未在 eMMC标准中定义)、设置系统进入中断模式,如 CMD39、CMD40 |
class 10 | Security Protocols,连续数据块传输,如 CMD53、CMD54 |
class 11 | Command Queuing,命令队列,定义操作的读或写、优先级、任务ID等、定义任务队列的块地址、丢弃特定队列或者整个队列,如 CMD44、CMD45、CMD46、CMD47、CMD48 |
常用命令
CMD index | type | argument | resp | abbr. | description |
---|---|---|---|---|---|
class 0 | |||||
CMD0 | bc | [31:0] 0000 0000 | none | GO_IDLE_STATE | 重置 device进入 idle状态 |
CMD1 | bcr | [31:0] OCR with-out busy | R3 | SEND_OP_COND | 在idle状态下,device从 CMD线的发送其 OCR寄存器内容给 host |
CMD2 | bcr | [31:0] stuff bits | R2 | ALL_SEND_CID | device从 CMD线发送其 CID编号给 host |
CMD3 | ac | [31:16] RCA [15:0] stuff bits | R1 | SET_RELATIVE_ADDR | 为 device分配相对地址 |
CMD6 | ac | [31:26] Set to 0 [25:24] Access [23:16] Index [15:8] Value [7:3] Set to 0 [2:0] Cmd Set | R1b | SWITCH | 切换 device运行的命令集或者修改 EXT_CSD寄存器的值。 bit [25:24],Access,00,Command Set表示根据 Cmd Set的值改变运行的命令集;01,Set Bits表示根据 Value中为 1的 bit对 Index指向 byte相应位进行置位;10,Clear Bits表示根据 Value中为 1的 bit对 Index所指向 byte相应位进行清零;11,Write Byte表示将Value的值写入指向的 byte bit [23:16],Index,EXT_CSD的索引值,有效值为 0到 191 bit [2:0],Cmd Set,要切换的命令集 具体请查看 6.6.1 Command sets and extended settings |
CMD8 | adtc | [31:0] stuff bits | R1 | SEND_EXT_CSD | device 以数据块的形式发送其 EXT_CSD寄存器的内容给 host |
CMD9 | ac | [31:16] RCA [15:0] stuff bits | R2 | SEND_CSD | device从 CMD线发送其 CSD寄存器内容给 host |
CMD12 | ac | [31:16] RCA [15:1] stuff bits [0] HPI | R1/R1b | STOP_TRANSMISSION | 强制 device停止传输。如果置位了 HPI,device应在明确规定的时间内中断其内部操作。读操作返回 R1,写操作返回 R1b |
CMD13 | ac | [31:16] RCA [15] SQS [14:1] stuff bits [0] HPI | R1 | SEND_STATUS | 如果 SQS bit=0:device发送其状态寄存器给 host。如果置位了 HPI,device应在明确规定的时间内中断其内部操作。 如果 SQS bit=1:表示这是一个 QSR查询。device应发送 QSR寄存器给 host。这种情况下,HPI必须为 0 |
class 2 | |||||
CMD16 | ac | [31:0] block length | R1 | SET_BLOCKLEN | 设置块读写操作的块长度,默认值在 CSD寄存器 READ_BL_LEN bit [83:80] / WRITE_BL_LEN bit [25:22]指定 |
CMD17 | adtc | [31:0] data address | R1 | READ_SINGLE_BLOCK | 读取单块数据 |
CMD18 | adtc | [31:0] data address | R1 | READ_MULTIPLE_BLOCK | 连续读取多块数据,直到传输停止,或者读取数据块数达到请求的数据块数 |
CMD21 | adtc | [31:0] stuff bits | R1 | SEND_TUNING_BLOCK | 在 tuning模式下,发送特定数据块(4 bit模式为 64 byte,8 bit模式为 128 byte)用于 HS200模式最佳采样点的检测 |
class 4 | |||||
CMD23 | ac | [31] Reliable Write Request [30] ‘0’ non- packed ‘1’ packed [29] tag request [28:25] context ID [24]: forced programming [23:16] set to 0 [15:0] number of blocks | R1 | SET_BLOCK_COUNT | bit [31] 可靠写请求,bit [30] ‘0’ non-packed / ‘1’ packed,bit [24] forced programming,设置为1,强迫数据直接写入存储介质,而不是写入 cache,bit [15:0] number of blocks,定义读写块数量 |
CMD24 | adtc | [31:0] data address | R1 | WRITE_BLOCK | 写入单块数据 |
CMD25 | adtc | [31:0] data address | R1 | WRITE_MULTIPLE_BLOCK | 连续写入多块数据,直到传输停止,或者写入数据块数达到设定的数据块数 |
class 11 | |||||
CMD44 | ac | [31] Reliable Write Request [30] DD: “1” read / “0” write [29] Tag request [28:25] Context ID [24]: Forced Programming [23] Priority: “0” simple / “1” high [22:21] reserved [20:16] Task ID [15:0] Number of Blocks | R1 | QUEUED_TASK_PARAMS | bit [31] 可靠写请求,bit [30] 定义操作的方向,’1’ 读取 / ‘0’ 写入,bit [23] 优先级,bit [20:16] 任务 ID,bit [15:0] 任务队列的块计数 |
CMD45 | ac | [31:0] Start block address | R1 | QUEUED_TASK_ADDRESS | 定义任务队列的起始块地址 |
CMD46 | adtc | [31:21] reserved [20:16] Task ID [15:0] reserved | R1 | EXECUTE_READ_TASK | device执行对应任务 ID的读操作 |
CMD47 | adtc | [31:21] reserved [20:16] Task ID [15:0] reserved | R1 | EXECUTE_WRITE_TASK | device执行对应任务 ID的写操作 |
CMD48 | ac | [31:21] reserved [20:16]: TaskID [15:4]: reserved [3:0] TM op-code (Table 5) | R1b | CMDQ_TASK_MGMT | device 丢弃特定任务或者整个队列 当 bit [3:0] TM op-code = 0x2时,bit [20:16]表示 task id,当 TM op-code = 0x1时,bit [20:16]为保留,无意义。 |
Responses
Response总共有 6种类型,分别是 R1,R1b,R2,R3,R4,R5。所有的 responses都是从 CMD线返回的,其长度和格式与类型相关,但都是以 0为起始位,1为结束位,传输方向位紧接着起始位,0表示 device到 host。除 R3类型外,所有的 responses都受到 CRC7保护。
R1
一般命令都是响应 R1,长度为 48 bit。bit [45:40] 描述响应的命令,bit [39:8] 描述 device的状态,详细状态可以查看 6.13 Device status。
R1b
R1b与 R1格式上完全一样,只是会在数据线 DAT0 传输 busy信号,device接受到部分命令会变得忙碌,例如 CMD6,忙碌时 DAT0会被 device拉低,具体时序可以查看 6.15.1 Command and response,R1b responses。
R2
R2长度为 136 bit,用于响应 CMD2和 CMD10,返回 CID寄存器的值,以及响应 CMD9,返回 CSD寄存器的值。CID和 CSD的 bit [0]会被结束位替代,即实际传输 bit [127:1],不过它们两个的 bit [0]没有使用上,默认为 1。
R3
R3长度为 48 bit,用于响应 CMD1,返回 device的 OCR寄存器值。
R4
R4长度为 48 bit,用于响应 CMD39。bit [15],Status表示操作是否成功,成功为 1,bit [14:8],Register address表示 device的特定寄存器地址,bit [7:0],Read register contents表示读取到的内容。
R5
R5长度为 48bit,用于响应 CMD40。host发送 CMD40让 device进入中断模式,device返回 R5则表明进入中断模式,后续 RCA将使用 0x0000。