4. R-Car启动流程与系统初始化
R-Car ADAS平台的启动过程是一条从芯片内部固化代码到完整Linux用户空间的逐级信任链。理解这条链路,不仅关系到系统能否正常点亮,更直接影响启动时间优化、安全启动配置以及故障定位效率。本节以R-Car H3/M3系列为参考对象,梳理从BootROM到根文件系统挂载的完整路径,并给出可操作的优化与调试方法。
4.1 启动链的整体结构
R-Car的启动分为五个主要阶段:BootROM、TF-A(Trusted Firmware-A)、U-Boot、Linux内核、根文件系统。每一级都负责初始化一部分硬件,并将控制权交给下一级。BootROM固化在芯片内部,上电后首先运行,它根据启动模式引脚(MD0~MD5)决定从eMMC、QSPI Flash、SD卡或串口等介质加载第一级引导程序。BootROM只信任经过签名或特定格式的镜像,因此第一级引导程序必须按R-Car要求的格式封装。
TF-A在R-Car上通常以BL2和BL31两个阶段存在。BL2运行在EL3,负责初始化DDR、时钟、电源域,并加载BL31和BL33(即U-Boot)。BL31常驻EL3,提供PSCI服务,供后续Linux内核进行CPU热插拔和电源管理。U-Boot运行在EL2或EL1,负责加载内核镜像、设备树和根文件系统,并传递启动参数。Linux内核接管后完成驱动初始化,最后挂载根文件系统,启动init进程。
4.2 BootROM与第一级加载
BootROM的行为由MD引脚采样结果决定。以R-Car H3为例,MD0、MD1、MD2组合选择启动介质:MD2=0、MD1=0、MD0=0对应QSPI Flash;MD2=0、MD1=1、MD0=0对应eMMC;MD2=1、MD1=0、MD0=0对应SD卡。BootROM会从所选介质的固定偏移读取引导头,校验通过后跳转执行。若使用安全启动,BootROM还会验证BL2的公钥签名,验证失败则停止启动并可能拉低错误引脚。
实际开发中,第一级镜像通常由Renesas提供的Flash Writer工具写入。例如通过SCIF下载模式,将bootparam和BL2写入QSPI Flash的0x0000和0x0400偏移。若启动无反应,首先应确认MD引脚电平是否与介质匹配,再用示波器检查串口是否有BootROM输出的“SCIF Download”提示。
4.3 TF-A与U-Boot的衔接
BL2完成DDR初始化后,将BL31和U-Boot镜像从Flash搬运到DDR指定地址。R-Car的BL2配置中,关键参数包括DDR类型、频率、时序以及BL33的入口地址。这些参数通常在plat/renesas/rcar/下的平台文件中定义。BL31加载后,U-Boot在EL2运行,其board_init_f阶段会读取环境变量,决定从何处加载内核。
U-Boot的启动命令通常写在bootcmd中。一个典型的R-Car ADAS板级配置如下:
setenv bootargs 'console=ttySC0,115200 root=/dev/mmcblk0p2 rw rootwait'
setenv bootcmd 'fatload mmc 0:1 0x48080000 Image; fatload mmc 0:1 0x48000000 r8a77951-adas.dtb; booti 0x48080000 - 0x48000000'
saveenv
这里0x48080000是内核镜像加载地址,0x48000000是设备树地址。地址选择必须避开BL31常驻区域和内核保留内存,否则会出现启动后随机崩溃。R-Car H3的BL31通常占用DDR低端约2MB,因此内核加载地址一般从0x48080000开始。
4.4 设备树配置要点
设备树是R-Car启动中最容易出错的环节。ADAS场景下,设备树需要描述:CPU拓扑与OPP、GIC中断控制器、SCIF/HSCIF串口、I2C/SPI连接的外围传感器、PCIe端点、以及为ADAS加速器预留的CMA内存区域。例如,为视觉处理预留64MB连续内存:
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
cma_region: cma@0x60000000 {
compatible = "shared-dma-pool";
reg = <0x0 0x60000000 0x0 0x4000000>;
reusable;
};
};
若设备树中遗漏了某个时钟或电源域节点,内核启动时会在该驱动处报-EPROBE_DEFER,表现为设备迟迟不出现。此时应检查clocks和power-domains属性是否与SoC手册一致。
4.5 根文件系统挂载与启动优化
根文件系统可以放在eMMC分区、SD卡或通过NFS挂载。量产ADAS通常使用eMMC的ext4或UBIFS分区,开发阶段则常用NFS便于迭代。内核命令行中的root=和rootwait决定挂载行为。若根文件系统损坏,内核会panic并打印VFS: Cannot open root device。
启动优化方面,R-Car平台常见的瓶颈在DDR初始化和内核解压。可将内核镜像改为未压缩的Image以减少解压时间,约节省200~400ms;将U-Boot的bootdelay设为0,节省1~3秒;使用quiet减少控制台输出,节省约100~300ms。更激进的方案是启用内核的initcall_debug定位耗时驱动,或将非关键驱动编译为模块延迟加载。
bootstage,记录各阶段时间戳;在内核命令行加入initcall_debug和printk.time=1,通过dmesg时间戳定位耗时点。两者结合可覆盖从BootROM到init的完整时间线。
4.6 调试手段与常见故障
串口是R-Car启动调试的第一手段。BootROM阶段若串口无输出,优先检查MD引脚、晶振和供电。TF-A阶段若卡在BL2,通常是DDR参数不匹配,可通过Renesas提供的DDR测试工具验证。U-Boot阶段若无法加载内核,检查fatload路径和文件系统格式。内核阶段若挂载rootfs失败,检查bootargs中的分区号和文件系统类型。
对于安全启动场景,还需关注签名验证失败时的错误码。R-Car BootROM在验证失败时会通过MFIS或错误引脚输出状态,具体含义需查阅对应SoC的安全手册。调试时建议先关闭安全启动,确认功能链路正常后再逐级开启签名验证。
掌握上述启动链的每一级职责与衔接关系,是进行R-Car ADAS平台系统集成和问题定位的基础。实际项目中,建议将各阶段镜像版本、配置参数和启动日志纳入版本管理,以便在出现回归时快速比对。