Lazy loaded image
🥳嵌入式Linux开发
Linux 驱动专题 - IIC 驱动
Words 1121Read Time 3 min
2025-4-16
2025-4-29
type
date
slug
category
icon
password
Linux内核提供了一套完整的I2C子系统,它采用分层设计,实现了硬件抽象,使得应用程序可以透明地访问I2C设备。
Linux I2C子系统的架构分为几个关键层次:应用层、设备驱动层、核心层和控制器驱动层。这种分层设计使得整个系统更加模块化,便于维护和扩展。
  1. 应用层
      • 用户空间的应用程序通过系统调用与I2C设备交互
      • I2C工具(i2ctools)提供设备探测、寄存器读写等功能
  1. 设备驱动层
      • 特定I2C设备的驱动程序
      • 通用I2C设备接口(i2c-dev.c)提供用户空间访问I2C总线的能力
  1. 核心层
      • 提供统一的API(如i2c_transfer、i2c_smbus_xfer等)
      • 管理I2C总线和设备的注册与注销
      • 处理地址分配和冲突检测
  1. 控制器驱动层
      • 实现特定硬件控制器的驱动
      • 提供I2C协议的底层实现
      • 包括硬件适配器驱动和GPIO模拟I2C驱动
 
下面对设备驱动层、核心层总线驱动匹配机制以及控制器驱动有源码分析。
IIC 驱动专题01 - 设备驱动 at24.c 源码分析
IIC 驱动专题02 - I2C总线驱动匹配机制分析
IIC 驱动专题03 - 控制器驱动 i2c-imx.c 源码分析
IIC 驱动专题04 - I2C Adpater驱动框架与实例
IIC 驱动专题05 - GPIO模拟I2C源码分析和实例

核心数据结构

  • 适配器 adpter,也是控制器,或总线。

设备注册流程

数据传输流程

Linux内核中的I2C核心实现位于drivers/i2c/i2c-core.c。以下是几个关键函数:
  1. i2c_transfer函数:I2C消息传输的核心函数
    1. __i2c_transfer函数:实际执行传输操作
       

      设计理念

      Linux I2C子系统的设计体现了以下几个关键理念:
      1. 分层架构:清晰分离应用层、驱动层、核心层和硬件控制层,每层职责明确。
      1. 设备模型集成:I2C子系统完全集成到Linux设备模型中,设备注册、发现和匹配都遵循统一的模式。
      1. 硬件抽象:通过抽象接口隔离硬件细节,使上层应用无需关心底层实现。
      1. 总线与设备分离:区分总线控制器(adapter)和总线上的设备(client),便于管理。
       
      上一篇
      Linux 驱动专题 - pinctrl 子系统
      下一篇
      Linux 驱动专题 - USB 驱动

      Comments
      Loading...