/**
******************************************************************************
* @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 eMMC时钟部分
最基础的部分还是时钟,eMMC支持的时钟分为好多种比如26M 52M HS200 HS400,当然eMMC越高端支持的时钟模式也就越多。
怎么知道eMMC支持的时钟模式,查一下
Extended CSD Register 的 [196] 字节即可,这里的这款B031芯片读数为0x57,那么这个0x57中的每一位含义是什么呢,查阅文档 [2] 的7.4.54节:
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/9488487a894e6c5b560a570d18e1fd53.png)
对照后0 1 2 4 6 位为1,即支持HS400 HS200 HS52-DDR HS52 HS26,4412可以选用任意一种时钟模式操作eMMC。
这里还有不同的模式需要的时钟速率及最大传输速率。
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/8731086d13255f77151a498d7e7a78b4.png)
1.2 4412 eMMC控制器部分
从CMU(Clock Management Unit)模块中找到MMC控制器时钟图,如下:
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/d1013de0efa5fc3b395c58c0a6903a5f.png)
系统上电默认使用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.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/934579d3c8c38daac7053ae73094fe9c.png)
这样可以得出这款B031
不支持的命令有CMD11 CMD20 CMD39 CMD40 CMD53~56。
四、CMD列表
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/1a5f45d5247329aaa1b98ea132013d88.png)
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/b35afa73485487fb1e4c9c9ea8d67798.png)
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/2adc9940931070eea61c3a2e07f08a9b.png)
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/a26927f49a2824634f69e3eaf48cefc6.png)
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/eb055bc307e68f2242125e2e673ca63a.png)
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/ad3b74038ef8ef965d992259e7bd4d7e.png)
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/a93812fc48abb3ffd78ade13a29c5f5c.png)
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/db9e13e5932424dcf00e45f11b08802b.png)
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/621173f52f8dd342791cc36ec713ea12.png)
五、CMD回复格式
先看上面表格的第4列Resp列,代表eMMC回复给4412控制器的消息,他们的含义如下:
5.1 R1回复格式
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/092c6afcb5d4993ba778858d311b457a.png)
共48bit,最高bit永远是0,后紧接0代表从eMMC传给控制器,而后[45:40]共6bit代表回复的哪个CMD(0 ~ 63),而后的[39:8]共32bit代表eMMC的设备状态,而后就是CRC和结束位。Device status的含义如下:
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/3ad715b17aa9f2fa9e912815f80dbd29.png)
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/1dbc2866583a27db61d9fcc5dc08167d.png)
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/98d740a5e74d2b38201f05f2dfeccae4.png)
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/1ef32f106c0bb838d279073a9f135bf5.png)
5.2 R1b回复格式
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/f52b61d237cc1fce073221ec50df19b2.png)
5.3 R2回复格式
R2用来回复CMD2 9 10这三个命令,当回复CMD2 10的时候内容是CID寄存器的值,当回复CMD9的时候内容是CSR寄存器的值。
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/a8ab73a60d47e601191709800208d3cb.png)
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/7608cd682a9f6405156d0ff6ba6be9ac.png)
5.4 R3回复格式
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/67c197e4fa064580e5165e142ba5e07f.png)
5.5 R4回复格式
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/982eca38f43a7c2ac8887ba39d2a2402.png)
5.6 R5回复格式
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/f096b5dbfeeaeb27643f02def5196435.png)
六、几种常用CMD
6.1 CMD0
这个命令用来复位eMMC,没有回复:
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/e813c967718b8687799e30c1ecda7299.png)
6.2 CMD1
这个命令得到eMMC的OCR寄存器值:
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/9c535fe818073718a54d1d81d94bd7db.png)
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/1bce539e0558b757e3e6d33a476f4ede.png)
在这里[31]位比较重要,如果是1代表eMMC复位完成了,
0x40FF8080复位未完成,
0xC0FF8080复位完成。
6.3 CMD2
这个命令得到eMMC的CID寄存器值,共128bit,16字节:
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/05cd30a4e959a5b375715638c1d45bed.png)
下面是在实际操作过程中读取到的数据:
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/91978f97d34b7245a6094575a9079dd3.png)
与文档(1)中CID寄存器对照后就会发现完全一致。
6.4 CMD3
此命令用来设置eMMC的相对地址,相对地址是为一条总线挂接多个eMMC准备的,如果只有一个eMMC这个命令没有很大意义。
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/e2942f54397e6f2a36898941024ed6d5.png)
eMMC回复R1给控制器。
6.5 CMD6
这个命令用来设置eMMC中EXT_CSR中寄存器的值:
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/d9f11b152d71bd977540711543f3c0e8.png)
[31:26]:为0
[25:24]:见下表,
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/077ea0f6652a4f8c2585bfa3f04cf82e.png)
[23:16]:为将要操作的寄存器索引
[15:8]:为将要写入寄存器的值
[7:3]:为0
[2:0]:如果[25:24]为00b,那么这三位含义如下,
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/962a3aa9033c48013c2b8bddaab3f5e6.png)
6.6 CMD7
此命令用来设置eMMC的状态,因为当使用CMD0使eMMC复位后,eMMC处于idle或pre_idle状态,如果需要数据传输,必须将eMMC置于transfer_state,CMD7就是这个作用。
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/8a7243e0b1f50d5322ebfc291e8ac060.png)
eMMC回复R1给控制器。
6.7 CMD8
此命令用来获取EXT_CSD的值,虽然回复为R1,但是EXT_CSD的512字节值会被读取并存储到内存里,然后用户可以根据这些数据分析出eMMC当前支持的各种参数和状态。
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/d1d17eb12e76bced40bd3203548c1043.png)
注意由于EXT_CSD是eMMC4之后才引入的寄存器组,所以只有判断eMMC版本大于4之后,才会发出这条指令读取EXT_CSD。
6.8 CMD13
要求eMMC发送自己的状态。
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/18b8f8dd2633b3424ab2ada5ff37db42.png)
七、操作顺序
eMMC上电后首先需要复位,CMD0实现,然后eMMC会进入自行复位busy状态,循环发送CMD1来检测busy状态,当busy状态结束后,eMMC进入ready状态,然后发送CMD2进行认证(获取CID),然后发送CMD3,之后eMMC进入stby状态,最后使用CMD7进入transfer状态,这时候就可以使用CMD16读取单块,CMD17读取多块了。
以上是一般的操作顺序,包括最关键的指令,当然也可以在这中间插入一些不是必需的指令,比如CMD6、CMD13等等。
详细的状态切换图见下:
![NewImage.png NewImage](https://i-blog.csdnimg.cn/blog_migrate/6d3fea48966841e7aa6ba69d1f43c6e6.png)
参考文档:
[1] KLMxGxxEMx-B031 Spec
[2] JESD84-B50(注:eMMC 5.0标准协议)