一、总线模型
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驱动,通过两者的名字来匹配,名字相同,则认为驱动匹配成功。