exynos 4412 eMMC配置及使用方法

/**
******************************************************************************
* @author    Maoxiao Hu
* @version   V1.0.0
* @date       Feb-2015
******************************************************************************
* < COPYRIGHT 2015 ISE of SHANDONG UNIVERSITY >
******************************************************************************
**/
本文會不時完善和糾正一些小錯誤,務必請到  http://www.cnblogs.com/humaoxiao 參考最新版本。
 
開發板:迅爲4412精英版。
uboot:uboot-2014-10。
開發板上的eMMC:三星  KLMxGxxEMx-B031 容量4GB 使用eMMC 5.0標準。
exynos4412上的eMMC控制器:使用的eMMC4.41標準。
 
參考文檔:見文末。 參考文檔 [2] 須要到JESD網站下載。

此款三星eMMC兼容e.MMC 5.0標準協議,可是4412的eMMC控制器是使用的e.MMC 4.4標準,這樣的搭配是否是不太好暫且不表。

1、時鐘

1.1 eMMC時鐘部分

最基礎的部分仍是時鐘,eMMC支持的時鐘分爲好多種好比26M 52M HS200 HS400,固然eMMC越高端支持的時鐘模式也就越多。
怎麼知道eMMC支持的時鐘模式,查一下 Extended CSD Register 的 [196] 字節便可,這裏的這款B031芯片讀數爲0x57,那麼這個0x57中的每一位含義是什麼呢,查閱文檔 [2] 的7.4.54節:
 
NewImage
 
對照後0 1 2 4 6 位爲1,即支持HS400 HS200 HS52-DDR HS52 HS26,4412能夠選用任意一種時鐘模式操做eMMC。
 
這裏還有不一樣的模式須要的時鐘速率及最大傳輸速率。
 
NewImage

1.2 4412 eMMC控制器部分

從CMU(Clock Management Unit)模塊中找到MMC控制器時鐘圖,以下:
 
NewImage
 
系統上電默認使用XusbXTI時鐘源,可是在實際使用中24M時鐘是遠遠不夠的,因此咱們按照手冊推薦將時鐘源選擇到SCLKmpll_user_t ,選擇方法請參考《exynos 4412 時鐘配置》
 
MUXmmc0-3涉及的寄存器:

    CLK_SRC_FSYShtml

    地址:0x1003C240網站

    默認值:0x00011111spa

    設置後的值:0x000666663d

DIVmmc0-3和DIVmmc0-3_pre涉及的寄存器:htm

    CLK_DIV_FSYS1 & CLK_DIV_FSYS2 & CLK_DIV_FSYS3blog

    地址:0x1003C544 & 0x1003C548 & 0x1003C54C索引

    默認值:0x00000000 & 0x00000000 & 0x00000000內存

    設置後的值:0x09010901 & 0x09010901 & 0x09010901ci

這樣在MPLL爲800MHz的狀況下,先二分頻再十分頻,最後eMMC控制器的時鐘是40MHz。可是若是eMMC芯片支持HS200或者HS400高速模式,那麼隨後對控制器時鐘進行修改便可。 開發

2、肯定Class

咱們都知道,eMMC也是分等級的,分別從Class0 ~ Class11 ,不一樣的Class支持的命令範圍不一樣,不先肯定Class就不敢肯定發出的指令eMMC可以正確響應。
查一下CSD Register的[95:84]共12bit。這裏的這款B031讀數爲0xF5(11110101),支持Class0 Class2 Class4 Class5 Class6 Class7指令集。

3、肯定支持的CMD

從支持的Class指令集就能夠推出支持的CMD命令,
 
NewImage
這樣能夠得出這款B031 不支持的命令有CMD11 CMD20 CMD39 CMD40 CMD53~56。

4、CMD列表

NewImage
NewImage
NewImage
NewImage
NewImage
NewImage
NewImage
NewImage
NewImage 

5、CMD回覆格式

先看上面表格的第4列Resp列,表明eMMC回覆給4412控制器的消息,他們的含義以下:

5.1 R1回覆格式

NewImage
 
共48bit,最高bit永遠是0,後緊接0表明從eMMC傳給控制器,然後[45:40]共6bit表明回覆的哪一個CMD(0 ~ 63),然後的[39:8]共32bit表明eMMC的設備狀態,然後就是CRC和結束位。Device status的含義以下:
 
NewImage
NewImage
NewImage
NewImage

5.2 R1b回覆格式

NewImage

5.3 R2回覆格式

R2用來回復CMD2 9 10這三個命令,當回覆CMD2 10的時候內容是CID寄存器的值,當回覆CMD9的時候內容是CSR寄存器的值。
NewImage
NewImage

5.4 R3回覆格式

NewImage 

5.5 R4回覆格式

NewImage

5.6 R5回覆格式

NewImage
 

6、幾種經常使用CMD 

6.1 CMD0

這個命令用來複位eMMC,沒有回覆:
NewImage

6.2 CMD1

這個命令獲得eMMC的OCR寄存器值:
NewImage
NewImage
在這裏[31]位比較重要,若是是1表明eMMC復位完成了, 0x40FF8080復位未完成, 0xC0FF8080復位完成。

6.3 CMD2

這個命令獲得eMMC的CID寄存器值,共128bit,16字節:
NewImage
下面是在實際操做過程當中讀取到的數據:
NewImage
與文檔(1)中CID寄存器對照後就會發現徹底一致。

6.4 CMD3

此命令用來設置eMMC的相對地址,相對地址是爲一條總線掛接多個eMMC準備的,若是隻有一個eMMC這個命令沒有很大意義。
NewImage
eMMC回覆R1給控制器。 

6.5 CMD6

這個命令用來設置eMMC中EXT_CSR中寄存器的值:
NewImage
[31:26]:爲0
[25:24]:見下表,
NewImage
[23:16]:爲將要操做的寄存器索引
[15:8]:爲將要寫入寄存器的值
[7:3]:爲0
[2:0]:若是[25:24]爲00b,那麼這三位含義以下,
NewImage

6.6 CMD7

此命令用來設置eMMC的狀態,由於當使用CMD0使eMMC復位後,eMMC處於idle或pre_idle狀態,若是須要數據傳輸,必須將eMMC置於transfer_state,CMD7就是這個做用。
NewImage
eMMC回覆R1給控制器。

6.7 CMD8

此命令用來獲取EXT_CSD的值,雖然回覆爲R1,可是EXT_CSD的512字節值會被讀取並存儲到內存裏,而後用戶能夠根據這些數據分析出eMMC當前支持的各類參數和狀態。
NewImage
注意因爲EXT_CSD是eMMC4以後才引入的寄存器組,因此只有判斷eMMC版本大於4以後,纔會發出這條指令讀取EXT_CSD。

6.8 CMD13

要求eMMC發送本身的狀態。
NewImage
 

7、操做順序

 eMMC上電後首先須要復位,CMD0實現,而後eMMC會進入自行復位busy狀態,循環發送CMD1來檢測busy狀態,當busy狀態結束後,eMMC進入ready狀態,而後發送CMD2進行認證(獲取CID),而後發送CMD3,以後eMMC進入stby狀態,最後使用CMD7進入transfer狀態,這時候就可使用CMD16讀取單塊,CMD17讀取多塊了。
以上是通常的操做順序,包括最關鍵的指令,固然也能夠在這中間插入一些不是必需的指令,好比CMD六、CMD13等等。
詳細的狀態切換圖見下:
 
NewImage
 
參考文檔:
[1] KLMxGxxEMx-B031 Spec
[2] JESD84-B50(注:eMMC 5.0標準協議)
相關文章
相關標籤/搜索