U-Boot 引导加载程序

简介

U-Boot 是 ARCS SDK 的系统级引导加载程序,负责设备启动与应用加载。boot_f 是引导的第一阶段,完成硬件初始化和应用镜像校验后跳转到应用;当检测到 Recovery 请求或需要执行 OTA 升级时,boot_f 进入 boot_s(基于 FreeRTOS 的第二阶段),由 boot_s 完成 ADB Recovery 或 OTA 流程。

功能特性

  • 应用引导:boot_f 校验应用镜像 header,确认有效后直接跳转;校验失败则进入 boot_s recovery

  • OTA 升级:在 boot_s 中执行,基于 TXZ (LZMA2) 压缩的 TAR 包,两遍处理(校验 + 写入),支持从 Flash 或 TF 卡读取 OTA 包

  • ADB Recovery:在 boot_s 中通过 ADB 协议更新 Flash / TF 卡上的固件和资源,支持 TinyUSB / CherryUSB USB 后端,可选 Shell 交互与文件推送/拉取

  • 看门狗:使用 CP 核 WDT,boot_f 阶段可启用看门狗检测启动超时;boot_s 中持续喂狗,超时触发全芯片复位并在下次启动进入 recovery

  • 地址重映射:通过硬件虚地址映射将 APP 分区偏移映射到固定地址空间(Region B)

启动流程

boot_f (第一阶段,Flash XIP)
  ├─ 硬件初始化(时钟、ECLIC、可选 PSRAM)
  ├─ 校验应用镜像 header
  ├─ 检查 recovery 条件(AON 寄存器 + Flash 持久标志)
  │   ├─ 无 recovery 请求 → 跳转到应用
  │   └─ 有 recovery 请求 → 进入 boot_s
  └─ boot_s (FreeRTOS, 需要 CONFIG_BOOT_SECOND_STAGE)
      ├─ recovery 原因为 ADB? → 启动 ADB Runtime(USB 枚举,等待主机连接)
      └─ boot mode 为 OTA? → 加载 OTA 请求,执行 TXZ 升级流程,完成后重启

触发 boot_s 的条件(来自 boot_stage_gate.c):

  • boot_info.req == 1(应用侧软件 recovery 请求)

  • boot_info.boot_wdt != 0(boot 看门狗超时)

  • boot_info.handshake_timeout != 0(AP 看门狗超时)

  • boot_config.recover != 0(Flash 持久化 recovery 标志)

  • boot_info.reserved != 0(OTA 升级挂起)

目录结构

uboot/
├── src/              # 引导核心实现(boot、OTA、ADB、配置存储等)
├── api/              # 对外 API 实现(OTA、Recovery、WDT)
├── include/          # 公共头文件
├── cmake/            # 构建脚本
├── linker/           # 链接脚本
├── tools/            # 分区表生成、OTA 打包等工具脚本
├── test/             # 单元测试与集成测试
├── doc/              # 设计文档(架构、存储布局、OTA 源选择)
├── Kconfig           # 根 Kconfig
├── Kconfig.boot      # 引导阶段专用配置
└── Kconfig.public    # 对应用可见的公共配置

配置选项

通过 menuconfig 配置以下关键选项:

OTA

选项

说明

默认值

CONFIG_BOOT_OTA_PACKAGE

启用 OTA 升级功能(TAR/TXZ 解包写分区,自动启用二阶段)

n

CONFIG_BOOT_OTA_SOURCE_TF

允许从 TF 卡读取 OTA 包

n

CONFIG_BOOT_CONTROL_STORE_FLASH

使用 Flash 存储 OTA 控制信息

n

ADB Recovery

选项

说明

默认值

CONFIG_BOOT_ADB

启用 ADB Recovery(自动启用二阶段)

n

CONFIG_BOOT_ADB_BACKEND_TINYUSB

使用 TinyUSB 作为 USB 后端

y (默认)

CONFIG_BOOT_ADB_BACKEND_CHERRYUSB

使用 CherryUSB 作为 USB 后端

n

CONFIG_BOOT_ADB_SHELL

启用 ADB Shell(依赖 Letter Shell)

n

CONFIG_BOOT_ADB_SYNC

启用 ADB 文件推送/拉取

n

CONFIG_BOOT_ADB_SDMMC_RAW

启用 RAW SDMMC 访问(/RAW/SDRAW/...

n

CONFIG_BOOT_ADB_SDMMC_FS

挂载 TF 卡 FAT 文件系统(默认根 /SD:/adb/

n

看门狗

选项

说明

默认值

CONFIG_BOOT_WDT

启用 boot 阶段看门狗(CP 核 WDT)

n

CONFIG_BOOT_WDT_BEFORE_JUMP

跳转应用前启用看门狗

n

日志

选项

说明

默认值

CONFIG_BOOT_LOG_LEVEL

日志级别(NON/ERR/WRN/INF/DBG)

INF

CONFIG_BOOT_EARLY_LOG

启用 boot_f 阶段早期日志

n

API 参考

以下 API 供应用侧调用,无需构建完整 boot 镜像即可链接。

OTA API (uboot_ota_api.h)

int uboot_ota_start_from_flash(uint32_t offset, uint32_t size);
int uboot_ota_start_from_tf(const char *path);
int uboot_ota_start_from_ota_partition(void);
int uboot_ota_start(const struct uboot_ota_request *req);
int uboot_ota_get_last_failure(uboot_ota_failure_info_t *info);

Recovery API (uboot_recovery_api.h)

int uboot_recovery_request(uboot_recovery_mode_t mode);

Watchdog API (uboot_wdt_api.h)

int uboot_wdt_feed(void);
int uboot_wdt_enable(void);
int uboot_wdt_disable(void);

构建依赖

  • boot_f(始终需要):arcs-hal、libc、libm

  • boot_s(二阶段):+ freertos、heap

  • ADB Sync / TF OTA:+ lsfs、disk

  • ADB Shell:+ letter-shell

  • 日志:+ easylogger

设计文档