哪个先注册应该 貌似看源码先注册驱动如果没有设备,那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(),后面情况就一样了。
-
追问
-
嗯,可以这样解释,哈哈,送你分了,学习了、