ST意法半导体
直播中

李舒桀

8年用户 1383经验值
私信 关注
[问答]

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-28 17:37:30

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




1. 检查设备树兼容性



  • 问题可能性:新内核可能修改了设备树绑定(Device Tree Bindings),尤其是时钟、RCC(Reset and Clock Controller)和存储设备相关的节点。

  • 解决方法

    • 从ST官方提供的Linux 6.1.82 SDK中获取参考设备树(如stm32mp157d.dtsi),覆盖你当前使用的设备树。

    • 对比新旧设备树中以下关键部分:

    • RCC节点:确认rcc节点的兼容性字符串(compatible属性)是否为st,stm32mp1-rcc或新内核要求的格式。

    • 时钟配置:检查clocksclock-names属性是否与新内核驱动匹配。

    • 存储设备节点(如MMC/SD卡):确认mmc@...sdmmc@...节点的配置是否更新。





2. 更新U-Boot版本



  • 问题可能性:2020年版的U-Boot可能无法正确传递设备树或启动参数给新内核。

  • 解决方法

    • 升级U-Boot至ST官方为Linux 6.1.82配套的版本(如U-Boot 2022.10或更高)。

    • 检查U-Boot环境变量:
      # 确认bootargs和bootcmd正确设置,例如:
      setenv bootargs root=/dev/mmcblk0p5 rootwait rw console=ttySTM0,115200
      setenv bootcmd 'load mmc 0:4 ${kernel_addr_r} uImage; load mmc 0:4 ${fdt_addr_r} stm32mp157d-myboard.dtb; bootm ${kernel_addr_r} - ${fdt_addr_r}'
      saveenv





3. 验证Trusted Firmware-A (TFA)兼容性



  • 问题可能性:旧版TFA可能不支持新内核的启动流程。

  • 解决方法

    • 从ST官方仓库下载与Linux 6.1.82配套的TFA版本,重新编译并替换旧固件。

    • 编译命令示例:
      make CROSS_COMPILE=arm-none-eabi- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 DTB_FILE_NAME=stm32mp157d-myboard.dtb





4. 检查内核配置选项



  • 问题可能性:关键驱动(如RCC、MMC、串口)未启用或配置错误。

  • 解决方法

    • 执行make menuconfig,确保以下选项已启用:
      Device Drivers > STM32 RCC support (CONFIG_RCC_STM32)
      Device Drivers > MMC/SD/SDIO card support > STM32 SDMMC Controller (CONFIG_MMC_STM32_SDMMC)
      Device Drivers > Serial drivers > STM32 USART (CONFIG_SERIAL_STM32)

    • 确认CONFIG_CMDLINE中指定的根设备(如root=/dev/mmcblk0p5)与实际分区一致。





5. 调试RCC初始化问题



  • 问题可能性:RCC驱动未正确初始化,导致时钟无法就绪。

  • 解决方法

    • 在内核启动参数中添加earlyconearlyprintk,捕获早期日志:
      bootargs=... earlycon earlyprintk

    • 在代码中定位while (driver_probe_done() != 0)循环的位置(通常位于init/main.c或驱动探测逻辑),添加打印调试:
      printk("Waiting for driver_probe_done()... ROOT_DEV=%dn", ROOT_DEV);

    • 检查drivers/clk/clk-stm32mp1.c中的RCC初始化函数(如stm32mp1_rcc_init()),确认时钟源(HSI/HSE)配置是否正确。





6. 验证实时补丁(RT Patch)影响



  • 问题可能性:RT补丁修改了中断或调度行为,导致驱动初始化顺序异常。

  • 解决方法

    • 尝试在不应用RT补丁的情况下编译启动内核,确认是否为补丁引入的问题。

    • 如果RT补丁必须启用,检查/proc/interruptsdmesg日志,确认是否出现IRQ冲突或死锁。





7. 官方资源与社区支持



  • ST官方资源

  • 社区支持

    • 在ST社区或Linux内核邮件列表搜索类似问题,例如:
      [STM32MP157] Linux 6.1.82 boot failure after RCC probe





8. 分步验证流程



  1. 最小系统启动:暂时移除所有非必要驱动和功能,仅保留串口和SD卡驱动。

  2. 逐步添加模块:在确认最小系统能启动后,逐步启用其他驱动(如网络、USB)。

  3. 对比启动日志:使用旧内核(5.4.31)和新内核的启动日志对比,定位首次出现错误的位置。




通过以上步骤,应能定位到RCC初始化失败的具体原因。如果问题仍未解决,建议提供更详细的启动日志和代码调试信息进一步分析。

举报

更多回帖

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