1. 课程导论与开发环境搭建
本章是《Linux平台设备驱动与设备树匹配开发实战》的起点。我们将首先明确课程定位与学习路径,随后逐步搭建一套完整的嵌入式Linux驱动开发实验环境,包括内核源码获取、交叉编译工具链安装以及QEMU模拟环境的配置。掌握这些基础工具链,是后续编写、编译和调试平台设备驱动的前提。
1.1 课程导论:平台设备驱动与设备树
在嵌入式Linux系统中,平台设备(Platform Device)是一种不依赖传统总线(如PCI、USB、I2C)的虚拟总线设备,广泛用于SoC内部集成的外设(如GPIO、UART、DMA控制器)。设备树(Device Tree)则是一种描述硬件拓扑结构的数据结构,用于将硬件配置信息从内核代码中解耦,实现“一次编译,多板运行”。
本课程的核心目标:掌握如何编写与设备树节点匹配的平台设备驱动,理解驱动与设备树之间的匹配机制、资源获取方式以及数据传递流程。
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 参数进行浅克隆,仅获取最新版本,节省下载时间和磁盘空间。
操作步骤:
- 安装git:
sudo apt install git -y - 克隆内核源码:
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)。
步骤:
- 设置环境变量:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
- 生成默认配置:
make vexpress_defconfig
- 编译内核与设备树:
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 | 设备树二进制文件 |
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
/ # _
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参数。 - 环境搭建完成后,务必执行检查清单确认所有组件正常。