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