您的位置:首页 > 运维架构 > Linux

linux 下platform设备和驱动注册的先后顺序

2013-02-28 10:44 316 查看
哪个先注册应该
貌似看源码先注册驱动如果没有设备,那probe不会被执行
int driver_probe_device(struct device_driver * drv, struct device * dev)
{
if (drv->bus->match && !drv->bus->match(dev, drv))
return -ENODEV;
dev->driver = drv;
if (drv->probe) {
int error = drv->probe(dev);
if (error) {
dev->driver = NULL;
return error;
}
}
device_bind_driver(dev);
return 0;
}

我来帮他解答

满意回答

2012-07-09 09:18

在内核源代码中,platform 设备的初始化(注册)用arch_initcall()调用,它的initcall 的level为3;而驱动的注册用module_init()调用,即device_initcall(),它的initcall 的level为6。
kernel 初始化时(kernel_init@init/main.c),按照内核链接文件中(arm系统:kernel/arch/arm/vmlinux.lds)的__initcall_start段的序列依次执行,这样level小的初始化函数先于level大的初始化函数被调用。
所以platform设备先被注册,驱动加载时会调用驱动程序中的probe(),扫描系统中已注册的设备,找到匹配设备后将驱动和设备绑定。

追问
嗯对platform也许你是正确的,因为一般的platform设备注册是由内核完成的,你只需要写过设备名字就好。但是回到device_register和driver_registe的先后的话,你的回答就没用了,驱动和设备先后注册没有影响,也不是你所说的那样具有先后的调用关系。


回答
1、一些通用的设备的注册采用优先级高于module_init()的调用方式,如subsys_initcall(),这样与这些设备相关的驱动会后于它们加载,驱动中可以扫描到这些设备;
2、另一些比较独立的设备在驱动中直接注册,它内嵌于驱动之中(如放在驱动中的probe()函数中),当驱动卸载时,设备也会同时卸载。这种设备的系统调用顺序上看是driver_registe()-->device_register(),它们不是先后关系,而是包含关系。


追问
嗯,并不是你说的2里面的那种情况,就是
driver_register先于device_register执行,也没有出现于嵌套之中,而且这种方法不常用
你说的1倒是有很多地方出现,比如I2C,适配器先需要于设备注册。


回答
我明白了,你说的是另一种情况,象USB 的hcd驱动一样,先注册驱动,后注册设备。
在注册设备时,遍历设备所在总线,找到与设备匹配的驱动,再调用device_attach()--> driver_probe_device()时的情况。
这时,会调用设备所在总线的probe()函数,如果没有这个函数,则调用匹配到的驱动的probe()函数,这样驱动的扫描函数就被执行了。当然如果前面一步没有找到与要注册的设备匹配的驱动,这个设备注册也就失败了。
先注册设备的那种情况,是调用driver_attach()-->driver_probe_device(),后面情况就一样了。


追问
嗯,可以这样解释,哈哈,送你分了,学习了、
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: