设备树Overlay编译告警:是否需重复定义主DTS已存在属性?
设备树Overlay编译告警处理问题
问题背景
我正在为主设备树(DTS)中缺失的CSI设备节点编写设备树Overlay,该Overlay节点包含interrupts和reg属性。
主DTS简化片段
/ { interrupt-parent = <&gic>; #address-cells = <1>; #size-cells = <1>; //... soc { compatible = "simple-bus"; #address-cells = <1>; #size-cells = <1>; ranges; //... gic: interrupt-controller@1c81000 { //... }; }; };
我的Overlay片段
fragment@1 { target = <&soc>; __overlay__ { /* Do I need this? */ // #address-cells = <1>;; /* And this? */ // #size-cells = <1>;; csi: camera-csi@1cb0000 { compatible = "allwinner,sun6i-a31-csi"; reg = <0x01cb0000 0x1000>; interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>; clocks = <&ccu CLK_BUS_CSI>, <&ccu CLK_CSI_SCLK>, <&ccu CLK_DRAM_CSI>; clock-names = "bus", "mod", "ram"; resets = <&ccu RST_BUS_CSI>; //... }; }; };
编译告警信息
camera_overlay.dtso:37.17-43: Warning (reg_format): /fragment@1/__overlay__/camera-csi@1cb0000:reg: property has invalid length (8 bytes) (#address-cells == 2, #size-cells == 1) camera_overlay.dtbo: Warning (pci_device_reg): Failed prerequisite 'reg_format' camera_overlay.dtbo: Warning (pci_device_bus_num): Failed prerequisite 'reg_format' camera_overlay.dtbo: Warning (simple_bus_reg): Failed prerequisite 'reg_format' camera_overlay.dtbo: Warning (i2c_bus_reg): Failed prerequisite 'reg_format' camera_overlay.dtbo: Warning (spi_bus_reg): Failed prerequisite 'reg_format' camera_overlay.dtso:35.37-65.15: Warning (avoid_default_addr_size): /fragment@1/__overlay__/camera-csi@1cb0000: Relying on default #address-cells value camera_overlay.dtso:35.37-65.15: Warning (avoid_default_addr_size): /fragment@1/__overlay__/camera-csi@1cb0000: Relying on default #size-cells value camera_overlay.dtbo: Warning (avoid_unnecessary_addr_size): Failed prerequisite 'avoid_default_addr_size' camera_overlay.dtbo: Warning (unique_unit_address): Failed prerequisite 'avoid_default_addr_size' camera_overlay.dtso:35.37-65.15: Warning (interrupts_property): /fragment@1/__overlay__/camera-csi@1cb0000: Missing interrupt-parent
我的疑问:这些属性(#address-cells、#size-cells、interrupt-parent)已经在主DTS中定义,我能否安全忽略这些告警?还是必须在Overlay中重新声明?担心忽略后运行时CSI的中断等功能无法正常工作。
解答
1. 不能直接忽略这些告警
这些告警是dtc(设备树编译器)单独编译Overlay时,无法感知主DTS上下文导致的。虽然主DTS里已有相关属性,但Overlay编译时是独立检查语法格式的,直接忽略可能导致运行时CSI设备功能异常(比如地址解析错误、中断路由失败)。
2. 正确的处理方式
(1)解决reg_format和avoid_default_addr_size告警
在Overlay的__overlay__块中,显式声明与主DTS一致的#address-cells和#size-cells,给dtc提供编译时的上下文:
fragment@1 { target = <&soc>; __overlay__ { #address-cells = <1>; #size-cells = <1>; csi: camera-csi@1cb0000 { // 原有属性保持不变 }; }; };
不用担心重复定义,Overlay加载时会复用主DTS的已有属性值,不会产生冲突,这只是为了满足编译检查的要求。
(2)解决interrupts_property告警
在CSI节点中显式添加与主DTS一致的interrupt-parent属性:
csi: camera-csi@1cb0000 { compatible = "allwinner,sun6i-a31-csi"; reg = <0x01cb0000 0x1000>; interrupt-parent = <&gic>; // 新增该行 interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>; // 其他属性保持不变 };
虽然主DTS根节点已设置全局interrupt-parent,但dtc编译Overlay时无法继承该上下文,显式声明可消除告警,同时保证运行时中断路由的正确性。
3. 核心原因
- dtc编译Overlay时独立于主DTS,必须在Overlay内提供足够上下文来验证属性格式合法性。
- 显式声明这些属性不会影响运行时功能,Overlay加载时会优先匹配主DTS的已有配置,不会产生冲突。
- 若不处理告警,可能出现
reg属性解析错误、中断无法正确路由到GIC等问题,导致CSI设备无法正常工作。
内容的提问来源于stack exchange,提问作者PookyFan
相关产品推荐
相关产品推荐

