EMMC Packed Command

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章