3. R-Car启动流程与引导加载
R-Car SoC 上电后的启动过程是一条严格分层的信任链:从芯片内部固化的 BootROM 开始,逐级校验并加载下一阶段镜像,最终把控制权交给操作系统内核。理解这条链的每一环,是排查"板子起不来"类问题的前提。本节围绕 BootROM 工作机理、启动模式选择、TF-A/U-Boot 移植、启动参数配置以及串口调试输出分析展开。
BootROM 工作机理
BootROM 是掩膜在 SoC 内部的一段只读代码,上电复位后由 Cortex-A 核或片上 RISC-V 协处理器首先执行。它完成三件事:采样启动模式引脚(MD 引脚)确定引导介质;初始化最小必要的外设控制器(如 SCIF 串口、eMMC/SD 控制器、QSPI 控制器);从选定介质读取第一阶段引导程序(通常称为 IPL 或 BL2)到片上 SRAM,并做基本完整性检查后跳转执行。
R-Car 的 BootROM 支持多种引导源,典型包括:QSPI Flash(串行 NOR)、eMMC、SD 卡、SCIF 串口下载(用于产线烧录或救砖)、以及以太网。BootROM 阶段可用的 SRAM 容量有限(不同型号约 数百 KB 量级),因此 BL2 必须足够精简,通常只做 DDR 初始化、时钟/PLL 配置,然后把更大的 U-Boot 或 TF-A BL31/BL33 搬到 DDR 中运行。
需要特别注意:BootROM 会读取引导头中的长度、校验和、目标地址等字段。若镜像头部信息与实际内容不符,BootROM 会直接放弃该介质并尝试下一个引导源,此时串口往往只输出极简的错误码,甚至无输出。因此镜像打包工具(如 Renesas 提供的 ipl 打包脚本或 mkimage)的参数必须与硬件配置严格一致。
启动模式选择
启动模式由复位时 MD 引脚的电平组合决定。以常见的 R-Car H3/M3 系列为例,MD0、MD1、MD3 等引脚共同编码引导介质。设计硬件时通常用拨码开关或电阻上下拉固定这些引脚,量产板则直接焊死。调试阶段建议保留拨码开关,便于在 QSPI、SD、SCIF 之间切换。
一个常见的误区是:修改了拨码开关却忘记复位。MD 引脚只在复位释放瞬间被采样,运行中改变不会生效。另一个误区是 SCIF 下载模式需要上位机工具配合,且对串口波特率、握手时序有要求,若串口线质量差或波特率不匹配,会表现为"卡在等待同步"。
TF-A 与 U-Boot 移植
在 R-Car 上,典型的引导链是:BootROM → IPL(BL2)→ TF-A BL31(EL3 运行时固件)→ U-Boot(BL33)→ Linux Kernel。TF-A 负责建立安全监控环境、初始化 PSCI、处理 CPU 热插拔与电源管理;U-Boot 负责加载内核、设备树与根文件系统。
移植工作的核心是板级配置。以 U-Boot 为例,需要新建 include/configs/r8a779x_xxx.h 或在 configs/ 下新增 defconfig,并在设备树中描述 DDR 容量、串口基地址、存储控制器。关键配置项包括:
CONFIG_SYS_TEXT_BASE=0x50000000
CONFIG_SYS_MALLOC_LEN=0x4000000
CONFIG_SH_SCIF_CLOCK=14745600
CONFIG_DEFAULT_DEVICE_TREE="r8a779x-xxx"
CONFIG_BOOTCOMMAND="fatload mmc 0:1 0x48080000 Image; ..."
DDR 初始化参数(时序、容量、位宽)通常由 Renesas 提供的 DDR 初始化代码或 ddr_init 表给出,必须与板卡实际使用的 DDR 颗粒匹配。若 DDR 参数错误,典型现象是 BL2 能打印几行后卡死,或 U-Boot 启动到 DRAM: 行时挂起。
启动参数配置
U-Boot 通过 bootargs 环境变量向内核传递参数。R-Car 平台上常见的配置包括:
setenv bootargs 'console=ttySC0,115200n8 root=/dev/mmcblk0p2 rw rootwait
ip=dhcp video=1920x1080'
其中 console=ttySC0 指定 SCIF 串口为控制台,rootwait 让内核等待存储设备就绪,video= 用于设定显示输出。若串口控制台参数写错,内核启动后串口会"突然安静",但系统可能仍在运行——此时可通过网络登录验证。
串口与调试端口输出分析
串口是启动调试的第一手信息源。建议固定使用 115200 8N1,并在终端工具中开启时间戳。正常启动时,串口会依次输出 BootROM 提示(部分型号)、BL2 的 DDR 初始化信息、TF-A 的 BL31 版本、U-Boot 的 U-Boot 20xx.xx 横幅,最后是内核 Starting kernel ...。
若输出在某一行停止,可按以下思路定位:停在 BL2 之前,多为引导介质或镜像头问题;停在 DDR 初始化,多为 DDR 参数或供电问题;停在 U-Boot 横幅后,多为环境变量或存储访问问题;停在 Starting kernel 后无输出,多为内核串口参数或设备树不匹配。下面这张图给出了从复位到内核的完整信号链与各阶段可观察的串口输出特征。
实际调试时,建议先用已知良好的 SD 卡启动镜像验证板卡基本功能,再逐步替换为自研镜像。每次只改一个变量(如只改 DDR 参数或只改 bootargs),并保留串口完整日志,这样才能把"卡死"精确定位到某一阶段。对于量产板,还应把 BootROM 支持的备用引导源(如 SCIF 下载)作为救砖手段保留在硬件设计上。