转自:http://www.cnblogs.com/fengeryi/p/3472728.html

 

mmc_sd_init_card剩下的关于UHS-I的分支结构。

uhs-I的初始化流程图如图:

红线标出的部分是已经做了的事,与上一篇那个流程图是一致的,之后就是if分支中做的事。

if分支中的函数mmc_sd_init_uhs_card:

/*
* UHS-I specific initialization procedure
*/
static int mmc_sd_init_uhs_card(struct mmc_card *card)
{
int err;
u8 *status; if (!card->scr.sda_spec3)//sd卡3.0版本才加入的UHS-I
return ; if (!(card->csd.cmdclass & CCC_SWITCH))//判断是否支持class10命令,CMD6属于该类
return ; status = kmalloc(, GFP_KERNEL);//CMD6的应答
if (!status) {
pr_err("%s: could not allocate a buffer for "
"switch capabilities.\n", mmc_hostname(card->host));
return -ENOMEM;
} /* Set 4-bit bus width */
if ((card->host->caps & MMC_CAP_4_BIT_DATA) &&//host是否支持4位数据线宽度
(card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) {//卡是否支持4位数据线宽度模式
err = mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4);//发送ACMD6切换.
if (err)
goto out; mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4);//host端的设置.
} /*
* Select the bus speed mode depending on host
* and card capability.
*/
sd_update_bus_speed_mode(card);/*这个函数是找一个card和host都支持的速度,类似上面对数据线宽度的操作,spec上有定义:
Bus Speed Mode (using 4 parallel data lines)
(1) Default Speed mode: 3.3V signaling, Frequency up to 25 MHz, up to 12.5 MB/sec
(2) High Speed mode: 3.3V signaling, Frequency up to 50 MHz, up to 25 MB/sec
(3) SDR12: UHS-I 1.8V signaling, Frequency up to 25 MHz, up to 12.5MB/sec
(4) SDR25: UHS-I 1.8V signaling, Frequency up to 50 MHz, up to 25MB/sec
(5) SDR50: UHS-I 1.8V signaling, Frequency up to 100 MHz, up to 50MB/sec
(6) SDR104: UHS-I 1.8V signaling, Frequency up to 208 MHz, up to 104MB/sec
(7) DDR50: UHS-I 1.8V signaling, Frequency up to 50 MHz, sampled on both clock edges, up to 50MB/sec
期望找到一个host和card支持的最快的速度.
*/ /* Set the driver strength for the card */
err = sd_select_driver_type(card, status);/*driver strength在spec中没找到详细的说明,
spec中流程图里有这个步骤.这个也是3.0才增加的,sd卡这边切换用的是CMD6, driver strength属于CMD6的function group 3*/
if (err)
goto out; /* Set current limit for the card */
err = sd_set_current_limit(card, status);/*这个函数里面注释比较清楚了,根据电压和速度模式,设置卡的最大功率,属于CMD6的function group 4*/
if (err)
goto out; /* Set bus speed mode of the card */
err = sd_set_bus_speed_mode(card, status);/*设置速度,属于CMD6的function group 1*/
if (err)
goto out; /* SPI mode doesn't define CMD19 */
if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning) {
mmc_host_clk_hold(card->host);
err = card->host->ops->execute_tuning(card->host,
MMC_SEND_TUNING_BLOCK);
mmc_host_clk_release(card->host);
} out:
kfree(status); return err;
}

linux并没有发送CMD42,spec上原话:

“When entering tran state, CARD_IS_LOCKED status in the R1 response should be checked (it is indicated in the response of CMD7). If the card is locked, CMD42 is required to unlock the card. If the card is unlocked, CMD42 can be skipped.”

但linux好像并没有检查,CMD7的返回值。没有搞懂,望知道的朋友指点一下。

还有最后发送CMD19的步骤,Tuning,我简单理解为调整时钟让时序稳定。

if分支中还有几条语句,都是主机或驱动的操作,没有涉及到卡的操作。

关于UHS-I,linux中的初始化就到这里。

下面说说CMD6。这些内容都是spec中的,这里只是按我的理解简单整理。

在3.0之后的协议中,该命令功能增加了很多。CMD6是这个样子的:

共有6组function group ,需要操作哪个功能就把相应goup 的相应 bit置1。 各个group的bit定义如下:

例如上面函数,要设置driver strenth

static int sd_select_driver_type(struct mmc_card *card, u8 *status)
{
。。。。。。 。。。。。。 err = mmc_sd_switch(card, , , drive_strength, status);
if (err)
return err; if ((status[] & 0xF) != drive_strength) {
pr_warning("%s: Problem setting drive strength!\n",
mmc_hostname(card->host));
return mmc_set_driver_type(card->host, drive_strength); ;
} return ;
}

调用mmc_sd_switch(card, , , drive_strength, status)函数,传入参数mode=1 group=2与表中相符(group参数从0开始),drive_strength就表示group 3的值,与表中相对应。

然后检查返回值,判断是否设置成功。 CMD6命令会从数据线而不是命令先接受一个512bit的应答值,这个值的具体定义在spec

Table 4-13: Status Data Structure。 这个表太大就不贴了。 需要注意的是表中定义与linux中收的数据字节顺序相反。status[0]是spec中的第504~511位。

