主 U-Boot 二进制文件可能太大,无法由 Boot ROM 直接加载。这是将 U-Boot 拆分为多个启动阶段的原始驱动程序。
U-Boot 通常经历以下启动阶段,其中 TPL、VPL 和 SPL 是可选的。虽然许多主板使用 SPL,但只有少数主板使用 TPL
TPL
第三级程序加载器。非常早的初始化,尽可能小。这将加载 SPL(或 VPL,如果启用)。
VPL
验证程序加载器。可选验证步骤,如果启用了 A/B 验证启动,则可以选择多个 SPL 二进制文件之一。VPL 逻辑的实现正在进行中。目前它只是启动到 SPL。
SPL
辅助程序加载器。设置 SDRAM 并正确加载 U-Boot。它还可以加载其他固件组件。
U-Boot
这是唯一包含命令的阶段。它还实现了加载操作系统的逻辑,例如通过 UEFI。
U-Boot SPL 的更多用途包括:
-
启动 ARM 可信固件的 BL31,以 BL33 的形式调用 U-Boot
-
启动 EDK II
-
启动 Linux,例如Falcon 模式
-
启动 RISC-V OpenSBI 并调用主 U-Boot
目标二进制文件
SPL/TPL 加载的二进制文件可以是:
-
原始二进制文件,其中入口地址等于起始地址。这是 TPL 支持的唯一二进制格式。
-
FIT图像
-
旧版 U-Boot 映像
配置
如果 CONFIG_SPL_RAW_IMAGE_SUPPORT=y,则仅 SPL 才支持原始映像。
需要 CONFIG_SPL_FIT=y 和 CONFIG_SPL_LOAD_FIT=y 来加载 FIT 映像。
需要 CONFIG_SPL_LEGACY_IMAGE_FORMAT=y 来加载旧版 U-Boot 映像。CONFIG_SPL_LEGACY_IMAGE_CRC_CHECK=y 可以检查旧版 U-Boot 映像的 CRC32。
映像加载方法
电路板可用的映像启动方法必须在两个地方定义:
主板代码实现了一个函数 board_boot_order(),它枚举最多五种启动方法及其尝试顺序。(启动方法的最大数量目前硬编码为变量 spl_boot_list[])。如果只有一个启动方法函数,则可以改为实现 spl_boot_device()。
配置控制哪些启动方法实际上可用。
从块设备加载 MMC1、MMC2、MMC2_2
这些方法从 SD 卡或 eMMC 读取映像。“MMC”后面的第一位数字表示设备编号。所需的配置设置包括:
- CONFIG_SPL_MMC=y 或 CONFIG_TPL_MMC=y
要使用 PCI 连接的 MMC 控制器,您还需要指定:
-
CONFIG_SPL_PCI=y
-
CONFIG_SPL_PCI_PNP=y
-
CONFIG_MMC=y
-
CONFIG_MMC_PCI=y
-
CONFIG_MMC_SDHCI=y
要从文件系统加载,请使用:
-
CONFIG_SPL_FS_FAT=y 或 CONFIG_SPL_FS_EXT=y
-
CONFIG_SPL_FS_LOAD_PAYLOAD_NAME="<文件路径>"
NVMe
此方法从 NVMe 驱动器加载映像。所需的配置设置包括:
-
CONFIG_SPL_PCI=y
-
CONFIG_SPL_PCI_PNP=y
-
CONFIG_SPL_NVME=y
-
CONFIG_SPL_NVME_PCI=y
-
CONFIG_SPL_NVME_BOOT_DEVICE(NVMe 设备编号)
-
CONFIG_SYS_NVME_BOOT_PARTITION(要读取的分区)
要从文件系统加载,请使用:
-
CONFIG_SPL_FS_FAT=y 或 CONFIG_SPL_FS_EXT=y
-
CONFIG_SPL_FS_LOAD_PAYLOAD_NAME="<文件路径>"
SATA
此方法从 SATA 驱动器读取图像。所需的配置设置包括:
- CONFIG_SPL_SATA=y 或 CONFIG_TPL_SATA=y
要使用 PCIe 连接 SATA 控制器,您还需要:
-
CONFIG_SPL_PCI=y
-
CONFIG_SPL_SATA=y
-
CONFIG_SPL_AHCI_PCI=y
-
CONFIG_SPL_PCI_PNP=y
要从文件系统加载,请使用:
-
CONFIG_SPL_FS_FAT=y
-
CONFIG_SYS_SATA_FAT_BOOT_PARTITION=<分区号>
-
CONFIG_SPL_FS_LOAD_PAYLOAD_NAME="<文件路径>"
USB
USB 方法从 USB 块设备加载映像。所需的配置设置包括:
-
CONFIG_SPL_USB_HOST=y
-
CONFIG_SPL_USB_STORAGE=y
要使用 PCI 连接的 USB 3.0 控制器,您还需要:
-
CONFIG_SPL_FS_FAT=y
-
CONFIG_SPL_PCI=y
-
CONFIG_SPL_PCI_PNP=y
-
CONFIG_USB=y
-
CONFIG_USB_XHCI_HCD=y
-
CONFIG_USB_XHCI_PCI=y
要从文件系统加载,请使用:
-
CONFIG_SPL_FS_FAT=y 或 * CONFIG_SPL_FS_EXT=y
-
CONFIG_SYS_USB_FAT_BOOT_PARTITION=<分区号>
-
CONFIG_SPL_FS_LOAD_PAYLOAD_NAME="<文件路径>"
从原始闪存设备加载
NAND
此方法从 NAND 闪存加载图像。要从原始 NAND 读取,需要以下配置设置:
CONFIG_SPL_NAND_SUPPORT=y 或 CONFIG_TPL_NAND_SUPPORT=y
如果 CONFIG_SPL_NAND_RAW_ONLY=y,则只能加载原始图像。
要使用 UBI(未分类的块图像)卷从 NAND 读取,需要以下配置设置:
CONFIG_SPL_UBI=y 或 CONFIG_TPL_UBI=y
可以指定要读取的 UBI 卷
使用 CONFIG_SPL_UBI_LOAD_BY_VOLNAME 按名称或按编号使用 CONFIG_SPL_UBI_LOAD_MONITOR_ID。
NOR
此方法从 NOR 闪存加载图像。所需的配置设置包括:
- CONFIG_SPL_NOR_SUPPORT=y 或 CONFIG_TPL_NOR_SUPPORT=y
OneNAND
此方法从 OneNAND 设备加载图像。要从原始 OneNAND 读取,需要以下配置设置:
- CONFIG_SPL_ONENAND_SUPPORT=y 或 CONFIG_TPL_ONENAND_SUPPORT=y
要使用 Ubi 文件系统从 NAND 读取,需要以下配置设置:
- CONFIG_SPL_UBI=y 或 CONFIG_TPL_UBI=y
串行外设接口
此方法从 SPI NOR 闪存加载图像。所需的配置设置包括:
- CONFIG_SPL_DM_SPI=y
- CONFIG_SPL_SPI_FLASH=y
- CONFIG_SPI_LOAD=y 或 CONFIG_TPL_SPI_LOAD=y
Sunxi SPI
此方法特定于 Allwinner SoC,可从 SPI NOR 闪存加载映像。所需的配置设置包括:
- CONFIG_SPL_SPI_SUNXI=y
从其他设备加载
BOOTROM
二进制文件由启动 ROM 加载。所需的配置设置包括:
- CONFIG_SPL_BOOTROM_SUPPORT=y 或 CONFIG_TPL_BOOTROM_SUPPORT=y
DFU
设备固件升级用于将二进制文件加载到 RAM 中。所需的配置设置包括:
- CONFIG__DFU=y
- CONFIG_SPL_RAM_SUPPORT=y 或 CONFIG TPL_RAM_SUPPORT=y
Ethernet
此方法通过以太网加载映像。BOOTP 协议用于查找 TFTP 服务器和二进制名称。二进制文件通过 TFTP 协议下载。所需的配置设置包括:
-
CONFIG_SPL_NET=y 或 CONFIG_TPL_NET=y
-
CONFIG_SPL_ETH_DEVICE=y 或 CONFIG_DM_USB_GADGET=y
FEL
此方法实际上不会加载 U-Boot 的映像。FEL 是 Allwinner SoC 的引导 ROM 中包含的例程,用于通过 USB 进行初始编程或恢复
RAM
此方法使用预加载到 RAM 中的图像。所需的配置设置包括:
-
CONFIG_SPL_RAM_SUPPORT=y 或 CONFIG_TPL_RAM_SUPPORT=y
-
CONFIG_RAM_DEVICE=y
Sandbox file
在沙箱中,此方法从主机文件系统加载图像。
Sandbox image
在沙箱中,此方法从主机文件系统加载图像
Semihosting
在 ARM 或 RISC-V 虚拟机中运行时,可以使用半主机方法从主机文件系统加载映像。所需的配置设置包括:
-
CONFIG_SPL_SEMIHOSTING = y
-
CONFIG_SPL_SEMIHOSTING_FALLBACK=y
CONFIG_SPL_FS_LOAD_PAYLOAD_NAME=<文件路径>
UART
此方法通过 Y-Modem 协议从 UART 加载图像。所需的配置设置包括:
- CONFIG_SPL_YMODEM_SUPPORT=y 或 CONFIG_TPL_YMODEM_SUPPORT=y
USB SDP
此方法使用由 i.MX 系列 SoC 的引导 ROM 实现的串行下载协议加载映像。
所需的配置设置包括:
- CONFIG_SPL_SERIAL=y
- CONFIG_SPL_USB_SDP_SUPPORT=y 或 CONFIG_TPL_USB_SDP_SUPPORT
VBE Simple
VPL阶段使用此方法从已加载的图像中提取下一阶段的图像。
所需的配置设置包括:
- CONFIG_VPL=y
- CONFIG_SPL_BOOTMETH_VBE_SIMPLE_FW=y 或 CONFIG_TPL_BOOTMETH_VBE_SIMPLE_FW=y
XIP
此方法在原地执行图像。
所需的配置设置包括:
- CONFIG_SPL_XIP_SUPPORT