i2c、spi设备展开过程

来源:互联网 发布:电话聊天软件 编辑:程序博客网 时间:2024/05/21 11:12

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

原创粉丝点击