歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux關於總線、設備、驅動的注冊順序

Linux關於總線、設備、驅動的注冊順序

日期:2017/2/28 16:14:47   编辑:Linux教程

+----> devices
|
|
|
-----------------------------------------------------------------------------
struct bus_type match() probe()
-----------------------------------------------------------------------------
|
|
|
+----> drivers 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()只負責將設備添加到總線的設備鏈表上。

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);
----}
}

如果設備和驅動匹配成功;或者設備已經注冊,但是總線上沒有與之相匹配的驅動,bus_attach_device()將調用klist_add_tail()將設備添加到總線的設備鏈表尾部。

Copyright © Linux教程網 All Rights Reserved