3588 启动介质顺序
启动介质顺序,由很多个方面决定,资料比较封闭,目前只能将收集到的资料都整理在此处,方便后人深入研究。
参考 《Rockchip_Developer_Guide_UBoot_Nextdev_CN》 《Rockchip_Developer_Guide_SD_Boot_CN》 https://www.w568w.eu.org/rockchip-boot-process.html https://docs.armsom.org/zh/advanced-manual/rockchip-boot
RK 两套启动流程
《Rockchip_Developer_Guide_UBoot_Nextdev_CN》P15
// 前级loader闭源 BOOTROM => ddr bin => Miniloader => TRUST => U-BOOT => KERNEL // 前级loader开源 BOOTROM => TPL => SPL => TRUST => U-BOOT => KERNEL
TPL 相当于 ddr bin,SPL 相当于 miniloader。TPL+SPL 的组合实现了跟 RK 闭源 ddr.bin+miniloader 一致的功能,可相互替换。
目前我司用的应该是第一套。
U-Boot 通过使用不同的编译条件可以用同一套代码获取三种不同功能的Loader:TPL/SPL/U-Bootproper。 TPL(Tiny Program Loader)和 SPL(Secondary Program Loader)是比 U-Boot 更早阶段的 Loader:
- TPL:运行在 sram 中,负责完成 ddr 初始化;
- SPL:运行在 ddr 中,负责完成系统的 lowlevel 初始化、后级固件加载(trust.img 和 uboot.img);
- U-Boot proper:运行在ddr中,即我们通常所说的”U-Boot”,它负责引导kernel;
说明:U-Boot proper 这一说法主要是为了和 SPL 区分开。出于习惯,后续章节提到的 UBoot proper 我们都简称为 U-Boot。
启动流程: BOOTROM => TPL(ddr bin) => SPL(miniloader) => TRUST => U-BOOT => KERNEL
通过硬件上 SARADC_IN0 进行boot mode config

目前硬件上配置的是LEVEL7,也就是EMMC->SD
SPL的启动优先级
《Rockchip_Developer_Guide_UBoot_Nextdev_CN》P198
SPL 使用 u-boot,spl-boot-order 定义的启动顺序,位于rkxxxx-u-boot.dtsi:
chosen {
stdout-path = &uart2;
u-boot,spl-boot-order = &sdmmc, &sfc, &nandc, &emmc;
};
rk3588 u-boot/arch/arm/dts/rk3588-u-boot.dtsi
chosen {
stdout-path = &uart2;
u-boot,spl-boot-order = &sdmmc, &sdhci, &spi_nand, &spi_nor;
};
u-boot
《Rockchip_Developer_Guide_UBoot_Nextdev_CN》P18
u-boot/include/configs/rk3588_common.h u-boot/include/configs/rockchip-common.h
RK 定制的启动设备检测:
#define RKIMG_DET_BOOTDEV \
"rkimg_bootdev=" \
"if mmc dev 1 && rkimgtest mmc 1; then " \
"setenv devtype mmc; setenv devnum 1; echo Boot from SDcard;" \
"elif mmc dev 0; then " \
"setenv devtype mmc; setenv devnum 0;" \
"elif mtd_blk dev 0; then " \
"setenv devtype mtd; setenv devnum 0;" \
"elif mtd_blk dev 1; then " \
"setenv devtype mtd; setenv devnum 1;" \
"elif mtd_blk dev 2; then " \
"setenv devtype mtd; setenv devnum 2;" \
"elif rknand dev 0; then " \
"setenv devtype rknand; setenv devnum 0;" \
"elif rksfc dev 0; then " \
"setenv devtype spinand; setenv devnum 0;" \
"elif rksfc dev 1; then " \
"setenv devtype spinor; setenv devnum 1;" \
"else;" \
"setenv devtype ramdisk; setenv devnum 0;" \
"fi; \0"
U-Boot 标准的 Distro Boot(通用分发版启动):
#define BOOT_TARGET_DEVICES(func) \
BOOT_TARGET_MMC(func) \
BOOT_TARGET_MTD(func) \
BOOT_TARGET_RKNAND(func) \
BOOT_TARGET_USB(func) \
BOOT_TARGET_PXE(func) \
BOOT_TARGET_DHCP(func)
/* First try to boot from SD (index 1), then eMMC (index 0) */
#if CONFIG_IS_ENABLED(CMD_MMC)
#define BOOT_TARGET_MMC(func) \
func(MMC, mmc, 0) \
func(MMC, mmc, 1)
这两个启动检测的顺序,是有先后的,RK定制的先:
#define RKIMG_BOOTCOMMAND \
"boot_android ${devtype} ${devnum};" \
"boot_fit;" \
"bootrkp;" \
"run distro_bootcmd;"
支持层级
《Rockchip_Developer_Guide_UBoot_Nextdev_CN》P31 SD启动/升级是从bootrom这一级开始支持 U盘启动/升级是从U-Boot这一级开始支持
SD boot启动流程
《Rockchip_Developer_Guide_UBoot_Nextdev_CN》P174

pre-loader 启动
maskrom 首先先找到一份可用的 miniloader 固件(可以从 TRM 确定 Maskrom 支持的启动存储介质
和优先顺序,maskrom 会依次扫描可用存储里的固件),然后跳转到 miniloader。miniloader 重新查
找存储设备,如果检测到 SD 卡,检测 SD 卡是否包含 IDB 格式固件。如果是,再判断卡标志。
U-Boot 启动
启动卡:U-Boot 重新查找存储设备,如果检测到 SD 卡, 检测 SD 卡是否包含 IDB 格式固件。如果
是,再判断卡标志是否为 1。最后读取 SD 卡的 misc 分区,读取卡启动模式,如果为 recovery,加载
启动 recovery。如果是 normal 模式,则加载启动 kernel。
留下评论