Chinaunix首页 | 论坛 | 博客
  • 博客访问: 156703
  • 博文数量: 91
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 25
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-19 01:02
文章分类

全部博文(91)

文章存档

2016年(75)

2014年(16)

我的朋友

分类: LINUX

2016-07-14 14:43:03

原文地址:sd卡驱动分析 作者:bough22

搜到一份不错的 linux SD卡驱动分析.doc   sd卡驱动解析,挺详细的,站在巨人的肩膀上看驱动,哈哈!花了半个月结合源码仔细看了一下,终于理清了sd驱动,还是挺有收获的。

首先是core层注册总线
接着是card层和host的init
     先讲card层:通过probe创建一个线程,while死循环,内有schedule,可以由request唤醒,每次有request来到,都唤醒线程,进而执行线程里的issue_fn服务函数,issue_fn调用core层的mmc_wait_for_reg,而mmc_wait_for_reg调用host层的s3cmci_request(即mmc的ops的request)。s3cmci_request通过fifo中断进入中断函数(上半部),而中断函数又通过tasklet触发下半部,下半部执行数据传输,在通过不停的触发fifo中断,直到数据处理完毕,发送mmc_request_done让s3cmci_request返回,所以issue_fn也返回,进而由于while循环再一次schedule直到下一次request,再一次重复。
    再讲host层:通过probe设置相应属性,和准备工作,初始化了工作队列,延时调用INIT_DELAYED_WORK(&host->detect,mmc_rescan),调用core层的mmc_add_host,mmc_add_host调用device_add注册设备,然后调用mmc_start_host,通过mmc_schedule_delayed_work(&host->detect,0),触发mmc_rescan的调用。mmc_rescan中最后一行为mmc_schedule_delayed_work(&host->detect,HZ),因此mmc_rescan每1秒钟调用一次。mmc_rescan主要完成sd卡的初始化。由于sd卡可以热插拔,所以每一秒扫一下很有必要。在host的probe中注册了卡插入的中断服务函数s3cmci_irq_cd,其中也是调用mmc_schedule_delayed_work来重新调用mmc_rescan的。

流程图我画了9页纸,基本上内核的基本知识点都有涉及。过程是痛苦的,结果是清晰的。

主要的框架就是这样,如有不同看法,希望批评指正,相互讨论。
阅读(470) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~