platform_driver_register( )过程追踪

桃扇骨 2022-08-09 06:19 183阅读 0赞

以下代码源于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为设备结构体
。。。

}
。。。
}

发表评论

表情:
评论列表 (有 0 条评论,183人围观)

还没有评论,来说两句吧...

相关阅读

    相关 光线追踪

    1、概念 全局光照(Global Illumination,简称 GI),是指既考虑场景中来自光源的直接光照,又考虑经过场景中其他物体反射后的间接光照的一种渲染技术。 光

    相关 c++异常追踪

    C++语言的运行时环境是基于栈的环境,堆栈跟踪(trace stack)就是程序运行时能够跟踪并打印所调用的函数、变量及返回地址等,C++异常中的堆栈跟踪就是当程序抛出异常时,

    相关 git追踪分支

    分享一下我老师大神的人工智能教程!零基础,通俗易懂![http://blog.csdn.net/jiangjunshow][http_blog.csdn.net_jiangju