mode 0和 mode 1

CMD6第31位表示该命令的两种模式,mode 0用来检查卡支持那些function group。 mode 1用来设置具体的function group的值。

发送mode 0 CMD6 ,可参考linux中mmc_read_switch()函数。

(linux)SD卡初始化-mmc_sd_init_card函数(续)的更多相关文章

  1. (linux)SD卡初始化-mmc_sd_init_card函数

      为了学习SD/SDIO协议,看了一下linux中初始化SD卡的流程,结合代码更容易SD初始化是怎么做的. 下面图截自:"SD Specifications Part 1 Physical ...

  2. (续)linux SD卡初始化---mmc_sd_init_card函数

    mmc_sd_init_card剩下的关于UHS-I的分支结构. uhs-I的初始化流程图如图: 红线标出的部分是已经做了的事,与上一篇那个流程图是一致的,之后就是if分支中做的事. if分支中的函数 ...

  3. Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作

    前面对SD卡控制器有了一个主要的介绍.事实上SD控制器层更过的意义是为core层提供一种操作SD卡硬件的一种方法.当然不同的控制器对硬件控制的方法不尽同样,可是他们终于都能像core层提交一个统一的封 ...

  4. SD卡初始化以及命令详解

    SD卡是嵌入式设备中很常用的一种存储设备,体积小,容量大,通讯简单,电路简单所以受到很多设备厂商的欢迎,主要用来记录设备运行过程中的各种信息,以及程序的各种配置信息,很是方便,有这样几点是需要知道的 ...

  5. Linux SD卡建立两个分区

    本文主要介绍Linux 环境下 SD 卡建立两个分区的操作流程: 操作环境:Linux Ubuntu 2016.4 操作目的:将 SD 卡分为两个分区:第一分区格式为 FAT32,大小 500M.第二 ...

  6. SD卡读写一些函数

    /SPI2 读写一个字节 //TxData:要写入的字节 //返回值:读取到的字节 u8 SPI2_ReadWriteByte(u8 TxData) { u16 retry=0;   while((S ...

  7. SD/MMC卡初始化及读写流程

    二.MMC/SD卡的模型和工作原理 PIN脚.SD卡总线.SD卡结构.SD卡寄存器.上电过程 SD卡寄存器:  OCR:操作电压寄存器: 只读,32位 第31位: 表示卡上电的状态位   CID: 卡 ...

  8. SD卡的SPI模式的初始化顺序(转)

    为了使SD卡初始化进入SPI模式,我们需要使用的命令有3个:CMD0,ACMD41,CMD55(使用ACMD类的指令前应先发CMD55,CMD55起到一个切换到ACMD类命令的作用). 为什么在使用C ...

  9. sd 卡驱动--基于高通平台

    点击打开链接 内容来自以下博客: http://blog.csdn.net/qianjin0703/article/details/5918041 Linux设备驱动子系统第二弹 - SD卡 (有介绍 ...

随机推荐

  1. XPosed框架_简单的应用

    0. Xposed框架简介 关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,而Xposed框架是免费的而且还是开源的,本文主要介绍如何通过这个框架来进行系统 ...

  2. bzoj2144 跳跳棋 二分

    [bzoj2144]跳跳棋 Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位 ...

  3. Log4j2同步异步性能比较以及教程和问题(坑)汇总

    线程数:500个   每个线程日志输出次数: 500次 log4j2其实有两个输出异步日志的方式:AsyncLogger和AsyncAppend 他两的区别在于: AsyncLogger使用的是无锁高 ...

  4. Codeforces983E. NN country

    新鲜出炉! $n \leq 200000$的树,给$m \leq 200000$条链,$q \leq 200000$个询问,每次问一条询问链最少用m条中的几条给定链覆盖其所有边,可能无解. 首先确定一 ...

  5. HTML中字体单位px pt em之间的转换

    在实现打印功能时,遇到一个问题,使用px作为单位在不同的机器或者打印机上打印出的字体大小不一样,所以经过查询,发现使用pt为单位能够进行物流适配,下面是各单位之间的转换: 定义字体大小有常见三种单位, ...

  6. 使用selenium抓取淘宝的商品信息

    淘宝的页面大量使用了js加载数据,所以采用selenium来进行爬取更为简单,selenum作为一个测试工具,主要配合无窗口浏览器phantomjs来使用. import re from seleni ...

  7. Windows下配置scrapy需要MVC的14.0版本(转载)

    转载于--http://blog.csdn.net/MrWilliamVs/article/details/77130965 杨煜冬煜杨的博客,他的博客比较杂,Java.Python都有--http: ...

  8. android 获得系统时间

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...

  9. 【转】 使用 Python 获取 Linux 系统信息

    在本文中,我们将会探索使用Python编程语言工具来检索Linux系统各种信息.走你. 哪个Python版本? 当我提及Python,所指的就是CPython 2(准确的是2.7).我会显式提醒那些相 ...

  10. Android中查看服务是否开启的工具类

    这个也是昨天学习的,做下总结. 检查服务是否开启要写成一个工具类,方便使用,传服务的名字返回Boolean值,当然,由于须要,还要传一个上下文context. 说一下这个工具类的几个关键点: 1.方法 ...