一、引入设备树之后
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设备展开过程
最新推荐文章于 2021-05-06 22:45:59 发布
本文对比分析了引入设备树前后的I2C与SPI设备注册流程。介绍了设备树机制下如何通过compatible属性匹配设备节点,并展开成平台设备。同时,详细解释了未使用设备树时,I2C与SPI设备如何通过定义特定结构体并加入全局链表进行注册。
摘要由CSDN通过智能技术生成