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 |
1.2 I²C 驱动在嵌入式 Linux 中的地位
在嵌入式 Linux 系统中,I²C 驱动是内核子系统的重要组成部分,位于硬件与用户空间应用程序之间。它遵循 Linux 内核标准的驱动模型,分为三个层次:
- I²C 核心层:提供总线注册、设备枚举、数据传输抽象和驱动注册/注销等通用框架。
- I²C 总线控制器驱动:直接操作 SoC 的 I²C 控制器硬件寄存器,实现时钟生成、起始/停止条件、数据收发等底层时序。
- I²C 从设备驱动:挂载在 I²C 总线上的具体外设驱动,通过核心层提供的 API 与控制器驱动交互。
工程实践提示:在嵌入式 Linux 中,I²C 驱动移植通常指适配新的 I²C 控制器(如将 STM32MP1 的 I²C 控制器驱动移植到 Linux 内核),而设备驱动开发则指为新的 I²C 从设备编写驱动并绑定设备树。
1.2.1 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.3.3 预备知识要求
- 熟悉 C 语言编程,理解指针、内存管理和中断处理。
- 了解 Linux 内核基础概念:模块、字符设备、platform 总线、驱动模型。
- 具备基本的嵌入式硬件知识:GPIO、时钟、寄存器读写。
- 掌握 Linux 内核编译与设备树编译(dtc)工具使用。
常见误区:初学者常将 I²C 设备驱动与控制器驱动混淆。本课程明确区分两者:控制器驱动由 SoC 厂商提供或需移植,设备驱动由外设开发者编写。设备树绑定是连接两者的关键桥梁。