platform_driver_register( )过程追踪

http://my.oschina.net/felixliang/blog/80741


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为设备结构体 
        。。。

    } 
     。。。 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值