您的位置:首页 > 其它

platform_driver_register( )过程追踪

2015-10-13 19:14 344 查看
以下代码源于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为设备结构体

。。。

}

。。。

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: