Chinaunix首页 | 论坛 | 博客
  • 博客访问: 120561
  • 博文数量: 35
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2016-10-24 15:06
文章分类

全部博文(35)

文章存档

2017年(5)

2016年(30)

我的朋友

分类: LINUX

2016-11-21 22:50:26

哪个先注册应该 貌似看源码先注册驱动如果没有设备,那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; ...
| 浏览 5672 次
发布于2015-08-19 22:21 最佳答案
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 设备的初始化(注册)用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(),后面情况就一样了。
追问
嗯,可以这样解释,哈哈,送你分了,学习了、
阅读(1820) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~