1. 丢失了所有依赖关系
原始DTS源码结构:
// px30-evb.dts
#include "px30.dtsi" // 基础定义
#include <dt-bindings/gpio/gpio.h> // 宏定义
#include <dt-bindings/clock/px30-cru.h> // 时钟ID
&pinctrl {
// ... 你的修改
};
// px30-evb.dts
#include "px30.dtsi" // 基础定义
#include <dt-bindings/gpio/gpio.h> // 宏定义
#include <dt-bindings/clock/px30-cru.h> // 时钟ID
&pinctrl {
// ... 你的修改
};
反编译后:
// 所有include被展开,宏被数值替代
pinctrl {
// ...
uart4 {
uart4-cts {
rockchip,pins = <0x01 0x1e 0x02 0xbb>; // 数值代替了RK_FUNC_2等宏
phandle = <0x58>;
};
};
};
pinctrl {
// ...
uart4 {
uart4-cts {
rockchip,pins = <0x01 0x1e 0x02 0xbb>; // 数值代替了RK_FUNC_2等宏
phandle = <0x58>;
};
};
};
2. phandle值冲突
-
反编译的phandle是静态值(如0x58, 0x99)
-
重新编译时,dtc会重新分配phandle,导致冲突
-
内核可能无法正确解析引用关系
3. 缺少必要的根节点
完整DTS需要:
/dts-v1/;
plugin;
/ {
model = "PX30 EVB";
compatible = "rockchip,px30-evb", "rockchip,px30";
// ... 子节点
};
/dts-v1/;
plugin;
/ {
model = "PX30 EVB";
compatible = "rockchip,px30-evb", "rockchip,px30";
// ... 子节点
};
应急方案
如果你只能使用反编译的DTS,必须进行手动修复:
修复1:删除所有phandle
// 删除所有phandle = <0xXXXX>行
sdmmc-clk {
rockchip,pins = <0x01 0x1e 0x01 0xc0>;
// phandle = <0x99>; <-- 删除!
};
修复2:添加必要的include
在文件开头:
/dts-v1/;
#include "px30.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/pinctrl/rockchip.h>
/ {
// ...
};
#include "px30.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/pinctrl/rockchip.h>
/ {
// ...
};
修复3:重新生成phandle
确保每个引用节点有唯一label:
&sdmmc {
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_bus8>; // 使用label引用
};
&sdmmc {
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_bus8>; // 使用label引用
};
反编译的DTS极可能是MMC初始化失败的根源!
这是一个非常关键的发现。反编译DTS与源码DTS在pinctrl处理上有本质区别,直接导致内核无法正确绑定引脚。
重新编译时:
-
dtc会重新分配phandle(可能变成0x100, 0x101...)
-
但
pinctrl-0 = <0x99>仍是硬编码的旧值 -
引用关系断裂,内核找不到对应的引脚配置
-
MMC控制器probe时无pinctrl可用,导致信号无法发送
浙公网安备 33010602011771号