1. 设备树基础概念与背景
大家好,我是接触嵌入式Linux开发十多年的老工程师了。记得刚开始搞驱动开发的时候,每换一块板子就要重新修改内核代码,那些板级细节信息散落在arch/arm/mach-xxx目录下,简直让人头疼。后来设备树(Device Tree)的出现彻底改变了这种状况,让硬件描述和驱动代码实现了分离。
设备树到底是什么?简单来说,它就像硬件的"描述文件",用文本格式记录了CPU、内存、外设等硬件信息。开发板上的设备连接情况、寄存器地址、中断号等信息都通过设备树来告诉内核,而不是像以前那样硬编码在内核代码中。
设备树包含几个关键组成部分:DTS(设备树源文件,人类可读的文本格式)、DTSI(设备树头文件,类似C语言的.h文件)、DTB(编译后的二进制文件,内核直接使用)和DTC(编译工具,相当于gcc编译器)。这种设计让硬件描述变得模块化和可重用,大大提升了开发效率。
2. DTS文件语法详解
2.1 节点结构与命名规则
设备树采用树形结构组织硬件信息,每个设备都是一个节点。节点的基本格式是这样的:
node-name@unit-address {
property1 = value;
property2 = value;
child-node {
/* 子节点内容 */
};
};
节点名(node-name)最长31个字符,应该清晰描述设备功能,比如"uart1"表示串口1。@后面的单元地址(unit-address)通常是设备的寄存器基地址或设备地址。
在实际项目中,我经常使用标签(label)来简化节点引用。比如:
cpu0: cpu@0 {
compatible = "arm,cortex-a7";
device_type = "cpu";
reg = <0>;
};
这里的"cpu0"就是标签,其他地方可以用&cpu0来引用这个节点,避免了重复写冗长的节点名。
2.2 属性值与数据类型
设备树属性支持多种数据类型,这是实际开发中最常用的部分:
字符串类型:
compatible = "st,stm32mp157";
32位无符号整数:
reg = <0x40011000 0x400>; // 起始地址0x40011000,长度0x400
字符串列表:
compatible = "st,stm32h7-uart", "st,stm32-uart";
二进制数据:
local-mac-address = [00 11 22 33 44 55];
布尔值(属性存在即

1万+

被折叠的 条评论
为什么被折叠?



