设备树(Device Tree)是一种描述硬件配置的数据结构,用于将硬件信息传递给操作系统内核,特别是在ARM架构中广泛使用。它解决了嵌入式系统中硬件描述硬编码在内核中的问题。
/dts-v1/; // 设备树版本
/ { // 根节点
node1 { // 子节点1
property1 = "value"; // 属性1
property2 = <0x1234>; // 属性2(数值)
child-node { // 子节点的子节点
property3;
};
};
node2 {
// ...
};
};
property = "string value";
property = <0x12345678>;
property = [01 23 45 67];
property = "string1", "string2";
property = <1 2 3 4>;
compatible
: 用于设备驱动匹配reg
: 寄存器地址和大小interrupts
: 中断信息status
: 设备状态("okay", "disabled"等)#address-cells
和#size-cells
: 定义寻址方式/dts-v1/;
/ {
compatible = "mycompany,myboard";
#address-cells = <1>;
#size-cells = <1>;
memory@80000000 {
device_type = "memory";
reg = <0x80000000 0x10000000>; // 256MB内存
};
uart0: serial@101f1000 {
compatible = "arm,pl011";
reg = <0x101f1000 0x1000>;
interrupts = <0 12 4>;
};
};
/dts-v1/;
/ {
// 定义标签
uart1: serial@101f2000 {
compatible = "arm,pl011";
reg = <0x101f2000 0x1000>;
};
// 使用标签引用
chosen {
stdout-path = &uart1;
};
};
设备树覆盖允许在运行时修改设备树,常用于动态配置硬件:
/dts-v1/;
/plugin/;
&uart1 { // 引用主设备树中的节点
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart1_pins>;
};
# 编译dts为dtb
dtc -I dts -O dtb -o myboard.dtb myboard.dts
# 反编译dtb为dts
dtc -I dtb -O dts -o myboard.dts myboard.dtb
arch/arm/boot/dts/
目录查看系统设备树:
ls /proc/device-tree/
查看特定节点属性:
hexdump /proc/device-tree/node/property
内核启动时查看设备树解析:
在启动参数中添加of=prdebug
使用dtc
工具验证语法:
dtc -I dts -O dtb -o /dev/null myboard.dts
compatible
字符串Documentation/devicetree/
(内核源码中)通过掌握设备树,您可以更灵活地配置Linux系统硬件,特别是在嵌入式开发中。