Boot 存储布局

概述

Boot 使用混合存储策略:寄存器用于快速访问的易失性状态,Flash 用于需要持久化的数据。

两块独立的存储区域:

  • 寄存器: REG_AON_DIG_RSVD4 (32-bit) — 启动模式、Recovery 请求等

  • Flash boot_config: 0x3003d000 (4KB) — Recovery 硬件模式持久化

  • Flash boot_control_store: CONFIG_BOOT_CONTROL_STORE_BASE_ADDR (4KB) — OTA 请求参数


寄存器布局 (REG_AON_DIG_RSVD4)

32-bit AON (Always-On) 寄存器,软件复位后保持,掉电丢失。

Bit  31  30  29  28 ················ 16  15 ········ 8  7 ········· 0
    ┌───┬───┬───┬───────────────────────┬─────────────┬──────────────┐
    │req│wdt│hst│     reserved (13)     │recover_rsn  │  reboot_cnt  │
    │   │   │   │                       │   (8-bit)   │   (8-bit)    │
    └─┬─┴─┬─┴─┬─┴──────────┬───────────┴─────────────┴──────────────┘
      │   │   │             │
      │   │   │   reserved 13-bit 子字段:
      │   │   │   ┌─────────────────────────────────────────────┐
      │   │   │   │ [0]    boot_mode       (1-bit)              │
      │   │   │   │        0 = BOOT_MODE_NORMAL                 │
      │   │   │   │        1 = BOOT_MODE_UPDATE                 │
      │   │   │   │ [1:4]  upgrade_status  (4-bit)              │
      │   │   │   │        0 = NONE                             │
      │   │   │   │        1 = IN_PROGRESS                      │
      │   │   │   │        2 = SUCCESS                          │
      │   │   │   │        3 = FAILED                           │
      │   │   │   │ [5:12] reserved        (8-bit, 未来扩展)    │
      │   │   │   └─────────────────────────────────────────────┘
      │   │   │
      │   │   └── [29] handshake_timeout  — Boot 握手超时标志
      │   └────── [30] boot_wdt           — Boot 看门狗标志
      └────────── [31] req                — Recovery 软件请求 (1=请求进入)

字段说明

字段

位域

写入方

读取方

用途

reboot_cnt

[7:0]

Boot

Boot

重启计数

recover_reason

[15:8]

Boot

Boot/App

Recovery 原因枚举

boot_mode

reserved[0]

App

Boot

OTA 启动模式

upgrade_status

reserved[4:1]

App/Boot

App/Boot

OTA 升级状态跟踪

handshake_timeout

[29]

Boot

Boot

AP/CP 握手超时

boot_wdt

[30]

Boot

Boot

看门狗超时标志

req

[31]

App

Boot

Recovery 软件请求

recover_reason 枚举

enum {
    RECOVER_REASON_NONE = 0,
    RECOVER_REASON_SOFT_REQ,        // 软件请求
    RECOVER_REASON_HARD_REQ,        // 硬件请求 (Flash 持久化)
    RECOVER_REASON_APP_INVALID,     // APP 镜像无效
    RECOVER_REASON_AP_WDT_TIMEOUT,  // AP 看门狗超时
    RECOVER_REASON_BOOT_WDT_TIMEOUT,// Boot 看门狗超时
};

Flash 布局

boot_config (0x3003d000, 4KB)

Recovery 硬件模式的持久化存储,由 boot_config.c 管理。

0x3003d000 ┌──────────────────────────────────────┐
           │ boot_config                          │
           │   tag      (4B)  — 配置标识          │
           │   version  (4B)  — 版本号            │
           │   size     (4B)  — 数据长度          │
           │   sum      (4B)  — 校验和            │
           │   recover  (1B)  — Recovery 标志     │
           │   ...                                │
0x3003dfff └──────────────────────────────────────┘

boot_control_store (CONFIG_BOOT_CONTROL_STORE_BASE_ADDR, 4KB)

OTA 请求参数的持久化存储,由 boot_control_store_flash.c / boot_control_store_lisa_flash.c 管理。

默认地址: Kconfig CONFIG_BOOT_CONTROL_STORE_BASE_ADDR (示例值 0x30700000)

+0x0000 ┌──────────────────────────────────────┐
        │ magic       (4B)  = 0x42435453       │ "BCTS"
        │ version     (4B)  = 1                │
        ├──────────────────────────────────────┤
        │ ota_request (144B)                   │
        │   magic     (4B)  = 0x5154414F       │ "OTAQ"
        │   version   (4B)  = 1                │
        │   source    (4B)  FLASH(0) / TF(1)   │
        │   pkg_size  (4B)  OTA 包大小          │
        │   union     (128B)                   │
        │     flash_offset (4B)  ← Flash OTA   │
        │     path[128]         ← TF 卡 OTA    │
        ├──────────────────────────────────────┤
        │ crc32       (4B)  数据完整性校验       │
        ├──────────────────────────────────────┤
        │ reserved    (3940B) 未来扩展          │
+0x0FFF └──────────────────────────────────────┘

校验机制

  • magic: 0x42435453 (“BCTS”),用于判断 Flash 是否已初始化

  • version: 1,用于未来格式升级时的兼容判断

  • crc32: 覆盖 magic + version + ota_request,检测数据损坏

  • Flash 全擦后为 0xFF,magic 校验失败,自动 fallback 到 BOOT_MODE_NORMAL


功能-存储对照表

功能

存储位置

大小

持久化

说明

OTA 启动模式

寄存器 reserved[0]

1-bit

Boot 快速判断是否需要 OTA

OTA 升级状态

寄存器 reserved[1:4]

4-bit

跟踪升级进度

OTA 请求参数

Flash boot_control_store

4KB

包来源、地址、大小

Recovery 软件请求

寄存器 req

1-bit

临时进入,重启后自动清除

Recovery 硬件请求

Flash boot_config

4KB

持久保存,需手动退出


Boot 启动时的读取顺序

1. 读寄存器 REG_AON_DIG_RSVD4
   ├── req == 1 ?  ──────────→ 进入 Recovery (软件模式)
   └── boot_mode == UPDATE ? ─→ 读 Flash boot_control_store
                                  ├── magic/crc 有效 → 执行 OTA 升级
                                  └── 无效 → 降级为 NORMAL

2. 读 Flash boot_config
   └── recover == true ? ─────→ 进入 Recovery (硬件模式)

3. 以上都不满足 → BOOT_MODE_NORMAL,跳转到 APP

实现文件

文件

作用

Flash API

src/boot_control_store_flash.c

Boot 内部实现

boot_flash.h (HAL 直接访问)

api/boot_control_store_lisa_flash.c

对外 API 实现

lisa_flash.h (设备框架)

src/boot_control_store_none.c

无存储桩实现

src/boot_control_store_test.c

内存测试实现

src/boot_config.c

Recovery 持久化

boot_flash.h