☰
设备树 Device Tree
2026/10/15 15:27:23 网站建设 项目流程

文章目录

  • 一、设备树的引入
  • 二、编译
    • 1、最简单的设备树文件
    • 2、编译验证
    • 3、dtc 来源
    • 4、使用内核内置dtc
  • 三、设备树语法

一、设备树的引入

设备树(Device Tree)在 Linux 3.0 版本开始被 ARM 架构正式引入,核心基础设施由 Grant Likely 主导合入。
在此之前,ARM Linux 的板级硬件细节大量硬编码在 arch/arm/plat-xxx 和 arch/arm/mach-xxx 目录中,导致内核臃肿且维护困难。2011 年 Linus Torvalds 对此表达了强烈不满,促使 ARM 社区借鉴 PowerPC 已有的 Flattened Device Tree 机制进行改革。

常用缩写,
dts:Device Tree Source,设备树源文件,文本文件。

dtsi:Device Tree Source Include,设备树包含文件,文本文件,类似头文件,被dts包含复用。

dtb:Device Tree Compiler,设备树编译器,工具,负责把DTS 编译成 DTB,也可反编译。

dtc:Device Tree Blob,设备树二进制文件,Bootloader 加载后传给 Linux 内核。
这里的Blob是普通英文单词,不是缩写,愿意为 “一团、一块、斑点”,在计算机里常指 “一大块二进制数据”。
注意:全大写的 BLOB 在数据库/计算机其他领域,常被解释为 Binary Large Object,这时它是缩写。

二、编译

1、最简单的设备树文件

最简单的设备树文件只需包含版本声明和根节点即可编译通过:

/dts-v1//{};

/dts-v1/:语法要求,声明使用V1版本的设备树规范,必须放在第一行(注释和空行除外)。
/:根节点,设备树有且仅有一个根节点。
{}:语法要求,包含节点对应的属性(属性即 name=value 的键值对)。
;:语法要求,分隔符,无论是节点之间,还是节点内的属性之间,都是以分号作为分隔符。

2、编译验证

编译为二进制 dtb

dtc-Idts-Odtb-ominimal.dtb minimal.dts

dtc:设备树编译器,Device Tree Compiler。
-I:指定输入格式。
-O:指定输出格式。

也可以反编译回 dts 查看,

dtc-Idtb-Odts-ominimal_out.dts minimal.dtb

3、dtc 来源

理论上独立:dtc 是一个独立维护的工具,有自己的 Git 仓库,它的职责仅仅是把人类可读的 .dts 文本“序列化”成内核能解析的二进制 .dtb。它不生成 CPU 指令,因此不依赖架构。在PC上执行which dtc,一般就能找到“/usr/bin/dtc”,使用这个dtc就可以做基本练习。

内核内置:Linux 内核源码树里其实自带了一个 dtc(在 scripts/dtc/ 目录下)。当你运行 make dtbs 时,内核默认会编译并使用这个内置版本。由于它是从内核发布那一刻“冻结”的,所以天然与当前内核版本匹配。

实践建议:最稳妥的方式就是直接使用目标内核源码树中自带的 dtc(即 ./scripts/dtc/dtc),这样可以最大程度避免兼容性问题。

4、使用内核内置dtc

make dtbs是 Linux 内核构建系统中的一个目标,专门用来编译设备树源文件(.dts)为设备树二进制文件(.dtb)。它不编译内核本身,只处理设备树。

📂 内核中的 dtc 是以源码形式存放的,位于内核源码树的:

scripts/dtc/

这个目录下包含dtc.c、dtc-lexer.l、dtc-parser.y等源文件,以及 Makefile。它不是预编译好的二进制可执行文件。
当你运行make dtbs(或make scripts)时,构建系统会用宿主机的编译器把这些源码编译成可执行文件:

scripts/dtc/dtc

之后才会用这个刚生成的dtc去编译设备树。
你也可以通过make DTC=/usr/bin/dtc dtbs强制使用系统安装的 dtc,但一般不推荐,除非你清楚版本兼容性。

🔨make dtbs具体做了什么

(1) 准备 dtc 工具
检查scripts/dtc/dtc是否存在,若不存在或源码有更新,则先调用宿主机的编译器(HOSTCC,如gcc)编译scripts/dtc/下的源码,生成可执行的dtc。
[ 这一步与目标板的交叉工具链无关,用的是你电脑上的普通 GCC。]

(2) 确定要编译哪些设备树
根据当前.config中选中的平台(如CONFIG_ARCH_IMX),从对应的 Makefile(如arch/arm/boot/dts/Makefile)中读取dtb-$(CONFIG_...)列表。
[ 例如dtb-$(CONFIG_SOC_IMX6UL) += imx6ul-14x14-evk.dtb,就会编译这个板子的设备树。]

(3) 预处理 + 编译
● 对每个.dts文件,内核构建系统会先调用 C 预处理器(cpp)处理#include、宏等,生成临时的预处理文件。
● 然后调用scripts/dtc/dtc,将预处理后的文件编译成.dtb。
● 最终输出到arch/arm/boot/dts/(或arch/arm64/boot/dts/等)目录下。

(4) 可选安装
make dtbs_install会把生成的.dtb安装到指定目录(如/boot/dtb)。

三、设备树语法

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询