目录
2.4 RCA - Relative device Address
3.3 Packed Commands - Packed Write and Packed Read
Overview
eMMC Device 在 Power On、HW Reset 或者 SW Reset 时,Host 可以触发 eMMC Boot,让 eMMC 进入 Boot Mode。在此模式下,eMMC Device 会将 Boot Data 发送给 Host,这部分内容通常为系统的启动代码,如 BootLoader。
如果 Host 没有触发 Boot 流程或者 Boot 流程完成后,eMMC Device 会进入 Device Identification Mode。在此模式下,eMMC Device 将进行初始化,Host 会为 eMMC Device 设定工作电压、协商寻址模式以及分配 RCA 设备地址。
Device Identification Mode 结束后,就会进入 Data Transfer Mode。在此模式下,Host 可以发起数据读写流程。
进入 Data Transfer Mode 后,Host 可以发起命令,让 eMMC Device 进入 Interrupt Mode。在此模式下,eMMC Device 会等待内部的中断事件,例如,写数据完成等。eMMC Device 在收到内部中断事件时,会向 Host 发送 Response,然后切换到 Data Transfer Mode,等待 Host 后续的数据读写命令。
1. Boot Operation Mode
1.1 Boot From eMMC Device
在 Power On、HW Reset 或者 SW Reset 后,如果 eMMC Device 有使能 Boot Mode(即,寄存器位 BOOT_PARTITION_ENABLE (EXT_CSD byte [179]) 指定了启动分区),那么 Host 有两种方式可以让 eMMC Device 进入 Boot Mode,分别定义为 Original Boot 和 Alternative Boot,如下:
- Original Boot:拉低 CMD 信号并保持不少于 74 个时钟周期
- Alternative Boot:保持 CMD 信号为高电平,74 个时钟周期后,发送参数为 0xFFFFFFFA 的 CMD0命令
进入 Boot Mode 后,eMMC Device 会根据寄存器位 BOOT_PARTITION_ENABLE 的设定,从两个 Boot partitions 和 UDA 中选择一个分区读取大小为 128KB × BOOT_SIZE_MULT (EXT_CSD byte [226]) 的 Boot Data 通过 Data Lines 发送给 Host。
在 Boot Data 数据传输过程中,Host 可以打断数据传输,提前结束 Boot Mode,方法如下:
- Original Boot:传输过程中,拉高 CMD 信号
- Alternative Boot:传输过程中,发送参数为 0xF0F0F0F0 的CMD0 命令
NOTE:
Host 发送参数为 0xF0F0F0F0 的CMD0命令,可以让 eMMC Device 进行 SW Reset
Host 拉高 RST_n 信号可以触发 eMMC Device 进行 HW Reset
1.2 Boot Acknowledge
如果寄存器位 BOOT_ACK (EXT_CSD byte [179]) 被设定为 1, eMMC Device 会在 Host 触发 Boot Mode 的 50 ms 内,在 DAT0 上发送一个 "010" Boot ACK 给 Host。
包含 Boot ACK 的时序图如下所示:
Original Boot:CMD 信号保持低电平不少于 74 个时钟周期,会触发 Original Boot Operation,进入 Boot State。
Alternative Boot:在 74 个时钟周期后,在 CMD 信号首次拉低或者 Host 发送 CMD1 之前,Host 发送参数为 0xFFFFFFFA 的 COM0时,会触发 Alternative Boot Operation,进入 Boot State。
1.3 Boot Bus 配置
EXT_CSD byte [177] BOOT_BUS_CONDITIONS 寄存器用于配置在 Boot Mode 时,数据传输的总线状态。
通过 BOOT_BUS_CONDITIONS 寄存器配置,在 Boot Mode 时,总线可以支持以下几种模式:
Mode | Data Rate | Bus Width | Frequency | Max Data Transfer (x8) |
---|---|---|---|---|
Backward Compatible | Single | x1, x4, x8 | 0-26 MHz | 26 MB/s |
High Speed SDR | Single | x1, x4, x8 | 0-52 MHz | 52 MB/s |
High Speed DDR | Dual | x4, x8 | 0-52 MHz | 104 MB/s |
BOOT_BUS_CONDITIONS 寄存器还可以配置退出 Boot Mode 后,是复位还是保留当前总线配置。如果配置为复位,那么退出 Boot Mode 后,总线会被复位为 Backward Compatible SDR x1 模式,如果配置为保留,那么退出 Boot Mode 后,总线会保留 Boot Mode 时的总线模式。
NOTE:
BOOT_BUS_CONDITIONS 寄存器为 nonvolatile 属性,配置内容掉电不会丢失。
如果 eMMC Device 没有经过 Boot Mode,BOOT_BUS_CONDITIONS 寄存器不会改变总线模式。
退出 Boot Mode 后,还可以通过 HS_TIMING 和 BUS_WIDTH 寄存器配置总线模式。
1.4 Boot Data 更新
eMMC Device 在从厂商出货时,没有存储内容,也没有使能 Boot Mode。使用 eMMC Devcie 产品需要先通过其他的方式(例如,通过 USB、UART 等)启动一个下载系统,将 Boot Data 以及其他的系统数据写入到 eMMC 中,同时使能 Boot Mode 并设定 Boot Bus 模式。而后,产品才能从 eMMC Device 上启动软件系统。
Boot Data 的更新与其他数据的写入类似。
2. Device Identification Mode
在设备识别模式下,主机复位设备,验证工作电压范围和访问模式,识别设备并为总线上的设备分配相对设备地址( RCA)。在设备识别模式下的所有数据通讯都仅采用命令线CMD。
2.1 设备复位
如果 Host 没有触发 Boot 流程或者 Boot 流程完成后,eMMC Device 会进入 Device Identification Mode。
eMMC Device 在退出 Boot Mode 后或者没使能 Boot Mode 时 Power On、HW Reset 或者 SW Reset 后,会进入 Device Identification Mode 的 Idle State。
在 Idle State 下,eMMC Device 会进行内部初始化,Host 需要持续发送 CMD1命令,查询 eMMC Device 是否已经完成初始化,同时进行工作电压和寻址模式协商。
Host 发送的 CMD1 命令的参数中,包含了 Host 所支持的工作电压和寻址模式信息,eMMC Device 在接收到这些信息后,会进行匹配。如果 eMMC Devcie 和 Host 所支持的工作电压和寻址模式不匹配,那么 eMMC Device 会进入 Inactive State。
eMMC Device 在接收到 CMD1 命令后,会将 OCR register 的内容作通过 Response 返回给 Host,其中包含了 eMMC Device 是否完成初始化的标志位、设备工作电压范围 Voltage Range 和存储访问模式 Memory Access Mode 信息。
eMMC Device 完成初始化后,就会进入 Ready State。在该 State 下,Host 会发送 CMD2 命令,获取 eMMC Device 的 CID。CID,即 Device identification number,用于标识一个 eMMC Device。它包含了 eMMC Device 的制造商、OEM、设备名称、设备***、生产年份等信息,每一个 eMMC Device 的 CID 都是唯一的,不会与其他的 eMMC Device 完全相同。
eMMC Device 接收到 CMD2 后,会将 127 Bits 的 CID register 的内容通过 Response 返回给 Host。
发送完 CID 后,eMMC Device 接着就会进入 Identification State。而后,Host 会发送参数包含 16 Bits RCA 的 CMD3 命令,为 eMMC Device 分配 RCA(相对设备地址)。
设定完 RCA 后,eMMC Devcie 就完成了 Devcie Identification,进入 Data Transfer Mode。
NOTE:
本节只描述了单个 eMMC Device 的 Devcie Identification 过程,多个 eMMC 的 Device Identification 过程与此类似。
2.2. Voltage Range
eMMC Device 支持 3.3v 和 1.8v 两种工作电压模式。在 1.8v 模式下,eMMC Device 会更加的省电。
2.3 Memory Access Mode
Memory Access Mode 决定了 eMMC Device 在响应 Host 的数据读写请求时,是如何访问内部存储器的。在 eMMC 标准中存在两种 Memory Access Mode:Byte Access Mode 和 Sector Access Mode。
在数据读写的 Command 中,Host 会将读写的地址 A 作为 Command 的参数发送给 eMMC Device,在 Byte Access Mode 下,eMMC Device 将从第 A 个 Byte 开始进行读写操作,而在 Sector Access Mode 下,eMMC Device 将会从第 A 个 Sector 开始进行读写操作,一个 Sector 的大小为 512 Bytes 或者 4 KBytes,更大的 Sector 支持更大容量的存储器访问。
使用 Byte Access Mode 更加的灵活高效,但是由于寻址位数的限制,不能访问超过 2GB 的存储内容。Sector Access Mode 则支持大容量存储的访问,其中 512 Bytes Sector 可以支持最大 256 GB 容量的存储访问,更大容量的需求则可以使用 4 KBytes Sector。
2.4 RCA - Relative device Address
RCA 是在 Devcie Identification 过程中,由 Host 分配的 16 Bits 的设备地址,主要用于 Data Transfer Mode 下进行通信时,选定具体要进行操作的 eMMC Devcie。
Host 分配的 RCA 通常从 1 开始递增,0 地址作为广播地址。eMMC Devcie 的 RCA register 保存了 Host 分配的 RCA。
3. Data Transfer Mode
eMMC Device 完成 Device Identification 后,就会进入到 Data Transfer Mode 的 Standby State。
在 Standby State 时,Host 可以通过发送 CMD5 命令,让 eMMC Devcie 进入 低功耗的 Sleep State,而后再发送 CMD5 命令则可以让 eMMC Device 退出 Sleep State。
在 Standby State 时,Host 可以通过发送 CMD7 命令,让 eMMC Devcie 进入 Transfer State,而后再发送 CMD7 命令则可以让 eMMC Device 退出 Transfer State。
3.1 Read Data
在 Transfer State 时,Host 可以发送以下的命令,触发数据读取流程:
命令 | 描述 |
---|---|
CMD8 | 读取 EXT_CSD 寄存器数据 |
CMD17 | 从指定的地址开始,读取一个 Block 的数据 |
CMD18 | 从指定的地址开始,读取多个 Block 的数据 |
CMD21 | 读取 Tuning Block 的数据 |
eMMC Device 在接收到上述几个 CMD 时,就会进入 Sending-data State。在此 State 下,eMMC Device 会持续将数据发送给 Host,直到指定数量的数据 Block 传输完成或者接收到 Host 发送的 CMD12 传输停止命令。eMMC Device 在停止发送数据后,会返回到 Transfer State。
如果 Host 在发送 CMD18 前,先发送一个设定需要读取的 Block Count 的 CMD23。eMMC Device 在完成指定 Block Count 的数据发送后,就自动结束数据传输,不需要 Host 主动发送停止命令 CMD12。
如果 Host 没有发送设定需要读取的 Block Count 的 Command,发送 Multiple Block Read 的 Command 后,eMMC Device 会持续发送数据,直到 Host 发送 Stop Command 停止数据传输。
NOTE: 如果在发送 CMD18 前,先发送 CMD23 设定需要读取的 Block Count,那么 eMMC Device 会在发送完指定数量的 Block 后,自动停止发送数据。
3.2 Write Data
在 Transfer State 时,Host 可以发送以下的命令,触发数据写入流程:
命令 | 描述 |
---|---|
CMD24 | 写入一个 Block 的数据 |
CMD25 | 写入多个 Block 的数据 |
CMD26 | 写入 CID 寄存器值 |
CMD27 | 写入 CSD 寄存器值 |
eMMC Device 在接收到上述几个 CMD 时,就会进入 Receive-data State,在此 State 下,eMMC Devcie 会持续从 Host 接收数据,并存储到内部的 Buffer 或者寄存器中。
如果 Host 在发送 CMD25 前,先发送一个设定需要写入的 Block Count 的 CMD23。eMMC Device 在完成指定 Block Count 的数据接收后,就自动结束数据传输,不需要 Host 主动发送停止命令 CMD12。
如果 Host 没有发送设定需要写入的 Block Count 的 Command,发送 Multiple Block Write 的 Command 后,eMMC Device 会持续接收数据,直到 Host 发送 Stop Command 停止数据传输。
eMMC Device 在开始进行写入操作时,会先将接收到的数据存储在内部 Buffer 中,然后在后台将 Buffer 中的数据写入到 Flash 中。通常情况下,Host 发送数据的速度会比 eMMC 写入 Flash 的速度快,所以内部的 Buffer 会出现写满的状态,此时 eMMC Devcie 会将 DAT0 信号线拉低作为 Busy 信号。Host 收到 Busy 信号后,就会暂停发送数据,等到 eMMC Device 将 Buffer 中的数据处完一部分并解除 Busy 信号后,再重新发送数据。
当 eMMC Device 完成数据接收后,就会进入到 Programming State,将内部 Buffer 中剩余未写入的数据写入到 Flash 中。 在该 State 下,eMMC Device 会持续将 DAT0 拉低,作为 Busy 信号。如果在完成写入前,有收到新的写入命令,那么 eMMC Device 会立刻退回到 Receive-data State,进行数据接收;如果在完成写入前,没有收到新的写入命令,则会在完成写入后,退回到 Transfer State。
如果 eMMC Devcie 在 Programming State 时,还没有完成写入操作,就收到参数不等于自身 RCA 的 CMD7 命令,那么 eMMC Device 会进入到 Disconnect State。在该 State 下,eMMC Device 会继续进行写入操作,写入完成后则进入到 Stand-by State。
如果 eMMC Device 在 Disconnect State 时,还没有完成写入操作,就收到参数等于自身 RCA 的 CMD7 命令,那么 eMMC Devcie 会从新回到 Programming State。
3.3 Packed Commands - Packed Write and Packed Read
在实际应用场景中,通常会对 eMMC Device 有很多随机数据读取和写入操作,这些随机读写的目标地址往往都不是连续的,每一个随机读写都需要通过一个独立的读写流程来实现。
在 eMMC 4.5 及以后的标准中,引入了 Packed Commands 机制,将多个地址不连续的数据写入请求封装到一个 Multiple Block Write 流程中,同时将多个地址不连续的数据读取请求封装的一个 Multiple Block Read 流程中,以此减少读写请求数量,提高数据读写的效率。
Packed Write
发起 Packed Write 流程时,首先 Host 端会需要发送 packed flag 置 1 的 CMD23 SET_BLOCK_COUNT 命令。其中,CMD23 中的 Block Count 参数为 Packed Command Header 和实际写入的数据所占 Block 的总数。然后 Host 再发送 CMD25 命令给 eMMC Device,开始进行多个 Block 的数据写入。其中第 1 个(或者前 8 个) Block 数据为 Packed Command Header,它包含了各个写请求写入数据的起始地址和长度等信息。eMMC Devcie 在接收到数据后,会根据 Packed Command Header 的信息,将数据写入到指定的位置。
Packed Read
发起 Packed Read 流程时,首先 Host 端会需要发送 packed flag 置 1 的 CMD23 SET_BLOCK_COUNT 命令。其中,CMD23 中的 Block Count 参数为 Packed Command Header 所占 Block 的数量。然后 Host 再发送 CMD25 命令给 eMMC Device,开始进行 1 个(或者 8 个) Block 的 Packed Command Header 数据发送。Packed Command Header 包含了各个读请求读取数据的起始地址和长度等信息。发送完 Packed Command Header 后,Host 会再发送一个 packed flag 置 1的 CMD23 SET_BLOCK_COUNT 命令。其中,CMD23 中的 Block Count 参数为待读取数据的 Block 的数量。紧接着,Host 再发送 CMD18 命令,开始进行多个 Block 的数据读取。eMMC Devcie 会解析接收到的 Packed Command Header,然后将指定的数据发送给 Host 端。
NOTE:
Host 也可以不发送第二个 CMD23 命令,在这种情况下,Host 需要主动发送 Stop 命令,通知 eMMC Device 停止数据发送。
Packed Command Header
Packed Command Header 的格式如上图所示,其中 CMD23_ARG_x 指示了各个请求数据读取或者写入的 Block 数,CMDxx_ARG_x (CMD18 或者 CMD25)则指示了各个请求数据读取或者写入的起始位置。
当 DATA_SECTOR_SIZE[61] = 0x00 时,即 Data Sector Size 为 512 Bytes 时,Packed Command Header 占 1 个 Block 大小,当 DATA_SECTOR_SIZE[61] = 0x01 时,即 Data Sector Size 为 4 KBytes 时,Packed Command Header 占 8 个 Block 大小。
NOTE:
Packed Command 的错误处理流程,请参考 eMMC Spec 文档中的描述,此处不再详细介绍。
数据擦除
eMMC 标准提供了几种主动擦除数据的方法,以满足不同的场景需求。
擦除方式 | 擦除单位 | 描述 |
---|---|---|
Erase | Erase Group | 按 Erase Group 擦除数据,完成后重新读取会返回全为 0 或者 1 的数据,但在物理存储介质上,可能还保留着原始数据 |
TRIM | Write Block | 按 Write Block 擦除数据,完成后重新读取会返回全为 0 或者 1 的数据,但在物理存储介质上,可能还保留着原始数据 |
Discard | Write Block | 按 Write Block 擦除数据,完成后重新读取可能会返回擦除前的数据 |
Sanitize | - | 将标记擦除的 Block 的数据在物理介质上清除 |
- Erase
Erase 操作以 Erase Group 为单位进行一个或者多个 Group 的数据擦除,一个 Erase Group 由一个或者多个 Write Block 组成。eMMC Device 在执行 Erase 操作时,通常并不会进行实际物理数据的擦除,只是将待擦除的 Erase Group 中的 Block 从地址空间中 unmap,然后从后台的空闲 Block 中选择已经完成物理擦除的 Block,重新 map 到该地址空间中,然后告知 Host 端已完成 Erase 操作。实际物理擦除操作则在后台选择合适的时机进行。这样的逻辑可以减少 Host 执行 Erase 操作的等待时间,提高 eMMC Devcie 的响应速度。
发起 Erase 流程时,首先 Host 会发送参数为待擦除 Erase Group 起始地址的 CMD23 SET_BLOCK_COUNT 命令。
- TRIM
剪切操作类似于 6.6.1 节所述的缺省的擦除操作。剪切功能适用于对写块的擦除操作,而不是擦除分组。剪切功能允许主机指定不再需要的数据,以便设备必要时在后台擦除事件中擦除数据。剪切功能实施后的写块内容应为 0 或 1,取决于不同的存储器工艺。此值在EXT_CSD 中定义。
一旦剪切命令成功完成,被剪切的映射设备地址范围就如同用全 0 或全 1 重写过,取决于不同的存储器工艺。剪切命令的影响应是将已映射的主机地址范围简单地变为未映射的主机地址范围(注:在某些情况下其他 Flash 管理任务也在执行此命令中完成)。完成剪切过程是一个 3 步的序列。首先主机用 ERASE_GROUP_START( CMD35)命令定义范围的起始地址,接下来用 ERASE_GROUP_END( CMD36)命令定义范围的最后地址,最后发送参数 bit 0 置为 1 其他位为 0 的 ERASE( CMD38)命令启动擦除过程。
在剪切操作的情况下, CMD35 和 CMD36 指定的都是写块而不是擦除分组。
如果剪切命令中的一条( CMD35、 CMD36、 CMD38)是在所定义的擦除序列之外接收到的,设备将置位状态寄存器的 ERASE_SEQ_ERROR 位并复位整个序列。
如果主机在 CMD35 或 CMD36 参数中提供了超范围地址,设备将拒绝该命令,以置位ADDRESS_OUT_OF_RANGE 作为应答,并复位整个擦除序列。如果设备接收到了“非擦除”命令( CMD35、 CMD36、 CMD38、 CMD13 以外),设备将以 ERASE_RESET 置位应答,复位擦除序列并执行最后收到的命令。非寻址到选定设备的命令不取消擦除序列。
如果剪切范围包括写保护区,它们将原样保留,仅非保护块被擦除。状态寄存器中状态位 WP_ERASE_SKIP 将置位。 如前面块写所述,设备将通过拉低 DAT0 来指示剪切命令正在进行中。操作的实际时间可能相当长,主机可以发送 CMD7 取消该设备的选定。
主机应小心执行剪切命令以避免意外的数据丢失。
复位设备(用 CMD0、 CMD15 或 e-MMC 的硬件复位)或掉电将终止任何挂起的或现行的剪切命令。这可能使操作所涉及的数据处于未知的状态。
.
.
基本命令集(class 0、1):
CMD INDEX |
Type | Argument | Resp | Abbreviation | Command Description |
CMD0 | bc | [31:0] 00000000 | — | GO_IDLE_STATE | Resets the Device to idle state |
bc | [31:0] F0F0F0F0 | — | GO_PRE_IDLE_STATE | Resets the Device to pre-idle state | |
— | [31:0]FFFFFFFA | — | BOOT_INITIATION | Initiate alternative boot operation | |
CMD1 | bcr | [31:0] OCR with out busy |
R3 | SEND_OP_COND | Asks Device, in idle state, to send its Operating Conditions Register contents in the response on the CMD line. |
CMD2 | bcr | [31:0] stuff bits | R2 | ALL_SEND_CID | Asks Device to send its CID number on the CMD line |
CMD3 | ac | [31:16] RCA [15:0] stuff bits |
R1 | SET_RELATIVE_ADDR | Assigns relative address to the Device |
CMD4 | bc | [31:16] DSR [15:0] stuff bits |
— | SET_DSR | Programs the DSR of the Device |
CMD5 | ac | [31:16] RCA [15]Sleep/Awake [14:0] stuff bits |
R1b | SLEEP_AWAKE | Toggles the Device between Sleep state and Standby state. (See 6.6.21). |
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 | Switches the mode of operation of the selected Device or modifies the EXT_CSD registers. (See 6.6.1) |
CMD7 | ac | [31:16] RCA [15:0] stuff bits |
R1/ R1b1 |
SELECT/DESELECT_CARD | Command toggles a device between the standby and transfer states or between the programming and disconnect states. NOTE In both cases the Device is selected by its own relative address and gets deselected by any other address; address 0 deselects the Device. |
CMD8 | adtc | [31:0] stuff bits | R1 | SEND_EXT_CSD | Device sends its EXT_CSD register as a block of data. |
CMD9 | ac | [31:16] RCA [15:0] stuff bits |
R2 | SEND_CSD | Addressed Device sends its Device-specific data (CSD) on the CMD line. |
CMD10 | ac | [31:16] RCA [15:0] stuff bits |
R2 | SEND_CID | Addressed Device sends its Device identification (CID) on CMD the line. |
CMD11 | obsolete | The response to CMD11 will be undefined. | |||
CMD12 | ac | [31:16] RCA2 [15:1] stuff bits [0] HPI |
R1/ R1b3 |
STOP_TRANSMISSION | Forces the Device to stop transmission. If HPI flag is set the device shall interrupt its internal operations in a well-defined timing. |
CMD13 | ac | [31:16] RCA [15] SQS [14:1] stuff bits [0] HPI |
R1 | SEND_STATUS | In case SQS bit = 0: Addressed Device sends its status register. If HPI flag is set the device shall interrupt its internal operations in a well-defined timing. In case SQS bit = 1: indicate that this is a QSR query. In response device shall send the QSR (Queue Status Register). In this case HPI must be set to ‘0’. |
CMD14 | adtc | [31:0] stuff bits | R1 | BUSTEST_R | A host reads the reversed bus testing data pattern from a Device. |
CMD15 | ac | [31:16] RCA [15:0] stuff bits |
– | GO_INACTIVE_STATE | Sets the Device to inactive state |
CMD19 | adtc | [31:0] stuff bits | R1 | BUSTEST_W | A host sends the bus test data pattern to a Device. |
块读命令:
CMD INDEX |
Type | Argument | Resp | Abbreviation | Command Description |
CMD16 | ac | [31:0] block length |
R1 | SET_BLOCKLEN | Sets the block length (in bytes) for all following block commands (read and write). Default block length is specified in the CSD. |
CMD17 | adtc | [31:0] data address1 |
R1 | READ_SINGLE_ BLOCK |
Reads a block of the size selected by the SET_BLOCKLEN command.2 |
CMD18 | adtc | [31:0] data address1 |
R1 | READ_MULTIPLE_ BLOCK |
Continuously transfers data blocks from Device to host until interrupted by a stop command, or the requested number of data blocks is transmitted If sent as part of a packed read command, the argument shall contain the first read data address in the pack (address of first individual read command inside the pack). (See 6.6.27.1) |
CMD21 | adtc | [31:0] stuff bits | R1 | SEND_TUNING_ BLOCK |
128 clocks of tuning pattern (64 byte in 4 bit mode or 128 byte in 8 bit mode) is sent for HS200 optimal sampling point detection. |