platform_driver_register( )过程追踪

 

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

    }
     。。。
}

你可能感兴趣的:(platform_driver_register( )过程追踪)