嵌入式Linux驱动学习之路(二十一)字符设备驱动程序总结和块设备驱动程序的引入
字符设备驱动程序
应用程序是调用C库中的open read write等函数。而为了操作硬件,所以引入了驱动模块。
构建一个简单的驱动,有一下步骤。
1. 创建file_operations
2. 申请设备号
3. 注册字符设备驱动,
4. 驱动入口
5. 驱动出口
检查数据是否到来的方式:
1. 查询方式
2. 休眠唤醒方式
如果设备出现异常而无法唤醒时,则将永远处于休眠状态。
3. poll机制
如果没有被唤醒,则在一定时间内可自己唤醒。
4. 异步通知(信号)
而以上的几种方式通用性不高,为了增强通用性,使用输入子系统。
块设备驱动程序
在读取硬盘的时候,磁头需要定位,但是定位是非常损耗时间的。
flash的操作也是一样的。在写之前需要擦除整块。
如果我们现在进行一下操作:1.写扇区0 2.写扇区1
1. 写扇区0:
读出整块到buffer
修改buffer中相应的内容,
擦除整块
写入整块
2.读扇区1则是重复上述步骤。
而上述的方法在操作的时候太过于繁杂,浪费时间。所以操作系统在处理的时候优化了一次。
1. 把读写放入队列
2.调用队列的处理函数(优化/调顺序/合并)
块设备驱动程序框架:
---------------------------------------------------------(文件的读写)
app: open、write、read等 (把对文件的读写转化为对扇区的读写)
----------------------------------------------------------
文件系统: vfat、ext2、ext3、yaffs2、jffs2
------------------ ll_rw_block --------------------------
块设备驱动程序
----------------------------------------------------------
硬件: 硬盘、Flash
----------------------------------------------------------
分析 ll_rw_block :(1. 把“读写”放入队列 2. 调用队列的处理函数( 优化 / 调顺序 / 合并 ))
for (i = 0; i < nr; i++) {
struct buffer_head *bh = bhs[i];
submit_bh(WRITE, bh);
struct bio *bio; //使用bh来构造bio (block input/output)
submit_bio(rw, bio); //通用的构造请求:使用bio来构造请求(request)
generic_make_request(bio);
__generic_make_request(bio);
request_queue_t *q = bdev_get_queue(bio->bi_bdev); //找到队列
ret = q->make_request_fn(q, bio); //默认函数是__make_request
__make_request
elv_merge(q, &req, bio); //尝试合并
init_request_from_bio(req, bio); //如果尝试合并不成功 使用bio构造请求
add_request(q, req); //把请求放入队列
__generic_unplug_device(q); //执行队列
q->request_fn(q); //调用队列的处理函数
}
如何编写块设备驱动程序呢?
1. 分配gendisk
2. 设置
2.1分配/设置队列: request_queue_t //提供读写能力
blk_init_queue
2. 2 设置gendisk其他信息 //提供属性:容量,扇区大小等
3. 注册: add_disk
嵌入式Linux驱动学习之路(二十一)字符设备驱动程序总结和块设备驱动程序的引入的更多相关文章
- 嵌入式Linux驱动学习之路(二十七)字符设备驱动的另一种写法
之前讲的字符设备驱动程序,只要有一个主设备号,那么次设备号无论是什么都会和同一个 struct file_operations 结构体对应. 而本节课讲的是如何在设备号相同的情况下,让不同的次设备号对 ...
- 嵌入式Linux驱动学习之路(二十四)Nor Flash驱动程序
Nor Flash和Nand Flash的不同: 类型 NOR Flash Nand Flash 接口 RAM-like,引脚多 引脚少 容量 小(1M.2M...) 大(512M.1G) 读 简 ...
- 嵌入式Linux驱动学习之路(二十三)NAND FLASH驱动程序
NAND FLASH是一个存储芯片. 在芯片上的DATA0-DATA7上既能传输数据也能传输地址. 当ALE为高电平时传输的是地址. 当CLE为高电平时传输的是命令. 当ALE和CLE都为低电平时传输 ...
- 嵌入式Linux驱动学习之路(二十)USB设备驱动
USB在接入系统的时候,以0的设备ID和主机通信,然后由主机为其分配新的ID. 在主机端,D+和D-都是下拉接地的.而设备端的D-接上拉时,表明此设备为高速设备:12M/s. D+接上拉时则是全速设备 ...
- 嵌入式Linux驱动学习之路(二十五)虚拟网卡驱动程序
一.协议栈层次对比 设备无关层到驱动层的体系结构 1).网络协议接口层向网络层协议提供提供统一的数据包收发接口,不论上层协议为ARP还是IP,都通过dev_queue_xmit()函数发送数据,并通过 ...
- 嵌入式Linux驱动学习之路(二十二)用内存模拟磁盘
安装驱动后,可在/dev/目录下发现已经生成了相应的设备文件. 格式化设备:mkdosfs /dev/ramblock. 挂载设备. 读写设备 . 驱动程序代码: /***************** ...
- 嵌入式Linux驱动学习之路(二十六)DM9000C网卡驱动程序
基于DM9000C的原厂代码修改dm9000c的驱动程序. 首先确认内存的基地址 iobase. 确定中断号码. 打开模块的初始化函数定义. 配置内存控制器的相应时序(结合DM9000C.C的手册). ...
- 嵌入式Linux驱动学习之路(二)u-boot体验
u-boot工程简介 现在的u-boot支持PowerPC.ARM.X86.MIPS体系结构的上百种开发板,已经称为功能最多.灵活性最强,并且开发最积极的开源Bootloader.目前由DENX的Wo ...
- 嵌入式Linux驱动学习之路(十二)按键驱动-poll机制
实现的功能是在读取按键信息的时候,如果没有产生按键,则程序休眠在read函数中,利用poll机制,可以在没有退出的情况下让程序自动退出. 下面的程序就是在读取按键信息的时候,如果5000ms内没有按键 ...
随机推荐
- C++_系列自学课程_第_7_课_数组_《C++ Primer 第四版》
说到数组,大家应该都很熟悉,在C.Pascal.Java等语言中,都有数组的概念.在C++中也提供了对数组的支持.数组简单来说就是一堆相同 数据类型对象的集合. 这里要把握住两个要点: 相同的数据类型 ...
- 最短路径之Floyd算法
Floyd算法又称弗洛伊德算法,也叫做Floyd's algorithm,Roy–Warshall algorithm,Roy–Floyd algorithm, WFI algorithm. Floy ...
- Group-buy项目总结
这是我做的第一个移动端项目,和传统PC端网站不同的是,做移动端的网站要适配各种尺寸的设备. 在默认情况下,移动设备上的viewport都是要大于浏览器可视区域的,这是因为考虑到移动设备的分辨率相对于桌 ...
- 原生JS:RegExp对象详解
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(二)鹰眼模块
讲解GIS功能模块实现之前,先大概说一下flexviewer的核心配置文件config.xml,系统额GIS功能widget菜单布局.系统的样式.地图资源等等都是在这里配置的,这里对flexviewe ...
- 【转】自定义UITableViewCell(registerNib: 与 registerClass: 的区别)
自定义UITableViewCell大致有两类方法: 使用nib 1.xib中指定cell的Class为自定义cell类型(注意不是设置File's Owner的class) 2.调用 tableVi ...
- Android 手机卫士--对话初次设置密码验证过程
本文实现设置密码对话框的逻辑判断 本文地址:http://www.cnblogs.com/wuyudong/p/5940551.html,转载请注明出处. 首先添加上图按钮的监听事件代码 /** * ...
- Xcode 创建.a和framework静态库(转载)
库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. iOS中的静态库有 .a 和 .framework两种形式:动态库有.dylib 和 .framew ...
- php面向对象编程 设计模式
面向对象编程的基本原则: 单一职责:一个类,只需要做好一件事 开放封闭:一个类,应该是可扩展的,而不是可修改的 依赖倒置:一个类,不应该强依赖另一个类.每个类对应另外一个类都是可替换的 配置化:尽可能 ...
- TortoiseSVN和VisualSVN-Server的配置使用,外网访问SVN版本库
TortoiseSVN和VisualSVN-Server的配置使用,外网访问SVN版本库 SVN客户端程序:TortoiseSVN SVN服务器程序:VisualSVN-Server ######## ...