ST意法半导体
直播中

硕达科讯

9年用户 966经验值
私信 关注
[问答]

STM32MP157d linux从5.4.31升级到6.1.82无法启动的原因?

我以前一直使用linux5.4.31,只使用了TFA没有optee
uboot是2020版本。一直用得好好的
上个礼拜我想升级到6.1.82(主要想打RT linux patch, 看到STM有出6.1.82的RT linux patch)
结果uboot启动之后,一直停在Starting kernel ...
因为串口已经被uboot初始化过,所以我自己实现了一个打印函数sysprintf,在kernel里面可以打印
发现它无法识别启动设备,一直trap在如下while循环里
while (driver_probe_done() != 0 ||(ROOT_DEV = name_to_dev_t(saved_root_name)) == 0){msleep(5);}
然后我跟了一下驱动程序,发现是rcc无法ready。程序有走到如下地方
bus: 'platform': __driver_probe_device: matched device 50000000.rcc with driver STM32mp1_rcc
然后platform_probe调用到了stm32mp1_rcc_clocks_probe返回EPROBE_DEFER的错误
之后系统又尝试了几次启动rcc,都是这个错误
从打印log 看,rcc在等scmi protocol@14 ready
bus: 'platform': __driver_probe_device: matched device 50000000.rcc with driver stm32mp1_rcc
Supplier name: protocol@14
protocol@14在scmi里面,我查看了scmi驱动加载时的打印,如下
bus: 'platform': __driver_probe_device: matched device firmware:scmi with driver arm-scmi
supplier mailbox-0 not ready
bus: 'platform': __driver_probe_device: matched device 4c001000.mailbox with driver stm32-ipcc
supplier 50000000.rcc not ready
scmi在等mailbox-0 ready, mailbox0在等rcc ready
而rcc在等scmi ready 陷入了死循环,这应该怎么处理??



回帖(1)

手托初梦

2025-5-6 16:50:35

针对你从Linux 5.4.31升级到6.1.82后STM32MP157D无法启动的问题,以下是逐步排查和解决方案:




1. 确认设备树(DTS)兼容性



  • 问题根源:新内核可能修改了时钟控制器(RCC)或外设节点的定义,旧版设备树未适配。

  • 操作步骤

    1. 对比ST官方提供的6.1.82内核设备树(如 stm32mp157d.dtsi)与你当前使用的设备树,重点检查:

      • RCC节点:确认时钟配置(如HSI/HSE/PLL设置)与新驱动匹配。

      • 存储控制器节点(如SDMMC、QSPI等):检查兼容性字符串(compatible)是否更新。


    2. 确保设备树中启用了必要的时钟和复位信号,例如:
      &rcc {
      status = "okay";
      /* 检查是否有新的时钟属性或子节点 */
      };

    3. 使用新内核的 dtc 工具编译设备树,避免语法错误:
      make dtbs





2. 升级U-Boot和TFA版本



  • 问题根源:旧版U-Boot(2020)可能无法正确初始化硬件或传递启动参数给新内核。

  • 操作步骤

    1. 升级U-Boot到与Linux 6.1.82配套的版本(建议使用ST官方仓库的 v2022.10 或更高)。

    2. 同步更新Trusted Firmware-A(TFA),确保其支持新内核的启动流程。

    3. 检查U-Boot环境变量(如 bootargsbootcmd),确认根设备参数(root=...)正确无误。





3. 检查RCC驱动和时钟初始化



  • 问题根源:RCC未就绪可能导致外设时钟无法使能,进而导致存储控制器初始化失败。

  • 操作步骤

    1. 在内核配置中确认启用以下关键选项:
      CONFIG_COMMON_CLK_STM32MP13=y  # 根据具体型号选择
      CONFIG_RESET_CONTROLLER=y
      CONFIG_STM32_RCC=y
      CONFIG_MMC_STM32_SDMMC=y       # 存储控制器驱动

    2. 在启动早期添加调试日志:

      • 修改 drivers/clk/clk-stm32mp13.c 或相关RCC驱动文件,在 stm32_rcc_init 函数中添加打印,确认初始化流程是否完成。


    3. 检查时钟频率配置是否符合硬件设计(如SDMMC时钟是否超出卡的限制)。





4. 验证存储控制器驱动



  • 问题根源:根设备无法识别可能是SD卡/USB/EMMC控制器驱动未初始化。

  • 操作步骤

    1. 在内核启动参数中添加 earlyconearlyprintk,观察早期日志:
      bootargs = ... earlycon earlyprintk console=ttySTM0,115200

    2. 确认存储控制器的PHY和时钟配置正确,例如SDMMC的引脚复用和时钟分频:
      &sdmmc1 {
      pinctrl-names = "default";
      pinctrl-0 = <&sdmmc1_b4_pins_a>;
      bus-width = <4>;
      vmmc-supply = <&vdd_sd>;
      status = "okay";
      };





5. 排查RT补丁兼容性



  • 问题根源:实时(RT)补丁可能修改了内核调度或中断处理逻辑,导致驱动初始化顺序变化。

  • 操作步骤

    1. 暂时移除RT补丁,测试标准6.1.82内核能否启动。

    2. 如果标准内核正常,逐步应用RT补丁并检查是否引入问题(如禁用某些时钟或中断控制器配置)。





6. 更新固件和依赖项



  • 问题根源:旧版TFA或SCMI固件可能与新内核存在兼容性问题。

  • 操作步骤

    1. 更新STM32MP1的固件包(如 tf-a-stm32mpu-boot-stm32mp)到与Linux 6.1.82匹配的版本。

    2. 确认SCMI协议版本是否一致(部分内核驱动依赖TFA通过SCMI管理时钟)。





7. 调试工具辅助



  • 操作步骤

    1. 使用JTAG调试器连接开发板,在卡死点检查寄存器状态:

      • 查看RCC相关寄存器(如 RCC_CRRCC_CFGR)是否配置正确。


    2. 通过OpenOCD或ST-Link导出内存和寄存器快照,分析硬件状态。





8. 参考官方资源





总结步骤



  1. 更新U-Boot和TFA到适配6.1.82的版本。

  2. 适配设备树,重点检查RCC和存储控制器节点。

  3. 启用必要内核配置,确保RCC和存储驱动编译正确。

  4. 分阶段测试,先验证标准内核再应用RT补丁。

  5. 利用调试工具定位RCC初始化失败的具体原因。


通过以上步骤,应能解决因RCC未就绪导致的启动卡死问题。如果仍无法解决,建议提供更详细的启动日志和设备树片段进一步分析。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分