分类: LINUX
2016-11-21 22:50:26
Linux关于总线、设备、驱动的注册顺序 设备挂接到总线上时,与总线上的所有驱动进行匹配(用bus_type.match进行匹配), 如果匹配成功,则调用bus_type.probe或者driver.probe初始化该设备,挂接到总线上 如果匹配失败,则只是将该设备挂接到总线上。 驱动挂接到总线上时,与总线上的所有设备进行匹配(用bus_type.match进行匹配), 如果匹配成功,则调用bus_type.probe或者driver.probe初始化该设备;挂接到总线上 如果匹配失败,则只是将该驱动挂接到总线上。 需要重点关注的是总线的匹配函数match(),驱动的初始化函数probe() 1. platform_bus_type--总线先被kenrel注册。 2. 过程中调用platform_add_devices或者platform_device_register,将平台设备(platform devices)注册到平台总线中(platform_bus_type) 3. 平台驱动(platform driver)与平台设备(platform device)的关联是在platform_driver_register或者driver_register中实现,一般这个函数在驱动的初始化过程调用。 通过这三步,就将平台总线,设备,驱动关联起来。 1. platform bus先被kenrel注册。 ------------------------------------------------------ do_basic_setup() -->-driver_init() -->-platform_bus_init()-->bus_register() 2. 过程中调用platform_add_devices或者platform_device_register,将平台设备(platform devices)注册到平台总线中(platform_bus_type) ------------------------------------------------------ 系统启动阶段,总线的驱动链表还是空的,所以启动阶段的platform_add_devices()只负责将设备添加到总线的设备链表上。
采纳率:76% 擅长:
嗯对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(),后面情况就一样了。
嗯,可以这样解释,哈哈,送你分了,学习了、