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

基于正点原子 STM32MP257DAK3 开发板,使用 STM32CubeMX + OpenSTLinux 开发过程中遇到的问题与解决方案汇总。

STM32MP2 Develop Package Problems

基于正点原子 STM32MP257DAK3 开发板,使用 STM32CubeMX + OpenSTLinux 开发过程中遇到的问题与解决方案汇总。


1. CubeMX 警告:SDMMC 与 RCC 配置

复制代码
Faulty state detected for SDMMC1, SDMMC2 : Only one Memory Boot Device can be assigned to TF-A simultaneously.

状态: 正常现象,可忽略。

参考:https://community.st.com/t5/stm32-mpus-software-development/sdmmc1-sdmmc2-only-one-memory-boot-device-can-be-assigned-to-tf/m-p/854989#M2196

复制代码
Main Config: These peripherals still have some not configured or wrong parameter values: [RCC]

状态: ST 官方已确认问题,正在解决。

参考:https://community.st.com/t5/stm32-mpus-software-development/stm32mp25-cubemx-rcc-warning-when-hse-set-to-crystal-ceramic/m-p/854940#M2198


2. TF-A 阶段:USB 控制台报错

复制代码
ERROR:   usb_core_ctl_error : Send an ERROR

解决方案:fw-config.dts 中添加 dtb-registry 节点:

dts 复制代码
dtb-registry {
    soc_fw-config {
        load-address = <0x0 0x81fc0000>;
        max-size = <0x40000>;
    };
    tos_fw {
        load-address = <0x0 0x82000000>;
        max-size = <0x2000000>;
    };
};

3. TF-A 阶段:DDR 初始化失败(BACKTRACE stm32mp2_ddr_init)

复制代码
BACKTRACE: START: stm32mp2_ddr_init
...
PANIC at PC : 0x000000000e01e3d0

解决方案: 在设备树中补全 DDR 电源配置:

dts 复制代码
&ddr {
    status = "okay";
    vdd-supply = <&vdd_ddr>;
    vtt-supply = <&vtt_ddr>;
    vpp-supply = <&vpp_ddr>;
    vref-supply = <&vref_ddr>;
};

4. TF-A 阶段:DDR PHY 训练失败

复制代码
ERROR:   ddrphy_phyinit_usercustom_g_waitfwdone Training has failed.
ERROR:   DDR PHY init: Error -1

解决方案: 根据正点原子开发板原理图,重新进行 DDR 引脚 remapping。


5. BL31 阶段:RISAF4 配置错误(EL3 PANIC)

复制代码
NOTICE:  BL2: Booting BL31
...
PANIC in EL3.

解决方案: 在 CubeMX 中配置 RIF → External Memorys (RISAF) → RISAF4 (DDR)。


6. BL31 阶段:RISAF4 DDR 加密特性错误

复制代码
ERROR:   RISAF4: encryption feature error
PANIC at PC : 0x000000000e02324c

根因分析:

  • 官方开发板 CPU 型号为 STM32MP257F --- 支持 DDR encryption/decryption
  • 正点原子开发板 CPU 型号为 STM32MP257D --- 不支持 DDR encryption/decryption

解决方案: 在 CubeMX 的 RISAF4 配置中,取消勾选 DDR 加密选项


7. OP-TEE 阶段:IAC 异常(RISAB 安全访问错误)

复制代码
E/TC:0 0 stm32_iac_itr:192 IAC exceptions [159:128]: 0x1
E/TC:0 0 stm32_iac_itr:197 IAC exception ID: 128
E/TC:0 0 Panic at core/drivers/firewall/stm32_iac.c:212 <stm32_iac_itr>

解决方案: 修改 OP-TEE 设备树 stm32mp257d-stm32mp257dak3-mx-rif.dtsi 中 RISAB 保护寄存器配置:

