Platform: RK3568
OS: Android 12
Kernel: v4.19.206
SDK Version:android-12.0-mid-rkr1
问题
在dts中配置rk628时遇到编译报错,提示找不到rk628的label:
scripts/kconfig/conf --syncconfig Kconfig
DTC arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtb
CALL scripts/checksyscalls.sh
Error: ./scripts/dtc/include-prefixes/arm/rk628.dtsi:25.1-7 Label or path rk628 not found
Error: arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi:393.7-17 syntax error
FATAL ERROR: Unable to parse input tree
scripts/Makefile.lib:307: recipe for target ‘arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtb’ failed
make[1]: *** [arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtb] Error 1
arch/arm64/Makefile:145: recipe for target ‘rockchip/rk3568-evb1-ddr4-v10.dtb’ failed
make: *** [rockchip/rk3568-evb1-ddr4-v10.dtb] Error 2
解决方法
#include <arm/rk628.dtsi> 必须要放在rk628的定义之后
&i2c3 {
clock-frequency = <400000>;
status = "okay";
rk628: rk628@50 {
reg = <0x50>;
interrupt-parent = <&gpio0>;
interrupts = <RK_PA0 IRQ_TYPE_LEVEL_HIGH>;
enable-gpios = <&gpio0 RK_PC5 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_LOW>;
status = "okay";
};
};
#include <arm/rk628.dtsi>
&rk628_hdmi {
status = "okay";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
简单分析
这个小问题却困扰了挺久,后来还是靠这篇文章1才解惑。
报错的主要原因是我把#include <arm/rk628.dtsi>放在dts头部位置了。
打开arch/arm/boot/dts/rk628.dtsi,可以看到这里是引用了&rk628节点,而该节点的定义是在我们dts的&i2c节点中实现的,根据dts的规范,节点要先定义后引用,是有顺序要求的,否则就会出现编译报错。
&rk628 {
compatible = "rockchip,rk628";
rk628_cru: cru {
compatible = "rockchip,rk628-cru";
#clock-cells = <1>;
#reset-cells = <1>;
status = "okay";
};
rk628_efuse: efuse {
compatible = "rockchip,rk628-efuse";
clocks = <&rk628_cru CGU_PCLK_EFUSE>;
clock-names = "pclk";
resets = <&rk628_cru RGU_EFUSE>;
#phy-cells = <0>;
status = "disabled";
};
其实在rk 的参考dts中(如: rk3568-evb6-ddr3-v10-rk628-rgb2hdmi.dts)就是这么配置的,如果老老实实参考该配置就没有问题。但是我却自作主张,为了格式整洁把include写在了文件头部,自己造出了bug。还以为已经对dts的配置已经很熟悉了,看来还是要多修炼啊。
关于dts设备树的详细说明我找到了这些资料234,多看看还是很有收获的!
如有谬误欢迎指正,感谢阅读~
参考资料