当前位置:首页 > 嵌入式 > 嵌入式分享
[导读]设备树(Device Tree, DTB)是嵌入式Linux系统中描述硬件的“骨架”。一个错误的status、一个拼错的compatible,就可能导致外设驱动无法加载或系统崩溃。本文总结十个在ARM/Linux设备树编写与调试中最高频的错误,附排查方法与修复示例。



设备树(Device Tree, DTB)是嵌入式Linux系统中描述硬件的“骨架”。一个错误的status、一个拼错的compatible,就可能导致外设驱动无法加载或系统崩溃。本文总结十个在ARM/Linux设备树编写与调试中最高频的错误,附排查方法与修复示例。


一、语法与编译错误


1. 缺少分号或花括号不匹配


DTS语法严格:每个属性结尾必须有;,每个node结尾必须有};。


错误示例:

&uart1 {

   status = "okay"  // 缺少分号

   pinctrl-names = "default";

};


排查:dtc -I dts -O dtb -o test.dtb test.dts会报Error: syntax error,行号指向下一行。


2. 引用未定义的label


&usb_otg1 {  // 若dtsi中标签为 usbotg1,则此引用无效

   dr_mode = "host";

};


排查:编译时提示Reference to non-existent label。用grep "usb_otg1" *.dtsi确认标签名。


二、属性值错误


3. compatible字符串与驱动不匹配


驱动通过of_match_table匹配compatible,必须完全一致(包括大小写与逗号)。


错误:

compatible = "maxim,max3232";   // 驱动期待 "maxim,max3222"


排查:cat /sys/devices/platform/.../of_node/compatible读出实际值,与驱动源码对比。


4. reg属性地址与长度错误


&spi1 {

   flash@0 {

       compatible = "jedec,spi-nor";

       reg = <0>;           // 正确:片选0

       spi-max-frequency = <50000000>;

   };

};


常见错误:reg写成了<0 0>(多了一个地址长度),导致内核无法正确分配地址资源。检查#address-cells和#size-cells的父节点定义。


三、引脚与控制错误


5. pinctrl配置了不存在的引脚功能


pinctrl-0 = <&uart1_pins_a>;


若uart1_pins_a在pinctrl.dtsi中未定义,或引脚的function不在SoC支持的列表中,内核会静默忽略,UART不工作。


排查:cat /sys/kernel/debug/gpio查看引脚是否被正确配置为AF模式。


6. gpio-hog导致资源冲突


多个设备hog同一个GPIO,或hog了已分配给别的设备的引脚,会导致gpiochip报错。


排查:dmesg | grep gpio查看gpiochip冲突日志。


四、中断与时钟错误


7. interrupt-parent缺失或错误


若设备不在根中断控制器下,必须显式指定interrupt-parent。


错误:

&gpio_extender {

   interrupt-parent = <&gpio1>;  // 若实际接在gpio2上,则中断无法触发

   interrupts = <5 IRQ_TYPE_EDGE_RISING>;

};


排查:cat /proc/interrupts查看中断号是否注册,或用evtest测试按键中断。


8. clocks属性与驱动要求不匹配


clocks = <&clkc 15>;   // 若驱动需要两个时钟,这里只提供了一个


排查:dmesg | grep clk或cat /sys/kernel/debug/clk/clk_summary查看时钟是否使能。


五、电源管理与状态错误


9. status属性写错


&usb1 {

   status = "disabled";  // 驱动认为该设备被禁用

};


排查:find /sys/devices -name "usb1"看设备节点是否存在。status应为"okay"或"ok"(部分内核支持后者)。


10. 未包含必要的.dtsi头文件


/dts-v1/;

#include "imx6ul.dtsi"   // 若漏了这句,所有SoC内部设备定义都不可见


排查:编译报大量undefined reference to,或生成的dtb大小明显偏小。


六、调试工具速查表


目的 命令


编译DTS → DTB dtc -I dts -O dtb -o output.dtb input.dts


反编译DTB → DTS dtc -I dtb -O dts -o output.dts input.dtb


查看当前系统DTB dtc -I fs -O dts /sys/firmware/devicetree/base


查看设备树节点 ls /sys/firmware/devicetree/base/soc/


查看设备树属性 cat /sys/firmware/devicetree/base/soc/aips-bus@02000000/spba-bus@02000000/uart1@02020000/compatible


查看驱动匹配 cat /sys/bus/platform/drivers/imx-uart/uevent


七、结语


设备树错误的排查,本质是“预期值 vs 实际值”的比对。将dmesg、/sys/firmware/devicetree与dtc反编译三板斧用好,配合本文的十类高频错误对照表,大部分DTS问题都能在十分钟内定位修复。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