概览

通常,固件存储在闪存中,然后加载到 RAM 以启动系统,这称为 boot from flash从闪存启动 )。USB 启动则允许系统从 USB 启动,这意味着固件存储并加载自 USB 设备,比如 U 盘。

架构

USB 启动可以在 U-Boot 阶段实现。下图显示了从闪存和 USB 启动的流程。系统默认从闪存启动。要实现 USB 启动,必须在 U-Boot 阶段启用 USB 功能和 USB 大容量存储类,以使系统识别 USB 设备。然后使用 fat 命令将固件加载到 RAM。最后,执行 bootm 命令引导内核。

../../rst_linux/7_usb_boot/figures/usb_boot_with_secure_boot_disabled.svg

启用安全启动时需要额外的步骤,因为 USB 设备中的固件也需要进行验证。对于 USB 启动,固件会在 bootm 阶段进行验证。如果验证失败,bootm 命令将返回失败且系统将不会启动内核。有关安全启动的更多信息,请参阅安全启动章节。

../../rst_linux/7_usb_boot/figures/usb_boot_with_secure_boot_enabled.svg

备注

  • 在系统启动时,用户应及时输入任意内容以进入 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 启动(禁用安全启动)

  1. dtb.imgkernel.img 放在 U 盘的根目录下。U 盘应为 FAT32 格式。

  2. 在系统启动时及时输入任意内容以进入 U-Boot 命令行模式。

  3. 插入 U 盘。

  4. 输入命令 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
    
  5. 输入命令 fatload usb 0 0x60370000 dtb.imgfatload 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)
    
  6. 输入命令 usb stop 以解除 USB 功能初始化,防止内核的 USB 功能受到影响。

  7. 输入命令 bootm 0x60380000 - 0x60370000 以启动内核。

启用安全启动的 USB 引导

  1. 请先参考安全启动章节以启用和配置安全启动。

  2. 将安全 dtb.imgkernel.imgvbmeta.img 放入 U 盘的根目录。U 盘应为 fat32 格式。

  3. 插入 U 盘。

  4. 输入命令 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
    
  5. 输入命令 fatload usb 0 0x60370000 dtb.imgfatload usb 0 0x60380000 kernel.imgfatload 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)
    
  6. 输入命令 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
    
  7. 输入命令 usb stop 以停用 USB 功能,防止内核的 USB 功能受到影响。

  8. 输入命令 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.imgkernel.imgvbmeta.img 时,不应修改固件 km4_boot_all_en.binkm0_km4_app_en.binrootfs_ubi.img