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,最后跳转到内核入口。理解这条链的关键是:每一级只信任上一级签名过的下一级,因此安全启动的配置点分布在每一级之间,而不是只在内核。
二、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→BL2 | 80ms | 80ms | 不可优化 |
| BL2→U-Boot | 320ms | 180ms | 裁剪U-Boot命令/驱动 |
| U-Boot→内核 | 450ms | 220ms | 直接booti、减少脚本 |
| 内核→init | 900ms | 500ms | 裁剪驱动、延迟probe |
| init→应用 | 1200ms | 600ms | 并行化、只读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卡或串口下载)作为兜底。