1. 课程导论与开发环境搭建

本章是《Linux平台设备驱动与设备树匹配开发实战》的起点。我们将首先明确课程定位与学习路径,随后逐步搭建一套完整的嵌入式Linux驱动开发实验环境,包括内核源码获取、交叉编译工具链安装以及QEMU模拟环境的配置。掌握这些基础工具链,是后续编写、编译和调试平台设备驱动的前提。

1.1 课程导论:平台设备驱动与设备树

在嵌入式Linux系统中,平台设备(Platform Device)是一种不依赖传统总线(如PCI、USB、I2C)的虚拟总线设备,广泛用于SoC内部集成的外设(如GPIO、UART、DMA控制器)。设备树(Device Tree)则是一种描述硬件拓扑结构的数据结构,用于将硬件配置信息从内核代码中解耦,实现“一次编译,多板运行”。

本课程的核心目标:掌握如何编写与设备树节点匹配的平台设备驱动,理解驱动与设备树之间的匹配机制、资源获取方式以及数据传递流程。

学习路径概览: 基础环境搭建 → 设备树语法与编译 → 平台驱动框架 → 匹配机制 → 中断/GPIO/时钟资源获取 → 实战项目(LED、按键、ADC)。
课程知识体系架构图 Linux平台设备驱动与设备树匹配 设备树语法与编译 平台驱动框架 匹配与资源获取 节点/属性/中断 DTC编译/反编译 probe/remove of_match_table GPIO/时钟/复位 DMA/IOMMU 课程核心:驱动与设备树的匹配机制 通过 compatible 属性匹配 → 调用 probe → 获取资源 → 注册设备

1.2 开发环境全景

本课程采用主机-目标机分离的开发模式。主机(Host)运行Ubuntu 22.04 LTS,负责代码编辑、交叉编译;目标机(Target)使用QEMU模拟的ARM Versatile Express平台(Cortex-A9),运行编译好的Linux内核与根文件系统。

组件 版本/说明 用途
主机操作系统 Ubuntu 22.04 LTS (x86_64) 开发、编译、调试
交叉编译工具链 gcc-arm-linux-gnueabihf (12.3) ARM目标代码生成
Linux内核源码 v6.1 LTS 驱动开发与编译
QEMU模拟器 7.2.0 目标机运行与调试
根文件系统 Buildroot生成的ext4镜像 目标机用户空间

1.3 Linux内核源码获取

我们使用LTS版本内核,确保稳定性和社区支持。推荐通过git克隆官方仓库,便于后续切换分支和查看历史。

建议: 使用 --depth=1 参数进行浅克隆,仅获取最新版本,节省下载时间和磁盘空间。

操作步骤:

  1. 安装git:sudo apt install git -y
  2. 克隆内核源码:
cd ~
git clone --depth=1 -b v6.1 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git linux-6.1
cd linux-6.1

验证源码完整性:

ls arch/arm/   # 确认ARM架构目录存在
ls drivers/    # 确认驱动目录存在
cat Makefile | head -5  # 查看版本号

1.4 交叉编译工具链安装

交叉编译工具链用于在x86主机上生成ARM架构的可执行代码。我们选择ARM官方推荐的gcc-arm-linux-gnueabihf,支持硬件浮点运算。

安装命令:

sudo apt update
sudo apt install gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf -y

验证安装:

arm-linux-gnueabihf-gcc --version
# 输出示例:arm-linux-gnueabihf-gcc (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
常见问题: 如果系统提示找不到包,请先执行 sudo apt update 更新软件源。若仍失败,可手动添加Ubuntu Ports源。

1.5 QEMU模拟环境搭建

QEMU能够模拟完整的ARM开发板,无需真实硬件即可运行和调试内核。我们使用qemu-system-arm模拟Versatile Express平台。

安装QEMU:

sudo apt install qemu-system-arm qemu-utils -y

验证安装:

qemu-system-arm --version
# 输出示例:QEMU emulator version 7.2.0

1.6 编译内核与设备树

配置并编译适用于vexpress平台的内核镜像和设备树二进制文件(.dtb)。

步骤:

  1. 设置环境变量:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
  1. 生成默认配置:
make vexpress_defconfig
  1. 编译内核与设备树:
make -j$(nproc) zImage
make -j$(nproc) dtbs

编译完成后,关键文件位置:

文件 路径 说明
zImage arch/arm/boot/zImage 压缩后的内核镜像
vexpress-v2p-ca9.dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb 设备树二进制文件
内核与设备树编译流程 内核源码 (C/ASM) 设备树源文件 (.dts) ARM GCC + DTC 交叉编译 + 设备树编译 zImage (内核镜像) vexpress.dtb make zImage 编译内核,make dtbs 编译设备树 两者独立编译,最终由QEMU或bootloader加载

1.7 启动QEMU验证环境

使用编译好的内核和设备树启动QEMU,验证环境是否正常工作。需要准备一个根文件系统镜像(此处使用Buildroot预生成的rootfs.ext4)。

启动命令:

qemu-system-arm \
  -M vexpress-a9 \
  -kernel arch/arm/boot/zImage \
  -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
  -drive file=rootfs.ext4,format=raw,if=sd \
  -append "console=ttyAMA0 root=/dev/mmcblk0 rw" \
  -nographic

启动后应看到内核启动日志,最终进入shell提示符:

...
VFS: Mounted root (ext4 filesystem) on device 179:0.
Freeing unused kernel memory: 1024K
Run /sbin/init as init process
Starting syslogd: OK
Starting klogd: OK
/ # _
验证驱动加载: 进入QEMU后,执行 ls /sys/bus/platform/devices/ 可查看当前平台设备列表,后续章节将在此环境中加载自定义驱动。

1.8 环境检查清单

完成上述步骤后,使用下表逐项确认环境就绪:

检查项 验证命令 预期结果
交叉编译器 arm-linux-gnueabihf-gcc --version 显示版本号,无错误
内核源码 ls arch/arm/boot/zImage 文件存在
设备树 ls arch/arm/boot/dts/vexpress-v2p-ca9.dtb 文件存在
QEMU qemu-system-arm --version 显示版本号
QEMU启动 执行启动命令 进入shell提示符

1.9 本章小结

本章完成了课程导论与开发环境的全面搭建。我们获取了Linux 6.1内核源码,安装了ARM交叉编译工具链,配置了QEMU模拟环境,并成功编译内核与设备树,最终在QEMU中启动了完整的Linux系统。这套环境将贯穿后续所有章节,是驱动开发与调试的基础平台。

关键记忆点:
  • 平台设备驱动依赖设备树描述硬件,通过 compatible 属性匹配。
  • 交叉编译工具链前缀为 arm-linux-gnueabihf-。
  • 内核与设备树独立编译,QEMU加载时分别指定 -kernel 和 -dtb 参数。
  • 环境搭建完成后,务必执行检查清单确认所有组件正常。