本帖最后由 robe.zhang 于 2021-6-28 17:24 编辑
【ALINX AXU2CGB试用】IIC复用器驱动源码分析
IIC 总线结构是这样的,一条总线上可以存在多个从机,一主多从通讯,每个从机有各自的地址来区分,此结构只有一条总线,一个adapter IIC 复用器硬件原理图示是这样的,一个IIC 接口复用为四个IIC,通过地址来区分每一个IIC接口。类似于usb hub 的功能,一分四,四个下行IIC 共享一个上行IIC接口。复用器是把一条IIC 总线分出来四条总线,对应驱动中的四个adapter IIC 复用器linux驱动核心源码位于:drivers\i2c\i2c-mux.c 中 先看struct i2c_mux_core 结构体,里面有两个函数,select 和 deselect,选中和不选两个函数,比如设置 A0A1 为 00选中 IIC0,01选中 IIC1,02选中IIC2,03选中 IIC3,等等 再看 i2c_mux_alloc 函数,分配一个 struct i2c_mux_core 结构体,赋值 select deselect 函数 再看 i2c_mux_add_adapter 函数,主要用来添加 复用器适配器主设备的,也就是对应最上面图示的I2C0,I2C1,I2C2,I2C3 的 第 309 行设置发送函数,发送前先选中,然后发送,然后不选。发送函数稍后I2C 驱动核心代码会看到 第 407行,添加多个适配器 i2c_add_numbered_adapter,最终调用i2c_register_adapter 注册适配器。i2c_register_adapter稍后I2C 核心代码能看到细节 I2C 复用器核心代码就这么多,很简单的。看一个驱动实例:pca954x Probe 函数第421 行分配struct i2c_mux_core 结构体,并初始化,赋值 pca954x_select_chan,pca954x_deselect_mux 两个函数,稍后详细看两个函数 第478 安装中断 第485 添加适配器 第491 开启中断线程专门处理中断 再看 pca954x_select_chan 函数,第246 行,是通过写chan 信息来选中对应的 IIC 总线 调用了 __i2c_smbus_xfer 来写入 chan 信息 __i2c_smbus_xfer 要么调用 adapter->algo->smbus_xfer_atomic;要么调用 i2c_smbus_xfer_emulated 写入 chan 信息 adapter->algo->smbus_xfer_atomic; 函数是在adapter 中已经实现的,i2c_smbus_xfer_emulated不是通过 smbus 实现的,是通过 IIC 控制器模拟发送数据。 i2c_smbus_xfer_emulated 模拟发送 chan 信息过程:先根据 smbus协议,不同的case 准备msg 信息,然后在461行调用__i2c_transfer 发送msg 信息,模拟smbus 通信过程 最后看Pca9540 复用器框架图,IIC总线一分二,他不是用 A0A1控制下行 IIC 总线选中状态的,而是通过smbus 总线,写寄存器决定选用哪一个下行IIC总线。 驱动代码和实物工作过程是对应的,驱动就是用程序来描述硬件的工作过程。Linux 驱动,需要遵循子系统框架。所以看代码就知道硬件的工作过程
|