/**
******************************************************************************
* @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节:
 
 
对照后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回复格式

 
共48bit,最高bit永远是0,后紧接0代表从eMMC传给控制器,而后[45:40]共6bit代表回复的哪个CMD(0 ~ 63),而后的[39:8]共32bit代表eMMC的设备状态,而后就是CRC和结束位。Device status的含义如下:
 

5.2 R1b回复格式

5.3 R2回复格式

R2用来回复CMD2 9 10这三个命令,当回复CMD2 10的时候内容是CID寄存器的值,当回复CMD9的时候内容是CSR寄存器的值。

5.4 R3回复格式

 

5.5 R4回复格式

5.6 R5回复格式

 

六、几种常用CMD 

6.1 CMD0

这个命令用来复位eMMC,没有回复:

6.2 CMD1

这个命令得到eMMC的OCR寄存器值:
在这里[31]位比较重要,如果是1代表eMMC复位完成了,0x40FF8080复位未完成,0xC0FF8080复位完成。

6.3 CMD2

这个命令得到eMMC的CID寄存器值,共128bit,16字节:
下面是在实际操作过程中读取到的数据:
与文档(1)中CID寄存器对照后就会发现完全一致。

6.4 CMD3

此命令用来设置eMMC的相对地址,相对地址是为一条总线挂接多个eMMC准备的,如果只有一个eMMC这个命令没有很大意义。
eMMC回复R1给控制器。 

6.5 CMD6

这个命令用来设置eMMC中EXT_CSR中寄存器的值:
[31:26]:为0
[25:24]:见下表,
[23:16]:为将要操作的寄存器索引
[15:8]:为将要写入寄存器的值
[7:3]:为0
[2:0]:如果[25:24]为00b,那么这三位含义如下,

6.6 CMD7

此命令用来设置eMMC的状态,因为当使用CMD0使eMMC复位后,eMMC处于idle或pre_idle状态,如果需要数据传输,必须将eMMC置于transfer_state,CMD7就是这个作用。
eMMC回复R1给控制器。

6.7 CMD8

此命令用来获取EXT_CSD的值,虽然回复为R1,但是EXT_CSD的512字节值会被读取并存储到内存里,然后用户可以根据这些数据分析出eMMC当前支持的各种参数和状态。
注意由于EXT_CSD是eMMC4之后才引入的寄存器组,所以只有判断eMMC版本大于4之后,才会发出这条指令读取EXT_CSD。

6.8 CMD13

要求eMMC发送自己的状态。
 

七、操作顺序

 eMMC上电后首先需要复位,CMD0实现,然后eMMC会进入自行复位busy状态,循环发送CMD1来检测busy状态,当busy状态结束后,eMMC进入ready状态,然后发送CMD2进行认证(获取CID),然后发送CMD3,之后eMMC进入stby状态,最后使用CMD7进入transfer状态,这时候就可以使用CMD16读取单块,CMD17读取多块了。
以上是一般的操作顺序,包括最关键的指令,当然也可以在这中间插入一些不是必需的指令,比如CMD6、CMD13等等。
详细的状态切换图见下:
 
 
参考文档:
[1] KLMxGxxEMx-B031 Spec
[2] JESD84-B50(注:eMMC 5.0标准协议)

exynos 4412 eMMC配置及使用方法的更多相关文章

  1. exynos 4412 时钟配置

    /** ****************************************************************************** * @author    Maox ...

  2. jLink V8调试exynos 4412 u-boot的几点补充

    /** ****************************************************************************** * @author    Maox ...

  3. VisualSVN Server的配置和使用方法(转)

    1.为什么要用VisualSVN Server,而不用Subversion? 回答: 因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Serve ...

  4. Sublime Text 3 配置和使用方法

    下载: Sublime Text 3 官方下载地址 Sublime Text 3 汉化破解版 资料: Sublime Text 非官方文档   技巧 -用户或-User后缀的菜单项,其对应的配置文件都 ...

  5. Exynos 4412

    Exynos 4412采用了三星最新的32nm HKMG工艺,是三星的第一款四核处理器 1.启动 有时间再接着写……

  6. Exynos 4412 Uboot源码解析

    原文地址:http://www.cnblogs.com/jacklu/p/6226330.html Exynos 4412 Uboot的汇编代码就不贴了,没有的可以私信我. 这是我当时阅读代码时的思维 ...

  7. VisualSVN Server的配置和使用方法 图文

    转载 http://www.jb51.net/article/17365.htm VisualSVN Server是免费的,而VisualSVN是收费的.VisualSVN是SVN的客户端,和Visu ...

  8. BizTalk 2013R2 WCF-LOB Oracle Adapter安装配置/问题&解决方法

    BizTalk 2013R2 WCF-LOB Oracle Adapter安装配置/问题&解决方法 安装Oracle Adapter 安装Oracle客户端 BizTalk 2013R2 安装 ...

  9. VisualSVN Server以及TortoiseSVN客户端的配置和使用方法

    http://www.cnblogs.com/beautifulFuture/archive/2014/07/01/3818211.html 近期学习代码管理工具,首先学习一下svn和Tortoise ...

随机推荐

  1. oracle视图总结

    视图简介: 视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改.视图基于的表称为基表.视图是存储在数据字典里的一条select语句. 通过创建视图可以提取数 ...

  2. 一个对称加密、解密的方法C#工具类

    封装了一个对称加解密的类,用私钥和密钥加解密 using System; using System.Collections.Generic; using System.Text; using Syst ...

  3. Java基础知识强化之IO流笔记74:NIO之 Buffer

    Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...

  4. iOS开发libWeChatSDK.a(WXApiObject.o)' does not contain bitcode.

    在使用微信分享的时候可能会报错, 报错如下: ld: '/Users/gti/Documents/********/Lib/SDKExport/libWeChatSDK.a(WXApiObject.o ...

  5. 使用hibernate配置多数据源链接MySQL和Oracle数据库

    最近做项目要将读取到的数据同时插入到MySQL数据库和Oracle数据库当中,以前都是使用一个数据库,没有用过多数据源的情况,现在把这个问题搞定了,写下来希望对大家有点帮助,可能我所使用的方法不是最好 ...

  6. python 基础——私有属性

    私有属性 python 私有属性以两个下划线开头. python 私有属性只能在类内部访问,类外面访问会出错. python 私有属性之所以不能在外面直接通过名称来访问,其实质是因为 python 做 ...

  7. Auto Layout 在iOS屏幕适配中的使用

    前几天在做iOS屏幕的适配,也就是让同样的UI控件的布局在不同屏幕的iOS设备上面都正确显示,storyBoard就无可避免的用到了Auto Layout.在这个过程中,我发现要熟练掌握Auto La ...

  8. 【.NET基础】--委托、事件、线程(1)

    1,委托 是存放方法的指针的清单,也就是装方法的容器 A, 新建winform项目[01委托],项目中添加dg_SayHi.cs 委托类 用于存储方法 namespace _01委托 { //定义委托 ...

  9. miniui MVC datagrid数据绑定

    数据绑定 Default.cshtml <div id="datagrid1" class="mini-datagrid" style="wid ...

  10. 跟我一起学习ASP.NET 4.5 MVC4.0(三)(转)

    今天我们继续ASP.NET 4.5 MVC 4.0,前两天熟悉了MVC4.0在VS11和win8下的更新,以及MVC中的基础语法和几个关键字的使用.了解了这些就可以对MVC进一步认识,相信很多人都对M ...