Linux_I2C总线分析
### Linux I2C总线分析 #### I2C总线工作原理及探查机制 Linux下的I2C(Inter-Integrated Circuit)总线系统是一种用于连接低速微控制器和外围设备的串行通信协议,广泛应用于嵌入式系统中。在Linux内核中,I2C子系统的实现遵循模块化设计原则,主要由I2C核心、I2C总线驱动和I2C设备驱动三个部分组成。 - **I2C核心**:这部分负责提供统一的接口供I2C总线驱动和设备驱动使用。它包括了I2C总线的注册、注销功能,以及通用的通信方法(即“algorithm”)。这一层是平台无关的,使得I2C子系统能够跨平台运行。 - **I2C总线驱动**:针对特定的硬件平台,I2C总线驱动负责实现对I2C适配器的控制,如发送开始和停止信号、读写数据等。它包含`i2c_adapter`结构体和相关的算法结构`i2c_algorithm`,以及用于产生通信信号的函数。这部分代码是平台相关的,不同的CPU平台可能需要不同的I2C总线驱动。 - **I2C设备驱动**:这部分关注于挂载在I2C总线上的具体设备,如传感器、EEPROM等。设备驱动通过`i2c_driver`和`i2c_client`结构体与设备交互,实现设备特有功能。设备驱动利用总线驱动提供的接口,屏蔽底层硬件差异,简化与硬件设备的通信过程。 #### Legacy与New-Style架构 Linux的I2C子系统同时支持Legacy(传统)架构和New-Style架构。两者的区别主要在于设备和驱动的注册方式: - **Legacy架构**:设备和驱动的注册通常在驱动加载时动态完成。这种架构下,设备和驱动的实例在系统运行时动态创建,灵活性较高。 - **New-Style架构**:采用了更静态的注册方式,设备和驱动信息在编译时就已确定,因此在系统启动过程中就可以预知所有的I2C设备和驱动。 #### 探测设备与检测地址 在I2C系统中,设备的探测和地址检测是关键步骤。Linux内核提供了probe机制,用于在系统启动或设备插入时自动识别和配置I2C设备。设备驱动可以通过调用总线驱动的函数,如`i2c_smbus_read_byte_data()`等,来读取设备的特定寄存器值,从而判断设备是否在线并确定其类型和状态。 #### 实例:MTK6516平台 在MTK6516平台中,I2C子系统的实现遵循上述框架。总线驱动和部分设备驱动由MTK预先实现,用户可以根据具体设备的需求定制设备驱动。例如,在Android2.2版本中,MTK采用了New-Style架构,设备和驱动的注册更为静态和高效。 #### 注册流程 完成I2C设备驱动的注册流程主要包括以下几步: 1. **适配器注册**:通过填充`i2c_adapter`和`i2c_algorithm`结构体,并调用`i2c_add_adapter()`函数将适配器添加到总线上。 2. **设备注册**:创建`i2c_client`结构体,用于表示挂在I2C总线上的设备,并通过`i2c_new_probed_device()`或类似函数将其注册到系统中。 3. **驱动注册**:实现`i2c_driver`结构体,包括设备的具体读写操作和其他功能,并调用`i2c_add_driver()`函数完成设备驱动的注册。 通过这一系列步骤,Linux内核能够管理和控制复杂的I2C设备网络,为用户提供稳定、高效的硬件接口服务。