1. 丢失了所有依赖关系

原始DTS源码结构:
// 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>;
        };
    };
};
 

2. phandle值冲突

  • 反编译的phandle是静态值(如0x58, 0x99)
  • 重新编译时,dtc会重新分配phandle,导致冲突
  • 内核可能无法正确解析引用关系

3. 缺少必要的根节点

完整DTS需要:
/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>

/ {
    // ...
};
 

修复3:重新生成phandle

确保每个引用节点有唯一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可用,导致信号无法发送