eMMC 命令整理
1. 命令分类概览
eMMC 命令按功能划分为多个命令类(Command Class),主机通过读取设备 CSD 寄存器中的 CCC 字段可获知设备支持的命令类。
| 命令类 | 描述 | 包含命令 |
|---|---|---|
| class 0 | 基本命令(Mandatory) | CMD0, CMD1, CMD2, CMD3, CMD4, CMD5, CMD6, CMD7, CMD8, CMD9, CMD10, CMD12, CMD13, CMD14, CMD15, CMD19, CMD23, CMD24 |
| class 1 | Obsolete | - |
| class 2 | 块读取(block read) | CMD16, CMD17, CMD18, CMD21 |
| class 3 | Obsolete | - |
| class 4 | 块写入(block write) | CMD25, CMD26, CMD27, CMD49 |
| class 5 | 擦除(Erase) | CMD35, CMD36, CMD38 |
| class 6 | 写保护(write protection) | CMD28, CMD29, CMD30, CMD31 |
| class 7 | 设备锁定(lock Device) | CMD42 |
| class 8 | 应用特定命令(Application-specific) | CMD55, CMD56 |
| class 9 | I/O 模式(I/O mode) | CMD39, CMD40 |
| class 10 | 安全协议(Security Protocols) | CMD53, CMD54 |
| class 11 | 命令队列(Command Queuing) | CMD44, CMD45, CMD46, CMD47, CMD48 |
| class 12 | Reserved | - |
说明:
- Class 0 为所有设备必须支持。
- Class 2 中 CMD21 仅在支持 HS200 模式的设备中为强制。
- 其他命令类根据设备类型为强制或可选。
2. 基本命令(Class 0 与 Class 1)
| CMD | 类型 | 参数 | 响应 | 缩写 | 命令描述 | 典型使用场景 |
|---|---|---|---|---|---|---|
| CMD0 | bc | [31:0] 00000000 |
--- | GO_IDLE_STATE | 将设备复位到 idle 状态 | 上电初始化、软件复位、退出 Boot 模式 |
| bc | [31:0] F0F0F0F0 |
--- | GO_PRE_IDLE_STATE | 将设备复位到 pre-idle 状态 | 准备进入 Boot 操作前的状态切换 | |
| --- | [31:0] FFFFFFFA |
--- | BOOT_INITIATION | 启动替代 Boot 操作 | 触发设备进入 Boot 模式 | |
| CMD1 | bcr | [31:0] OCR(无 busy 位) |
R3 | SEND_OP_COND | 请求处于 idle 状态的设备通过 CMD 线返回其操作条件寄存器(OCR)内容 | 设备上电初始化、电压协商、容量模式确认 |
| CMD2 | bcr | [31:0] stuff bits |
R2 | ALL_SEND_CID | 请求设备通过 CMD 线发送其 CID 编号 | 设备识别阶段,获取设备唯一标识 |
| CMD3 | ac | [31:16] RCA [15:0] stuff bits |
R1 | SET_RELATIVE_ADDR | 为设备分配相对地址(RCA) | 设备枚举阶段,分配后续通信地址 |
| CMD4 | bc | [31:16] DSR [15:0] stuff bits |
--- | SET_DSR | 编程设备的驱动级寄存器(DSR) | 优化总线性能,调整驱动强度 |
| CMD5 | ac | [31:16] RCA [15] Sleep/Awake [14:0] stuff bits |
R1b | SLEEP_AWAKE | 切换设备在 Sleep 状态与 Standby 状态之间 | 低功耗管理,进入/退出休眠 |
| CMD6 | ac | [31:26] 0 [25:24] Access [23:16] Index [15:8] Value [7:3] 0 [2:0] Cmd Set |
R1b | SWITCH | 切换选中设备的工作模式或修改 EXT_CSD 寄存器 | 切换总线速度模式(如 HS200/HS400)、切换分区、启用缓存、设置写保护等 |
| CMD7 | ac | [31:16] RCA [15:0] stuff bits |
R1/R1b | SELECT/DESELECT_CARD | 在 standby 与 transfer 状态之间,或 programming 与 disconnect 状态之间切换设备 | 选中设备进行数据传输,或取消选择(RCA=0) |
| CMD8 | adtc | [31:0] stuff bits |
R1 | SEND_EXT_CSD | 设备将 EXT_CSD 寄存器作为数据块发送 | 读取扩展配置寄存器,获取设备能力、分区信息、当前配置等 |
| CMD9 | ac | [31:16] RCA [15:0] stuff bits |
R2 | SEND_CSD | 被寻址设备通过 CMD 线发送其设备特定数据(CSD) | 获取设备容量、块长度、传输速率等参数 |
| CMD10 | ac | [31:16] RCA [15:0] stuff bits |
R2 | SEND_CID | 被寻址设备通过 CMD 线发送其设备标识(CID) | 获取设备制造商、产品名称、序列号等 |
| CMD11 | --- | --- | --- | --- | Obsolete,响应未定义 | 不再使用 |
| CMD12 | ac | [31:16] RCA [15:1] stuff bits [0] HPI |
R1/R1b | STOP_TRANSMISSION | 强制设备停止传输。若 HPI 位置位,设备应在明确定义的时序内中断内部操作 | 停止多块读写、中断设备操作、高优先级中断(HPI) |
| CMD13 | ac | [31:16] RCA [15] SQS [14:1] stuff bits [0] HPI |
R1 | SEND_STATUS | SQS=0:设备发送状态寄存器;SQS=1:查询 QSR(队列状态寄存器),此时 HPI 必须为 0 | 轮询设备状态、检查错误、查询命令队列状态 |
| CMD14 | adtc | [31:0] stuff bits |
R1 | BUSTEST_R | 主机从设备读取反转后的总线测试数据模式 | 总线宽度测试(配合 CMD19),检测 1/4/8 位数据总线连接 |
| CMD15 | ac | [31:16] RCA [15:0] stuff bits |
--- | GO_INACTIVE_STATE | 将设备设置为 inactive 状态 | 停用设备,使其不再响应总线命令 |
| CMD19 | adtc | [31:0] stuff bits |
R1 | BUSTEST_W | 主机向设备发送总线测试数据模式 | 总线宽度测试(配合 CMD14),验证数据总线连通性 |
注:
- CMD7:从 Stand-By 到 Transfer 状态响应 R1;从 Disconnected 到 Programming 状态响应 R1b。
- CMD12 中的 RCA 仅在 HPI 位置位时使用,设备端不进行 RCA 检查。
- CMD12:读操作响应 R1,写操作响应 R1b。
3. 块读取命令(Class 2)
| CMD | 类型 | 参数 | 响应 | 缩写 | 命令描述 | 典型使用场景 |
|---|---|---|---|---|---|---|
| CMD16 | ac | [31:0] block length |
R1 | SET_BLOCKLEN | 设置后续所有块命令(读和写)的块长度(字节)。默认块长度在 CSD 中指定 | 配置单次读写块大小,仅适用于单倍数据速率模式 |
| CMD17 | adtc | [31:0] data address |
R1 | READ_SINGLE_BLOCK | 读取由 SET_BLOCKLEN 选定大小的一个块 | 读取单个数据块 |
| CMD18 | adtc | [31:0] data address |
R1 | READ_MULTIPLE_BLOCK | 连续从设备向主机传输数据块,直到被停止命令中断或传输完请求的块数。作为打包读命令的一部分时,参数应包含包内第一个读取数据地址 | 连续读取多个数据块、打包读取(Packed Read) |
| CMD21 | adtc | [31:0] stuff bits |
R1 | SEND_TUNING_BLOCK | 发送 128 个时钟的调谐模式(4 位模式 64 字节,8 位模式 128 字节),用于 HS200 最佳采样点检测 | HS200 模式下的采样点调谐(Tuning) |
注:
- 容量 ≤2GB 的设备使用 32 位字节地址;容量 >2GB 的设备使用 32 位扇区(512B)地址。
- 传输数据不得跨越物理块边界,除非 CSD 中设置了 READ_BLK_MISALIGN。
4. Class 3 命令
| CMD | 说明 |
|---|---|
| CMD20 | Obsolete,响应未定义 |
| CMD22 | Reserved |
5. 块写入命令(Class 4)
| CMD | 类型 | 参数 | 响应 | 缩写 | 命令描述 | 典型使用场景 |
|---|---|---|---|---|---|---|
| CMD23 | ac | [31] Reliable Write Request [30] packed [29] tag request [28:25] context ID [24] forced programming [23:16] 0 [15:0] number of blocks |
R1 | SET_BLOCK_COUNT | 定义后续块读/写命令的块数及可靠写参数。可包含标签请求或上下文 ID(二者不能同时使用) | 预定义多块读写数量、可靠写(Reliable Write)、强制编程(Forced Programming)、上下文管理 |
| ac | [31] 0 [30] 1 packed [29:16] 0 [15:0] number of blocks |
R1 | SET_BLOCK_COUNT(packed) | 定义后续打包写命令或打包读命令头的块数 | 打包命令(Packed Command)传输 | |
| CMD24 | adtc | [31:0] data address |
R1 | WRITE_BLOCK | 写入由 SET_BLOCKLEN 选定大小的一个块 | 写入单个数据块 |
| CMD25 | adtc | [31:0] data address |
R1 | WRITE_MULTIPLE_BLOCK | 连续写入数据块,直到 STOP_TRANSMISSION 或接收完请求的块数。作为打包命令时,参数应包含包内第一个读/写数据地址 | 连续写入多个数据块、打包写入(Packed Write)、RPMB 密钥编程 |
| CMD26 | adtc | [31:0] stuff bits |
R1 | PROGRAM_CID | 编程设备标识寄存器。此命令只能发出一次,设备硬件会阻止首次编程后的再次操作。通常保留给制造商 | 设备生产时一次性编程 CID |
| CMD27 | adtc | [31:0] stuff bits |
R1 | PROGRAM_CSD | 编程 CSD 的可编程位 | 修改设备配置参数 |
| CMD49 | adtc | [31:0] stuff bits |
R1 | SET_TIME | 根据 512B 数据块中的 RTC 信息设置实时时钟 | 设置设备实时时钟 |
注:
- 容量 ≤2GB 使用字节地址;>2GB 使用扇区地址。
- 传输数据不得跨越物理块边界,除非 CSD 中设置了 WRITE_BLK_MISALIGN。
6. 擦除命令(Class 5)
| CMD | 类型 | 参数 | 响应 | 缩写 | 命令描述 | 典型使用场景 |
|---|---|---|---|---|---|---|
| CMD32 ~ CMD34 | --- | --- | --- | --- | Reserved,保持向后兼容 | 不可用 |
| CMD35 | ac | [31:0] data address |
R1 | ERASE_GROUP_START | 设置待擦除范围内第一个擦除组的地址 | 擦除/修剪/丢弃操作的起始地址设定 |
| CMD36 | ac | [31:0] data address |
R1 | ERASE_GROUP_END | 设置连续范围内最后一个擦除组的地址 | 擦除/修剪/丢弃 操作的结束地址设定 |
| CMD37 | --- | --- | --- | --- | Reserved,保持向后兼容 | 不可用 |
| CMD38 | ac | [31] Secure request [30:16] 0 [15] Force Garbage Collect request [14:2] 0 [1] Discard Enable [0] Identify Write Blocks for Erase (or TRIM Enable) |
R1b | ERASE | 擦除所有先前选定的写块。所有参数位为 0 时执行擦除;Bit0=1,Bit1=0 执行 TRIM;Bit0=1,Bit1=1 执行 DISCARD;Bit31 和 Bit15 为可选安全/垃圾回收功能 | 数据擦除、TRIM(标记无效块)、DISCARD(丢弃块)、安全擦除、强制垃圾回收 |
擦除序列:CMD35 → CMD36 → CMD38,主机可在 CMD38 前多次重复 CMD35/CMD36 以选择多个不连续范围。
7. 写保护命令(Class 6)
| CMD | 类型 | 参数 | 响应 | 缩写 | 命令描述 | 典型使用场景 |
|---|---|---|---|---|---|---|
| CMD28 | ac | [31:0] data address |
R1b | SET_WRITE_PROT | CLASS_6_CTRL=0x00:设置寻址组的写保护位;CLASS_6_CTRL=0x01:释放指定的寻址组 | 设置写保护、动态容量管理(释放 WP-Group) |
| CMD29 | ac | [31:0] data address |
R1b | CLR_WRITE_PROT | CLASS_6_CTRL=0x00:清除寻址组的写保护位;CLASS_6_CTRL=0x01:忽略 | 清除写保护 |
| CMD30 | adtc | [31:0] write protect data address |
R1 | SEND_WRITE_PROT | CLASS_6_CTRL=0x00:请求设备发送写保护位状态;CLASS_6_CTRL=0x01:请求设备发送已释放组状态 | 查询写保护状态、查询已释放组状态 |
| CMD31 | adtc | [31:0] write protect data address |
R1 | SEND_WRITE_PROT_TYPE | CLASS_6_CTRL=0x00:发送不同写保护组的保护类型;CLASS_6_CTRL=0x01:返回固定的 64 位零模式 | 查询写保护类型(临时/上电/永久) |
写保护类型编码:
00:未保护01:临时写保护10:上电写保护11:永久写保护
8. I/O 模式命令(Class 9)
| CMD | 类型 | 参数 | 响应 | 缩写 | 命令描述 | 典型使用场景 |
|---|---|---|---|---|---|---|
| CMD39 | ac | [31:16] RCA [15] register write flag [14:8] register address [7:0] register data |
R4 | FAST_IO | 读写 8 位(寄存器)数据字段。寻址设备和寄存器,写标志置位时提供写数据;写标志为 0 时 R4 响应包含从寻址寄存器读取的数据。访问 eMMC 标准未定义的应用相关寄存器 | 访问厂商特定应用寄存器 |
| CMD40 | bcr | [31:0] stuff bits |
R5 | GO_IRQ_STATE | 将系统设置为中断模式 | 使设备进入中断驱动模式 |
9. 设备锁定命令(Class 7)
| CMD | 类型 | 参数 | 响应 | 缩写 | 命令描述 | 典型使用场景 |
|---|---|---|---|---|---|---|
| CMD42 | adtc | [31:0] stuff bits |
R1 | LOCK_UNLOCK | 设置/重置密码或锁定/解锁设备。数据块大小由 SET_BLOCK_LEN 命令设置 | 设备密码锁定/解锁、数据安全保护 |
10. 应用特定命令(Class 8)
| CMD | 类型 | 参数 | 响应 | 缩写 | 命令描述 | 典型使用场景 |
|---|---|---|---|---|---|---|
| CMD55 | ac | [31:16] RCA [15:0] stuff bits |
R1 | APP_CMD | 告知设备下一个命令是应用特定命令而非标准命令 | 发送厂商特定命令前的声明 |
| CMD56 | adtc | [31:1] stuff bits [0] RD/WR |
R1 | GEN_CMD | 向设备传输数据块或从设备获取数据块,用于通用/应用特定命令。数据块大小由 SET_BLOCK_LEN 命令设置 | 厂商自定义数据交互 |
11. 安全协议命令(Class 10)
| CMD | 类型 | 参数 | 响应 | 缩写 | 命令描述 | 典型使用场景 |
|---|---|---|---|---|---|---|
| CMD50 ~ CMD52 | --- | --- | --- | --- | Reserved | 不可用 |
| CMD53 | adtc | [16:31] Security Protocol Specific [15:8] Security Protocol [7:0] reserved |
R1 | PROTOCOL_RD | 从设备向主机连续传输数据块。数据块数由先前的 CMD23 定义,可被 STOP_TRANSMISSION 中断。不支持打包命令。块大小固定为 512 字节 | 安全协议数据读取 |
| CMD54 | adtc | [16:31] Security Protocol Specific [15:8] Security Protocol [7:0] reserved |
R1 | PROTOCOL_WR | 从主机向设备连续传输数据块。数据块数由先前的 CMD23 定义,可被 STOP_TRANSMISSION 中断。不支持打包命令。块大小固定为 512 字节 | 安全协议数据写入 |
12. 命令队列命令(Class 11)
| CMD | 类型 | 参数 | 响应 | 缩写 | 命令描述 | 典型使用场景 |
|---|---|---|---|---|---|---|
| CMD44 | ac | [31] Reliable Write Request [30] DD(1=读/0=写) [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 | 定义排队任务的数据方向、优先级、任务 ID 和块数 | 命令队列任务参数配置 |
| 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 | 执行队列中由参数编码的任务 ID 对应的读任务 | 触发命令队列中的读任务执行 |
| CMD47 | adtc | [31:21] reserved [20:16] Task ID [15:0] reserved |
R1 | EXECUTE_WRITE_TASK | 执行队列中由参数编码的任务 ID 对应的写任务 | 触发命令队列中的写任务执行 |
| CMD48 | ac | [31:21] reserved [20:16] TaskID(TM op-code=2h 时) [15:4] reserved [3:0] TM op-code |
R1b | CMDQ_TASK_MGMT | 丢弃特定任务或整个队列(队列中所有任务) | 命令队列任务管理/清除 |
典型命令队列序列:
CMD44 (QUEUED_TASK_PARAMS) → CMD45 (QUEUED_TASK_ADDRESS) → 任务入队
CMD13 (SQS=1) 查询 QSR → CMD46/CMD47 (EXECUTE_READ/WRITE_TASK) → 执行数据传输
13. 保留命令与厂商命令
| CMD 范围 | 说明 |
|---|---|
| CMD32 ~ CMD34 | Reserved,保持向后兼容 |
| CMD37 | Reserved,保持向后兼容 |
| CMD41 | Reserved |
| CMD43 | Reserved |
| CMD50 ~ CMD52 | Reserved |
| CMD57 ~ CMD59 | Reserved |
| CMD60 ~ CMD63 | Reserved for manufacturer |
14. 命令类型与响应类型说明
| 缩写 | 含义 |
|---|---|
| bc | broadcast command,无响应 |
| bcr | broadcast command with response,广播命令带响应 |
| ac | addressed command,寻址命令,无数据传输 |
| adtc | addressed data transfer command,寻址数据传输命令 |
| R1 | 标准响应,包含设备状态 |
| R1b | 标准响应带 busy 信号 |
| R2 | 长响应,包含 CID/CSD 寄存器内容 |
| R3 | OCR 寄存器响应 |
| R4 | FAST_IO 响应 |
| R5 | 中断请求响应 |