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 端。
注意:在这个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 |
来源:CSDN
作者:申小白
链接:https://blog.csdn.net/shenjin_s/article/details/104293249