分类:
2012-12-18 22:44:20
struct bus_type 中为devices 和drivers 准备了两个链表,而代表device 的结构体struct device 中又有两个成员,struct bus_type *bus 和struct device_driver *driver,同样,代表
driver 的结构体struct device_driver 同样有两个成员,struct bus_type *bus 和struct list_head devices,struct device 和struct device_driver 的定义和struct bus_type 一样,
在include/linux/device.h 中
于是我们想知道,关于bus,关于device,关于driver,他们是如何建立联系的呢?换言之,这三个数据结构中的指针是如何被赋值的?绝对不可能发生的事情是,一旦为一条总线申请了一个struct bus_type 的数据结构之后,它就知道它的devices 链表和drivers 链表会包含哪些东西,这些咚咚一定不会是先天就有的,只能是后天填进来的.而具体到usb 系统,完成这个工作的就是
usb core.usb core 的代码会进行整个usb 系统的初始化,比如申请struct bus_type usb_bus_type,然后会扫描usb 总线,看线上连接了哪些usb 设备,或者说root hub 上连了哪些usb 设备,比如说连了一个usb 键盘,那么就为它准备一个struct device,根据它的实际情况,为这个struct device 赋值,并插入devices 链表中来.又比如root hub 上连了一个普通的hub,那么除了要为这个hub 本身准备一个struct device 以外,还得继续扫描看这个hub 上是否又
连了别的设备,有的话继续重复之前的事情,这样一直进行下去,直到完成整个扫描,最终就把usb_bus_type 中的devices 链表给建立了起来.
而此刻我们只需注意到其中的struct device_driver driver 这个成员,usb core 为每一个设备驱动准备了一个函数,让它把自己的这个struct device_driver driver 插入到usb_bus_type 中的drivers 链表中去.而这个函数正是我们此前看到的usb_register.而与之对应的usb_deregister 所从事的正是与之相反的工作,把这个
结构体从drivers 链表中删除.
很久很久以前,在那激情燃烧的岁月里,先有的是device,每一个要用的device 在计算机启动之前就已经插好了,插放在它应该在的位置上,然后计算机启动,然后操作系统开始初始化,总线开始扫描设备,每找到一个设备,就为其申请一个struct device 结构,并且挂入总线中的devices 链表中来,然后每一个驱动程序开始初始化,开始注册其struct device_driver 结构,然后它去总线的devices 链表中去寻找(遍历),去寻找每一个还没有绑定driver 的设备,即struct device 中的struct device_driver 指针仍为空的设备,然后它会
去观察这种设备的特征,看是否是他所支持的设备,如果是,那么调用一个叫做device_bind_driver 的函数,然后他们就结为了秦晋之好.换句话说,把struct device 中的struct device_driver driver 指向这个driver,而struct device_driver driver 把struct device 加入他的那张struct list_head devices 链表中来.就这样,bus,device,和driver,这三者之间或者说他们中的两两之间,就给联系上了.知道其中之一,就能找到另外两个.一荣俱荣,一损俱损.
出现了一种新的名词,叫热插拔.device可以在计算机启动以后在插入或者拔出计算机了.因此,很难再说是先有device 还是先有driver 了.因为都有可能.device 可以在任何时刻出现,而driver 也可以在任何时刻被加载,所以,出现的情况就是,每当一个struct device 诞生,它就会去bus 的drivers 链表中寻找自己的另一半,反之,每当一个一个struct device_driver 诞生,它就去bus 的devices 链表中寻找它的那些设备.如果找到了合适的,那么ok,和之前那种情况一下,调用device_bind_driver 绑定好.如果找不到,没有关系,等待吧,等到昙花再开,等到风景看透,心中相信,这世界上总有一个人是你所等的,只是还没有遇到而已。