设计说明
源代码位于: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 子系统的体系结构如下图所示
-
I2C master
I2C 作为 master 时,驱动的实现主要包括 4 个部分:
-
硬件参数配置:主要是设置 C 工作的主机模式,7bit 或 10bit 寻址,寻址的从机地址设置,FIFO 设置以及总线传输速率等。
-
SCL 时序参数设置:根据设置的总线传输速率,设置 SCL 的高低电平时间。
-
i2c_algorithm 的实现:作为主机端,主要是 xfer 的实现。在驱动实现中,以 message 为单位进行数据的收发,数据的传输采用中断的方式。
-
中断的处理:处理 master 端的数据收发,并产生相应的 start、ack、nack、restart、stop 信号。
-
- I2C slave
I2C 作为从机时,需要一个相应的后端软件(对 C 从设备的软件模拟),该后端软件与 adapter 驱动,组合成具有相应功能的 C 从设备。内核的 C 子系统框架中提供了一个 EEPROM 的软件后端,与 slave 驱动一起,可以作为一个具有 C 接口的 EEPROM 使用。
I2C 作为 slave 时,驱动的实现主要包括 3 个部分:
-
硬件参数配置:设置 C 工作的从模式,FIFO 设置等。
-
i2c_algorithm 的实现:作为从机端,主要是 slave 和 unreg_slave 的实现。reg_slave 用于将一个 client 注册到从模式的 i2c adapter 上,unreg_slave 的功能与 slave 相反。
-
中断的处理:处理 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 作为从机时的各种中断信号处理。