一、总线驱动设计过程
总线驱动数据结构定义,struct bus_type ,主要需要定义的是name 和match 成员,uevent为热插拔的前对环境变量的设置。定义一个总线设备,对于CPU核心来说,总线也只是一个外设而已,所以需要定义总线设备,struct device ,主要要定义的成员是BUS_ID 和 release 两个成员。定义总线属性BUS_ATTR(version, S_IRUGO, show_bus_version, NULL)。
总线需要的几个基本的对象定义以后,在module_init里注册总线,注册步骤,第一步注册总线,bus_register(struct bus_type),第二步建立属性文件(不是必须)bus_create_file,可以在sys/bus/../可以看到总线属性。第三步注册总线设备(。。。。。)。
在总线驱动中定义设备注册和设备驱动注册的函数。定义包括struct device 成员的自定义_device 数据结构的设备结构,定义包含struct device_driver 的自定义的_driver数据结构的驱动结构,在驱动结构中定义device_driver的probe remove等方法,这些方法为中间的一个重定向作用,便于设备驱动程序中可以自定义这些方法,这些实现的过程在接下来解释。数据都定义好了,接下来就实现两个注册过程:
第一个过程,int register_xx_device(struct xx_device *)
1、设置device 里的bus类型,此类型为把设备注册到总线上。
2、设置 device parent ,指向总线注册的时候注册的总线设备。
3、定义一个dev.release,必须的。
4、COPY一个名字到dev.bus_id中,这个名字要与自定义的driver结构中的.driver成员中的.name成员一致,才能在接下来的注册成功。
5、注册设备自定义中的device成员,device_register
其卸载过程
device_unregister 就可以了,比较简单
第二个过程,设备驱动程序的注册过程:
int register_xxx_driver(struct xxx_driver *)
1、设置设备驱动结构中的device_driver 成员的bus_type
2、在设备驱动程序中定义了probe等方法,则调用总线的probe把设备驱动中的probe等方法注册到内核中去
3、其他一些相关的device_driver定义
4、注册 device_driver
5、属性文件的建立(可选)
二、基于总线的设备驱动设计过程
有了以上总线驱动以后,可以直接调用起定义的设备注册函数和设备驱动注册函数来注册设备。驱动的编写和常规的方法一样,只上在模块加载的时候增加设备注册到总线和设备驱动到总线的注册过程,有一点要注意就是定义的设备的结构中的bus_id和设备驱动中的device_driver.name必须一致,不然设备能被正常注册,而对应的设备驱动在其总线上找不到和其匹配的设备,则注册失败。在成功注册以后,一般会自定义probe函数,其带的参数是自定义的设备的数据结构,在驱动注册到内核的过程中,系统找到与之匹配的设备以后会把这个设备的指针传给probe作为参数使设备驱动能得到这个参数,在此以后,我们可以把其看成是一个句柄来使用,通过这个句秉可以调用总线上的方法,因为总线的方法都是和设备相关的,需要这个设备指针。
附例子源代码
|
文件: |
lddbus.rar |
大小: |
20KB |
下载: |
下载 |
|