DTS(Device Tree Source)是Linux系统中用于描述硬件设备信息的一种数据结构,它通过一种树状结构来描述系统中的硬件设备及其连接关系。DTS最初由Open Firmware提出,后被广泛应用于嵌入式Linux系统中。
/dts-v1/;
/ {
node1 {
a-string-property = "A string";
a-byte-data-property = [0x01 0x23 0x34 0x56];
child-node1 {
first-child-property;
second-child-property = <1>;
a-string-property = "Hello, world";
};
child-node2 {
};
};
node2 {
an-empty-property;
a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
child-node1 {
};
};
};
# 编译DTS为DTB
dtc -I dts -O dtb -o myboard.dtb myboard.dts
# 反编译DTB为DTS
dtc -I dtb -O dts -o myboard.dts myboard.dtb
/* I2C控制器 */
i2c@1,0 {
compatible = "acme,a1234-i2c-bus";
#address-cells = <1>;
#size-cells = <0>;
reg = <1 0 0x1000>;
rtc@58 {
compatible = "maxim,ds1338";
reg = <0x58>;
};
};
/* GPIO控制器 */
gpio-controller@d4019000 {
compatible = "marvell,88pm805-gpio";
reg = <0xd4019000 0x1000>;
#gpio-cells = <2>;
gpio-controller;
};
// base.dts
/ {
fragment@0 {
target = <&i2c1>;
__overlay__ {
status = "okay";
pca9555: gpio@20 {
compatible = "nxp,pca9555";
reg = <0x20>;
gpio-controller;
#gpio-cells = <2>;
};
};
};
};
#ifdef CONFIG_FEATURE_X
feature-x {
status = "okay";
};
#else
feature-x {
status = "disabled";
};
#endif
# 查看当前设备树
ls /proc/device-tree/
# 查看特定节点属性
hexdump -C /proc/device-tree/node/property
# 内核启动参数添加设备树调试
bootargs="... earlycon console=ttyS0,115200 earlyprintk rootwait root=/dev/mmcblk0p2 drm.debug=0xf dtb=myboard.dtb"
症状: 驱动probe失败,内核日志显示"compatible"不匹配
解决:
- 检查设备树中的compatible属性与驱动中的of_match_table是否一致
- 使用of_device_is_compatible()
调试
症状: 设备无法正常工作,内核日志显示资源申请失败
解决:
- 检查reg属性是否与其他设备冲突
- 检查interrupts属性是否唯一
- 使用cat /proc/iomem
和cat /proc/interrupts
查看资源分配情况
症状: dtc编译失败
解决:
- 检查节点闭合是否正确
- 检查属性格式是否正确(字符串用引号,十六进制用尖括号)
- 使用dtc -I dts -O dtb -o /dev/null your.dts
快速验证语法
通过掌握DTS的应用和实践,开发者可以更高效地管理嵌入式Linux系统中的硬件配置,提高系统的可移植性和可维护性。