Android学习笔记之SD卡驱动(1)
来源:互联网 发布:kmp算法next原理 编辑:程序博客网 时间:2024/05/17 08:03
一、SD卡热插拔
识别SD的热插拔都是通过注册GPIO的中断来实现,插入SD卡的时候触发内核中断,在中断例程里面完成sd卡的识别和初始化工作。
下面通过代码来追踪一下。
高通芯片mci的驱动代码在/kernel/drivers/mmc/host/msm_sdcc.c文件中。
内核驱动第一招:
module_init(msmsdcc_init);
告诉我们驱动初始化入口函数是msmsdcc_init,顺着这个函数看
static int __init msmsdcc_init(void)
{
returnplatform_driver_register(&msmsdcc_driver);
}
非常简洁,就是注册了一个平台设备驱动。内核驱动第二招:找probe函数
static int
msmsdcc_probe(struct platform_device *pdev)
{
。。。。
host->stat_irq= stat_irqres->start;
ret =request_irq(host->stat_irq,
msmsdcc_platform_status_irq,
irqflags,
DRIVER_NAME " (slot)",
host);
。。。。
}
让我们找到了关键代码,这段代码注册了一个软中断,中断处理函数是msmsdcc_platform_status_irq。SD卡热插拔处理的庐山真面目就要显露了。
我一直觉得高通的代码阅读起来比较费力,就是他的函数调用层数比较多,这里也一样。
static irqreturn_t
msmsdcc_platform_status_irq(int irq, void *dev_id)
{
struct msmsdcc_host*host = dev_id;
printk(KERN_DEBUG"%s: %d\n", __func__, irq);
msmsdcc_check_status((unsignedlong) host);
return IRQ_HANDLED;
}
代码将我们引导到msmsdcc_check_status
感觉是顺风顺水,但是继续看下去的时候有了迷惑。
调用到mmc_detect_change函数,这个函数里面
mmc_schedule_delayed_work(&host->detect, delay);
让一切又迷惑起来了,host->detect是个什么东西?
还是回到源头probe函数里面,mmc_alloc_host才是我们需要关注的地方,这个函数里面初始化host->detect执行的是mmc_rescan函数,真累,看看mmc_rescan都做了些什么。
七拐八绕,看起来是调用了mmc_rescan_try_freq来看是否存在sd卡。
这里真是花了我不少时间,找到了调用顺序:
mmc_rescan_try_freq -> mmc_attach_sd -> mmc_sd_detect
这个里面有一个中间环节:mmc_sd_attach_bus_ops。这个是mmc检测中断里面的精华,统一了SDI、SD和MMC的热插拔检测。
mmc_attach_sd -> mmc_add_card调用device_add()会产生一个hotplug事件,最终调用mmc_bus_uevent向userspace发消息。
- Android学习笔记之SD卡驱动(1)
- SD卡驱动学习笔记
- 安卓驱动学习笔记1----关于友善之臂SD卡烧写的问题
- 【android学习笔记】读取SD卡
- android SD卡学习1
- Wince SD 卡驱动学习
- wince7下SD host驱动学习笔记
- sd卡--1--驱动
- MMC驱动之SD卡
- SD卡学习笔记
- SD卡学习笔记
- android学习笔记之——获取SD卡及手机ROM容量
- android学习笔记之——获取SD卡及手机ROM容量
- android学习笔记9--------------SD卡读写文件
- (Android学习笔记)读写SD卡文件
- Android酱油笔记之判断SD卡是否存在
- SD卡驱动学习(一)
- SD卡驱动学习(二)
- 真正的优秀程序员有哪些与众不同之处
- 润乾报表打印报错找不到类之解决办法
- [Android]使用ActivityGroup来切换Activity和Layout
- MOSS 2013研究系列---MOSS2013新特性
- Spring Bean Scopes Example
- Android学习笔记之SD卡驱动(1)
- 《coredump问题原理探究》windows版第二章coredump捕获环境配置
- git错误:error: failed to push some refs to
- sql之left join、right join、inner join的区别
- freemarker+struts2+spring
- C# eval()函数浅谈
- 隐藏MOSS2010 左边的导航
- Fxcop ASP.NET Security Rules - 为FxCop定制的ASP.NET安全规则包
- Oracle数据库中的字符处理技巧总结