一、什么是设备树
设备树,英文名 Device Tree(缩写 DT),是 Linux 内核用于描述硬件设备信息的一种文本结构化语言和机制。
- 本质上:就是一份描述“本台硬件上到底连了哪些外设,每个外设参数是多少”的树状配置文件。
- 格式:由
.dts、.dtsi、.dtb等文件组成,最终由 bootloader 传给内核。
二、设备树的历史背景与意义
为什么出现设备树?
- 解耦:原来 Linux 驱动要写死设备信息在 C 代码里,硬件变了就要改代码,非常不灵活。
- 动态适配:设备树让同样的内核驱动可以服务于多种硬件,只需改设备树文件,无需动驱动代码!
- 硬件信息搬家:设备树把所有设备资源描述(如地址/中断/名字/引脚/参数)从 C 代码“搬”到了dts文本里。
三、设备树结构图
设备树 = 树状结构的硬件目录
- 根节点
/代表 “整台设备” - 各分支描述一类硬件(CPU/内存/外设/挂载的总线等)
- 每个节点就是一个设备,节点下还能有子节点,表现出真实“谁挂在哪”关系
- 每个节点里可以有多种“属性”(如寄存器地址、名字、IRQ、引脚等)
四、设备树实际样例
泰山派3M的设备树跟文件存放在: kernel-6.1/arch/arm64/boot/dts/rockchip/tspi-3m-rk3576.dts
c
/*-----------------------------------------------------------
* 板子基础信息配置
*----------------------------------------------------------*/
/ {
model = "LCKFB TaishanPi 3M RK3576 Board";
compatible = "lckfb,tspi-3m-rk3576", "rockchip,rk3576";
/*
* 用户LED
* 用于提示系统状态
*/
leds: leds {
status = "okay";
compatible = "gpio-leds";
work_led: work {
linux,default-trigger = "heartbeat";
gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>;
};
};
};1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
五、硬件与软件的桥梁
- 设备树就像是硬件电路说明书,但机器能看、内核能解析
- 一台板子的全部硬件资源都是一个树状结构
- 内核启动时,解析dtb(设备树二进制),自动“创建设备对象”,并与各类platform/i2c/spi驱动自动匹配工作
六、设备树与sysfs的联系
- 设备树是静态描述:告诉内核有哪些硬件、属性怎样(写在dts)
- sysfs 是动态展示:内核把设备树和驱动结合后的组织,动态“展现”为目录结构(
/sys/)- 比如
/sys/firmware/devicetree/下内容就是解析过的设备树 /sys/bus/platform/devices等下的设备,往往跟dts里定义一一对照!
- 比如
七、设备树的现实作用
- 裁剪/移植硬件时不用大改代码,只要改dts
- 批量出货——一套驱动代码,配N份dts即可适配多机型
- 动态生成设备节点,让驱动自动识别新外设
- 极大提高硬件/驱动工程师配合效率和灵活性
八、图解
设备树结构和驱动关系:
- 设备树经
BootLoader(U-boot)加载进内核,生成设备对象,驱动匹配后再反映到 sysfs
九、dts、dtsi与dtb
1、这些是什么?
dts (Device Tree Source)
- dts 文件(device tree source)是“设备树源码文件”,拓扑树形结构的文本格式,手工编辑,后缀名为
.dts,是主板/单板具体硬件资源的详细描述。
dtsi (Device Tree Source Include)
- dtsi 文件(device tree source include)是“设备树源码的头文件/公共部分”,后缀是
.dtsi,主要用于复用通用硬件描述,被多个.dts引用,就像 C 语言的.h文件。
dtb (Device Tree Blob)
- dtb 文件(device tree blob)是编译后的二进制设备树文件,后缀为
.dtb,包含所有树信息。bootloader 会把 dtb 传递给内核启动使用。
2、关系与用途
- dtsi :公共的 SoC/外设描述,供复用
- dts :各机型/主板引用一个或多个 dtsi,再补充板子本身参数,是“最终的源文件”
- dtb :dts文件经过编译器(dtc)编译生成的二进制,开机时BOOT加载进内核
3、常见问题
Q1:dts 和 dtsi 区别?
dts通常每款主板/机型一份,是顶层“主”文件,会 include 一或多个dtsidtsi提供“通用”部分,再也不用在每个 dts 中重复写 CPU/外设/片内资源等
Q2:dtb 从哪里来的?能改吗?
- 用设备树编译器 dtc:
dtc -I dts -O dtb xxx.dts -o xxx.dtb - 也可以用内核 make 系统自动生产
- 只能读不能手工编辑,需要重新编译 dts 才能修改!
Q3:设备树的修改流程?
- 编辑 dts/dtsi
- 用 dtc 或 make 编译出 dtb
- 烧录/Update/传递到开发板,bootloader 自动加载
4、实际举例
拥有以下的文件结构:
makefile
sensor.dtsi # sensor 公共外设描述
myboard.dts # 你自己的开发板顶层设备树文件
myboard.dtb # 编译生成的二进制文件1
2
3
2
3
通常在 myboard.dts 文件头会有:
clike
#include "sensor.dtsi"1
最终 make 会输出 myboard.dtb 。
INFO
写 dts / dtsi,编出 dtb,板子跑的就是 dtb!