i2c、spi设备展开过程

本文对比分析了引入设备树前后的I2C与SPI设备注册流程。介绍了设备树机制下如何通过compatible属性匹配设备节点,并展开成平台设备。同时,详细解释了未使用设备树时,I2C与SPI设备如何通过定义特定结构体并加入全局链表进行注册。
摘要由CSDN通过智能技术生成

一、引入设备树之后
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。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值