SD卡驱动-源代码树分析
来源:互联网 发布:java reference 编辑:程序博客网 时间:2024/06/15 10:40
\mmc_blk_init(void)\register_blkdev(MMC_BLOCK_MAJOR,"mmc")\mmc_register_driver(&mmc_driver);\(&mmc_driver)->drv.bus=&mmc_bus_type;\driver_register(&(&mmc_driver)->drv);module_init(mmc_blk_init)struct bus_type mmc_bus_type={.match = mmc_bus_match;.probe = mmc_bus_probe;};\mmc_bus_probe(struct device *dev)\drv->probe();struct mmc_driver mmc_driver={.probe = mmc_blk_probe;}\mmc_blk_probe(card)\struct mmc_blk_data *md;\md = mmc_blk_alloc(card);\mmc_blk_readonly(card)\alloc_disk(1<<MMC_SHIFT)\mmc_init_queue\blk_init_queue(mmc_request,lock)//mmc_request里面有wake_up_process\blk_queue_prep_rq\blk_queue_ordered\kthread_run(mmc_queue_thread,mq,"mmcqd")\md->queue.issue_fn = mmc_blk_issue_rq\常规的gendisk赋值工作\mmc_blk_set_blksize\mmc_claim_host//一个控制器可以服务多个对象所以需申请\mmc_wait_for_cmd\mmc_releaes_host//释放控制器\mmc_set_drvdata //\add_disk//使用add_disk向内核注册块设备驱动struct mmc_blk_data{struct gendisk * disk;struct mmc_queue queue;}struct mmc_queue{struct request *req;struct request_queue *queue;}\mmc_request(q)\wake_up_process(q->queuedata->thread)\try_to_wake_up(mq->thread,TASK_ALL,0)\...\mmc_queue_thread(void *d)\down(&d->thread_sem)//获得线程的信号量\set_current_state(TASK_INTERRUPTIBLE)//设置当前线程运行状态为可中断\up(&d->thread_sem)//释放线程的信号量\schedule();//内核发起调度\mq->issue_fn(d,req)\mmc_blk_issue_rq\mmc_claim_host\brq.mrq.cmd = &brq.cmd//因为struct mmc_request中的内容为指针,所以需要指代 \brq.mrq.data = &brq.data\mmc_queue_map_sg\mmc_wait_for_req(card->host,*brq.mrq)struct mmc_blk_request{struct mmc_request mrq;//传递给core和host层的一个mmc封装请求struct mmc_command cmd;struct mmc_command stop;struct mmc_data data;}部分card层与core层的接口函数:mmc_claim_host();mmc_release_host();mmc_wait_for_req();mmc_wait_for_cmd();
几个代码树结构:
\blk_init_queue(rfn,lock)
\blk_init_queue_node(rfn,lock,-1)
\q->request_fn = rfn;
\blk_queue_make_request(q,__make_request)
\q->make_request_fn=__make_request;
blk_init_queue是和blk_cleanup_queue搭配使用的
\mmc_wait_for_cmd(host,cmd,retries)\mmc_wait_for_req(host,mrq)\mmc_start_request(host,mrq)\host->ops->request(host,mrq)\mrq->done_data = &complete\mrq->done = mmc_wait_done\wait_for_completion(&complete)
0 0
- SD卡驱动-源代码树分析
- SD卡驱动分析
- SD卡驱动分析
- SD卡驱动分析
- SD卡驱动分析
- sd卡驱动分析
- SD卡驱动分析
- SD 卡 linux 驱动分析
- linux SD卡驱动分析
- linux sd卡驱动分析
- linux sd卡驱动分析
- linux SD卡驱动分析
- linux sd卡驱动分析
- linux SD卡驱动分析
- SD卡驱动分析(一)
- SD卡驱动分析(二)
- linux sd卡驱动分析
- linux sd卡驱动分析
- HTML位置感知
- Multiply Strings
- oj抽象类
- C++阳历转阴历算法及实现
- atof实现(c++)
- SD卡驱动-源代码树分析
- 最大公约数(递归与非递归实现),最小公倍数
- 在 CodeIgniter 2中集成 Smarty 3 模板引擎
- 通过连接池和字段索引,提升单点登录cas的性能
- 详解CSS相对定位,绝对定位与固定定位
- java基础加强_JDK1.5线程并发库
- ftk学习记(滑动条篇)
- iOS学习:UILabel和sizeWithFont方法
- initrd