Linux关于总线、设备、驱动的注册顺序

1. platform bus 先被kenrel注册。
2. 系统初始化过程中调用platform_add_devices或者
platform_device_register
,将平台设备(platform devices)注册到平台总线中(platform bus)
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)
------------------------------------------------------
系统启动阶段,总线的驱动链表还是空的,所以启动阶段的 platform_add_devices()只负责将设备添加到总线的设备链表上。

linux-2.6.26/drivers/base/platform.c
int platform_add_devices(struct platform_device **devs, int num)
{
----...
---- ret = platform_device_register(devs[i]);
---- ...
}

int platform_device_register(struct platform_device *pdev)
{
---- device_initialize(&pdev->dev);
---- return platform_device_add(pdev);
}

int platform_device_add(struct platform_device *pdev)
{
---- ...
---- pdev->dev.bus = &platform_bus_type;
---- ...
---- ret = device_add(&pdev->dev);
---- ...
}

device_add() -->
- bus_attach_device()

void bus_attach_device(struct device *dev)
{
---- struct bus_type *bus = dev->bus;
---- int ret = 0;

---- if (bus) {
---- ---- if (bus->p->drivers_autoprobe)
---- ---- ---- ret = device_attach(dev);
---- ---- WARN_ON(ret < 0);
---- ---- if (ret >= 0)
---- ---- ---- klist_add_tail(&dev->knode_bus, &bus->p->klist_devices);
---- }
}


device_attach()的返回值:
1           设备和驱动匹配成功
0           设备已经注册,但是总线上没有与之相匹配的驱动(系统启动阶段,由于总线上还没有驱动,所以设备在此匹配不到与之对应的驱动,只是将其添加到总线的设备链表)
-ENODEV     设备没有注册(registered) -- 设备在哪里注册?

如果设备和驱动匹配成功;或者设备已经注册,但是总线上没有与之相匹配的驱动bus_attach_device()将调用klist_add_tail()将设备添加到总线的设备链表尾部。


http://tanxiang1103.blog.163.com/blog/static/17104983920109209145864/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值