diff 复制代码
 &tfa_bl31 {
-    st,protreg = <RISABPROT(RIF_DDCID_DIS, RIF_UNUSED, RIF_NSEC, RIF_NPRIV, RIF_CFDIS, RIF_UNUSED, RIF_UNUSED, RIF_UNUSED)>;
+    st,protreg = <RISABPROT(RIF_DDCID_DIS, RIF_UNUSED, RIF_SEC, RIF_NPRIV, RIF_CFEN, RIF_CID1_BF, RIF_CID1_BF, RIF_CID1_BF)>;
 };

 &hpdma_lli {
-    st,protreg = <RISABPROT(RIF_DDCID_DIS, RIF_UNUSED, RIF_NSEC, RIF_NPRIV, RIF_CFDIS, RIF_UNUSED, RIF_UNUSED, RIF_UNUSED)>;
+    st,protreg = <RISABPROT(RIF_DDCID_DIS, RIF_UNUSED, RIF_NSEC, RIF_NPRIV, RIF_CFEN, RIF_CID1_BF, RIF_CID1_BF, RIF_CID1_BF)>;
 };

8. OP-TEE 阶段:TAMP NVRAM 驱动加载失败

复制代码
E/TC:0 0 probe_driver_node:565 Failed to probe stm32_tamp_nvram on node nvram@46010100: 0xffff0006
E/TC:0 0 Panic at core/kernel/dt_driver.c:904 <probe_dt_drivers>

解决方案: 在 OP-TEE 设备树中添加 TAMP 节点配置:

dts 复制代码
/* USER CODE BEGIN addons */
&tamp {
    wakeup-source;
    st,tamp-passive-precharge = <2>;
    st,tamp-passive-nb-sample = <4>;
    st,tamp-passive-sample-clk-div = <16384>;

    tamp-button {
        status = "okay";
        tamper-gpios = <&gpioi 8 0>;
        st,tamp-mode = <TAMPER_CONFIRMED_MODE>;
        st,tamp-id = <1>;
    };
};
/* USER CODE END addons */

9. OP-TEE 阶段:probe_dt_drivers Panic(PMIC 相关)

复制代码
E/TC:0 0 probe_dt_drivers:902 Probe sequence result: 0x80000000
E/TC:0 0 Panic at core/kernel/dt_driver.c:904 <probe_dt_drivers>

解决方案: 检查 OP-TEE 设备树中的 PMIC 配置是否完整。


10. TF-A 阶段:FCONF dtb-registry 配置不完整

复制代码
ERROR:   FCONF: Incomplete configuration property in dtb-registry.
PANIC at PC : 0x000000000e0255fc

解决方案:stm32mp257d-stm32mp257dak3-mx-fw-config.dts 中补全 dtb-registry:

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 */

11. OP-TEE 阶段:PMIC 与 GPU 驱动 probe 循环失败

复制代码
D/TC:0 0 process_probe_list:697 Unresolved dependencies after 8 rounds, 7 deferred
E/TC:0 0 probe_dt_drivers:902 Probe sequence result: 0x80000000
E/TC:0 0 Panic at core/kernel/dt_driver.c:904 <probe_dt_drivers>

涉及 stm32_pmic2stm32-cpustm32-gpu 三个驱动反复 deferred。

调试方法: 修改 OP-TEE 日志等级为 4,以获取更详细信息:

makefile 复制代码
# 在 Makefile.sdk.stm32mp2 中修改
EXTRA_OEMAKE = PLATFORM=stm32mp2 CROSS_COMPILE_core=aarch64-ostl-linux- \
    ARCH=arm CFG_ARM64_core=y CROSS_COMPILE_ta_arm64=aarch64-ostl-linux- \
    NOWERROR=1 LDFLAGS= CFG_TEE_CORE_LOG_LEVEL=4 CFG_TEE_CORE_DEBUG=y

解决方案: 在 OP-TEE 设备树中增加 &pwr 节点内容。


12. OP-TEE 阶段:RISAF 访问异常(进入 U-Boot 时)

复制代码
INFO:    Entry point address = 0x84000000
E/TC:0   stm32_iac_itr:197 IAC exception ID: 137
DUMPING DATA FOR risaf@420d0000
I/TC: Faulty address (IADDR0): 0x84000000
E/TC:0   Panic at core/drivers/firewall/stm32_iac.c:212 <stm32_iac_itr>

状态: TODO --- 待进一步排查 RISAF 对 U-Boot 加载地址的访问权限配置。


13. OP-TEE 阶段:IAC 异常 ID 152

复制代码
E/TC:0   stm32_iac_itr:197 IAC exception ID: 152
E/TC:0   Panic at core/drivers/firewall/stm32_iac.c:212 <stm32_iac_itr>

