1 分钟阅读 次阅读

启动介质顺序,由很多个方面决定,资料比较封闭,目前只能将收集到的资料都整理在此处,方便后人深入研究。

参考 《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

alt text

目前硬件上配置的是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

alt text

pre-loader 启动

alt text maskrom 首先先找到一份可用的 miniloader 固件(可以从 TRM 确定 Maskrom 支持的启动存储介质 和优先顺序,maskrom 会依次扫描可用存储里的固件),然后跳转到 miniloader。miniloader 重新查 找存储设备,如果检测到 SD 卡,检测 SD 卡是否包含 IDB 格式固件。如果是,再判断卡标志。

U-Boot 启动

alt text alt text 启动卡:U-Boot 重新查找存储设备,如果检测到 SD 卡, 检测 SD 卡是否包含 IDB 格式固件。如果 是,再判断卡标志是否为 1。最后读取 SD 卡的 misc 分区,读取卡启动模式,如果为 recovery,加载 启动 recovery。如果是 normal 模式,则加载启动 kernel。

留下评论