Linux MMC framework2:基本组件之host
声明:本文很多内容和思路参考了http://www.wowotech.net/comm/mmc_host_driver.html,对原作者表示感谢!
1.前言
本文是Linux MMC framework的第二篇,将介绍host对象的基本结构和相应的操作
2.主要数据结构和API
2.1 struct mmc_host
| Elemete Name | struct mmc_host |
| Path | include/linux/mmc/host.h |
| Responsiblities |
mmc core使用struct mmc_host来抽象mmc host controller |
| Attributions |
|
| Operations |
分配一个mmc_host结构体,并对其进行初始化
将host device注册进设备驱动模型,并做host硬件的初始化,向PM core 注册notify, 在本函数完成之前,必须能保证host可以使用
将host device从设备驱动模型移除,并将所有的卡与bus切断连接,向pm core注销notify,将mmc bus掉电
释放mmc_host结构体
对host掉电处理
恢复host上电
检测mmc卡的状态
mmc host在处理完一次request后需要调用此函数来进行后处理
返回支持的操作电压范围
设置regulator以匹配操作电压
通过device tree获取vcc和vccq
用于pm在suspend时做卡移除操作
卡是否被移除
卡在suspend时是否仍然保持供电
sdio中断来时是否会唤醒休眠的系统
是否支持CMD23
是否支持从boot分区访问
返回host支持的访问速率
|
2.2 struct mmc_host_ops
| Elemete Name | struct mmc_host_ops |
| Path | include/linux/mmc/host.h |
| Responsiblities |
主要包含了host contrller 所需要实现的操作 |
| Attributions |
如下的函数可能会sleep,不能在中断上下文中调用:
|
| Operations |
2.3 struct mmc_ios
| Elemete Name | struct mmc_ios |
| Path | include/linux/mmc/host.h |
| Responsiblities | |
| Attributions |
clock: vdd: bus_mode:command输出模式,opendrain or pushpull chip_select:用于SPI片选 power_mode:power supply mode bus_width: timing:时序 signal_voltage:信号电压 drv_type: |
| Operations |
3. 主要流程
3.1 mmc_add_host
mmc_add_host->
mmc_start_host->
mmc_detect_change->
mmc_rescan->
mmc_rescan_try_freq->
mmc_attach_mmc
- mmc_add_host
一般在xxx_mmc_probe中执行mmc_add_host来对sd进行注册并完成相应的初始化
- mmc_start_host
mmc_start_host会调用mmc_detect_change会启动detect的work线程来做mmc检测,对应的线程处理函数为mmc_rescan
- mmc_rescan
对一些边界情况进行处理:
a)如果卡检测禁用了,则直接退出;
b)如果是不可移除的卡,如贴片的eMMC;,则只检测一次退出;
c)如果定义了总线的bus_ops->detect函数,则执行之; 如果host的bus被移除了,就为用户空间准备一把超时锁,为做相关处理争取时间;
调用mmc_bus_put来尝试释放总线,即将host->bus_ops 标记为 NULL;
如果host->bus_ops 不为NULL,说明卡在线,已经扫描过,直接退出;
通过调用host->ops->get_cd来获取卡在线状态,如果不在线作相应处理:mmc_power_off和mmc_release_host;
除去上面几种特殊情况,说明是首次扫描卡,则通过调用mmc_rescan_try_freq进行卡扫描
- mmc_rescan_try_freq
将按照如下的几种频率来对卡进行扫描:
static const unsigned freqs[] = { , , , };
mmc_power_up:主要分两阶段MMC_POWER_UP完成给卡的上电,MMC_POWER_ON完成时钟设置以及对模块CLK EN的使能;
mmc_hw_reset_for_init:对卡做reset(主要是对eMMC卡);
sdio_reset:发送CMD52给SDIO卡作reset,SD/eMMC会忽略这个命令;
mmc_go_idle:发送CMD0,命令的flags一般包括了response类型和CMD类型,对于非SPI模式需要将D3设置为高电平,以防进入SPI模式;arg为0,进入IDLE模式。
这里是按照如下的顺序来进行扫描:SDIO SD MMC
以emmc检测为例,因此扫描时会调用回调mmc_attach_mmc()
- mmc_attach_mmc
主要完成card的初始化(一般是identification mode下),并通过mmc_add_card将mmc_card注册到mmc bus,这样就触发了执行前文所述的mmc_blk_probe函数
TODO
Linux MMC framework2:基本组件之host的更多相关文章
- Linux MMC framework2:基本组件之core
1.前言 本文主要core组件的主要流程,在介绍的过程中,将详细说明和core相关的流程,涉及到其它组件的详细流程再在相关文章中说明. 2.主要数据结构和API TODO 3. 主要流程 3.1 mm ...
- Linux mmc framework2:基本组件之block
1.前言 本文主要block组件的主要流程,在介绍的过程中,将详细说明和block相关的流程,涉及到其它组件的详细流程再在相关文章中说明. 2.主要数据结构和API 2.1 struct mmc_ca ...
- Linux mmc framework2:基本组件之queue
1.前言 本文主要介绍card下queue组件的主要流程,在介绍的过程中,将详细说明和queue相关的流程,涉及到其它组件的详细流程再在相关文章中说明. 2.主要数据结构和API 2.1 struct ...
- Linux mmc framework2:基本组件之mmc
1.前言 本文主要mmc组件的主要流程,在介绍的过程中,将详细说明和mmc相关的流程,涉及到其它组件的详细流程再在相关文章中说明. 2.主要数据结构和API TODO 3. 主要流程 3.1 mmc_ ...
- Linux mmc framework1:软件架构
[部分内容来自] http://www.wowotech.net/comm/mmc_framework_arch.html 1. 前言 由eMMC基础技术1:MMC简介中MMC.SD.SDIO的介绍可 ...
- [MMC]Linux MMC/SD/SDIO驱动分析
转自:http://www.cnblogs.com/cslunatic/p/3678045.html 一.SD/MMC/SDIO概念区分 SD(SecureDigital)与 MMC(Multimed ...
- linux驱动基础系列--Linux mmc sd sdio驱动分析
前言 主要是想对Linux mmc子系统(包含mmc sd sdio)驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.块设备驱动.设备模型等也不进行详细说明原 ...
- (linux)MMC 卡驱动分析
最近花时间研究了一下 MMC 卡驱动程序,开始在网上找了很多关于 MMC 卡驱动的分析文章,但大都是在描述各个层,这对于初学者来讲帮助并不大,所以我就打算把自己的理解写下来,希望对大家有用.个人觉得理 ...
- Linux MMC 驱动子系统简述(源码剖析)
1. Linux MMC 驱动子系统 块设备是Linux系统中的基础外设之一,而 MMC/SD 存储设备是一种典型的块设备.Linux内核设计了 MMC子系统,用于管理 MMC/SD 设备. MMC ...
随机推荐
- 启用SharePoint 2013文档版本控制
cls $PSSnapin = Add-PsSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue | Out-Nul ...
- 洛谷 P4345 [SHOI2015]超能粒子炮·改 解题报告
P4345 [SHOI2015]超能粒子炮·改 题意 求\(\sum_{i=0}^k\binom{n}{i}\),\(T\)组数据 范围 \(T\le 10^5,n,j\le 10^{18}\) 设\ ...
- 【bzoj4818】 Sdoi2017—序列计数
http://www.lydsy.com/JudgeOnline/problem.php?id=4818 (题目链接) 题意 一个长度为$n$的序列,每个元素是不超过$m$的正整数,且这$n$个数的和 ...
- 【ATcoder s8pc_3 F】 寿司
http://s8pc-3.contest.atcoder.jp/tasks/s8pc_3_f (题目链接) 题意 有一个长度为$N$的数列$A$,初始为$0$.$Q$次操作,每次两个参数$x,y$. ...
- Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树)
Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树) Description 一棵树上有n个节点,编号分别 ...
- C# HasRows 和 Read的区别
HasRows:返回true或者false,表示从数据库中读取出来的数据集DataRead是否存在,用来判断是否为空: Read:返回true或者false,Read才是真正的读数据,采用的是顺序读法 ...
- Flash10下复制到剪切板的一种新方法
web开发中常常要实现“复制到剪切板”功能.这个功能很实用,但是由于安全问题,浏览器的限制越来越严,实现的方法也越来越有限了.Firefox默认下不能直接通过Javascript操作剪切板,必须开启相 ...
- KindEditor 4.1.2版本,在上传图片的时候 设置为绝对路径
被这个问题困扰了很久,最终搞定,竟然是如此之简单. 方法如下: 1.打开编辑器目录下的:kindeditor.js 2.修改:urlType : ”, 为:urlType : ‘domain’, ...
- C++中>>,<<的重载问题
在学习对运算符的重载的时候,重载了++,--(前缀后缀),并且都是在定义为类中的成员函数.但是当我尝试去重载>>,<<为某一个类的成员函数的时候,就会报错,无论如何改参数的属性 ...
- SpringBoot 核心配置
1. 入口类和 @SpringBootApplication Spring Boot的项目一般都会有*Application的入口类,入口类中会有main方法,这是一个标准的Java应用程序的入口方法 ...