状态: 与 RISAF 防火墙配置相关,需排查对应外设的 RIF 权限。


14. OP-TEE 阶段:RISAF 访问异常(地址 0xfdc12f70)

复制代码
DUMPING DATA FOR risaf@420d0000
I/TC: Faulty address (IADDR0): 0xfdc12f70
E/TC:0   Panic at core/drivers/firewall/stm32_iac.c:212 <stm32_iac_itr>

状态: 与 RISAF 防火墙配置相关,需排查对应内存区域的访问权限。


15. U-Boot 阶段:GPIOI8 安全访问失败(SD 卡检测)

复制代码
gpio_stm32 gpio@442c0000: Failed to get secure IO GPIOI 8 @ 00000000442c0000
Card did not respond to voltage select! : -110
invalid MAC address 0 in OTP 00:00:00:00:00:00

解决方案: 在 CubeMX 中修改 GPIO I8 的 RIF 权限,允许非安全世界访问。


16. U-Boot 阶段:USB Gadget 初始化失败

复制代码
Card did not respond to voltage select! : -110
No USB device found
usb_gadget_initialize failed
System reset not

解决方案: 参考并修正 stm32mp257d-stm32mp257dak3-mx-u-boot.dtsi 中的 USB 相关配置。


17. U-Boot 阶段:外设 RIF 权限不足

复制代码
stm32_rifsc bus@42080000: phy@480c0000 not allowed on bus (-13)
stm32_rifsc bus@42080000: vdec@480d0000 not allowed on bus (-13)
stm32_rifsc bus@42080000: venc@480e0000 not allowed on bus (-13)

解决方案:

  • phy@480c0000 (PCIe) --- 在 CubeMX 中开启对应外设
  • vdec@480d0000 (视频解码器) --- 在 CubeMX 中配置 RIF 权限
  • venc@480e0000 (视频编码器) --- 在 CubeMX 中配置 RIF 权限

18. U-Boot 阶段:SD 卡检测 GPIO 与 IAC 异常

复制代码
STM32MP> gpio input GPIOI8
gpio: pin GPIOI8 (gpio 136) value is 0  # 插入
gpio: pin GPIOI8 (gpio 136) value is 1  # 拔出

操作 GPIO 后触发 IAC 异常:

复制代码
E/TC:0   stm32_iac_itr:197 IAC exception ID: 156
E/TC:0   Panic at core/drivers/firewall/stm32_iac.c:212 <stm32_iac_itr>

解决方案: 检查 RCC 中 HSI MON 的配置。


19. 正点原子开发板 TAMP 功能异常

注意:正点原子的开发板不要使用 TAMP 功能!

此问题在断电后次日自动恢复正常,属于硬件相关的间歇性问题。


20. U-Boot 阶段:ADC 外设访问被拒

复制代码
stm32_rifsc bus@42080000: adc@404f0000 not allowed on bus (-13)

解决方案: 待确认。可能需要在 ADC 节点补充电源配置:

dts 复制代码
vdda-supply = <&vdda_1v8>;
vref-supply = <&vddref_1v8>;

21. OP-TEE 阶段:Display Controller RIFSC 访问被拒

复制代码
E/TC:0 0 stm32_rifsc_dt_probe_bus:1058 RIFSC: display-controller@48010000 not accessible: 0xffff0001
E/TC:0 0 Panic at core/drivers/firewall/stm32_rifsc.c:1061 <stm32_rifsc_dt_probe_bus>

解决方案: 在 CubeMX 的 RIF 配置中,为 Display Controller 分配正确的访问权限。


22. U-Boot 阶段:MIPI 触摸屏与 LCD 面板 GPIO 权限问题

复制代码
cannot find alientek,mipi-ts compatible
gpio_stm32 gpio@442a0000: Failed to acquire RIF access on IO GPIOG 7
gpio_stm32 gpio@442c0000: Failed to acquire RIF access on IO GPIOI 11
stm32-display-dsi dsi@48000000: No panel found -22

解决方案: 在 CubeMX 中为 GPIOG7、GPIOI11 配置正确的 RIF 访问权限。


23. Kernel 启动阶段:RISAF 访问异常

