以下代碼源於linux3.1.9。
platform_driver_register( ) 是內核中非常著名的函數 。platform_driver_register( )負責註冊平臺驅動程序,如果在內核中找到了使用驅動程序的設備,調用probe( )。刨去參數檢查、錯誤處理,platform_driver_register的主要過程如下:
。。。
{
。。。
return platform_driver_register(&bcm2708_i2c_driver);
。。。
}
int platform_driver_register(struct platform_driver *drv)
{
。。。
return driver_register(&drv->driver);
}
int driver_register(struct device_driver *drv)
{
。。。
ret = bus_add_driver(drv); //platform是一個虛擬總線
。。。
}
int bus_add_driver(struct device_driver *drv)
{
。。。
if (drv->bus->p->drivers_autoprobe) {
error = driver_attach(drv);
if (error)
goto out_unregister;
}
。。。
kobject_uevent(&priv->kobj, KOBJ_ADD); //發送uevent消息
return 0;
。。。
}
int driver_attach(struct device_driver *drv)
{
return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach); //監測到bus設備,調用__driver_attach( )
}
static int __driver_attach(struct device *dev, void *data) //dev 爲使用驅動程式的設備結構體
{
。。。
if (!dev->driver)
driver_probe_device(drv, dev);
。。。
return 0;
}
int driver_probe_device(struct device_driver *drv, struct device *dev)
{
。。。
ret = really_probe(dev, drv);
。。。
}
static int really_probe(struct device *dev, struct device_driver *drv)
{
。。。
dev->driver = drv;
if (driver_sysfs_add(dev)) { //在sysfs中添加設備的Kobject目錄和熟悉文件
。。。
}
if (dev->bus->probe) {
。。。
} else if (drv->probe) {
ret = drv->probe(dev); //調用driver的probe( ),dev爲設備結構體
。。。
}
。。。
}