一、引入設備樹之後
const struct of_device_id of_default_bus_match_table[] = {
{ .compatible = "simple-bus", },
{ .compatible = "simple-mfd", },
#ifdef CONFIG_ARM_AMBA
{ .compatible = "arm,amba-bus", },
#endif /* CONFIG_ARM_AMBA */
{} /* Empty terminated list */
};
如果某個device node的compatible屬性的值與數組of_default_bus_match_table中的任意一個元素的compatible的值match,那麼這個device node的child device node仍舊會被註冊爲platform_device;如果不滿足則不會展開,一般會在總線控制器的probe函數中展開成對應的總線設備,如i2c、spi。
i2c、spi 設備的展開過程如下
the probe function of i2c bus controller
i2c_add_numbered_adapter---->
__i2c_add_numbered_adapter---->
i2c_register_adapter
of_i2c_register_devices---->
qcom:
i2c_msm_probe---->
i2c_msm_frmwrk_reg---->
(1)i2c_add_numbered_adapter
(2)of_i2c_register_devices
the probe function of spi bus controller
devm_spi_register_master---->
spi_register_master---->
(1)of_spi_register_master
(2)of_register_spi_devices
二、引入設備樹之前
i2c:
i2c核心維護了一個全局鏈表__i2c_board_list用於管理i2c_client對應的設備結構體struct i2c_board_info,如下:
LIST_HEAD(__i2c_board_list);
i2c 設備驅動需要在板級文件中定義struct i2c_board_info,然後調用i2c_register_board_info
向i2c核心註冊,i2c核心會把其加入全局鏈表__i2c_board_list上,接着在總線控制器驅動註冊i2c_adapter
的時候(i2c_register_adapter)調用i2c_scan_static_board_info遍歷board_list,在總線和
設備的匹配後由struct i2c_board_info生成i2c_client。
spi:
spi核心維護了一個全局鏈表board_list,用於管理spi_device對應的設備結構體struct spi_board_info,如下:
static LIST_HEAD(board_list);
spi 設備驅動需要在板級文件中定義struct spi_board_info,然後調用spi_register_board_info
向spi核心註冊,spi核心會把其加入全局鏈表board_list上,接着在總線控制器驅動註冊spi_master
的時候(spi_register_master)遍歷board_list,調用spi_match_master_to_boardinfo進行總線和
設備的匹配,最後由struct spi_board_info生成spi_device。
i2c、spi設備展開過程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.