复制代码
Starting kernel ...
E/TC:0   stm32_iac_itr:197 IAC exception ID: 137
DUMPING DATA FOR risaf@420d0000
I/TC: Faulty address (IADDR0): 0x80000020
E/TC:0   Panic at core/drivers/firewall/stm32_iac.c:212 <stm32_iac_itr>

解决方案: 检查 RISAF 对 Kernel 加载地址区域 (0x80000000) 的访问权限配置。


24. U-Boot 阶段:Kernel 启动后无输出

复制代码
Starting kernel ...
I/TC: Reserved shared memory is disabled
I/TC: Dynamic shared memory is enabled
(之后无任何输出)

解决方案: 设置内核启动参数,启用串口控制台:

bash 复制代码
setenv bootargs "console=ttySTM0,115200 earlycon"

25. U-Boot 阶段:FDT 内存预留失败

复制代码
DRAM:  ERROR: reserving fdt memory region failed (addr=a09f000 size=20000 flags=4)
ERROR: Failed to allocate 0x2a00000 bytes below 0x0.

解决方案: 检查设备树中的 reserved-memory 区域配置。


26. Linux 运行阶段:IAC 异常导致 CPU 停止

复制代码
E/TC:0 1 stm32_iac_itr:197 IAC exception ID: 156
E/TC:0 1 Panic at core/drivers/firewall/stm32_iac.c:212 <stm32_iac_itr>
I/TC: Halting CPU 1

伴随大量 sync_state() pending 信息,涉及 DMA、GPU、USB 等多个外设。

解决方案: 排查 IAC exception ID 156 对应的外设 RIF 权限配置。


27. Linux 运行阶段:galcore GPU 驱动加载超时

复制代码
[   35.882202] Time out check load galcore module expired
[   48.136858] Time out check galcore device expired
[   48.514707] Weston already configured on pixman

解决方案:

  1. 执行 depmod -a 重建模块依赖
  2. 确认 modinfo galcore.ko 显示的版本与 uname -a 的内核版本一致

28. Linux 运行阶段:无法挂载根文件系统(Kernel Panic)

复制代码
[  111.994340] VFS: Unable to mount root fs via NFS.
[  112.018135] Kernel panic - not syncing: No working init found.

伴随大量 sync_state() pendingdeferred probe pending 信息。

根因: 内核版本 6.6.78-g3378fcf598e4-dirty/lib/modules/6.6.78 不匹配。

解决方案: 确保编译的内核版本与根文件系统中的模块版本一致。


29. Linux 运行阶段:SAI 音频播放触发 IAC 异常

bash 复制代码
aplay -D hw:0,1 /usr/share/sounds/alsa/Front_Center.wav

触发 RISAB 安全访问异常:

复制代码
E/TC:0 stm32_iac_itr:197 IAC exception ID: 129
DUMPING DATA FOR risab@42100000
I/TC: Faulty address (IADDR): 0xa020020
E/TC:0 Panic at core/drivers/firewall/stm32_iac.c:212 <stm32_iac_itr>
I/TC: Halting CPU 1

解决方案: 排查 SAI 使用的 DMA 缓冲区所在内存区域的 RISAB 权限配置,确保非安全世界的 DMA 可以访问该内存区域。

相关推荐
iFlyCai10 小时前
C语言中的指针
c语言·数据结构·算法
eastyuxiao11 小时前
如何在不同的机器上运行多个OpenClaw实例?
人工智能·git·架构·github·php
421!11 小时前
GPIO工作原理以及核心
开发语言·单片机·嵌入式硬件·学习
良木生香13 小时前
【C++初阶】:C++类和对象(下):构造函数promax & 类型转换 & static & 友元 & 内部类 & 匿名对象 & 超级优化
c语言·开发语言·c++
bu_shuo13 小时前
git练习学习网站【中文网站】
git·学习
秃秃然然13 小时前
Git指北
git
无巧不成书021813 小时前
C语言零基础速通指南 | 1小时从入门到跑通完整项目
c语言·开发语言·编程实战·c语言入门·零基础编程·c语言速通
cmpxr_15 小时前
【单片机】STM32的启动流程(Keil)
stm32·单片机·嵌入式硬件
广药门徒15 小时前
嵌入式常用通信协议速率对比及布线要点全解析
单片机·嵌入式硬件