3. 开发环境搭建:安装dtc编译器、交叉编译工具链配置、在Ubuntu上搭建设备树实验环境
设备树开发环境的核心由三部分组成:设备树编译器(dtc)、交叉编译工具链以及实验验证平台。本章将指导你在 Ubuntu 系统上完整搭建这三部分,确保后续的 DTS 编写与调试工作能够顺利进行。
3.1 设备树编译器(dtc)安装
dtc 是设备树源文件(.dts)与二进制文件(.dtb)之间的转换工具。Ubuntu 提供了两种安装方式:
| 安装方式 | 命令 | 适用场景 |
|---|---|---|
| apt 包管理器 | sudo apt install device-tree-compiler |
快速安装,版本稳定但可能较旧 |
| 源码编译安装 | 从内核源码 scripts/dtc/ 目录编译 |
需要最新特性或自定义补丁 |
推荐使用 apt 方式,安装后验证版本:
dtc --version
# 输出示例:Version DTC 1.6.1
提示:如果后续实验需要 dtc 的
-@(生成插件节点)或 -H(生成头文件)等高级选项,建议从 Linux 内核源码编译最新版本,以获得最完整的语法支持。
3.2 交叉编译工具链配置
嵌入式设备通常使用 ARM、RISC-V 或 AArch64 架构,因此需要交叉编译工具链来编译内核、驱动以及设备树相关的测试程序。以 ARM Cortex-A 系列为例,配置步骤如下:
- 安装 ARM 交叉编译器:
sudo apt install gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf
- 验证工具链:
arm-linux-gnueabihf-gcc --version
# 输出示例:arm-linux-gnueabihf-gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
- 设置环境变量(可选,但推荐):
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
将上述两行添加到 ~/.bashrc 文件中,可使每次打开终端自动生效。
| 目标架构 | 工具链前缀 | Ubuntu 包名示例 |
|---|---|---|
| ARM (32-bit) | arm-linux-gnueabihf- |
gcc-arm-linux-gnueabihf |
| AArch64 (64-bit) | aarch64-linux-gnu- |
gcc-aarch64-linux-gnu |
| RISC-V (64-bit) | riscv64-linux-gnu- |
gcc-riscv64-linux-gnu |
注意:交叉编译工具链的版本应与目标内核版本匹配。过旧的工具链可能无法识别新的设备树绑定宏或内联汇编语法,导致编译失败。
3.3 实验环境目录结构
为了后续章节的 DTS 编写与调试,建议在 Ubuntu 上建立统一的实验目录结构:
~/dts-lab/
├── dts/ # 存放 .dts 源文件
├── dtb/ # 存放编译后的 .dtb 文件
├── dts-include/ # 存放 .dtsi 头文件(公共定义)
├── kernel/ # 存放 Linux 内核源码(可选,用于参考绑定文档)
└── scripts/ # 存放辅助脚本(如批量编译、反编译脚本)
创建目录并赋予基本权限:
mkdir -p ~/dts-lab/{dts,dtb,dts-include,scripts}
chmod -R 755 ~/dts-lab
3.4 实验环境工作流程
下图展示了从编写 DTS 到在目标板上验证的完整流程:
3.5 快速验证实验环境
搭建完成后,执行以下命令验证环境是否正常工作:
# 1. 创建一个最小 DTS 文件
cat << EOF > ~/dts-lab/dts/test.dts
/dts-v1/;
/ {
compatible = "test,board";
#address-cells = <1>;
#size-cells = <1>;
memory@80000000 {
device_type = "memory";
reg = <0x80000000 0x10000000>;
};
};
EOF
# 2. 编译为 DTB
dtc -I dts -O dtb -o ~/dts-lab/dtb/test.dtb ~/dts-lab/dts/test.dts
# 3. 反编译验证
dtc -I dtb -O dts -o ~/dts-lab/dts/test_decompiled.dts ~/dts-lab/dtb/test.dtb
# 4. 对比源文件与反编译文件
diff ~/dts-lab/dts/test.dts ~/dts-lab/dts/test_decompiled.dts
如果 diff 命令无输出,说明编译与反编译过程正确,环境搭建成功。
关键检查点:
- dtc 版本 ≥ 1.6.0(支持设备树插件与 overlays)
- 交叉编译器可正常编译一个简单的 C 程序(如
arm-linux-gnueabihf-gcc hello.c -o hello.arm) - 实验目录结构完整,且具有读写权限
3.6 常见问题与解决
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
dtc: command not found |
未安装 device-tree-compiler 包 | sudo apt install device-tree-compiler |
编译报错 syntax error |
DTS 文件格式错误(如缺少分号、花括号不匹配) | 使用 dtc -I dts -O dtb -o /dev/null test.dts 仅检查语法 |
| 交叉编译器无法执行 | 缺少 32 位库支持(64 位系统常见) | sudo apt install libc6:i386 lib32stdc++6 |
| 反编译后节点顺序错乱 | dtc 默认按字母顺序排序节点 | 使用 -f 选项强制保留原始顺序(部分版本支持) |