Chinaunix首页 | 论坛 | 博客
  • 博客访问: 714013
  • 博文数量: 192
  • 博客积分: 2653
  • 博客等级: 少校
  • 技术积分: 1623
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 18:25
个人简介

How tough life is, how strong you should be!

文章分类

全部博文(192)

文章存档

2015年(1)

2014年(2)

2013年(37)

2012年(152)

分类: LINUX

2012-08-20 14:59:25

搜到一份不错的 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页纸,基本上内核的基本知识点都有涉及。过程是痛苦的,结果是清晰的。

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