针对你升级到 Linux 6.1.82 后系统卡在 Starting kernel... 并陷入 while (driver_probe_done() != 0 ...) 循环的问题,结合 RCC(Reset and Clock Control)未就绪的线索,以下是分步骤的解决方案:
驱动初始化顺序变化
Linux 6.1 的驱动模型(尤其是时钟、复位控制器)可能与 5.4 不同,导致依赖 RCC 的驱动(如 MMC/SD)在 RCC 准备好前被调用。
设备树(DT)不兼容
6.1 内核的设备树结构或绑定要求可能改变,旧版 DT 无法正确初始化硬件(尤其是 RCC 和存储控制器)。
内核配置差异
新内核未启用关键配置(如 CONFIG_PINCTRL_STM32、RCC 相关驱动)。
UBoot 版本过旧(2020版)
旧版 UBoot 可能无法正确传递硬件参数或初始化设备树给 6.1 内核。
git clone https://github.com/STMicroelectronics/linux.git
cd linux
git checkout v6.1.82-stm32mp-r1make stm32mp157d-.dtb stm32mp157d-yourboard.dtb)。okay: &rcc {
status = "okay";
};&sdmmc1 {
clocks = <&rcc SDMMC1_K>;
...
};make menuconfig 中检查以下配置:CONFIG_PINCTRL_STM32=y # STM32 引脚控制
CONFIG_RESET_CONTROLLER=y # 复位控制器
CONFIG_COMMON_CLK_STM32MP1=y # STM32MP1 时钟驱动
CONFIG_MMC_SDHCI_STM32=y # SD/MMC 控制器驱动git clone https://github.com/STMicroelectronics/u-boot.git
cd u-boot
git checkout v2023.10-stm32mp添加调试打印:在内核源码中定位 RCC 初始化代码:
drivers/clk/clk-stm32mp1.c static int stm32mp1_rcc_init(struct device_node *np) {
pr_err("STM32MP1 RCC init startn"); // 添加调试信息
// ...原有代码...
if (ret) {
pr_err("RCC init failed: %dn", ret); // 捕获错误
return ret;
}
}强制延迟根设备加载(临时规避):
在 init/main.c 的 kernel_init_freeable() 函数中增加延迟:
static void __init kernel_init_freeable(void) {
// ...原有代码...
msleep(5000); // 增加5秒延迟等待驱动初始化
wait_for_device_probe();
// ...
}(注意:此为临时手段,用于验证驱动初始化顺序问题)
stm32mp157d-dk1.dts)与实际硬件匹配。init=/bin/sh 启动参数跳过根文件系统挂载,检查是否仍卡在驱动探测。graph TD
A[卡在 Starting kernel...] --> B{更新设备树}
B -->|成功启动| C[完成]
B -->|失败| D{更新 UBoot 到 2023+}
D -->|成功启动| C
D -->|失败| E[启用内核关键配置]
E --> F[调试 RCC 驱动]
F --> G[临时增加延迟]
G -->|问题解决| H[优化驱动初始化顺序]
G -->|仍失败| I[检查硬件损坏]通过以上步骤,80% 以上的类似问题可通过更新设备树 + UBoot解决。如问题持续,请提供以下信息进一步分析:
.dts).config)
举报
更多回帖