1. 课程导论:驱动移植与 I2C 适配概述

嵌入式 Linux 设备驱动开发是连接硬件与操作系统的核心环节。在实际工程中,驱动工程师面临两大核心挑战:将现有驱动快速移植到新内核或新平台,以及适配标准总线协议(如 I2C)以驱动多样化外设。本课程正是围绕这两大主题,构建一套从环境搭建到实战落地的完整工程实践体系。

课程定位:本课程面向具备基础 Linux 驱动开发经验的工程师,聚焦“移植”与“适配”两大工程场景,而非从头讲解驱动基础。课程内容直接对应企业级开发中的常见任务:内核版本升级、SoC 平台迁移、I2C 外设驱动集成。

1.1 驱动移植与 I2C 适配的核心问题

驱动移植并非简单的代码复制,它涉及内核 API 变更、设备树适配、时钟/电源管理差异、中断控制器变化等多个维度。I2C 驱动适配则要求开发者理解 I2C 子系统架构、设备树绑定、以及从机设备通信协议。下图展示了驱动移植与 I2C 适配在整个嵌入式软件栈中的位置:

嵌入式 Linux 驱动软件栈与课程聚焦范围 用户空间应用程序 (App / Daemon) Linux 内核核心 (VFS / 进程调度 / 内存管理) 设备驱动框架 (Platform / I2C / SPI / MMC 子系统) 课程聚焦:驱动移植与 I2C 适配 驱动移植:API / DTS / 平台适配 I2C 适配:子系统 / 设备树 / 从机驱动 硬件平台 (SoC / 外设 / I2C 总线 / 传感器 / 执行器)
工程视角:驱动移植和 I2C 适配不是孤立的技术点。一次典型的项目任务可能是:将某款 I2C 温湿度传感器驱动从 Linux 4.19 移植到 Linux 6.1,同时适配新的 ARM64 平台。这要求开发者同时掌握内核 API 变更追踪、设备树语法、I2C 子系统接口以及平台时钟/GPIO 配置。

1.2 课程目标

完成本课程学习后,学员应具备以下核心能力:

能力维度 具体目标 对应实战章节
内核移植 独立完成 Linux 内核在不同 SoC 平台间的移植,包括设备树、时钟、中断、DMA 等核心模块的适配 第 2-8 章
驱动迁移 掌握内核 API 变更追踪方法,能将 4.x/5.x 驱动迁移至 6.x 内核,处理关键 API 废弃与替换 第 9-14 章
I2C 子系统 深入理解 Linux I2C 核心层、总线驱动与从机驱动三层架构,能编写和调试 I2C 设备驱动 第 15-22 章
工程实践 搭建交叉编译环境、使用 QEMU 模拟验证、掌握设备树调试与 I2C 总线分析工具 第 23-30 章

1.3 学习路径与章节地图

课程按“基础 → 移植 → I2C 适配 → 实战”四阶段递进设计。下图展示了完整的学习路径与章节依赖关系:

课程学习路径与章节依赖关系 阶段一:基础与环境 第 1-4 章 课程导论 交叉编译环境 内核编译与 QEMU 阶段二:驱动移植 第 5-14 章 内核 API 变更追踪 设备树移植 Platform 驱动迁移 阶段三:I2C 适配 第 15-22 章 I2C 核心层分析 I2C 总线驱动 从机设备驱动编写 阶段四 第 23-30 章 综合实战 项目交付 关键依赖说明 • 阶段二(驱动移植)依赖阶段一的环境搭建能力,建议顺序学习 • 阶段三(I2C 适配)与阶段二部分内容可并行学习,但设备树知识是 I2C 适配的前置条件 章节详细列表 阶段一: 第 1 章 课程导论 · 第 2 章 交叉编译工具链 · 第 3 章 内核源码与配置 · 第 4 章 QEMU 模拟环境 阶段二: 第 5 章 内核 API 版本差异 · 第 6 章 设备树语法与绑定 · 第 7 章 时钟与中断移植 · 第 8 章 DMA 引擎适配 第 9 章 Platform 驱动框架 · 第 10 章 字符设备移植 · 第 11 章 块设备移植 · 第 12 章 网络设备移植 第 13 章 电源管理适配 · 第 14 章 内核调试与性能分析 阶段三: 第 15 章 I2C 子系统架构 · 第 16 章 I2C 核心层 API · 第 17 章 I2C 总线驱动 · 第 18 章 I2C 从机驱动框架 第 19 章 设备树 I2C 绑定 · 第 20 章 I2C 传感器驱动实战 · 第 21 章 I2C 多主与仲裁 · 第 22 章 I2C 调试工具 阶段四: 第 23-30 章 综合项目:从零移植 I2C 触摸屏驱动至 ARM64 平台,包含完整工程交付

1.4 前置知识要求

为确保学习效果,学员应在课前具备以下基础能力。建议对照下表进行自我评估:

知识领域 具体要求 推荐自检方式
C 语言与 Linux 编程 熟练使用 C 语言,理解指针、内存管理、链表操作;掌握 Linux 系统调用基础 能独立编写字符设备驱动并测试
Linux 内核基础 理解内核模块机制、设备模型(kobject/uevent)、中断上下文的区别 完成过至少一个内核模块的加载/卸载实验
嵌入式基础 了解 ARM/ARM64 体系结构基础,理解 MMU、中断控制器、时钟树等概念 能阅读 SoC 数据手册中的内存映射与时钟章节
工具链使用 熟悉 Git 版本控制、Makefile 构建系统、gdb 调试基础 能使用 git bisect 定位问题提交
前置知识不足怎么办? 本课程在第 2-4 章安排了环境搭建与基础回顾内容,但不会从头讲解 C 语言或内核基础。如果自检发现上述领域存在明显短板,建议先补充《Linux 设备驱动开发基础》或《嵌入式 Linux 系统编程》相关课程。

1.5 课程工程环境概览

本课程所有实验均基于以下工程环境配置,学员应在课程开始前完成环境准备:

  • 主机系统:Ubuntu 22.04 LTS (x86_64) 或更新版本
  • 交叉编译工具链:gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu
  • 目标内核:Linux Kernel 6.1 LTS(主线版本,用于移植目标)
  • 参考内核:Linux Kernel 5.10 LTS / 4.19 LTS(用于 API 差异对比)
  • 模拟平台:QEMU 7.2+ 模拟 ARM64 virt 平台
  • I2C 外设模拟:QEMU 内置 I2C 控制器 + 虚拟从机设备
  • 版本管理:Git + 课程提供的实验仓库
为什么选择 6.1 LTS? Linux 6.1 是 2022 年 12 月发布的长期支持版本,支持至 2027 年。它包含了 Rust 实验性支持、Btrfs 性能优化、以及大量 I2C 子系统的改进。选择 6.1 LTS 既能覆盖最新的内核 API,又能保证课程内容的时效性。