I2C驱动移植与设备树绑定:设备驱动工程实践环境搭建 - 第1节

1.1 I²C 总线简介

I²C(Inter-Integrated Circuit)总线是由 Philips 公司(现 NXP)在 1980 年代推出的一种同步、多主从、串行通信总线。它仅需两根线——串行数据线(SDA)和串行时钟线(SCL)——即可实现芯片间的数据交换,广泛应用于嵌入式系统中连接微控制器与各种外设,如传感器、EEPROM、RTC、ADC/DAC、显示控制器等。

1.1.1 物理层与电气特性

  • 双线制:SDA(数据线)和 SCL(时钟线)均为开漏输出,需外接上拉电阻。
  • 多主多从:总线上可挂载多个主设备和从设备,通过仲裁机制解决冲突。
  • 7位/10位地址:标准模式使用 7 位地址,最多支持 127 个从设备;10 位地址模式扩展至 1023 个。
  • 速率模式:标准模式(100 kbit/s)、快速模式(400 kbit/s)、高速模式(3.4 Mbit/s)和超快速模式(5 Mbit/s)。
关键点:I²C 总线通过开漏结构实现线与逻辑,任何设备拉低 SCL 即可插入等待周期,这是其流控机制的基础。

1.1.2 通信协议帧格式

一次完整的 I²C 传输包含起始条件、从设备地址、读写位、数据字节和停止条件。每个字节后跟随一个应答位(ACK/NACK)。

起始条件 | 7位从地址 | R/W | ACK | 数据字节1 | ACK | ... | 数据字节N | ACK/NACK | 停止条件
信号 描述 时序要求
起始条件 (S) SCL 高电平时,SDA 由高变低 建立时间 ≥ 4.7 μs(标准模式)
停止条件 (P) SCL 高电平时,SDA 由低变高 保持时间 ≥ 4.0 μs
数据采样 SCL 低电平时改变 SDA,高电平时采样 数据保持时间 ≥ 0 ns
应答位 (ACK) 接收方在第 9 个 SCL 脉冲拉低 SDA 应答建立时间 ≥ 4.7 μs
I²C 总线单次写传输时序图 SCL SDA S A6 A0 R/W ACK D7 D0 ACK P 起始条件 → 从设备地址(7位) → 读写位 → 应答 → 数据字节 → 应答 → 停止条件

1.2 I²C 驱动在嵌入式 Linux 中的地位

在嵌入式 Linux 系统中,I²C 驱动是内核子系统的重要组成部分,位于硬件与用户空间应用程序之间。它遵循 Linux 内核标准的驱动模型,分为三个层次:

  1. I²C 核心层:提供总线注册、设备枚举、数据传输抽象和驱动注册/注销等通用框架。
  2. I²C 总线控制器驱动:直接操作 SoC 的 I²C 控制器硬件寄存器,实现时钟生成、起始/停止条件、数据收发等底层时序。
  3. I²C 从设备驱动:挂载在 I²C 总线上的具体外设驱动,通过核心层提供的 API 与控制器驱动交互。
工程实践提示:在嵌入式 Linux 中,I²C 驱动移植通常指适配新的 I²C 控制器(如将 STM32MP1 的 I²C 控制器驱动移植到 Linux 内核),而设备驱动开发则指为新的 I²C 从设备编写驱动并绑定设备树。

1.2.1 I²C 驱动在系统中的位置

嵌入式 Linux I²C 驱动软件架构 用户空间应用程序 (App / libi2c / sysfs) 内核空间 I²C 核心层 (i2c-core) I²C 控制器驱动 I²C 从设备驱动 硬件抽象层 (HAL / 寄存器操作) 硬件平台 (SoC I²C 控制器 + 外设芯片)

1.3 课程目标与学习路径

本课程旨在帮助嵌入式驱动工程师掌握 I²C 驱动移植与设备树绑定的完整工程实践流程。通过 30 章的系统学习,学员将从原理理解进阶到实际项目落地。

1.3.1 课程核心目标

目标编号 目标描述 对应章节
G1 理解 I²C 总线协议、时序和 Linux 内核 I²C 子系统架构 第 1-4 章
G2 掌握设备树语法、绑定规则及 I²C 设备节点编写 第 5-10 章
G3 独立完成 I²C 控制器驱动的移植与调试 第 11-18 章
G4 开发并验证 I²C 从设备驱动(含中断、DMA、Regmap) 第 19-25 章
G5 搭建工程实践环境,完成从源码到目标板的完整部署 第 26-30 章

1.3.2 推荐学习路径

课程学习路径图 阶段 1 基础与协议 阶段 2 设备树绑定 阶段 3 控制器驱动移植 阶段 4 设备驱动开发 阶段 5 工程实践与部署 建议顺序学习,每阶段完成后进行配套实验,确保理论与实践结合 阶段 5 为综合项目,需整合前 4 阶段知识

1.3.3 预备知识要求

  • 熟悉 C 语言编程,理解指针、内存管理和中断处理。
  • 了解 Linux 内核基础概念:模块、字符设备、platform 总线、驱动模型。
  • 具备基本的嵌入式硬件知识:GPIO、时钟、寄存器读写。
  • 掌握 Linux 内核编译与设备树编译(dtc)工具使用。
常见误区:初学者常将 I²C 设备驱动与控制器驱动混淆。本课程明确区分两者:控制器驱动由 SoC 厂商提供或需移植,设备驱动由外设开发者编写。设备树绑定是连接两者的关键桥梁。

1.4 本章小结