概览
通常,固件存储在闪存中,然后加载到 RAM 以启动系统,这称为 boot from flash ( 从闪存启动 )。USB 启动则允许系统从 USB 启动,这意味着固件存储并加载自 USB 设备,比如 U 盘。
架构
USB 启动可以在 U-Boot 阶段实现。下图显示了从闪存和 USB 启动的流程。系统默认从闪存启动。要实现 USB 启动,必须在 U-Boot 阶段启用 USB 功能和 USB 大容量存储类,以使系统识别 USB 设备。然后使用 fat 命令将固件加载到 RAM。最后,执行 bootm 命令引导内核。
启用安全启动时需要额外的步骤,因为 USB 设备中的固件也需要进行验证。对于 USB 启动,固件会在 bootm 阶段进行验证。如果验证失败,bootm 命令将返回失败且系统将不会启动内核。有关安全启动的更多信息,请参阅安全启动章节。
备注
在系统启动时,用户应及时输入任意内容以进入 U-Boot 命令行模式,否则系统将从闪存启动。
在进行 USB 初始化之前,必须将 USB 设备插入开发板,因为 U-Boot 中的 USB 驱动程序使用轮询模式来识别 USB 设备。
配置
要启用 USB 启动,应该为 U-Boot 启用以下配置。在 SDK 中,这些配置默认已启用。
CONFIG_PHY=y
CONFIG_PHY_RTK_USB=y
CONFIG_USB_STORAGE=y
CONFIG_USB=y
CONFIG_USB_DWC2=y
CONFIG_USB_DWC2_BUFFER_SIZE=64
CONFIG_USB_HOST=y
CONFIG_DM_USB=y
CONFIG_BOOTDELAY=3
CONFIG_FS_FAT=y
CONFIG_FS_FAT_MAX_CLUSTSIZE=65536
CONFIG_CMDLINE=y
CONFIG_CMD_USB=y
CONFIG_CMD_FAT=y
用途
USB 启动(禁用安全启动)
将
dtb.img
和kernel.img
放在 U 盘的根目录下。U 盘应为 FAT32 格式。在系统启动时及时输入任意内容以进入 U-Boot 命令行模式。
插入 U 盘。
输入命令
usb start
。U 盘会显示以下日志信息:=> usb start starting USB... Bus usb@40080000: USB DWC2 scanning bus usb@40080000 for devices... 2 USB Device(s) found scanning usb for storage devices... 1 Storage Device(s) found
输入命令
fatload usb 0 0x60370000 dtb.img
与fatload usb 0 0x60380000 kernel.img
将映像从 U 盘加载到 RAM。=> fatload usb 0 0x60370000 dtb.img 19423 bytes read in 17 ms (1.1 MiB/s) => => fatload usb 0 0x60380000 kernel.img 3294376 bytes read in 253 ms (12.4 MiB/s)
输入命令
usb stop
以解除 USB 功能初始化,防止内核的 USB 功能受到影响。输入命令
bootm 0x60380000 - 0x60370000
以启动内核。
启用安全启动的 USB 引导
请先参考安全启动章节以启用和配置安全启动。
将安全
dtb.img
、kernel.img
和vbmeta.img
放入 U 盘的根目录。U 盘应为 fat32 格式。插入 U 盘。
输入命令
usb start
。U 盘将被识别,并显示以下日志:=> usb start starting USB... Bus usb@40080000: USB DWC2 scanning bus usb@40080000 for devices... 2 USB Device(s) found scanning usb for storage devices... 1 Storage Device(s) found
输入命令
fatload usb 0 0x60370000 dtb.img
、fatload usb 0 0x60380000 kernel.img
和fatload usb 0 0x60d80000 vbmeta.img
,将固件从 U 盘加载到 RAM 中。=> fatload usb 0 0x60380000 kernel.img 3357648 bytes read in 259 ms (12.4 MiB/s) => => fatload usb 0 0x60370000 dtb.img 19549 bytes read in 16 ms (1.2 MiB/s) => => fatload usb 0 0x60d80000 vbmeta.img 5632 bytes read in 14 ms (392.6 KiB/s)
输入命令
mtd read pk-hash 0x60e80000 0x0 0x1000
,将 pk-hash 从闪存加载到 RAM 中。=> mtd read pk-hash 0x60e80000 0x0 0x1000 SPIC mode 0x2000 mtd: partition "pk-hash" doesn't end on an erase block -- force read-only Reading 4096 byte(s) (2 page(s)) at offset 0x00000000
输入命令
usb stop
以停用 USB 功能,防止内核的 USB 功能受到影响。输入命令
bootm verify 0x60380000 0x60370000 0x60d80000 0x40000 0x60e80000 0x1000 0x60380000 - 0x60370000
以验证并加载固件从 U 盘到 RAM。如果成功,控制台将显示以下日志:Public Key Hash Verified Success! VbMeta Signature Verified Success! Kernel Image verified success! DTB/FDT Image verified success.
如果失败,控制台将显示以下日志:
Bootm fail! Please verify images correctly.
备注
由于安全启动是由多个固件共同实现的,用户应确保在编译将放入 U 盘的固件 dtb.img
、 kernel.img
和 vbmeta.img
时,不应修改固件 km4_boot_all_en.bin
、 km0_km4_app_en.bin
和 rootfs_ubi.img
。