EMMC Packed Command

Packed Commands - Packed Write and Packed Read

在实际应用场景中,通常会对 eMMC Device 有很多随机数据读取和写入操作,这些随机读写的目标地址往往都不是连续的,每一个随机读写都需要通过一个独立的读写流程来实现,通常随机读写很慢。


如下图所示:(seq 为顺序大数据读写,4k为随机读写,每笔数据4k),可以看出随机读写只有10MB/s左右。
EMMC Packed Command_第1张图片

为了改变这种情况,在 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 端。

注意:在这个Case 中,CMD25和CMD18的参数应该和 Packed Command Header 头中的第一个read/write 的地址相同(下表加粗的CMD参数)。

Packed command Header Struct

Entry index Offset(bytes) name Length(Bytes)
- 0 Version 1
- 1 R/W 1
- 2 NUM_ENTRIES(=N) 1
- 3 padding to 8B 5
1 8 CMD23_ARG_1 4
1 12 CMDxx_ARG_1 4
2 16 CMD23_ARG_2 4
2 20 CMDxx_ARG_2 4
N 8N CMD23_ARG_N 4
N 8N+4 CMDxx_ARG_N 4
- 8N+8 Padding till block ends

你可能感兴趣的:(EMMC和UFS)