Driver的注册
Driver的prob的调用顺序
可以从bus_attach_device()看起,
1 bus_attach_device()调用device_attach(dev)
2 device_attach(): 调用bus_for_each_drv()遍历bus上的每个driver,当找到一个driver则用__device_attach()来判断是否匹配
3 __device_attach(): 直接调用driver_probe_device(drv, dev)
4 driver_probe_device(): 首先如果driver所在总线有match函数则先调用这个match来匹配,如不匹配则直接返回错误,否则接着调用really_probe(dev,drv)
5 really_probe(): 先判断dev所在总线是否有probe函数,有则调用它来匹配,失败则返回,正确则成功,如果总线没有probe则判断drv是否有probe函数,有则调用并匹配它.
6 drv->prob(): 一般它是一类设备的probe,在它里面它会调用具体某个drv的probe函数,这个函数是在我们的驱动程序里面注册的.
下面以usb acm驱动为例:
1 注册: usb_register()注册我们的usb_driver对象;里面含有一个probe函数.并含有一个device_driver对象(其实这个对象才是真正注册到系统理的驱动对象)
2 Usb_register(): 调用usb_register_driver()
3 usb_register_driver(): 填充device_driver对象(包括一个usb_probe_interface函数,即USB设备类通用的probe函数), 最后通过driver_register注册这个device_driver.
Probe过程.
新的usb设备连上机器后, hub_port_connect_change会被调用