[轉]exynos 4412 eMMC配置及使用方法
exynos 4412 eMMC配置及使用方法
/**
- @author Maoxiao Hu
- @version V1.0.0
@date Feb-2015
< COPYRIGHT 2015 ISE of SHANDONG UNIVERSITY >
開發板:迅為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 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_FSYS
地址:0x1003C240
預設值:0x00011111
設定後的值:0x00066666
DIVmmc0-3和DIVmmc0-3_pre涉及的暫存器:
CLK_DIV_FSYS1 & CLK_DIV_FSYS2 & CLK_DIV_FSYS3
地址:0x1003C544 & 0x1003C548 & 0x1003C54C
預設值:0x00000000 & 0x00000000 & 0x00000000
設定後的值:0x09010901 & 0x09010901 & 0x09010901
這樣在MPLL為800MHz的情況下,先二分頻再十分頻,最後eMMC控制器的時鐘是40MHz。但是如果eMMC晶片支援HS200或者HS400高速模式,那麼隨後對控制器時鐘進行修改即可。
二、確定Class
我們都知道,eMMC也是分等級的,分別從Class0 ~ Class11 ,不同的Class支援的命令範圍不同,不先確定Class就不敢確定發出的指令eMMC能夠正確響應。
查一下CSD Register的[95:84]共12bit。這裡的這款B031讀數為0xF5(11110101),支援Class0 Class2 Class4 Class5 Class6 Class7指令集。
三、確定支援的CMD
從支援的Class指令集就可以推出支援的CMD命令,
NewImage
這樣可以得出這款B031不支援的命令有CMD11 CMD20 CMD39 CMD40 CMD53~56。
四、CMD列表
NewImage
NewImage
NewImage
NewImage
NewImage
NewImage
NewImage
NewImage
NewImage
五、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
六、幾種常用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
七、操作順序
eMMC上電後首先需要復位,CMD0實現,然後eMMC會進入自行復位busy狀態,迴圈傳送CMD1來檢測busy狀態,當busy狀態結束後,eMMC進入ready狀態,然後傳送CMD2進行認證(獲取CID),然後傳送CMD3,之後eMMC進入stby狀態,最後使用CMD7進入transfer狀態,這時候就可以使用CMD16讀取單塊,CMD17讀取多塊了。
以上是一般的操作順序,包括最關鍵的指令,當然也可以在這中間插入一些不是必需的指令,比如CMD6、CMD13等等。
詳細的狀態切換圖見下:
NewImage
參考文件:
[1] KLMxGxxEMx-B031 Spec
[2] JESD84-B50(注:eMMC 5.0標準協議)
來源於http://www.cnblogs.com/humaoxiao,轉載請註明出處。