Linux DTS编译SPI设备时reg属性格式警告问题排查
问题原因及解决方案
警告根源
编译警告的核心原因是spi-gpio节点未显式设置#size-cells = <0>:
- 你在spi-gpio节点中声明了
#address-cells = <1>,但未指定#size-cells。由于添加了ranges属性,设备树会默认继承父节点的#size-cells值(通常为1)。 - 当
#address-cells=1且#size-cells=1时,reg属性要求格式为<地址 大小>(共2个32位值,8字节),但你给从设备的reg只写了芯片选择号(如<0>,仅4字节),长度不符合要求,因此触发reg_format警告。
SPI总线的特性是:从设备通过芯片选择(CS)线寻址,不需要地址空间大小,因此SPI总线节点的#size-cells必须设为0。
修复步骤
在spi-gpio节点中添加#size-cells = <0>,修改后的节点如下:
spi-gpio { compatible = "spi-gpio"; #address-cells = <0x1>; #size-cells = <0>; // 新增这一行 ranges; status = "okay"; sck-gpios = <&pio 4 9 GPIO_ACTIVE_HIGH>; // PE9 mosi-gpios = <&pio 4 6 GPIO_ACTIVE_HIGH>; // PE6 miso-gpios = <&pio 4 8 GPIO_ACTIVE_HIGH>; // PE8 cs-gpios = <&pio 4 4 GPIO_ACTIVE_HIGH>, // PE4 <&pio 4 17 GPIO_ACTIVE_HIGH>; // PE17 num-chipselects = <2>; /* Clients */ m90e32@0 { reg = <0>; compatible = "atmel,m90e32"; spi-max-frequency = <1000>; reset-gpios = <&pio 4 18 GPIO_ACTIVE_HIGH>; // 注释写的PE17,实际是PE18,建议修正注释 }; m90e32@1 { reg = <1>; compatible = "atmel,m90e32"; spi-max-frequency = <1000>; reset-gpios = <&pio 4 18 GPIO_ACTIVE_HIGH>; // 同样注释与实际GPIO不符,建议修正 }; };
额外提示
你代码中两个从设备的reset-gpios注释写的是PE17,但实际配置的是&pio 4 18(对应PE18),这属于注释与代码不一致的小问题,建议同步修正,避免后续维护混淆。
内容的提问来源于stack exchange,提问作者Michael_Y
相关产品推荐
相关产品推荐

