继之前的文章mmc_rescan之后,我们来分析一下mmc_rescan_try_freq,顾名思义,就是用不同的clock去尝试初始化与目标卡的连接。

static int mmc_rescan_try_freq(struct mmc_host *host, unsigned freq)
{host->f_init = freq; //根据mmc_recan函数传进来的参数知道,首先传进来的是400kHZ.一般mmc/sd/sdio的初始化时钟采用的是400kHZ.#ifdef CONFIG_MMC_DEBUGpr_info("%s: %s: trying to init card at %u Hz\n",mmc_hostname(host), __func__, host->f_init);
#endif
1.  mmc_power_up(host); //上电,我们知道,在mmc_add_host时,会调用mmc_start_host,而那里首先是将host掉电的。这里上电。/** Some eMMCs (with VCCQ always on) may not be reset after power up, so* do a hardware reset if possible.*/mmc_hw_reset_for_init(host); //复位硬件,可以选择性实现。/* Initialization should be done at 3.3 V I/O voltage. */mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0);//这里其实什么事情都没做,因为一般host控制器并不会实现host->ops->start_signal_voltage_switch/** sdio_reset sends CMD52 to reset card.  Since we do not know* if the card is being re-initialized, just send it.  CMD52* should be ignored by SD/eMMC cards.*/2. sdio_reset(host);//①如果目标卡是纯SD卡(对MMC卡不了解,所以不加评论),则目标卡不会应答,一般主机host的寄存器会报错,但是这个无关紧要,可以不理它。②如果目标卡是纯SDIO卡,那么这里就是复位SDIO卡,通过命令CMD52来实现的。③如果目标卡是SD卡和SDIO卡的组合卡,则需要先发送CMD52来复位SDIO卡,再复位SD卡,因为CMD52要先于CMD0发送。When the host re-initializes both I/O and Memory controllers, it is strongly recommended that the host either execute a power reset (power off then on) or issues a reset commands to both controllers prior to any other operation. If the host chooses to use the reset commands, it shall issue CMD52 (I/O Reset) first, because it cannot issue CMD52 after CMD0 (see 4.4). After the reset, the host shall re-initialize both the I/O and Memory controller as defined in Figure 3-2.(协议)3. mmc_go_idle(host); //发送CMD0 复位SD卡。4. mmc_send_if_cond(host, host->ocr_avail); //为了支持sd version 2.0以上的sd卡,在初始化的过程中必须在发送ACMD41之前,先发送CMD8,CMD8一般是用于检测SD卡是否能运行在host提供的电压范围内。大家可能发现,这个调用过程没有检查是否出错,其实一般CMD8是用来辨别目标卡是否是高容量SD卡,如果是,CMD8 会有R7应答,R7应答中会有目标SD卡支持的电压范围以及CMD8中发送过去的“check pattern(一般是0xAA)”,否则,目标卡不会应答,在Linux 内核代码中,判断是这样的,如果应答,目标卡就是SD高容量卡,否则出现应答超时错误,就是标准SD卡!这里的调用,主要作用是为了在发送ACMD41之前发送CMD8,这是version 2.0及以上的规定顺序,后面还会有发送CMD8的地方,那里才是真正检测目标卡的类型的地方。/* Order's important: probe SDIO, then SD, then MMC */5 .if (!mmc_attach_sdio(host))return 0;6.if (!mmc_attach_sd(host))return 0;7.if (!mmc_attach_mmc(host))return 0;Linux 卡的探测顺序是:先辨别卡是否是sdio功能卡或者是sdio与sd卡的组合卡,然后辨别是否是SD卡,最后才会辨别是否是mmc卡。mmc_power_off(host); return -EIO;
}

