Edit online

设计说明

2 Dec 2024
Read time: 2 minute(s)

源代码位于:linux-5.10/drivers/i2c/busses/

I2C 的驱动文件如下:

文件 说明
i2c-artinchip.h aic I2C 公用头文件,I2C 模块的寄存器定义,结构体定义等
i2c-artinchip-master.c I2C 作为 master 时的驱动文件
i2c-artinchip-slave.c I2C 作为 slave 时的驱动文件
i2c-artinchip-common.c I2C 一些公用寄存器读写函数的实现,以及 driver 的定义

模块架构

linux 中 C 子系统的体系结构如下图所示


subsystem_arch

在 C 子系统中,SOC 厂商需要实现的就是 adapter 部分的驱动,I2C adapter 是对 controller 的软件抽象。具体到上图,就是实现 adapter 的 algorithm 以及特定 SOC 的 I2C 代码部分。I2C 模块支持 master 和 slave 两种模式,所以 adapter 的驱动实现也就分为两部分:I2C master 驱动和 slave 驱动。
  • I2C master

    I2C 作为 master 时,驱动的实现主要包括 4 个部分:

    1. 硬件参数配置:主要是设置 C 工作的主机模式,7bit 或 10bit 寻址,寻址的从机地址设置,FIFO 设置以及总线传输速率等。

    2. SCL 时序参数设置:根据设置的总线传输速率,设置 SCL 的高低电平时间。

    3. i2c_algorithm 的实现:作为主机端,主要是 xfer 的实现。在驱动实现中,以 message 为单位进行数据的收发,数据的传输采用中断的方式。

    4. 中断的处理:处理 master 端的数据收发,并产生相应的 start、ack、nack、restart、stop 信号。

  • I2C slave

    I2C 作为从机时,需要一个相应的后端软件(对 C 从设备的软件模拟),该后端软件与 adapter 驱动,组合成具有相应功能的 C 从设备。内核的 C 子系统框架中提供了一个 EEPROM 的软件后端,与 slave 驱动一起,可以作为一个具有 C 接口的 EEPROM 使用。


    twi_slave

    I2C 作为 slave 时,驱动的实现主要包括 3 个部分:

    1. 硬件参数配置:设置 C 工作的从模式,FIFO 设置等。

    2. i2c_algorithm 的实现:作为从机端,主要是 slave 和 unreg_slave 的实现。reg_slave 用于将一个 client 注册到从模式的 i2c adapter 上,unreg_slave 的功能与 slave 相反。

    3. 中断的处理:处理 C 从机接收到的各种中断信号,并调用相应的回调函数进行数据的读写。

综上,I2C 模块的驱动实现,主要的工作有:

  • 提供 C 控制器的 platform 驱动,初始化 C 适配器,判断 C 模块工作的主从模式,执行不同的初始化流程。

  • I2C 模块作为主机时,提供 C 适配器的 algorithm,并用具体适配器的 xfer 函数填充 i2c_algorithm 的 xfer 指针,并把 algorithm 指针赋值给 i2c_adapter 的 algo 指针。处理 master 端时序的设置以及 I2C 作为主机时的各种中断信号处理。

  • I2C 模块作为从机时,提供 C 适配器的 algorithm,实现具体适配器的 slave 和 unreg_slave 函数,并把 algorithm 指针赋值给 i2c_adapter 的 algo 指针。处理 C 作为从机时的各种中断信号处理。