查看: 3161|回复: 0

[评测分享] 【ALINX AXU2CGB试用】IIC 核心驱动框架源码分析

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 597 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2021-6-29 16:12:00 | 显示全部楼层 |阅读模式
    分享到:
    【ALINX AXU2CGB试用】IIC 核心驱动框架源码分析

    IIC 核心驱动源码位于 drivers\i2c\i2c-core-base.c文件中:
    第1864 行:I2c 当作模块初始化的
    1.png
    看 i2c_init怎么初始化的:
    第1813行,注册 i2c 总线(笔者文章中 IIC,I2C都是指同一个总线哈,写法不同,本质一样)
    第1826 行,添加驱动
    第1831,1833行,注册两个通知链
    2.png
    bus_register 是 linux通用代码,用于注册总线子系统,I2C总线和这部分代码没啥关系,跳过
    看 i2c_bus_type   IIC 总线:
    3.png
    Match函数 :
    4.png
    Probe 函数:准备中断,时钟,电源,调用驱动的 probe 函数
    5.png
    6.png
    7.png
    Remove 函数:和 probe 相反
    8.png
    Shutdown 函数:
    9.png
    dummy_driver 驱动空的,只是凑结构的,没有具体功能的实现:
    10.png
    看注册的两个通知:一个是 i2c_of_notifier 通知:
    分两个 case,一个是 add 通知:第238行,获取 adap ,第247行,注册 client:
    另一个case 是 remove 通知:第263行,获取 client ,第268行,注销 client:
    收到通知,判断通知类型,就来做相应的处理
    11.png
    有必要看一下 of_i2c_register_device 函数:
    第 73 行,处理 of 相关信息
    第 77 行,调用 i2c_new_device,这是个重要的函数
    12.png
    i2c_new_device  调用 i2c_new_client_device,
    13.png
    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 函数 。这是总线搞定的。
    14.png
    15.png
    有注册 client 函数,也有注册adapter 函数,看 i2c_add_adapter 函数
    第 1451 行,调用 i2c_register_adapter注册 adapter
    16.png
    追踪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 探测
    17.png
    18.png
    of_i2c_register_devices 函数的集体实现:
    第 100 行,遍历所有子节点
    第 104 行,of_i2c_register_device往上面翻翻,已经说过了。注册 client 设备的
    19.png
    __process_new_adapter 经过层层调用,最终调用了 i2c_new_client_device 把 client 设备挂在 adapter,完成注册。i2c_new_client_device 函数上面也有,自己翻回去看。
    20.png
    21.png
    22.png
    23.png
    24.png
    25.png
    再看注册driver 函数i2c_register_driver
    第 1698 行:标识 i2c_bus_type IIC 类型的driver
    第 1704 行:注册 driver
    第 1711 行:遍历所有 IIC 设备,调用__process_new_driver 来处理
    26.png
    i2c_for_each_dev 函数:遍历所有 IIC 总线设备
    27.png
    __process_new_driver 函数就是检测 iic 设备
    28.png
    29.png
    到此整个 IIC 驱动核心框架的就全部看完




    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-23 09:30 , Processed in 0.145479 second(s), 21 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.