mmc rescan简析
mmc rescan是mmc host的detect work的功能函数,该函数用于探测目标卡的类型并且根据mmc/sd/sdio协议进行comm的初始化。
void mmc_rescan(struct work_struct *work)
{static const unsigned freqs[] = { 400000, 300000, 200000, 100000 };struct mmc_host *host =container_of(work, struct mmc_host, detect.work);int i;bool extend_wakelock = false;if (host->rescan_disable)return;mmc_bus_get(host);/** if there is a _removable_ card registered, check whether it is* still present*/if (host->bus_ops && host->bus_ops->detect && !host->bus_dead&& !(host->caps & MMC_CAP_NONREMOVABLE))host->bus_ops->detect(host);//这里所做的事情:当我们进入delay work时,我们首先要检查一下,目标卡是否依然存在,如果仍然存在而且目标卡是可插拔的,那么我们需要先将该卡在内核留下的一些痕迹清除,重新探测该卡。所以一般如果是目标卡复位的话,一般是调用内核提供的专用的复位接口(如sdio_reset_comm等),而不是调度host的这个delay work,host->detect_change = 0;/* If the card was removed the bus will be marked* as dead - extend the wakelock so userspace* can respond */if (host->bus_dead)extend_wakelock = 1;/** Let mmc_bus_put() free the bus/bus_ops if we've found that* the card is no longer present.*/mmc_bus_put(host);mmc_bus_get(host);/* if there still is a card present, stop here */if (host->bus_ops != NULL) { //判断是否bus的引用计数是否为0,如果不为0 ,说明bus仍然被引用,不能再继续下面的探测了。mmc_bus_put(host);goto out;}/** Only we can add a new handler, so it's safe to* release the lock here.*/mmc_bus_put(host);if (host->ops->get_cd && host->ops->get_cd(host) == 0)goto out;mmc_claim_host(host);for (i = 0; i < ARRAY_SIZE(freqs); i++) {if (!mmc_rescan_try_freq(host, max(freqs[i], host->f_min))) {extend_wakelock = true;break;}if (freqs[i] <= host->f_min)break;}mmc_release_host(host);out:if (extend_wakelock)wake_lock_timeout(&host->detect_wake_lock, HZ / 2);elsewake_unlock(&host->detect_wake_lock);if (host->caps & MMC_CAP_NEEDS_POLL) {wake_lock(&host->detect_wake_lock);mmc_schedule_delayed_work(&host->detect, HZ);}
}
mmc rescan简析相关推荐
- 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析
目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...
- 简析平衡树(三)——浅谈Splay
前言 原本以为\(Treap\)已经很难了,学习了\(Splay\),我才知道,没有最难,只有更难.(强烈建议先去学一学\(Treap\)再来看这篇博客) 简介 \(Splay\)是平衡树中的一种,除 ...
- 基于libmad库的MP3解码简析
基于libmad库的MP3解码简析 MAD (libmad)是一个开源的高精度 MPEG 音频解码库,支持 MPEG-1(Layer I, Layer II 和 LayerIII(也就是 MP3). ...
- 简析 .NET Core 构成体系
简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...
- Python源码学习:内建类型简析并简析int对象
Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一篇文章中已经大致分析了下,Python的启动执行流程,现在我们分析一下Pytho ...
- Python源码学习:启动流程简析
Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> Python简介: python主要是动态语言,虽然Python语言也有编译,生成中 ...
- 简析TCP的三次握手与四次分手【转】
转自 简析TCP的三次握手与四次分手 | 果冻想 http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇 ...
- ceph存储原理_Ceph存储引擎BlueStore简析
前文我们创建了一个单节点的Ceph集群,并且创建了2个基于BlueStore的OSD.同时,为了便于学习,这两个OSD分别基于不同的布局,也就是一个OSD是基于3中不同的存储介质(这里是模拟的,并非真 ...
- Android Jetpack组件App Startup简析
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Webpack模块化原理简析
webpack模块化原理简析 1.webpack的核心原理 一切皆模块:在webpack中,css,html.js,静态资源文件等都可以视作模块:便于管理,利于重复利用: 按需加载:进行代码分割,实现 ...
最新文章
- 浏览器及时感知服务端数据变化的方式
- double free or corruption (fasttop)
- Reactive Streams
- 科沃斯机器人双十一全渠道成交额超7亿 两大爆款单品携手破亿
- 程序员面试题精选100题(43)-n个骰子的点数[算法]
- Rancher upgrade webhook之CI/CD
- 前沿分享|阿里云数据库解决方案资深专家 李圣陶:云原生数据库解决方案 加速企业国产化升级
- java servlet 输出_JavaWeb中servlet读取配置文件的方式
- 使用log4j2打印mybatis的sql执行日志
- Address already in use: JVM_Bindnull:8080
- Android实现计算器布局(相对布局)
- 多媒体计算机教室的使用与管理,焦作师范高等专科学校多媒体教室使用管理规定...
- AndroidStudio一键国际化方案
- HTML5 Canvas API详解
- 【期刊会议】机器学习深度学习 + 计算机视觉(To be continued..)
- 01.【设计模式】工厂模式
- Linux Capability探索实验
- 计算机网络实训报告总结,学习计算机网络的实训总结
- 实践材料1(感谢刘望的翻译)
- 快速查询出中通快运物流信息,将信息导出EXCEL表格
热门文章
- 利用openFrameWork、ofxFaceTrack制作的虚拟眼镜加载系统
- android adb安装 apk,adb 安装并运行 apk
- python截图并识别文字
- 从iRedMail 创建web服务学习Nginx
- 大文件上传插件webupload插件
- 手把手教你php调用短信接口(smsapi)实现发送短信验证码
- 【第三方互联】2、创建腾讯QQ互联应用
- python语言的多行注释以什么开头_python实现多行注释的方法
- 用这本书《现在,发现你的优势》,识别了自己的典型优势
- rs485的1:n计算机连接和n:n的主从plc通讯,富士人机界面与GE90-70 PLC N:1通讯在轧钢生产线的应用...