3. 量产级BSP与启动链构建

R-Car平台的启动链不是“上电直接跑Linux”,而是一条由多级固件逐级移交控制权的信任链:BootROM → Boot Firmware(含ATF/BL2/BL31)→ U-Boot(BL33)→ Linux内核 → 用户态。量产级BSP的核心工作,就是把这条链上的每一级都做成可复现、可签名、可度量、可优化的交付物。本节围绕四个工程决策展开:ATF/U-Boot/内核如何定制、启动介质如何选、启动时间如何压、安全启动如何配。

一、启动链的分级与各段职责

R-Car Gen3/Gen4的典型启动链如下:芯片上电后,BootROM从启动介质读取Boot Firmware(在R-Car上通常称为BL2,基于ATF构建),BL2完成DDR初始化、时钟与引脚复用配置,然后加载BL31(ATF运行时,提供PSCI电源管理、SIP服务)和BL33(U-Boot)。U-Boot再加载Linux内核镜像、设备树和initramfs/rootfs,最后跳转到内核入口。理解这条链的关键是:每一级只信任上一级签名过的下一级,因此安全启动的配置点分布在每一级之间,而不是只在内核。

启动介质 QSPI NOR BL2+BL31+U-Boot eMMC 全链+rootfs SD卡 开发/恢复 UFS/NAND 大容量量产 BootROM按启动模式选择 BootROM 固化代码 · 不可改 验签BL2 · 加载到SRAM BL2 (ATF) DDR初始化 · 时钟 · PinMux 加载BL31/BL33 BL31 (ATF) PSCI · SIP · 运行时 常驻EL3 U-Boot (BL33) SPL/TPL可选 · 环境变量 · 驱动模型 加载Image + DTB + initramfs Linux Kernel 解压 · 设备树匹配 · 驱动probe 挂载rootfs → init 安全启动验签点 ① BootROM验BL2 ② BL2验BL31/BL33 ③ U-Boot验内核/DTB ④ dm-verity验rootfs 密钥根:OTP/eFuse 签名:RSA-2048/4096 0ms ~200ms ~500ms ~1.5s →用户态

二、ATF与U-Boot的定制要点

ATF在R-Car上以BL2+BL31的形式交付。BL2的定制集中在DDR初始化参数(DDR类型、频率、时序)、时钟树配置和引脚复用表,这些通常由Renesas提供的工具生成,量产时必须与硬件版本严格对应。BL31一般不需要修改,但需要确认PSCI的CPU上下电、系统级电源域和SIP服务(如向R-Car的MFIS/CPG寄存器写入)是否与内核的cpuidle/cpufreq驱动匹配。

U-Boot的定制重点在板级配置:include/configs/<board>.h或configs/<board>_defconfig中定义启动介质、环境变量存储位置、内核加载地址。R-Car Gen3的典型加载地址为:内核Image加载到0x48080000,DTB加载到0x48000000,initramfs加载到0x4A000000。这些地址必须与内核的CONFIG_PHYS_OFFSET和内存布局一致,否则会出现“内核启动后无输出”的典型故障。

# U-Boot环境变量示例(R-Car H3 Salvator-XS)
setenv bootargs 'console=ttySC0,115200 root=/dev/mmcblk0p1 rw rootwait'
setenv load_kernel 'fatload mmc 0:1 0x48080000 Image'
setenv load_dtb    'fatload mmc 0:1 0x48000000 r8a77951-salvator-xs.dtb'
setenv bootcmd 'run load_kernel; run load_dtb; booti 0x48080000 - 0x48000000'
saveenv

三、启动介质选择

启动介质的选择直接影响启动时间、成本和可维护性。QSPI NOR的读取延迟低、支持XIP,适合存放BL2/BL31/U-Boot,典型启动到U-Boot约200~300ms;eMMC容量大、成本低,适合存放完整镜像和rootfs,但初始化需要额外的CMD时序协商,启动到U-Boot约400~600ms;SD卡主要用于开发和恢复模式,量产不建议作为主启动介质;UFS/NAND适合大容量场景,但需要额外的驱动支持。量产常见方案是“QSPI NOR存引导链 + eMMC存系统”,兼顾启动速度和容量。

四、启动时间优化

启动时间优化要分段测量,而不是凭感觉裁剪。建议在U-Boot中打开CONFIG_BOOTSTAGE和CONFIG_BOOTSTAGE_REPORT,内核侧打开initcall_debug和printk.time=1,用systemd-analyze或bootchart看用户态耗时。典型优化手段包括:关闭U-Boot中不需要的命令和驱动(可减少100~200ms)、使用booti直接启动而非脚本、内核裁剪掉未使用的驱动和文件系统、将rootfs改为只读squashfs+overlay、并行化init脚本。以下是一个可参考的优化前后对比示例(数据为教学示例,非实测):

阶段优化前优化后主要手段
BootROM→BL280ms80ms不可优化
BL2→U-Boot320ms180ms裁剪U-Boot命令/驱动
U-Boot→内核450ms220ms直接booti、减少脚本
内核→init900ms500ms裁剪驱动、延迟probe
init→应用1200ms600ms并行化、只读rootfs

五、安全启动配置

R-Car的安全启动基于OTP/eFuse中的根公钥哈希。配置流程是:生成RSA密钥对 → 用私钥签名BL2/BL31/U-Boot/内核 → 将公钥哈希烧入eFuse → 在BootROM和各级固件中启用验签。关键注意点:eFuse烧写不可逆,量产前必须用未烧写的样片完整验证;签名算法和密钥长度要与BootROM支持的能力匹配(R-Car Gen3通常支持RSA-2048/4096);U-Boot阶段的内核验签需要开启CONFIG_FIT_SIGNATURE并使用FIT镜像格式。安全启动一旦启用,任何未签名的镜像都会被拒绝,因此产线必须保留恢复模式(如通过SD卡或串口下载)作为兜底。

安全启动启用后,调试用的未签名U-Boot将无法启动。建议在开发阶段使用“安全启动关闭 + 签名验证脚本”的方式验证签名流程,量产前再烧写eFuse。
启动时间优化的第一步永远是测量。没有分段数据就裁剪配置,往往只是把时间从一个阶段挪到另一个阶段,总时间不变。