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 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标准协议)

时间: 2024-10-10 15:38:23

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

exynos 4412 时钟配置

/** ****************************************************************************** * @author ? ?Maoxiao Hu * @version ? V1.0.0 * @date ? ? ? Jan-2015 ****************************************************************************** * < COPYRIGHT 2015 IS

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

/** ****************************************************************************** * @author ? ?Maoxiao Hu * @version ? V1.0.0 * @date ? ? ? Dec-2014 ****************************************************************************** * < COPYRIGHT 2014 IS

Spring配置bean的方法(工厂方法和Factorybean)

通过工厂方法配置bean 通过调用静态工厂方法创建bean 通过静态工厂方法创建bean是将对象创建的过程封装到静态方法中.当客户端需要对象时,只需要简单地调用静态方法,而不关心创建对象的细节. 要声明通过静态方法创建的bean,需要在bean的class属性里指定拥有该工厂的方法的类,通知在factory-method属性里指定工厂方法的名称, 最后,使用<constructor-arg>元素为该方法传递方法参数 通过调用实例工厂方法创建bean 实例工厂方法:将对象的创建过程封装到另外一个

Android x86模拟器Intel Atom x86 System Image配置与使用方法

Android x86模拟器Intel Atom x86 System Image配置与使用方法      前言:      大家现在开发使用的Android 模拟器模拟的是 ARM 的体系结构(arm-eabi),因此模拟器并不是运行在x86上而是模拟的ARM,所以我们调试程序的时候经常感觉到非常慢,大部分开发者应该都深有体会.      针对这种情况,前段时间Intel推出了支持x86的Android模拟器,这将大大提高启动速度和程序的运行速度,这将允许Android模拟器能够以原始速度(真

64位win2003/win2008系统IIS6.0/7.5配置PHP的方法

64位win2003/win2008系统IIS6.0/7.5配置PHP的方法 32位的win2003系统配置PHP,估计很多人都已经驾轻就熟了,不过当遇到64位的系统时,估计又会遇上新的问题了.本文记录了我在64位win2003/win2008系统IIS6.0/7.5配置PHP的方法,第一次配置的人可以参考参考. 64位win2008系统IIS7.5配置PHP环境 用惯IIS6.0的人,对IIS7.5的界面尤为陌生,操作习惯也大不一样,不过这都很容易就上手,就如第一次操作IIS6.0一样. 64

Spring配置bean的方法(工厂方法和Factorybean)【转】

通过工厂方法配置bean 通过调用静态工厂方法创建bean 通过静态工厂方法创建bean是将对象创建的过程封装到静态方法中.当客户端需要对象时,只需要简单地调用静态方法,而不关心创建对象的细节. 要声明通过静态方法创建的bean,需要在bean的class属性里指定拥有该工厂的方法的类,通知在factory-method属性里指定工厂方法的名称, 最后,使用<constructor-arg>元素为该方法传递方法参数 通过调用实例工厂方法创建bean 实例工厂方法:将对象的创建过程封装到另外一个

如何在Ubuntu下使用TF/SD 卡制作Exynos 4412 u-boot启动盘

/** ****************************************************************************** * @author ? ?Maoxiao Hu * @version ? V1.0.0 * @date ? ? ? Feb-2015 ****************************************************************************** * < COPYRIGHT 2015 IS

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

一.VisualSVN Server的配置和使用方法[服务器端] 好的,下面我来添加一个代码库[Repository],如下图: 按上图所示,创建新的代码库,在下图所示的文本框中输入代码库名称: 注意:上图中的CheckBox如果选中,则在代码库StartKit下面会创建trunk.branches.tags三个子目录:不选中,则只创建空的代码库StartKit. 点击OK按钮,代码库就创建成功了. 创建完代码库后,没有任何内容在里面.我会在这个教程的第二部分说明如何迁入源代码. 下面,我们开始

YUM 源配置与使用方法

Cen  YUM 源配置与使用方法 一. YUM简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的开发者Terra Soft 研发,用python 写成,那时还叫做yup(yellow dog updater),后经杜克大学的[email protected] 开发团队进行改进,遂有此名.yum 的宗旨是自动化地升级,安装/移除rpm 包,收集rpm 包的相关