总线设备驱动模型

总线设备驱动模型

一个总线设备驱动包含三个元素:总线驱动设备

总线是处理器设备之间的同道,在设备模型中,所有的设备都通过总线相连,甚至是内部的虚拟“platform”总线。

 

总线:

描述总线的数据结构如下:

 

总线注册和删除使用:

 

下面介绍几个比较重要的总线方法:

 

 

总线属性Buf_attribute的结构定义如下:

 

 

而总线设备和总线属性的结合和解除如下:

 

 

设备:

Linux系统中的每一个总线设备由一个struct device描述:

 

 

设备的注册与注销:

 

 

设备属性由struct device_attribute描述:

 

 

设备属性的创建与删除:

 

 

驱动:

驱动程序由struct device_driver描述:

 

 

驱动注册与注销:

 

 

驱动的属性使用struct driver_attribute来描述,其中attr代表一个文件,showstore代表读写:

 

 

驱动属性的创建与删除:

 

 

 

注意:昨天一边玩一边学,恶果深重,今天从新把代码写一遍。

 

1._init是告诉操作系统,带着这个标示符的函数,调用一次就可以从内存中删除了。

 

2.宏定义中的##号代表连接。

 

 

3.总线也是一种设备,所以注册总线的时候也要注册总线设备。

 

4.热插拔:带电插拔,比如没有关机的情况下插拔硬件。

 

5.当拔掉一个设备后会调用驱动的remove函数,当驱动连接一个设备的时候会调用prob函数。

 

6初始化总线,设备,驱动的区别:

总线:                

 

设备:

 

驱动:

 

 

Platform平台驱动:

Platform总线是linux2.6内核加入的一种虚拟总线platform机制本身使用并不复杂,由两部分组成:Platform_deviceplatform_driver

Platform驱动与传统的设备驱动模型相比,优势在于platform机制将设备本身的资源注册进内核,有内核统一管理,在驱动程序使用这些资源时使用统一的接口,这样提高了程序的可移植性。

通过platform机制开发底层设备驱动的流程如图:

 

 

平台设备:

  挂到platform总线上的设备使用struct Platform_device来描述:

 

struct Platform_device使用如下函数:

 

 

平台设备的注册如下:

 

 设备的资源描述结构体如下:

 

  下面是设备资源的例子:

 

可以通过如下的方式获取设备的资源:

 

    一个平台设备内核模块的典型编写方式如下:

 

 

平台驱动:

平台驱动描述的数据结构struct platform_driver

 

 

平台驱动注册函数:

 

下面是编写平台驱动内核模块的一个例子:

 

 

中断处理:

 

 

中断的注册:

注册函数如下:

 

 

其中flags的可能值如下:

 

快速中断和慢中断:

 

 

共享中断:

 

 

注意:

1. 共享中断的dev_id是唯一的。

2. 共享中断不能使用disable_irq(),否则会导致其他使用这个中断的硬件设备也无法中断。

 

 

 

 

使用完毕后应该释放中断:

 





原文地址:https://www.cnblogs.com/dchipnau/p/5010059.html