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 |
|---|---|---|
|
Boot 内部实现 |
boot_flash.h (HAL 直接访问) |
|
对外 API 实现 |
lisa_flash.h (设备框架) |
|
无存储桩实现 |
— |
|
内存测试实现 |
— |
|
Recovery 持久化 |
boot_flash.h |