搜到一份不错的
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页纸,基本上内核的基本知识点都有涉及。过程是痛苦的,结果是清晰的。
主要的框架就是这样,如有不同看法,希望批评指正,相互讨论。
阅读(1238) | 评论(0) | 转发(2) |