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 ...
随机推荐
- eclipse中用maven创建web项目
上一节中完成了本地的maven环境搭建,在eclipse中怎么创建一个maven项目呢 一.eclipse中配置maven环境 eclipse版本4.3 1.打开菜单Help->Eclipse ...
- AtCoder Grand Contest 011
AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...
- SharePoint 2013 pre-config
#region 1. add winrm, application server and web server role Add-WindowsFeature winrm-iis-ext, Appli ...
- Java NIO -- 管道 (Pipe)
Java NIO 管道是2个线程之间的单向数据连接. Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 举个例子: package com.soyo ...
- 洛谷P4145 上帝造题的⑦minutes ②
又是线段树. 区间开平方求和,套路题. 如果开到了1就不用再开下去了,否则直接到底. 记得 l > r 时交换 l r #include <cstdio> #include < ...
- Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) D. Labyrinth
http://codeforces.com/contest/1064/problem/D 向上/向下加0,向左/右加1, step = 0,1,…… 求的是最少的步数,所以使用bfs. step=k ...
- 洛谷 P3956 棋盘(BFS)
传送门:Problem P3956 https://www.cnblogs.com/violet-acmer/p/9827010.html 题解: BFS 相关变量解释: color[maxn][ma ...
- poj 3683(2-SAT+SCC)
传送门:Problem 3683 https://www.cnblogs.com/violet-acmer/p/9769406.html 参考资料: [1]:挑战程序设计竞赛 题意: 有n场婚礼,每场 ...
- shell中脚本变量和函数变量的作用域
http://blog.csdn.net/ltx19860420/article/details/5570902 1. shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到she ...
- passat / maintenance / baoyang
s s 南京迎客隆汽车租赁有限公司 / 地址:常府街54号 / 电话:025-84546836 84507610 二手车养不起.修不起?果真如此吗?http://www.che168.com/list ...