设备树Overlay添加根节点时混合语法报错,求最优解决方法
设备树Overlay:根节点添加与偏好语法兼容的解决方案
问题由来
在设备树Overlay里给根节点添加内容时,直接用fragment@0指向根节点的写法很简单,但如果同时搭配&spi0这类广泛使用的偏好语法修改其他节点,就会触发ERROR (duplicate_node_names): /fragment@0: Duplicate node name错误。很多人会疑惑是否必须把所有&X语法都转换成完整的fragment@N { target = <&X>; ... }写法,其实不用,有更优的解决办法。
最优方案1:直接在根节点下写内容,省略fragment包装
dtc(设备树编译器)支持直接在Overlay的根/节点下定义要添加的内容,不需要额外嵌套fragment。这种写法会被编译器自动转换成针对根节点的fragment,完全不会和&X语法生成的fragment冲突。示例代码:
/dts-v1/; /plugin/; / { // 直接在这里写要添加到根节点的内容 custom_root_device { compatible = "my-vendor,my-device"; status = "okay"; reg = <0x10000000 0x1000>; }; }; &spi0 { // 继续用偏好语法修改spi0节点,完全不受影响 status = "okay"; cs-gpios = <&gpio 15 GPIO_ACTIVE_LOW>; max-frequency = <50000000>; };
最优方案2:给根节点的fragment换个唯一名称
如果你一定要保留fragment写法,只要别用fragment@0这种会被自动生成的命名,换成自定义的唯一名称(比如fragment@root),就能和&X语法和平共处。示例:
/dts-v1/; /plugin/; / { fragment@root { target-path = "/"; __overlay__ { // 根节点添加内容 another_root_node { compatible = "vendor,another-device"; }; }; }; }; &spi0 { // 偏好语法正常使用 };
原因是&X语法会被dtc自动生成从fragment@0开始的序列命名,手动写的fragment@0刚好和自动生成的第一个fragment重名,换个名字就解决了冲突。
总结
完全没必要把所有&X语法都改成完整的fragment写法,上面两种方式既保持了代码的简洁性,又完美解决了根节点添加和偏好语法兼容的问题,选哪种都可以。
内容的提问来源于stack exchange,提问作者apriori
相关产品推荐
相关产品推荐

