高级驱动——导学

之前我就说过,驱动代码的过程肯定是那一套,但是稍微有点懂点代码的人或者有点面向对象的思维的人看到这种代码肯定会不爽。
第一:我每写一个小小的驱动,只有一个按键的驱动代码量都这么大,要是所有的驱动都这样写那光驱动这一块就可以几十M了,而我们的内核源码才2~3M,(我们的驱动代码以模块的形式,可以直接放在内核中当内核启动之后模块也会加载,也可以在内核加载完成之后,再加载驱动模块到内核中—华为微架构就是利用这种方法)所以肯定会有一种方法去减少我们的代码量。
第二:我们的代码有很多事可以复用的,我一开始想的就是把申请设备号,注册驱动,申请设备节点,还有那些fileoperation等等做成一个头文件用的时候,这样实现的就可以直接调用头文件就可以了,反正对于大多数驱动来说这些过程都一样(你要读数据就统一的一种方法去读数据。。。。)
第三:之前的代码给人一看的感觉就是,不知道从哪里读,逻辑性非常不好,函数跳来跳去,一开始肯定从模块装载入口读,但是它中间又由很多的函数调用(fileoperstion 、int_hande、probe。。。)

这样我们就引入了我们的更高级的驱动方法————高级驱动
———
我们先看初级驱动的驱动步骤:

linux字符设备驱动编程
	1,实现入口函数 xxx_init()和卸载函数 xxx_exit()
	2,申请设备号  register_chrdev_region (与内核相关)
	3,注册字符设备驱动 cdev_alloc  cdev_init  cdev_add (与内核相关)
	4,利用udev/mdev机制创建设备文件(节点) class_create, device_create (与内核相关)
	5,硬件部分初始化
		io资源映射 ioremap,内核提供gpio库函数 (与硬件相关)
		注册中断(与硬件相关)
		初始化等待队列 (与内核相关)
		初始化定时器 (与内核相关)
	6,构建 file_operation结构 (与内核相关)
	7,实现操作硬件方法  xxx_open,xxx_read,xxxx_write...(与硬件相关)

像1.2.3.4.6.7.这些都可以实现统一的标准,然后实现通用性然后代码复用。这样留给我们的事情只有一个:5.
我之前说了我们的想法,那内核是怎么做的呢?和我的一样吗?
————————————————————-——————
这里引入了Linux程序框架和分层的概念:

1,内核引入程序框架思想:代码可重用,可维护,可伸缩
2,通用功能  写一次    可重用性好
3,差异功能  平台不同  可移植性好
4,内核框架采用分层
5,建立设备模型,它外在表现 平台设备驱动(总线,设备,驱动来实现的)
6,面向对象编程方式

那么我们来看一下linux内核驱动的分层是怎么实现驱动的。
在这里插入图片描述
我们将一个驱动代码分成三层:调用层、核心层、硬件对象层。
硬件对象层:
采用面向对象的方法,把硬件的属性(Name,addr…)和方法(驱动的函数)封装在一个结构体中(用c写的
其实用类更好,这样一个设备的数据只能给这个设备的方法使用,更安全)

核心层:
核心层会有链表将硬件和调用层进行匹配(这和bus很像——盲猜一波是总线(先学,后面来改))
而且它的匹配方法也是更据总线来匹配的。
调用层:
与链表进行匹配之后就会根据设备对象里面的函数指针(前面说的方法)来调用函数。实现一些操作
那么这一层应该就是存放着一些实现函数(申请设备、文件操作、申请设备节点、probe…这些函数)
通过函数指针来调用它————————猜的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值