资讯动态

Linux 驱动研究 —— I2C (1)

发布时间:2026/8/25 11:18:55 来源:尧图企业网站定制
1. I2C 子系统驱动框架我们在之前的研究中学习了 SPI 子系统驱动而 I2C 与 SPI 极为相似。SPI 是“基于物理专线的点对点通信”而 I2C 子系统则是一种“基于共享总线的对话机制”。I2C 的设计哲学与 SPI 极其相似只是将“片选信号”替换为了“从机地址寻址”。以下是 I2C 子系统驱动框架1. 用户层 (User Space)功能定义与 SPI 相同用户层是业务逻辑的源头。交互方式用户层通过 /dev/i2c-x 等标准化字符设备接口将“要读取某个传感器的数据”、“要配置某个寄存器”等高级需求下发给内核。它不直接控制物理引脚SCL/SDA而是通过系统调用完成请求。2. 内核层 (Kernel Space)接口层 (Interface Layer)功能定义直接对接特定硬件外设如 I2C 接口的温度传感器、EEPROM 存储芯片的一层。逻辑作用充当“翻译官”将操作系统定义的抽象请求翻译为特定硬件所需的物理通信协议序列。抽象层 (Abstraction Layer)功能定义Linux I2C 子系统的核心通常位于 drivers/i2c/i2c-core.c充当 I2C 主控器Adapter与外设驱动Client Driver之间的中间件。核心功能总线匹配负责 I2C Adapter 和 I2C Client 的注册与匹配。标准化 API通过导出 i2c_transfer() 等通用函数接口强制所有从设备驱动遵循统一的调用规范。传输序列化通过核心层机制将并发的 I2C 请求转化为串行的传输队列确保物理总线在同一时刻只处理一个对话对话管理。主控层 (Controller/Adapter Layer)功能定义作为内核 I2C 子系统的执行引擎负责将上层抽象的 i2c_msg 数据请求转化为底层硬件可解析的指令序列。逻辑作用它是通信协议的“配置者”和数据流的“调度指挥官”。它通过对物理寄存器、DMA 通道及中断系统的实时操控确保数据在内存与 I2C 总线之间实现稳定、高效的闭环传输。3. 硬件层 (Hardware Layer)功能定义执行 master_xfer() 钩子函数的具体实现层如 i2c-imx.c。逻辑作用它直接与 SoC 内部的 I2C 控制器寄存器交互。它负责产生 START/STOP 信号、处理从机地址的发送与 ACK/NACK 响应、以及管理中断状态机从而完成最终的物理信号转换。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价