1. 设备树(DTS)基础概念解析
在嵌入式Linux开发领域,设备树(Device Tree)已经成为ARM架构下硬件描述的事实标准。我第一次接触设备树是在2014年为一个工业控制器移植Linux系统时,当时内核刚从board files过渡到device tree,这个转变让硬件描述与内核代码实现了真正的解耦。
设备树本质上是一种描述硬件配置的数据结构,采用树状节点形式组织。它解决了ARM架构下硬件碎片化严重的问题——想象一下,如果没有设备树,内核需要为每块开发板维护单独的源代码分支,这简直是维护者的噩梦。设备树文件通常以.dts(设备树源文件)或.dtsi(包含文件)为扩展名,经过dtc编译器处理后生成二进制的.dtb文件,由bootloader在启动时传递给内核。
在Ubuntu 20.04环境下,设备树开发工具链已经相当完善。通过apt-get install device-tree-compiler即可获取dtc编译器,其版本为1.5.1,支持最新的设备树语法规范。值得注意的是,虽然设备树语法相对稳定,但不同内核版本对某些绑定(bindings)的支持可能存在差异,这也是为什么我们强调Ubuntu 20.04这个特定环境——它搭载的5.4 LTS内核代表了当前工业界最广泛采用的稳定版本。
实践提示:建议在开发目录下创建arch/arm/boot/dts/这样的标准目录结构,虽然Ubuntu环境下编译不强制要求,但这能保持与内核源码树的一致性,方便后续维护。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. DTS语法深度剖析
2.1 设备树基本结构
一个完整的.dts文件通常由以下几部分组成,我们以一个虚拟的"myboard.dts"为例:
dts复制/dts-v1/;
#include "soc-base.dtsi"
/ {
model = "MyTech ARM Board";
compatible = "mytech,arm-board";
memory@80000000 {
device_type = "memory";
reg = <0x80000000 0x20000000>;
};
chosen {
bootargs = "console=ttyS0,115200 earlyprintk";
};
};
这个简单示例已经展示了设备树的几个关键特征:
- 版本声明(/dts-v1/)必须出现在文件首行
- 支持#include包含机制,类似C语言的头文件
- 根节点(/)包含板级基本信息
- 内存节点(memory)描述物理内存布局
- chosen节点传递运行时参数
2.2 节点与属性详解
设备树的核心是节点(node)和属性(property)的嵌套结构。节点用标签:语法定义,例如:
dts复制uart0: serial@101f1000 {
compatible = "arm,pl011";
reg = <0x101f1000
