i2c、spi設備展開過程

一、引入設備樹之後
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。


發佈了203 篇原創文章 · 獲贊 71 · 訪問量 54萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章