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

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

后面有时间在更新吧.

相关推荐
意法半导体STM322 小时前
【官方原创】防止STM32CubeMX删除用户文件的方法 LAT1442
stm32·单片机·嵌入式硬件·stm32cubemx·stm32开发·stm32生态
静若繁花_jingjing2 小时前
Git分支命令
git
lingzhilab2 小时前
零知IDE——STM32旋转编码器计数系统:原理可视化 + 精准计数实现
stm32·单片机·嵌入式硬件
LS_learner3 小时前
ROS (Robot Operating System) 一个灵活的机器人软件框架及其适用平台
嵌入式硬件
你怎么知道我是队长3 小时前
C语言---排序算法6---递归归并排序法
c语言·算法·排序算法
兆龙电子单片机设计3 小时前
【STM32项目开源】STM32单片机厂房环境安全监测
stm32·单片机·安全·开源·毕业设计·电子信息
chengpei1473 小时前
Ender-3S加装3DTouch实现自动网床校准
单片机·嵌入式硬件·3d打印
开源能源管理系统3 小时前
MyEMS开源能源管理系统:开源赋能、智控减碳,引领工业能源管理新变革
开源·能源·能源管理系统·零碳工厂
梵刹古音3 小时前
【C语言】 字符数组与多维数组
c语言·数据结构·算法