1.前言
eMMC總線操作包含:
- boot mode
- device identification mode
- interrupt mode
- data transfer mode
本文主要描述boot mode。
2. boot operation mode
2.1 boot mode狀态機
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiETPwJWZ3ZCMwcTP39zZuBnLENTJENTJ3pVdC5GT0UEVPhXWU5UeNpnT4BzQPlXWq1UMNpWT1EEVOdXUE10MFRUT5BTaOhXRE9keFRVT2FFRNNTRE1Ue4kmT4VERPpXRU1kdjJjYzpkMMRXOykVdNNjW2hXbZVnTtxUMFRUT51EWa5mRXJGc5kHT20ESjBjUIF2Lc12bj5SYphXa5VWen5WY35iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.png)
圖 eMMC boot mode state
- pre-idle state
. 三種方式可以進入pre-idle狀态:(1)power on後;(2)GO_PRE_IDLE_STATE指令(CMD0+0xf0f0f0f0參數);(3)hw reset by host
. GO_PRE_IDLE_STATE或hw reset assert後,device端output bus将呈現高阻态,device的初始位址被設定為0x0001,bus會有預設的驅動能力
. device可以檢測到rst_n産生一段脈沖信号,通過上升沿來确定device是否發生了reset操作
. 有兩個boot分區,每個分區大小最小為128KB,boot分區與user area是分離的,單獨編址
. 可以使用CMD6來設定BOOT_PARTITION_ENABLE=1從boot area啟動(否則從user area啟動),進入到pre-boot state,如果BOOT_PARTITION_ENABLE=0或不支援boot mode(4.2以前的版本)則直接進入到idle state
- pre-boot state
. 上電或reset後且發送第一個指令CMD1之前,CMD LINE要保持至少74個周期的低電平,device識别到,進入boot state執行初始化,并準備boot data
若是CMD lines沒有保持74個時鐘周期的LOW,又若是host在初始話過程之前發送任意的正常eMMC指令的話,slave應該沒有任何反應且會退出boot mode到Idle State狀态即card identification mode
注:CMD0+0xfffffffa執行alternative boot初始化是針對4.4的規範,CMD LINE不是保持74個周期的低電平,而是通過發送CMD0,并帶有參數0XFFFFFFFA
- boot state
主要進行boot資料的讀取操作:
. host要讀取的分區以及data size可以通過extended csd來設定
. 通過保持CMD line低電平或發送CMD0+0XFFFFFFFA來讀取boot資料
. 在讀取資料期間,cmd line必須保持低電平
. host必須采用push-pull模式,直到boot mode結束
. host可以采用single data rate(SDR)或dual data rate(DDR)
. HS200 & HS400在boot mode不支援
. host可以設定是否從device接收boot acknowledge
. 通過拉高CMD line則會終止boot mode進入idle state,從此離開boot mode 進入到card identification mode
注1:在SDR模式中,資料由裝置發出的時鐘控制而host則在時鐘上升沿取樣。而且每一個data line都有一個單獨的CRC内容。
注2:在DDR模式中,資料則會在時鐘的上升和下降沿同時取樣,而且每一個data line有兩個CRC内容。在這個模式下,block長度總是為512 bytes,而且資料會以4bit或者8bit模式交叉出現。奇數bytes(1,3,5……511)會被host在時鐘上升沿取樣,而偶數bytes(2,4,6……512)則被host在時鐘的下降沿取樣。裝置會附加兩個CRC16到每個有效地data line上(若是4bit資料模式,則有4個line是無效的),一個對應上升沿的奇數bytes,一個對應下降沿的偶數bytes。
注3:所有DAT lines的時序都應該按照DDR時序來。開始bit,結束bit 還有boot acknowledge隻在時鐘的上升沿有效。如果這些資料出現在下降沿是沒用的。
2.2 boot mode時序
圖 boot mode時序
進入boot state後:
. 若是boot acknowledge被激活,在CMD信号變LOW之後的50ms之内,slave必須發送acknowledge内容"010"到host。若是boot acknowledge沒被激活,slave不會 發送;
.在CMD line變低的1S内,device 必須發出第一個資料給host;
.host必須保持CMD信号為LOW來讀取所有的boot資料, host必須使用push-pull模式
.當boot資料讀取操作完成,boot操作将會終止;
.通過拉高CMD line則會終止boot mode進入idle state,從此進入card identification mode
.當拉高CMD line後需要經過至少56個clock,才可以發送CMD1
注1:host選擇從哪個partition讀取boot資料是可以被提前設定的(EXT_CSD byte[179], bits[5:3]). Master可以讀取的boot資料大小也是可以計算的(128KB x BYTE_SIZE_MULT (EXT_CSD byte[226]))
注2:host可以通過設定EXT_CSD byte[179],bit 6來選擇是否從slave接受acknowledge,若是選擇接受host可以通過acknowledge确認slave是在boot模式中運作。
注3:在資料傳輸階段若是host把CMD拉高,slave必須在Nst個時鐘周期内中終止資料或者acknowledge内容的傳輸。Nst值為一個資料周期和一個結束bit周期。若是在block傳輸過程中,master終止了boot模式,則slave必須在Nst個時鐘周期内釋放data lines。
3.參考文檔
[1]http://www.jedec.org/sites/default/files/docs/JESD84-B51.pdf
[2]eMMC啟動過程 http://blog.sina.com.cn/s/blog_6cb8cdbd0102vno5.html