2015-02-09 54 views
3

我看到了一個場景,其中「struct of_device_id」未在驅動程序中定義,但在爲相同設備條目添加的設備樹(dts)文件兼容字符串中。驅動程序綁定使用驅動程序中沒有兼容字符串的設備樹

以下是芯片的示例設備樹條目。

&i2c1 { 

    ... 

    adv7ex: [email protected] { 
      compatible = "adv7ex"; 
      reg = <0x4a>; 
    }; 

    ... 

}; 

以下是正在註冊爲I2C驅動程序的芯片驅動程序的示例代碼片段。

static struct i2c_device_id adv7ex_id[] = { 
    { "adv7ex", ADV7EX }, 
    { } 
}; 
MODULE_DEVICE_TABLE(i2c, adv7ex_id); 

static struct i2c_driver adv7ex_driver = { 
    .driver = { 
     .owner = THIS_MODULE, 
     .name = "adv7ex", 
    }, 
    .probe = adv7ex_probe, 
    .remove = adv7ex_remove, 
    .id_table = adv7ex_id, 
}; 

module_i2c_driver(adv7ex_driver); 

能否請你幫我瞭解設備驅動程序綁定在這種情況下發生的,因爲沒有「of_device_id」結構中的驅動程序定義。

+0

我想你正在尋找類似於:i2c_register_adapter() - > of_i2c_register_devices() - > of_i2c_register_device() - > of_modalias_node()。 – 0andriy 2015-02-09 13:30:33

+0

我不確定of_i2c_register_device()的用途,我的疑問是,如果在裸驅動程序結構(struct device_driver)中沒有填充兼容字符串,那麼設備樹核心將如何將驅動程序與設備條目綁定。 – user3693586 2015-02-09 13:40:49

+0

在內核中只有一個映射,即通過名稱(或modalias是名稱的別名)。因此,您必須在設備樹和驅動程序中提供相同的名稱。問題可能是如何匹配它們。 – 0andriy 2015-02-09 13:43:39

回答

1

其實,它不是內核會加載驅動程序,但用戶工具:

MODULE_DEVICE_TABLE(i2c, adv7ex_id); 

這個宏最終編譯的模塊中添加了特定符號的名稱(即:.ko文件)將被解析depmod工具,然後將在module.alias中爲您的驅動程序添加一個「引用」,最後,您的驅動程序將由您的用戶hotplug工具加載。

參考:https://www.kernel.org/doc/ols/2001/hotplug.pdf第5

0

正如你可以看到herei2c_device_match()函數首先試圖通過compatible字符串(的風格,這是設備樹)來匹配設備。如果失敗,則會嘗試通過id表匹配設備。