Packed Commands - Packed Write and Packed Read
在實際應用場景中,通常會對 eMMC Device 有很多隨機數據讀取和寫入操作,這些隨機讀寫的目標地址往往都不是連續的,每一個隨機讀寫都需要通過一個獨立的讀寫流程來實現,通常隨機讀寫很慢。
如下圖所示:(seq 爲順序大數據讀寫,4k爲隨機讀寫,每筆數據4k),可以看出隨機讀寫只有10MB/s左右。
爲了改變這種情況,在 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 |