fix: rebalance HX GNSS OTA partitions
This commit is contained in:
@@ -8,9 +8,9 @@ OTA 所依赖的底层条件。
|
||||
|
||||
本基线完成:
|
||||
|
||||
- 将 `customer_fs` 从 256 KiB 扩大到 640 KiB;
|
||||
- 保持 `customer_app` 为 460 KiB;
|
||||
- 将 APP 物理/XIP 地址固定为 `0x002C2000` / `0x802C2000`;
|
||||
- 将 HX_GNSS 的 `customer_fs` 从 256 KiB 扩大到 576 KiB;
|
||||
- 将 `customer_app` 从 460 KiB 调整为 384 KiB;
|
||||
- 将 APP 物理/XIP 地址固定为 `0x002E5000` / `0x802E5000`;
|
||||
- 保留 SDK 已有的 `QUEC_APP_FULL_FOTA` 与 FULLOTA2 公共 API;
|
||||
- 将现有 OTA 命令切换为最小本地暂存式 FULLOTA2;
|
||||
- 为设备和构建产物加入唯一布局身份;
|
||||
@@ -34,22 +34,22 @@ OTA 所依赖的底层条件。
|
||||
设备布局身份:
|
||||
|
||||
```text
|
||||
eg800akcn_11lg-fs640-app2c2000
|
||||
eg800akcn_11lg-hxgnss-fs576-app2e5000
|
||||
```
|
||||
|
||||
构建 profile:
|
||||
|
||||
```text
|
||||
ota_ready_fs640
|
||||
ota_ready_hxgnss_fs576
|
||||
```
|
||||
|
||||
4 MiB 内部 Flash 的尾部分区固定如下:
|
||||
|
||||
| 分区 | 起始地址 | 结束地址 | 大小 |
|
||||
| --- | ---: | ---: | ---: |
|
||||
| reserved | `0x00287000` | `0x002C2000` | 236 KiB |
|
||||
| customer_app | `0x002C2000` | `0x00335000` | 460 KiB |
|
||||
| customer_fs | `0x00335000` | `0x003D5000` | 640 KiB |
|
||||
| reserved(按当前镜像估算) | `0x002D0000` | `0x002E5000` | 84 KiB |
|
||||
| customer_app | `0x002E5000` | `0x00345000` | 384 KiB |
|
||||
| customer_fs | `0x00345000` | `0x003D5000` | 576 KiB |
|
||||
| nvm | `0x003D5000` | `0x003F5000` | 128 KiB |
|
||||
| erase_rd | `0x003F5000` | `0x003F7000` | 8 KiB |
|
||||
| fota_param | `0x003F7000` | `0x003FA000` | 12 KiB |
|
||||
@@ -63,36 +63,37 @@ ota_ready_fs640
|
||||
### 3.1 分区和链接地址
|
||||
|
||||
- `CRANELRH_QUEC_FLASH_LAYOUT_SS_04M_HX_GNSS.json`:当前 `CC11XXW_GPS` 构建实际选择的
|
||||
分区表,`customer_fs = 640KiB`;
|
||||
分区表,`customer_app = 384KiB`、`customer_fs = 576KiB`;
|
||||
- `CRANELRH_QUEC_FLASH_LAYOUT_SS_04M_OPEN.json`:同步保持 `customer_fs = 640KiB`,避免
|
||||
无 GNSS variant 回退到旧布局;
|
||||
- `app_linkscript.ld`:ROM 起始地址改为 `0x802C2000`,最大 ROM 大小收紧为 `0x73000`;
|
||||
- `app_linkscript.ld`:ROM 起始地址改为 `0x802E5000`,最大 ROM 大小收紧为 `0x60000`;
|
||||
- `customer_fs.bin`:从原 256 KiB LittleFS 中提取全部 14 个音频文件,以 4096 字节块、
|
||||
160 个块重新生成 640 KiB LittleFS;
|
||||
144 个块重新生成 576 KiB LittleFS;
|
||||
- 新文件系统镜像 SHA-256:
|
||||
`19bd849dbcc6816f6dfffd1e585645a3474a2265f96a926b5dd073f0affb69f9`。
|
||||
`45350804d65fc6ded24caf9b215b71e89f9160d10d4998c5d57d4f4496d6000d`。
|
||||
|
||||
### 3.2 运行身份
|
||||
|
||||
`ota_baseline.h` 固定布局身份、APP/FS 地址和分区大小。应用启动时打印:
|
||||
|
||||
```text
|
||||
[OTA-BASELINE] layout=eg800akcn_11lg-fs640-app2c2000 ... slot=single
|
||||
[OTA-BASELINE] layout=eg800akcn_11lg-hxgnss-fs576-app2e5000 ... slot=single
|
||||
[OTA-BASELINE] U: total=... free=... fota2_reserve=65536
|
||||
```
|
||||
|
||||
该日志用于产线和联调确认设备没有混入旧的 fs256 基线,不改变任何业务状态。
|
||||
该日志用于产线和联调确认设备没有混入旧的 fs256 或错误的 fs640 OPEN 基线,不改变任何业务状态。
|
||||
|
||||
### 3.3 构建保护
|
||||
|
||||
`build_rel.bat` 在构建前运行源码校验,在生成 APP 后运行容量校验。任何一项不满足都会中止:
|
||||
|
||||
- `customer_fs` 必须为 640 KiB;
|
||||
- APP 地址必须为 `0x002C2000`;
|
||||
- LittleFS 必须为 4096 字节块、160 块且镜像哈希一致;
|
||||
- HX_GNSS `customer_fs` 必须为 576 KiB;
|
||||
- APP 必须为 384 KiB,地址必须为 `0x002E5000`;
|
||||
- LittleFS 必须为 4096 字节块、144 块且镜像哈希一致;
|
||||
- 当前 kernel、DSP、RF 和 GNSS 镜像到 APP 之间必须至少保留 64 KiB;
|
||||
- kernel 必须继续定义 `QUEC_APP_FULL_FOTA`;
|
||||
- FULLOTA2 所需的 SDK API 必须存在;
|
||||
- `app.bin + 8192` 不得超过 460 KiB。
|
||||
- `app.bin + 8192` 不得超过 384 KiB。
|
||||
- MQTT OTA 入口必须调用 `banban_fullfota2_start()`,不得回退到
|
||||
`ql_fullfota_app_start()`。
|
||||
|
||||
@@ -101,7 +102,8 @@ ota_ready_fs640
|
||||
```powershell
|
||||
ql-cross-tool\win32\owtoolchain\Python\python.exe tools\verify_ota_ready_baseline.py
|
||||
ql-cross-tool\win32\owtoolchain\Python\python.exe tools\verify_ota_ready_baseline.py `
|
||||
--app-bin ql-application\threadx\build\app.bin
|
||||
--app-bin ql-application\threadx\build\app.bin `
|
||||
--kernel-bin ql-kernel\threadx\build\release_kernel.bin
|
||||
```
|
||||
|
||||
### 3.4 最小 FULLOTA2 执行路径
|
||||
@@ -113,7 +115,7 @@ ql-cross-tool\win32\owtoolchain\Python\python.exe tools\verify_ota_ready_baselin
|
||||
|
||||
1. 删除上一次残留的 `U:/FotaFile.bin`;
|
||||
2. HTTP GET 必须返回 200 和非零 `Content-Length`;
|
||||
3. FBF 必须大于 8 KiB 且不超过 460 KiB;
|
||||
3. FBF 必须大于 8 KiB 且不超过 384 KiB;
|
||||
4. `U:` 空闲空间必须不小于 `Content-Length + 64 KiB`;
|
||||
5. 设置内部 Flash 固定暂存路径,初始化 FOTA context;
|
||||
6. 以 4096 字节缓冲顺序读取并调用 `ql_fota_image_write()`;
|
||||
@@ -125,7 +127,7 @@ ql-cross-tool\win32\owtoolchain\Python\python.exe tools\verify_ota_ready_baselin
|
||||
任一步在设置升级标志前失败,都会关闭 HTTP/FOTA context、删除暂存包、撤销固定升级模式、
|
||||
清除 pending 状态并把 `fota_start` 恢复为 0。旧 APP 未被擦写,可继续运行并接受下一次命令。
|
||||
|
||||
旧实现会在 OTA 前删除服务器管理的提示音。fs640 基线有足够空间后,这版不再主动删除
|
||||
旧实现会在 OTA 前删除服务器管理的提示音。fs576 基线有足够空间后,这版不再主动删除
|
||||
业务资源;若空间不足则明确失败,不通过牺牲业务文件强行升级。
|
||||
|
||||
`http_aofei.c` 中未被当前业务调用的旧 HTTP 轮询 OTA 包装函数原本仍可进入 FULLOTA1,
|
||||
@@ -161,10 +163,11 @@ ASR1605/CRANELRH,但量产包必须由 `EG800AKCN_11LG` 配置生成。
|
||||
### 5.1 静态和产物测试
|
||||
|
||||
1. 运行 `verify_ota_ready_baseline.py`,结果必须通过。
|
||||
2. 解包工厂 ZIP,确认其中 `customer_fs.bin` 为 655360 字节且哈希一致。
|
||||
2. 解包工厂 ZIP,确认其中 `customer_fs.bin` 为 589824 字节且哈希一致。
|
||||
3. 使用 Aboot 工具检查 `partition.bin`,确认 APP/FS 地址与本文件一致。
|
||||
4. 确认 `customer_app.bin + 8192 <= 471040`。
|
||||
5. 确认 FBF 的目标物理地址是 `0x002C2000`,不能是旧地址 `0x00322000`。
|
||||
4. 确认 `customer_app.bin + 8192 <= 393216`。
|
||||
5. 确认 FBF 的目标物理地址是 `0x002E5000`,不能是旧地址 `0x00322000`、
|
||||
也不能是错误基线地址 `0x002C2000`。
|
||||
|
||||
### 5.2 全擦工厂烧录测试
|
||||
|
||||
@@ -172,7 +175,7 @@ ASR1605/CRANELRH,但量产包必须由 `EG800AKCN_11LG` 配置生成。
|
||||
|
||||
1. 下载器无越界、校验或 partition 错误。
|
||||
2. USB 重新枚举,`AT`/`ATI` 正常。
|
||||
3. 串口打印正确 layout、地址和 640 KiB 文件系统容量。
|
||||
3. 串口打印正确 layout、地址和 576 KiB 文件系统容量。
|
||||
4. 14 个预置音频均可读取和播放。
|
||||
5. IMEI、SIM、驻网、数据连接和 GNSS 正常。
|
||||
6. MQTT 注册、命令收发、心跳和状态上报正常。
|
||||
@@ -226,7 +229,7 @@ ASR1605/CRANELRH,但量产包必须由 `EG800AKCN_11LG` 配置生成。
|
||||
```json
|
||||
{
|
||||
"product": "EG800AKCN_11LG",
|
||||
"layout_id": "eg800akcn_11lg-fs640-app2c2000",
|
||||
"layout_id": "eg800akcn_11lg-hxgnss-fs576-app2e5000",
|
||||
"version": "1.9.0",
|
||||
"release_seq": 10900,
|
||||
"min_release_seq": 10800,
|
||||
@@ -262,8 +265,8 @@ ASR1605/CRANELRH,但量产包必须由 `EG800AKCN_11LG` 配置生成。
|
||||
|
||||
## 8. 发布和回退策略
|
||||
|
||||
- 新生产设备只允许使用 fs640 工厂包和 `0x002C2000` APP/FBF。
|
||||
- 禁止向 fs640 设备发布旧地址 `0x00322000` 的 FBF。
|
||||
- 新生产设备只允许使用 HX_GNSS fs576 工厂包和 `0x002E5000` APP/FBF。
|
||||
- 禁止向 fs576 设备发布旧地址 `0x00322000` 或错误地址 `0x002C2000` 的 FBF。
|
||||
- 如生产前验证失败,可回退源码分支和工厂包重新全擦烧录;不得混烧新旧布局制品。
|
||||
- 量产后若只是业务问题,可通过 APP OTA 修复;若分区或 kernel 基线有问题,需要返厂或有线
|
||||
完整烧录,不能假定业务 APP OTA 能安全修改分区表。
|
||||
|
||||
Reference in New Issue
Block a user