1.设备通过device_register函数向bus注册,将device注册到bus的设备链表的尾端,同时试图将设备与总线上的驱动对象进行绑定操作。
2.驱动通过diver_register函数将某一驱动注册到bus的驱动链表上,同时试图将驱动与总线的设备进行绑定操作。
//分析
int device_register(struct device *dev)
{
device_initialize(dev);
return device_add(dev);
bus_probe_device(dev);
if (bus && bus->p->drivers_autoprobe) {
ret = device_attach(dev); //
if (dev->driver) //如果此设备有驱动
{
ret = device_bind_driver(dev);
klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices);
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,BUS_NOTIFY_BOUND_DRIVER, dev);
}else //没有驱动去寻找驱动匹配
{
ret = bus_for_each_drv(dev->bus, NULL, dev, __device_attach); //__device_attach 匹配
}
}
}
static int __device_attach(struct device_driver *drv, void *data)
{
struct device *dev = data;
if (!driver_match_device(drv, dev)) //首先匹配
return 0;
return driver_probe_device(drv, dev); //再调用proble
}
static inline int driver_match_device(struct device_driver *drv,
struct device *dev)
{
return drv->bus->match ? drv->bus->match(dev, drv) : 1; //调用总线的匹配函数
}
int driver_probe_device(struct device_driver *drv, struct device *dev)
{
ret = really_probe(dev, drv);
if (dev->bus->probe) {
ret = dev->bus->probe(dev); //probe
if (ret)
goto probe_failed;
} else if (drv->probe) {
ret = drv->probe(dev); //执行probe
if (ret)
goto probe_failed;
}
}