总线设备驱动模型

一、总线模型

linux 2.6开始提供全新的设备模型。

以USB总线为例,假设USB总线上链接鼠标驱动、键盘驱动、网卡驱动等等,此时将网卡插入USB总线上,这是USB总线就会挨个查找总线上的驱动,知道找到相应的网卡驱动,然后将控制权交给网卡驱动,由网卡驱动程序操作设备,同样,在USB总线拔掉网卡时,也会找到相应驱动程序来处理拔掉的事件。

总线:

1、总线描述结构:linux内核中由bus_type结构表示,定义于<linux/device.h>

2、总线注册与注销:注册使用bus_register(struct  bus_type  *bus),若成功新的总线将被添加进系统,并在/sys/bus下看到相应的目录

       注销使用bus_unregister(struct  bus_type  *bus)

模型:①创建总线,定义一个bus_type结构的变量

    ②总线注册bus_register(struct  bus_type  *bus)

    ③总线注销bus_unregister(struct  bus_type  *bus)

注:在编程中一定要加入MODULE_LICENSE("GPL");  用来声明遵循GPL协议



二、驱动

linux系统中由device_driver结构表示。   struct  device_driver{

     const  char    *name ;    总线名称

     struct  bus_type  *bus;     驱动程序所在的总线

     int  (*probe)(struct  device  *dev);    probe与之前的总线结构有关系,当总线上找到对应的驱动程序的时候,总线会调用probe函数对设备进行一些相应的初始化

     ........

    }

驱动注册:int  driver_register(struct  device_driver  *drv);

驱动注销:void  driver_unregister(struct  device_driver  *drv) ;


总线上挂载驱动:声明struct  device_driver,初始化name成员、bus成员 (此时要用到总线内的成员,使用EXPORY_SYMBOL(my_bus_type);输出出来,在另外的模块上extern声明)、probe成员(实现probe函数)

linux内核中由struct_device结构表示设备:

struct_device

{

const  char  *init_name;     设备名字

struct bus_type  *bus;     设备所在的总线

...........

}

设备的注册使用:int  device_register(struct  device  *dev)

设备的注销使用:void  device_unregister(struct  device  *dev)

总线上挂载设备:声明struct_device,初始化init_name,bus成员(与驱动内的bus成员名字要一致),注册设备。

在module_exit()中写入注销设备


在设备连接到总线后,会逐个match驱动,通过两者的名字来匹配,名字相同,则认为驱动匹配成功。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值