总线设备驱动模型
一个总线设备驱动包含三个元素:总线,驱动,设备。
总线是处理器和设备之间的同道,在设备模型中,所有的设备都通过总线相连,甚至是内部的虚拟“platform”总线。
总线:
描述总线的数据结构如下:
总线注册和删除使用:
下面介绍几个比较重要的总线方法:
。
总线属性Buf_attribute的结构定义如下:
而总线设备和总线属性的结合和解除如下:
设备:
Linux系统中的每一个总线设备由一个struct device描述:
设备的注册与注销:
设备属性由struct device_attribute描述:
设备属性的创建与删除:
驱动:
驱动程序由struct device_driver描述:
驱动注册与注销:
驱动的属性使用struct driver_attribute来描述,其中attr代表一个文件,show和store代表读写:
驱动属性的创建与删除:
注意:昨天一边玩一边学,恶果深重,今天从新把代码写一遍。
1._init是告诉操作系统,带着这个标示符的函数,调用一次就可以从内存中删除了。
2.宏定义中的##号代表连接。
3.总线也是一种设备,所以注册总线的时候也要注册总线设备。
4.热插拔:带电插拔,比如没有关机的情况下插拔硬件。
5.当拔掉一个设备后会调用驱动的remove函数,当驱动连接一个设备的时候会调用prob函数。
6初始化总线,设备,驱动的区别:
总线:
设备:
驱动:
Platform平台驱动:
Platform总线是linux2.6内核加入的一种虚拟总线,platform机制本身使用并不复杂,由两部分组成:Platform_device和platform_driver。
Platform驱动与传统的设备驱动模型相比,优势在于platform机制将设备本身的资源注册进内核,有内核统一管理,在驱动程序使用这些资源时使用统一的接口,这样提高了程序的可移植性。
通过platform机制开发底层设备驱动的流程如图:
平台设备:
挂到platform总线上的设备使用struct Platform_device来描述:
struct Platform_device使用如下函数:
平台设备的注册如下:
设备的资源描述结构体如下:
下面是设备资源的例子:
可以通过如下的方式获取设备的资源:
一个平台设备内核模块的典型编写方式如下:
平台驱动:
平台驱动描述的数据结构struct platform_driver:
平台驱动注册函数:
下面是编写平台驱动内核模块的一个例子:
中断处理:
中断的注册:
注册函数如下:
其中flags的可能值如下:
快速中断和慢中断:
共享中断:
注意:
1. 共享中断的dev_id是唯一的。
2. 共享中断不能使用disable_irq(),否则会导致其他使用这个中断的硬件设备也无法中断。
使用完毕后应该释放中断: