******************************************************************************
* @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节:
对照后0 1 2 4 6 位为1,即支持HS400 HS200 HS52-DDR HS52 HS26,4412可以选用任意一种时钟模式操作eMMC。
这里还有不同的模式需要的时钟速率及最大传输速率。
1.2 4412 eMMC控制器部分
从CMU(Clock Management Unit)模块中找到MMC控制器时钟图,如下:
系统上电默认使用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命令,
这样可以得出这款B031不支持的命令有CMD11 CMD20 CMD39 CMD40 CMD53~56。
四、CMD列表 五、CMD回复格式先看上面表格的第4列Resp列,代表eMMC回复给4412控制器的消息,他们的含义如下:
5.1 R1回复格式