2. Layerscape启动流程分析与U-Boot阶段调试

Layerscape启动流程分析与U-Boot阶段调试 学习卡片

LS1046A 启动阶段划分与串口日志特征

LS1046A 从上电到内核接管,依次经历 BootROM → PBL/SPL → U-Boot proper → Linux Kernel 四个阶段。每个阶段在串口上留下的日志特征不同,这是判断卡死位置的第一手依据。BootROM 阶段通常无输出或仅有极短的 RCW 校验信息;PBL 阶段会打印 DDR 初始化与 SPL 版本;U-Boot proper 阶段输出板级信息、环境变量加载与设备树传递;内核阶段则出现 Starting kernel ... 之后的解压与启动日志。

BootROM RCW 校验 / 引导介质选择 PBL / SPL DDR 初始化 / 加载 U-Boot U-Boot proper 板级初始化 / 加载内核 Linux Kernel 解压 / 驱动初始化 串口日志特征 无输出或极短 RCW 校验失败时 可能完全静默 SPL 版本号 DDR 训练信息 "U-Boot SPL ..." "U-Boot 20xx.xx" CPU / DDR 容量 "Hit any key ..." "Starting kernel" 解压日志 驱动 probe 信息 卡死定位判断路径 串口无任何输出 → 检查 RCW / 时钟 / 复位 停在 SPL 阶段 → 检查 DDR 参数 / 启动介质 停在 U-Boot 命令行 → 检查 bootcmd / 环境变量 停在 "Starting kernel" → 检查设备树 / 内核镜像 / 加载地址 关键命令:bdinfo 查看板级信息 | printenv 查看环境变量 | mmc info / sf probe 检查启动介质 | md 查看内存内容

U-Boot 阶段调试命令与卡死定位

当串口停在 U-Boot 阶段时,利用 U-Boot 命令行逐项排查。以下命令按启动链路顺序排列,每执行一步观察输出是否符合预期。

检查项命令预期输出异常处理
板级信息bdinfo显示 DDR 起始地址、容量、CPU 频率DDR 容量为 0 或异常 → 检查 DDR 初始化参数
环境变量printenv bootcmd显示内核加载命令链bootcmd 为空或错误 → 恢复默认环境
启动介质mmc info 或 sf probe识别到 SD/eMMC 或 QSPI 容量识别失败 → 检查引脚复用与时钟
内核镜像mmc read ${loadaddr} 0x1000 0x8000读取成功无报错读取失败 → 检查分区偏移与镜像烧录
设备树fdt addr ${fdtaddr}显示设备树头部信息地址错误 → 检查 fdtaddr 环境变量
内存内容md ${loadaddr} 0x10显示内核镜像头部魔数全 0 或乱码 → 镜像未正确加载
典型卡死场景:串口停在 Starting kernel ... 后无输出。此时 U-Boot 已成功将控制权交给内核,问题通常出在设备树中 chosen 节点的 bootargs 参数错误、内核镜像加载地址与设备树不匹配,或内核配置缺少 LS1046A 必需的串口驱动。可在 U-Boot 中执行 fdt print /chosen 查看实际传递的启动参数。

启动卡死排查清单

  • 无输出:确认串口线序(TX/RX/GND)、波特率 115200、RCW 中 UART 引脚复用是否正确。
  • SPL 阶段卡死:检查 DDR 训练参数是否与板卡实际 DDR 颗粒匹配,确认启动介质(SD/QSPI)的 SPL 镜像偏移正确。
  • U-Boot 命令行卡死:执行 printenv 检查 bootcmd、bootargs、loadaddr、fdtaddr 是否被意外修改,可用 env default -a 恢复默认后 saveenv。
  • 内核阶段卡死:在 U-Boot 中手动执行 booti ${loadaddr} - ${fdtaddr} 观察完整输出,确认内核镜像格式(Image vs zImage)与 booti/bootz 命令匹配。