本帖最后由 robe.zhang 于 2021-6-29 16:52 编辑
【ALINX AXU2CGB试用】IIC适配器驱动源码分析
开发板中的IIC 适配器是 Cadence 的 对应驱动源码位于 drivers\i2c\busses\i2c-cadence.c文件中 先看 probe 函数: 第 1298 行,有个 structcdns_i2c *id; 结构体,里面封装了一个 (194行)struct i2c_adapter adap; 结构体,可以认为它继承自 I2C adapter。本文 candonce 是适配器,所以需要继承自adapter 第 1309行,match table 然后做一些 pinctrl,ioremap,irq,clk,pm 的处理,其中 第 1331 行,设置了一个 id->adap.algo= &cdns_i2c_algo; 这是I2C 控制器的一个收发方法,此处先记住,稍后详细分析
第1382 行:调用 i2c_add_adapter注册适配器,注册进 IIC 子系统,总线会当作适配器对待。 i2c_add_adapter 函数,上一篇 IIC 核心框架里面说过
详细看 cdns_i2c_algo,他的结构体是这样的:七个函数 cdns_i2c_algo实现了 4 个: 先看第一个 cdns_i2c_master_xfer 函数:发送信息的函数,调用了cdns_i2c_process_msg 函数实现 cdns_i2c_process_msg 函数又根据不同的 flags调用 cdns_i2c_slvmon,cdns_i2c_mrecv,cdns_i2c_msend 函数完成 cdns_i2c_slvmon,cdns_i2c_mrecv,cdns_i2c_msend 这三个函数都是通过读写寄存器收发数据 最终都是读写寄存器完成,IP 核数字逻辑,给数据,它自动完成协议 IO高低电平等完成数据收发。
先看第2个函数 cdns_i2c_func:函数的功能是获取适配器支持的功能特性,返回一堆flags,每一个 flags代表不同功能,代码判断不同 flags,执行不同的代码,完成不同的功能 再看第3,4 个函数 cdns_reg_slave,cdns_unreg_slave,这个适配器硬件是支持 slave 模式的,对应的函数接口。 Cadonce 适配器驱动就完成了。主要是实现接口,构建数据结构,注册 I2C 控制器搞定。因为I2C 核心框架已经实现了框架,所以具体驱动只管接口实现,注册,完事。
|