mmc_rescan_try_freq 简析相关推荐

  1. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  2. 简析平衡树(三)——浅谈Splay

    前言 原本以为\(Treap\)已经很难了,学习了\(Splay\),我才知道,没有最难,只有更难.(强烈建议先去学一学\(Treap\)再来看这篇博客) 简介 \(Splay\)是平衡树中的一种,除 ...

  3. 基于libmad库的MP3解码简析

    基于libmad库的MP3解码简析  MAD (libmad)是一个开源的高精度 MPEG 音频解码库,支持 MPEG-1(Layer I, Layer II 和 LayerIII(也就是 MP3). ...

  4. 简析 .NET Core 构成体系

    简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...

  5. Python源码学习:内建类型简析并简析int对象

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一篇文章中已经大致分析了下,Python的启动执行流程,现在我们分析一下Pytho ...

  6. Python源码学习:启动流程简析

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> Python简介: python主要是动态语言,虽然Python语言也有编译,生成中 ...

  7. 简析TCP的三次握手与四次分手【转】

    转自 简析TCP的三次握手与四次分手 | 果冻想 http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇 ...

  8. ceph存储原理_Ceph存储引擎BlueStore简析

    前文我们创建了一个单节点的Ceph集群,并且创建了2个基于BlueStore的OSD.同时,为了便于学习,这两个OSD分别基于不同的布局,也就是一个OSD是基于3中不同的存储介质(这里是模拟的,并非真 ...

  9. Android Jetpack组件App Startup简析

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  10. Webpack模块化原理简析

    webpack模块化原理简析 1.webpack的核心原理 一切皆模块:在webpack中,css,html.js,静态资源文件等都可以视作模块:便于管理,利于重复利用: 按需加载:进行代码分割,实现 ...

最新文章

  1. 【Nginx】面试官:给我讲讲Nginx如何实现四层负载均衡?
  2. c语言自动机的建立,C语言最优状态机规范
  3. 架构设计文章读后感7
  4. Java黑皮书课后题第4章:*4.5(几何:正多边形的面积)正多边形是一个具有n条边的多边形,它每条边的长度都相等,而且所有角的度数也相等。编写程序,提示用户数输入边个数和边长,然后显示它的面积
  5. 实验16 编写包含多个功能子程序的中断例程
  6. 字节跳动证实28岁员工离世;《英雄联盟》回应服务器崩了:官方直接回退了旧版本;Deno 1.19 发布|极客头条...
  7. 小tips:JS语法之标签(label)
  8. Linux下c编程设置串口属性和读写串口操作说明总结
  9. 高新计算机考试1-8视频,最新版计算机高新考试 PS 第1单元1-8.doc
  10. 宝塔 python项目管理器2.0 部署django项目 uwsgi
  11. 网络分析系列之十三 Wireshark显示过滤器
  12. java英雄联盟战斗力题目,lol:英雄联盟宇宙的顶尖战力,那些强大的飞升者们...
  13. 微软云服务器机房分布,Azure手把手系列 1:微软中国公有云概述
  14. 给div添加蒙版(遮罩?)
  15. 5. 位操作指令 AND,ORR, TST,BIC
  16. JVM参数解析 Xmx、Xms、Xmn、NewRatio、SurvivorRatio、PermSize、PrintGC
  17. H106OJ | 第二次练习(查找)
  18. spring 代码执行 (CVE-2018-1273)
  19. MYSQL优化之碎片整理
  20. 再见,Python正则表达式!

热门文章

  1. 键盘鼠标录制哪个好用_美商海盗船Scimitar RGB Elite鼠标体验:再多技能也怕这把弯刀...
  2. 手表端adb安装apk
  3. 【矩阵论笔记】Schmidt正交化、标准正交基
  4. 无法导入reg:指定的文件不是注册脚本——兼了解文本格式问题
  5. 蓝桥杯 回文数 C语言版
  6. 计算机八进制 算法视频,八进制算法
  7. puzzle(102)数独
  8. Unity的使用(六):天空盒,灯光和烘焙
  9. BAT机器学习面试题
  10. 微信公众号小程序怎么做 微信公众号小程序制作教程