1. 设备树基础概念与演进背景
在早期的ARM Linux开发中,内核源码充斥着大量描述板级细节的代码。这些代码通常位于arch/arm/mach-xxx目录下,包含platform设备、resource、i2c_board_info等硬件描述信息。这种架构存在几个显著问题:
- 代码冗余:相同外设在不同板级文件中重复定义
- 维护困难:硬件变更需要重新编译内核
- 扩展性差:每新增一块开发板都需要修改内核源码
设备树(Device Tree)的引入彻底改变了这一局面。它最初在PowerPC架构中使用,后被ARM社区采纳。设备树本质上是一种描述硬件配置的数据结构,采用树状节点形式组织,具有以下核心特点:
- 硬件描述与内核代码分离
- 支持动态加载和解析
- 可扩展性强
- 人类可读的文本格式(dts)与机器可读的二进制格式(dtb)并存
典型设备树包含的硬件信息包括:
- CPU数量与类型
- 内存基地址和大小
- 总线拓扑
- 外设连接关系
- 中断控制器配置
- GPIO和Clock资源分配
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 设备树源文件结构与语法规范
2.1 DTS文件组织架构
设备树源文件(.dts)采用分层结构设计:
code复制/ { // 根节点
node1 { // 一级节点
child-node1 { // 二级节点
property1; // 节点属性
property2;
};
child-node2;
};
node2;
};
实际项目中通常采用模块化设计:
- .dts:板级定义文件(对应具体开发板)
- .dtsi:SoC级定义文件(包含芯片通用配置)
- 通过#include指令实现文件包含
2.2 节点命名规范
设备树节点命名遵循严格约定:
code复制<节点类型>@<单元地址>
例如:
dts复制serial@101f2000 { // 串口设备,基地址0x101f2000
compatible = "ns16550";
reg = <0x101f2000 0x1000>;
};
特殊节点说明:
- /:根节点,必须存在
- /aliases:定义设备别名
- /chosen:传递启动参数
- /memory:描述物理内存布局
- /cpus:描述CPU核心信息
2.3 属性值类型系统
设备树支持丰富的数据类型:
| 类型 | 示例 | 说明 |
|---|
