查看: 2043|回复: 0

[评测分享] 【ALINX AXU2CGB试用】IIC 适配器驱动源码分析

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

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2021-6-29 16:53:02 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 robe.zhang 于 2021-6-29 16:52 编辑

    【ALINX AXU2CGB试用】IIC适配器驱动源码分析

    开发板中的IIC 适配器是 Cadence 的
    31.png
    对应驱动源码位于 drivers\i2c\busses\i2c-cadence.c文件中
    32.png
    先看 probe 函数:
    33.png
    34.png
    35.png
    第 1298 行,有个 structcdns_i2c *id; 结构体,里面封装了一个 (194行)struct i2c_adapter adap; 结构体,可以认为它继承自 I2C adapter。本文 candonce 是适配器,所以需要继承自adapter
    36.png
    第 1309行,match table
    37.png
    然后做一些 pinctrl,ioremap,irq,clk,pm 的处理,其中
    第 1331 行,设置了一个 id->adap.algo= &cdns_i2c_algo; 这是I2C 控制器的一个收发方法,此处先记住,稍后详细分析
    38.png
    第1382 行:调用 i2c_add_adapter注册适配器,注册进 IIC 子系统,总线会当作适配器对待。
    i2c_add_adapter 函数,上一篇 IIC 核心框架里面说过

    详细看 cdns_i2c_algo,他的结构体是这样的:七个函数
    39.png
    cdns_i2c_algo实现了 4 个:
    40.png
    先看第一个 cdns_i2c_master_xfer 函数:发送信息的函数,调用了cdns_i2c_process_msg 函数实现
    41.png
    42.png
    cdns_i2c_process_msg 函数又根据不同的 flags调用 cdns_i2c_slvmon,cdns_i2c_mrecv,cdns_i2c_msend 函数完成
    43.png
    cdns_i2c_slvmon,cdns_i2c_mrecv,cdns_i2c_msend 这三个函数都是通过读写寄存器收发数据
    44.png
    45.png
    46.png
    最终都是读写寄存器完成,IP 核数字逻辑,给数据,它自动完成协议 IO高低电平等完成数据收发。


    先看第2个函数 cdns_i2c_func:函数的功能是获取适配器支持的功能特性,返回一堆flags,每一个 flags代表不同功能,代码判断不同 flags,执行不同的代码,完成不同的功能
    47.png
    再看第3,4 个函数 cdns_reg_slave,cdns_unreg_slave,这个适配器硬件是支持 slave 模式的,对应的函数接口。
    48.png
    Cadonce 适配器驱动就完成了。主要是实现接口,构建数据结构,注册 I2C 控制器搞定。因为I2C 核心框架已经实现了框架,所以具体驱动只管接口实现,注册,完事。




    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-11-23 08:49 , Processed in 0.109884 second(s), 17 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.