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标准协议)
相关文章
相关标签/搜索