01、设备树(device Tree)的由来
设备树(Device Tree)是嵌入式系统和操作系统中描述硬件的一种方式。它用统一的格式说明硬件设备的类型、连接方式和配置参数,让操作系统能更灵活地适配不同硬件,减少系统对特定硬件的依赖,方便后续维护和移植。
::: 我们通过 platform_device 结构体来描述硬件设备。这是传统上用来定义硬件设备的一种方法。
每个 platform_device 结构体代表一个具体的硬件设备(比如芯片、传感器等)。通过将它注册到系统的"平台总线"上,内核就能识别并管理这个设备。这个结构体里会记录设备的名称、硬件资源(如内存地址、中断号等),以及对应的驱动程序信息。这样,内核就能根据这些信息和设备正常通信了。 :::
一、设备树的由来
随着时间推移,Linux内核中针对ARM架构的代码变得越来越混乱。不同硬件平台的配置代码重复冗余,维护起来费时费力。2011年3月17日,Linux创始人林纳斯·托瓦兹在邮件列表中直接抱怨:"唉,各位,ARM这部分代码简直让人头疼透了!" 这番话引发开发者们对现有开发模式的反思。
大家意识到,过去那种为每个硬件平台单独编写配置代码的方式已经不可持续。于是社区开始寻求更高效且能适应未来发展的解决方案,来替代这些难以复用的"垃圾代码"(不可复用的平台专用代码)。
为了应对硬件描述的挑战,ARM社区开发了设备树这一新方案。设备树就像硬件的说明书,把设备信息从代码中独立出来,用更灵活的方式描述硬件。
它用清晰的结构化数据格式,记录设备信息、功能特性和连接方式。这样硬件描述不再依赖具体平台,不同设备还能共享相同配置,让开发更高效。
设备树给ARM架构的Linux系统带来了重大变革。它统一了硬件描述方式,让不同芯片和开发板的支持变得更简单。开发者还能通过可视化配置更直观地理解和调试硬件。
如今设备树已成为嵌入式系统和Linux的标准配置方案,不仅在ARM平台上广泛应用,也被其他架构逐渐采用。这种灵活易读的硬件描述方式,极大简化了多平台设备的开发工作。
二、设备树的组成
设备树(Device Tree)涉及的四个关键术语:
- DTS(设备树源文件) DTS是用纯文本写的硬件描述文件,后缀是
.dts
。它像代码一样,用简单语法描述硬件设备的结构、功能和连接方式。开发者直接编写DTS文件,方便人阅读和修改。 - DTSI(设备树包含文件) DTSI是DTS的“共享代码块”,后缀是
.dtsi
。它类似C语言的头文件,可以被多个DTS文件引用。比如,多个设备共用的硬件配置(如芯片通用参数)可以放在DTSI里,避免重复编写,方便维护。 - DTC(设备树编译器) DTC是一个工具,作用类似“翻译器”。它把DTS或DTSI文件(人可读的文本)编译成二进制格式的DTB文件。简单来说,DTC就是“把文本文件转成机器能直接用的二进制文件”。
- DTB(设备树二进制文件) DTB是DTS/DTSI编译后的二进制文件,后缀是
.dtb
。它是操作系统启动时需要加载的文件,用来识别和管理硬件设备。因为是二进制格式,机器读取更快,但人无法直接阅读。
它们之间的关系:
- 开发阶段: 开发者先写DTS和DTSI文件,用DTSI共享通用配置(比如多个设备共用的传感器参数)。 (类比:DTS是“主程序”,DTSI是“可复用的代码片段”)
- 编译阶段: 用DTC工具将DTS(和引用的DTSI)编译成DTB文件。 (类比:把源代码编译成可执行文件)
- 运行阶段: 操作系统启动时加载DTB文件,根据DTB里的信息自动识别硬件,完成初始化。 (类比:手机开机时,系统根据DTB“认识”自己的屏幕、摄像头等硬件)
三、设备树文件目录
- ARM架构设备的硬件配置文件(设备树)通常存放在系统代码的
arch/arm/boot/dts/
文件夹中,这是这类文件的主要存放位置。 - 对于ARM64架构的设备,硬件配置文件路径为
arch/arm64/boot/dts/
文件夹及其子文件夹。这也是存放设备树文件的主目录,里面会根据不同的硬件平台或芯片厂商划分子文件夹(比如高通、英伟达、三星等)。 - 以我们使用的瑞芯微RK3566芯片为例,对应的设备树文件就在
arch/arm64/boot/dts/rockchip
这个子文件夹里。每个子文件夹里会包含多个配置文件,分别对应不同设备型号或硬件组合的设置。
四、设备树的编译
设备树的编译是将设备树源文件(如上述的.dts 文件)转换为二进制的设备树表示形式(.dtb文件) 的过程。 编译器通常被称为 DTC(Device Tree Compiler) 。
在 Linux 内核源码中, DTC( Device Tree Compiler) 的源代码和相关工具通常存放在scripts/dtc/目录中, 如下图:
在编译完源码之后 dtc 设备树编译器会默认生成, 如果没有生成相应的 dtc 可执行文件,可以查看在内核默认配置文件中 CONFIG_DTC 是否使能
4.1、设备树的编译
在 Linux 环境中, 可以使用以下命令将设备树源文件编译为二进制设备树文件:
dtc -I dts -O dtb -o output.dtb input.dts
其中, input.dts
是输入的设备树源文件, output.dtb
是编译后的二进制设备树文件。编译器会验证设备树源文件的语法和语义, 生成与硬件描述相对应的设备树表示形式。
4.2、设备树的反编译
设备树的反编译是将二进制设备树文件转换回设备树源文件的过程, 以便进行查看、 编辑或修改。 反编译器通常也是 DTC。
在 Linux 环境中, 可以使用以下命令将二进制设备树文件反编译为设备树源文件:
dtc -I dtb -O dts -o output.dts input.dtb
其中, input.dtb 是输入的二进制设备树文件, output.dts 是反编译后的设备树源文件。
反编译器会将二进制设备树文件解析并还原为文本形式的设备树源文件, 使其可读性更好。
下面来进行一下实际的设备树编译和反编译的演示, 首先创建一个名为 test.dts 的设备树文件, 文件内容如下所示:
/dts-v1/;
/
{
};
2
3
4
5
这个设备树很简单, 只包含了根节点/, 而根节点中没有任何子节点或属性。 这个示例并没有描述任何具体的硬件设备或连接关系, 它只是一个最基本的设备树框架。