3、DTC编译器安装:从源码编译dtc、apt-get安装、验证安装是否成功

设备树编译器(DTC),说白了就是把 .dts 文本文件变成 .dtb 二进制文件的工具。没有它,你的设备树写得再漂亮也跑不起来。我刚开始接触设备树时,就吃过这个亏——写了一大堆节点,结果编译不过,折腾半天才发现是 DTC 版本太老。

这一节,咱们就把 DTC 的安装彻底搞定。我会介绍两种方式:apt-get 快速安装源码编译安装。你根据自己情况选一种就行。

3.1 方式一:apt-get 快速安装(推荐新手)

如果你用的是 Ubuntu 或 Debian 系系统,最简单的方式就是直接装。我个人习惯先用这个方式,省时间。

sudo apt-get update
sudo apt-get install device-tree-compiler

装完之后,验证一下:

dtc --version

正常会输出类似:

Version: DTC 1.6.1
小提示: apt-get 安装的版本通常比上游源码慢一两个小版本。不过对于日常开发,1.6.x 完全够用。我在项目中用 1.6.0 跑了两年,没出过问题。

3.2 方式二:从源码编译安装(推荐进阶用户)

为什么要自己编译?原因很简单:你要用最新特性。比如某些新内核引入了新的 binding,老版本 DTC 可能不认识。我记得有一次,内核 5.10 新增了 interrupt-map 的语法糖,我用的 1.5.0 直接报错。嗯,从那以后我就养成了源码编译的习惯。

3.2.1 下载源码

DTC 的官方仓库在 git://git.kernel.org/pub/scm/utils/dtc/dtc.git。你也可以从 GitHub 镜像拉:

git clone https://git.kernel.org/pub/scm/utils/dtc/dtc.git
cd dtc

或者直接下载 release 包:

wget https://www.kernel.org/pub/software/utils/dtc/dtc-1.6.1.tar.gz
tar -xzf dtc-1.6.1.tar.gz
cd dtc-1.6.1

3.2.2 编译与安装

DTC 的编译很简单,没有复杂的 configure 步骤。直接 make 就行:

make
sudo make install

这里有个坑——默认安装路径是 /usr/local/bin。如果你的系统 PATH 没包含这个目录,记得加一下:

export PATH=$PATH:/usr/local/bin

或者你像我一样,直接指定安装路径:

make PREFIX=/usr install
注意: 如果你之前用 apt-get 装过 DTC,源码编译安装后可能会覆盖系统版本。建议先卸载旧版:sudo apt-get remove device-tree-compiler。我曾经没卸载,结果两个版本冲突,编译时莫名其妙报错,排查了半天。

3.3 验证安装是否成功

不管用哪种方式,装完之后都要验证。我一般做三步检查:

  1. 版本检查dtc --version,确认版本号符合预期。
  2. 基本编译测试:随便写个最简单的 .dts 文件,编译成 .dtb
  3. 反编译测试:把刚生成的 .dtb 反编译回 .dts,看看是否一致。

第二步和第三步的具体操作,我写个示例:

# 创建一个最简单的 dts 文件
cat > test.dts << EOF
/dts-v1/;

/ {
    compatible = "test,device";
    #address-cells = <1>;
    #size-cells = <1>;

    cpu@0 {
        compatible = "test,cpu";
        reg = <0x00 0x100>;
    };
};
EOF

# 编译
dtc -I dts -O dtb -o test.dtb test.dts

# 反编译
dtc -I dtb -O dts -o test_reverse.dts test.dtb

# 对比原始文件和反编译文件
diff test.dts test_reverse.dts

如果 diff 没有输出,说明编译和反编译都正常。你想想看,这其实就验证了 DTC 的核心功能——无损转换

核心要点: 验证 DTC 安装是否成功,不是只看版本号。一定要跑一次完整的编译→反编译→对比流程。我在项目中遇到过版本号显示正常,但编译出来的 dtb 有字节对齐问题的案例。所以,实战验证才是硬道理。

3.4 常见问题与避坑指南

问题 原因 解决方法
dtc: command not found 没安装或 PATH 没配置 检查安装路径,或重新安装
FATAL ERROR: Unrecognized input format 输入文件格式不对 检查 -I 参数是 dts 还是 dtb
Error: syntax error dts 文件语法错误 检查分号、花括号是否匹配
反编译后多了 __symbols__ 节点 DTC 版本差异 -@ 参数控制符号表生成

我曾经在调试一块 ARM 开发板时,反编译出来的 dtb 总是多出一些奇怪的节点。后来发现是 DTC 版本太老,不支持新的 plugin 语法。升级到 1.6.1 后问题解决。所以,版本对齐很重要——你的 DTC 版本最好和内核源码树里自带的版本一致。

3.5 本章知识体系

下面这张图,帮你理清 DTC 安装的完整脉络:

DTC 编译器安装知识体系 方式一:apt-get 安装 方式二:源码编译安装 sudo apt-get install device-tree-compiler git clone → make → make install 验证安装:三步检查法 ① 版本检查 ② 编译测试 ③ 反编译对比

这张图把安装流程分成了两条路径,最终汇聚到验证环节。你跟着走一遍,基本不会出错。


好了,DTC 的安装就讲到这里。两种方式各有优劣——apt-get 省心,源码编译灵活。我个人建议:开发环境用源码编译,生产环境用 apt-get。下一节,咱们会真正动手写第一个 .dts 文件,到时候你就知道 DTC 装好有多重要了。

最后提醒: 如果你在编译内核时遇到 DTC: command not found 错误,别慌。八成是内核源码树里的 scripts/dtc 目录没编译。进到内核目录,执行 make scripts 就能生成。这个坑我踩过两次,现在记住了。

专注资料整理