转自:http://blog.csdn.net/vipwangzs/article/details/4134941
总线、设备和驱动的主要结构定义:
struct bus_type:
1、devices
2、drivers
struct device:
1、struct bus_type *bus:设备所连接的总线
2、struct device_driver *driver:设备使用哪个驱动(一个设备只绑定一个驱动)
struct device_driver:
1、struct bus_type *bus:驱动属于哪根总线
2、struct device *devices:驱动支持哪些设备(一个驱动可以支持多个设备)定给一个驱动程序.
总线、设备和驱动的如何建立联系:
设备核心代码(以USB为例)会进行整个USB系统的初始化,主要工作有:
1、申请struct bus_type usb_bus_type,
2、扫描usb总线,看线上连接了哪些usb设备,或者说root hub上连了哪些usb设备,比如说连了一个usb键盘,那么就为它准备一个struct device,根据它的实际情况,为这个struct device赋值,并插入devices链表中来.又比如root hub上连了一个普通的hub,那么除了要为这个hub本身准备一个struct device以外,还得继续扫描看这个hub上是否又连了别的设备,有的话继续重复之前的事情,这样一直进行下去,直到完成整个扫描,最终就把usb_bus_type中的devices链表给建立了起来.这样就建立devices链表。这个链表是由USB总线主动来完成的。
3、drivers链表由每一个driver本身去bus上面登记,或者说挂牌.具体到usb系统,每一个usb设备的驱动程序都会有一个struct usb_driver结构体。例如:usb_register将device_driver插入到usb_bus_type的drivers链表中去。而usb_deregister将device_driver从usb_bus_type将device_driver从usb_bus_type的drivers链表中删除
4、device_driver和device如何建立关系呢?
古老的方式:
a、先有device,每一个要用的device在计算机启动之前就已经插好了,插放在它应该在的位置上,然后计算机启动,然后操作系统开始初始化,总线开始扫描设备,每找到一个设备,就为其申请一个struct device结构,并且挂入总线中的devices链表中来;
b、然后每一个驱动程序开始初始化,开始注册其struct device_driver结构,然后它去总线的devices链表中去寻找(遍历),去寻找每一个还没有绑定driver的设备,即struct device中的struct device_driver指针仍为空的设备,然后它会去观察这种设备的特征,看是否是他所支持的设备,如果是,那么调用一个叫做device_bind_driver的函数,然后他们就结为了秦晋之好.
现在的方式:
device可以在任何时刻出现,而driver也可以在任何时刻被加载,所以,出现的情况就是,每当一个struct device诞生,它就会去bus的drivers链表中寻找自己的另一半,反之,每当一个一个struct device_driver诞生,它就去bus的devices链表中寻找它的那些设备.如果找到了合适的,那么ok,和之前那种情况一下,调用device_bind_driver绑定好.如果找不到,没有关系,等待