从零开始打造 OpenSTLinux 6.6 Yocto 系统 - STM32MP2(基于STM32CubeMX)(六)
上一章已经可以通过 串口看到 TF-A 的启动日志 ,但系统在 TF-A 阶段发生 PANIC,无法继续启动。本章节主要记录 TF-A 启动阶段的典型报错、原因分析以及对应的 Device Tree 解决方案
一、TF-A 启动阶段说明
STM32MP2 启动链路如下:
ROM → TF-A (BL2 / BL31) → OP-TEE → U-Boot → Linux
本章问题均发生在 TF-A 解析设备树(FCONF / DDR / PMIC)阶段 ,属于典型的 DTS 配置不完整或不匹配问题。
问题一:PANIC at PC : 0x000000000e01e3d0
PANIC at PC : 0x000000000e01e3d0
解决方案:
/* USER CODE BEGIN root */
aliases {
serial0 = &usart2;
};
chosen {
stdout-path = "serial0:115200n8";
};
shadow-prov {
compatible = "st,provisioning";
hconf1_prov {
nvmem-cells = <&hconf1_otp>;
st,shadow-value = <0x00018000>;
};
};
/* USER CODE END root */

问题二:ERROR: DDR power init failed
解决方案:
&ddr {
status = "okay";
/* USER CODE BEGIN ddr */
vdd-supply = <&vdd_ddr>;
vtt-supply = <&vtt_ddr>;
vpp-supply = <&vpp_ddr>;
vref-supply = <&vref_ddr>;
/* USER CODE END ddr */
};

问题三:ERROR: FCONF: Incomplete configuration property in dtb-registry.
ERROR: FCONF: Incomplete configuration property in dtb-registry.
BACKTRACE: START: fconf_populate
0: EL3: 0xe017ba0
1: EL3: 0xe0255f4
2: EL3: 0xe029110
3: EL3: 0xe0179d8
4: EL3: 0xe017ad4
5: EL3: 0xe0170e0
BACKTRACE: END: fconf_populate
PANIC at PC : 0x000000000e0255fc
解决方案:在stm32mp257d-stm32mp257dak3-mx-fw-config.dts
/* USER CODE BEGIN root */
dtb-registry {
soc_fw-config {
load-address = <0x0 0x81fc0000>;
max-size = <0x40000>;
};
tos_fw {
load-address = <0x0 0x82000000>;
max-size = <0x2000000>;
};
};
/* USER CODE END root */

二、I2C7 + STPMIC2(PMIC)配置
/* USER CODE BEGIN i2c7 */
i2c-scl-rising-time-ns = <185>;
i2c-scl-falling-time-ns = <20>;
clock-frequency = <400000>;
#address-cells = <1>;
#size-cells = <0>;
pmic2: stpmic@33 {
compatible = "st,stpmic2";
reg = <0x33>;
status = "okay";
regulators {
compatible = "st,stpmic2-regulators";
vddcpu: buck1 {
regulator-name = "vddcpu";
regulator-min-microvolt = <800000>;
regulator-max-microvolt = <910000>;
regulator-always-on;
};
vddcore: buck2 {
regulator-name = "vddcore";
regulator-min-microvolt = <820000>;
regulator-max-microvolt = <820000>;
regulator-always-on;
};
vddgpu: buck3 {
regulator-name = "vddgpu";
regulator-min-microvolt = <800000>;
regulator-max-microvolt = <900000>;
regulator-always-on;
};
vddio_pmic: buck4 {
regulator-name = "vddio_pmic";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
};
v1v8: buck5 {
regulator-name = "v1v8";
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-always-on;
};
vdd_ddr: buck6 {
regulator-name = "vdd_ddr";
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1200000>;
};
v3v3: buck7 {
regulator-name = "v3v3";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
};
vdda1v8_aon: ldo1 {
regulator-name = "vdda1v8_aon";
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-always-on;
};
vdd_emmc: ldo2 {
regulator-name = "vdd_emmc";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
};
vtt_ddr: ldo3 {
regulator-name = "vtt_ddr";
st,regulator-sink-source;
};
vdd3v3_usb: ldo4 {
regulator-name = "vdd3v3_usb";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
};
vpp_ddr: ldo5 {
regulator-name = "vpp_ddr";
regulator-min-microvolt = <2500000>;
regulator-max-microvolt = <2500000>;
regulator-enable-ramp-delay = <1000>;
};
vdd_sdcard: ldo7 {
regulator-name = "vdd_sdcard";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
};
vddio_sdcard: ldo8 {
regulator-name = "vddio_sdcard";
st,regulator-bypass-microvolt = <3300000>;
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
};
vref_ddr: refddr {
regulator-name = "vref_ddr";
};
};
};
/* USER CODE END i2c7 */
三、当前状态总结
✅ TF-A 启动成功
✅ FCONF 错误修复
✅ DDR / PMIC 初始化完成
➡️ 系统已成功进入 OP-TEE 阶段
到这里,其实最难的部分已经过去了。
对于软件开发而言,问题本身并不可怕,可怕的是既看不到源代码,也拿不到任何有效输出。
一旦满足两个条件:
① 有完整的源代码
② 有稳定、可控的打印(日志/串口/trace)
那剩下的事情就只是:
定位 → 验证 → 修正。
无论是 TF-A、OP-TEE 还是 U-Boot,本质上都只是代码在某个阶段走进了「不满足前置条件的分支」。
只要能看到它"走到哪一步、为什么停下",问题就一定是可解的。
后面有时间在更新吧.
