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