Linux设备树.dts文件别名语法错误:dtc编译失败求助
Linux设备树.dts别名的正确语法及编译报错排查
嗨,我来帮你理清设备树别名的正确写法,还有你遇到的编译问题到底出在哪。
一、设备树别名的正确语法
设备树里的别名必须定义在根节点下的aliases节点中,核心规则如下:
- 必须放在
/aliases节点内部(如果你的.dts里还没有这个节点,直接在根节点下创建即可) - 别名的赋值只能是两种格式:
- 节点标签引用:用
&标签名的格式(推荐,可读性和维护性更强) - 完整节点路径:直接写节点的绝对路径(不用加
&符号)
- 节点标签引用:用
举个直观的正确示例:
假设你的目标节点结构是这样的(给ntscpal节点加上标签):
/ { amba_pl { // 给ntscpal节点添加标签:ntscpal: ntscpal: ntscpal@12340000 { compatible = "vendor,ntscpal"; reg = <0x12340000 0x1000>; // 其他节点属性... }; }; // 定义aliases节点 aliases { // 通过标签引用目标节点 ntscpal = &ntscpal; }; };
如果不想给节点加标签,也可以用完整路径定义别名(这种方式不推荐,路径变更时容易出错):
aliases { ntscpal = "/amba_pl/ntscpal"; };
二、你的编译错误原因及解决方法
你写的ntscpal = &amba_pl/ntscpal;是非法语法,问题出在:&符号在设备树中是专门用来引用节点标签或者节点phandle的,不能和父节点/子节点这种路径格式混用。dtc编译器无法识别这种错误的引用写法,所以抛出了“FATAL ERROR: Unable to parse input tree”的致命错误。
解决方法很简单,二选一即可:
- 给目标节点添加标签(推荐):
按照上面的示例,给amba_pl下的ntscpal节点加上标签(比如ntscpal:),然后在aliases里用&ntscpal引用即可。 - 改用完整节点路径:
去掉&符号,写成绝对路径的格式:ntscpal = "/amba_pl/ntscpal";
另外要注意:别把别名直接写在根节点或者其他业务节点里,必须放在aliases节点内部。
内容的提问来源于stack exchange,提问作者Andres Gonzalez
相关产品推荐
相关产品推荐

