从零开始打造 OpenSTLinux 6.6 Yocto 系统 - STM32MP2(基于STM32CubeMX)(六)

从零开始打造 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,本质上都只是代码在某个阶段走进了「不满足前置条件的分支」。

只要能看到它"走到哪一步、为什么停下",问题就一定是可解的。

后面有时间在更新吧.

相关推荐
全栈工程师修炼指南9 小时前
Moodle | ‌开源学习管理系统简体中文包安装配置
学习·开源
ye150127774559 小时前
220V降12V降24V风扇驱动WT5112
单片机·嵌入式硬件·其他·硬件工程
-Springer-9 小时前
STM32 学习 —— 个人学习笔记11-2(SPI 通信外设 & 硬件 SPI 读写 W25Q64)
笔记·stm32·学习
dqsh069 小时前
STM32和STM32CubeMX实现遥控器控制, 保姆级教程
stm32·单片机·嵌入式硬件·机器人·遥控器
xmdy58669 小时前
Flutter+开源鸿蒙实战|智联邻里Day1 项目搭建+环境适配+架构规划(十五五民生创新版)
flutter·开源·harmonyos
llilian_1610 小时前
晶振测量仪 晶振频率测试仪器的多领域应用解析 晶振频率测试仪器
功能测试·单片机·嵌入式硬件·测试工具·51单片机
kaikaile199510 小时前
基于STM32F103的BMS通信控制
stm32·单片机·嵌入式硬件
天天爱吃肉821810 小时前
笔记:同步电机调试时电角度校正方法说明
大数据·人工智能·笔记·功能测试·嵌入式硬件·汽车
国科安芯10 小时前
空间激光通信系统中抗辐射 MCU 芯片应用研究
单片机·嵌入式硬件·架构·risc-v·安全性测试
十六年开源服务商10 小时前
2026响应式优化WordPress定制开发最佳方案
开源