【ALINX AXU2CGB试用】IIC 核心驱动框架源码分析
IIC 核心驱动源码位于 drivers\i2c\i2c-core-base.c文件中: 第1864 行:I2c 当作模块初始化的
看 i2c_init怎么初始化的: 第1813行,注册 i2c 总线(笔者文章中 IIC,I2C都是指同一个总线哈,写法不同,本质一样) 第1826 行,添加驱动 第1831,1833行,注册两个通知链 bus_register 是 linux通用代码,用于注册总线子系统,I2C总线和这部分代码没啥关系,跳过 看 i2c_bus_type IIC 总线: Probe 函数:准备中断,时钟,电源,调用驱动的 probe 函数 dummy_driver 驱动空的,只是凑结构的,没有具体功能的实现: 看注册的两个通知:一个是 i2c_of_notifier 通知: 分两个 case,一个是 add 通知:第238行,获取 adap ,第247行,注册 client: 另一个case 是 remove 通知:第263行,获取 client ,第268行,注销 client: 收到通知,判断通知类型,就来做相应的处理 有必要看一下 of_i2c_register_device 函数: 第 73 行,处理 of 相关信息 第 77 行,调用 i2c_new_device,这是个重要的函数 i2c_new_device 调用 i2c_new_client_device, i2c_new_client_device 中 第 777 行:调用 device_register来注册一个设备 第 760行:标识是个 i2c_bus_type IIC 总线类型的设备 第 761行:标识是个 i2c_client_type IIC总线上 client 类型设备 所以 i2c_new_device 是注册新client 设备的函数。 注册完,上面看的 IIC总线会适配中断,时钟,电源,match 驱动,调用驱动的 probe 函数完成驱动probe工作,比如dummy_driver 驱动中的 dummy_probe 函数 。这是总线搞定的。 有注册 client 函数,也有注册adapter 函数,看 i2c_add_adapter 函数 第 1451 行,调用 i2c_register_adapter注册 adapter 追踪i2c_register_adapter 函数: 初始化一个 adap 结构体 第 1341 行:标识是 i2c_bus_type IIC 总线类型 第 1342行:标识是 i2c_adapter_type IIC 总线中的 adapter 类型设备 第 1343行:调用 device_register注册设备 第 1370 行:调用 of_i2c_register_devices函数,因为这个设备是 adapter,所以他有很多client 设备,调用这个函数就是扫描所有 client 设备,注册所有 client 设备,注册 client 设备如上,已经说过了,稍后看本函数具体实现 第 1379 行,遍历所有 i2c_bus_type类型的 driver,调用 __process_new_adapter完成 I2C detect 探测 of_i2c_register_devices 函数的集体实现: 第 100 行,遍历所有子节点 第 104 行,of_i2c_register_device往上面翻翻,已经说过了。注册 client 设备的 __process_new_adapter 经过层层调用,最终调用了 i2c_new_client_device 把 client 设备挂在 adapter,完成注册。i2c_new_client_device 函数上面也有,自己翻回去看。 再看注册driver 函数i2c_register_driver 第 1698 行:标识 i2c_bus_type IIC 类型的driver 第 1704 行:注册 driver 第 1711 行:遍历所有 IIC 设备,调用__process_new_driver 来处理 i2c_for_each_dev 函数:遍历所有 IIC 总线设备 __process_new_driver 函数就是检测 iic 设备
|