Chinaunix首页 | 论坛 | 博客
  • 博客访问: 254149
  • 博文数量: 106
  • 博客积分: 535
  • 博客等级: 下士
  • 技术积分: 1020
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-27 14:13
文章分类

全部博文(106)

文章存档

2021年(10)

2020年(4)

2019年(2)

2018年(5)

2017年(6)

2016年(10)

2015年(15)

2014年(16)

2013年(25)

2012年(9)

2010年(4)

我的朋友

分类: Android平台

2015-07-17 11:08:29

通用的快设备函数
Linux的快设备的输入输出请求操作,都会向快设备发送一个请求,在驱动中用request表示.但是磁盘像比较速度比较慢,所以这些请求会被放入一个请求队列.在向快设备提交请求前,会先合并响应的请求,优化速度.
申请块设备号,表明这个快设备号已经被占用.Mmc中是在注册mmc驱动前申请的快设备编号.
创建一个通用块设备结构gendisk,创建一个工作队列request_queue,并提供一个制造请求函数.
将这个gendisk添加到系统中.
当文件系统层产生数据请求后,会将请求封装为一个request,并挂在到request_queue中,此时我们提供的制造请求函数,就可以将对应的扇区数据返回给对应的request,完成一次数据传输.

MMC快设备驱动
MMC驱动首先需要实现MMC Controler的驱动,也即是mmc_host。当发生一个卡插入事件后,mmc_host通过调用mmc_rescan,利用mmc comand,检查插入的是什么设备mmc card亦或是sdio的wifi设备。
假设为一个mmc卡。那么随后通过mmc command读取mmc里面寄存器的值,得到卡的一些属性信息,包含卡的大小,内置分区信息。有这些信息去建立一个MMC快设备。
这里又会涉及到一些结构
Mmc_card代表了一个mmc卡设备,当mmc_host检测到存在一个mmc_card后,那么会创建一个mmc_card设备。这就是一个kernel的device。当然同样需要建立一个mmc_card的driver,也就是mmc_driver。
在mmc_driver里面,有一个通用的结构 mmc_blk_data代表这一个卡快设备,同时在mmc_driver中就会创建块设备,对应的快设备的请求队列,这里通用的块设备请求队列包含在mmc_queue中,

点击(此处)折叠或打开

  1. Struct mmc_blk_data {
  2.    /* 这是一个通用的快设备结构,
  3.       在mmc_driver中,通过alloc_disk, add_disk创建和添加到系统中。 */
  4.    Struct gendisk *disk;
  5.    //这里是一个mmc_queue,里面对应有一个快设备的request_queue.面向对象的思想
  6.    Struct mmc_queue {
  7.        Struct mmc_card *card;
  8.        /* 重要的是这个thread,我们在cat /proc/process里面看到的mmcqd/1名字的进程就是.
  9.            Kthread_run(mmc_queue_thread, mq, “mmcqd/%d%s”, host->index, subname);
  10.           这个就是mmc数据传输服务线程,当快设备通过request_queue传入后,仅仅是唤醒了这个线程,这个线程才是真正执行数据传输的地方.
  11.           然而具体的数据传输,优势通过下面的issue_fn来完成的 */
  12.        Struct task_struct *thread;
  13.        /* thread取出对应的queue后,就通过这个函数对应到具体的mmc数据请求 */
  14.        Int (*issue_fn)(struct mmc_queue *, struct request *);
  15.        /* 通过blk_init_queue,传入请求函数mmc_request,来创建 */
  16.        Struct request_queue *queue; /
  17.    } queue;
  18.  }


阅读(1400) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~