init: Air780EPM 官方 LuatOS 项目代码基线
- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码 - 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等) - 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
This commit is contained in:
@@ -0,0 +1,169 @@
|
||||
# mobile RF 校准 rfa 重构实施计划
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans
|
||||
>
|
||||
> **Status**: ✅ 已完成 5 阶段 6 commit (2026-06-13, branch: `mobile-rf-test-rewrite`)
|
||||
|
||||
**Goal:** 把 `mobile` 库的 RF 校准功能从 C 端硬编码改为 Thin C / Fat Lua 架构, 沿用 `luat_mobile_rf_test_*` 前缀扩展
|
||||
**Architecture:** Thin C (5 函数) / Fat Lua (新模块 `rfa.*`)
|
||||
**Tech Stack:** C (luat_mobile_*) + Lua 5.3 + xmake + MSVC
|
||||
|
||||
**Worktree:** `D:\github\LuatOS\.worktrees\mobile-rf-test-rewrite` (branch `mobile-rf-test-rewrite`)
|
||||
|
||||
---
|
||||
|
||||
## File Structure
|
||||
|
||||
### New (Create)
|
||||
- `script/libs/rfa.lua` — Lua 端 rfa.* 模块
|
||||
- `testcase/utest/drv/mobile_rfa_basic/metas.json`
|
||||
- `testcase/utest/drv/mobile_rfa_basic/scripts/main.lua`
|
||||
- `testcase/utest/drv/mobile_rfa_basic/scripts/mobile_rfa_test.lua` — 13 case
|
||||
- `tools/rfa_com0com/at_server_main/main.lua`
|
||||
- `tools/rfa_com0com/setup_com0com_pair.ps1`
|
||||
- `tools/rfa_com0com/test_rfa_com0com.py`
|
||||
- `components/mobile/README_rfa.md`
|
||||
- `docs/superpowers/specs/2026-06-13-mobile-rf-test-redesign-design.md`
|
||||
- `docs/superpowers/plans/2026-06-13-mobile-rf-test-redesign.md` (本文件)
|
||||
|
||||
### Modify
|
||||
- `components/mobile/luat_mobile.h` — 改 rf_test_*, 删 rfcal_*, 加 3 个新函数
|
||||
- `components/mobile/luat_lib_mobile.c` — 改 nst_*, 删 rfcal_*, 加 5 个新绑定
|
||||
- `bsp/pc/port/luat_mobile_pc.c` — 改 rf_test_*, 删 rfcal_*, 加 s_rf_test + 3 个新函数
|
||||
- `components/mobile/luat_mobile_airlink_rpc.c` — 改 rf_test_*, 加 4 个新空桩
|
||||
- `oldmodule/Air780E/demo/rf_test/main.lua` — 加 deprecation 注释
|
||||
|
||||
### Delete
|
||||
- `lua/luat/rfcal_at_server.lua`
|
||||
- `testcase/utest/drv/mobile_rfcal_basic/` (整目录)
|
||||
- `tools/rfcal_com0com/` (整目录)
|
||||
- `components/mobile/README_rfcal.md`
|
||||
- `components/utest/mobile/luat_mobile_rfcal_utest.c`
|
||||
|
||||
---
|
||||
|
||||
## Task 1: 实化原有 rf_test_* + 新增 5 个新函数 (不删旧的) ✅
|
||||
|
||||
**Files:** `luat_mobile.h`, `luat_mobile_pc.c`, `luat_mobile_airlink_rpc.c`, `luat_lib_mobile.c`
|
||||
|
||||
**Commit:** `refactor(mobile): realize luat_mobile_rf_test_mode/input; add param/imei/set_rx_cb`
|
||||
|
||||
- [x] **Step 1:** `components/mobile/luat_mobile.h` 末尾追加 5 个新函数声明 + key 宏 + rx_cb 结构
|
||||
- [x] **Step 2:** `bsp/pc/port/luat_mobile_pc.c` 顶部加 `s_rf_test` 静态结构
|
||||
- [x] **Step 3:** `luat_mobile_pc.c` 312-319 行替换空桩为实化实现 (调 s_rf_test)
|
||||
- [x] **Step 4:** `luat_mobile_pc.c` 末尾加 4 个新函数 (set_rx_cb / param / imei_get / imei_set)
|
||||
- [x] **Step 5:** `luat_mobile_airlink_rpc.c` 419-427 改空桩, 加 4 个新空桩 (返 -1)
|
||||
- [x] **Step 6:** `luat_lib_mobile.c` 加 5 个新绑定 (rfTestMode/Input/Param/Imei/ImeiSet) 并注册到 reg_mobile
|
||||
- [x] **Step 7:** 编译 `cd bsp/pc && powershell -Command "& '.\build_windows_32bit_msvc.bat'"`
|
||||
- [x] **Step 8:** 烟雾测试 `mobile_rf_test_smoke` 14/14 全过
|
||||
|
||||
## Task 2: 新增 script/libs/rfa.lua + 新 utest 套件 ✅
|
||||
|
||||
**Files:** `script/libs/rfa.lua`, `testcase/utest/drv/mobile_rfa_basic/`
|
||||
|
||||
**Commit:** `feat(lua): add script/libs/rfa.lua state machine + dispatch`
|
||||
|
||||
- [x] **Step 1:** 新建 `script/libs/rfa.lua` (~200 行, 状态机 7 阶段 + 派发表 + 扩展点)
|
||||
- [x] **Step 2:** 新建 `testcase/utest/drv/mobile_rfa_basic/metas.json`
|
||||
- [x] **Step 3:** 新建 `testcase/utest/drv/mobile_rfa_basic/scripts/main.lua`
|
||||
- [x] **Step 4:** 新建 `testcase/utest/drv/mobile_rfa_basic/scripts/mobile_rfa_test.lua` (4 套件, 13 case)
|
||||
- [x] **Step 5:** 跑测试 `./luatos-lua.exe ../../../../testcase/common/scripts/ ../../../../testcase/utest/drv/mobile_rfa_basic/scripts/ ../../../../script/libs/`
|
||||
- [x] **Step 7:** 验证 `### OVERALL_PASS ### mobile_rfa_basic`
|
||||
|
||||
## Task 3: 迁移 com0com 工具 (双轨运行期) ✅
|
||||
|
||||
**Files:** `tools/rfa_com0com/` (新), `tools/rfcal_com0com/` (保留到阶段 4)
|
||||
|
||||
**Commit:** `feat(com0com): migrate rfcal_com0com → rfa_com0com (双轨运行期)`
|
||||
|
||||
- [x] **Step 1:** `mkdir -p tools/rfa_com0com/at_server_main`
|
||||
- [x] **Step 2:** 复制 `setup_com0com_pair.ps1` 到 `tools/rfa_com0com/`
|
||||
- [x] **Step 3:** 新建 `tools/rfa_com0com/at_server_main/main.lua` (改用 rfa, 内部 mobile.rfTest* 桥, 通过 script/libs 加载)
|
||||
- [x] **Step 4:** 新建 `tools/rfa_com0com/test_rfa_com0com.py` (复制 + 改名 + 注释更新)
|
||||
- [x] **Step 5:** 验证 `tools/rfcal_com0com/` 仍存在 (双轨)
|
||||
|
||||
## Task 4: 删旧代码 (rfcal_* + nst_* + 旧 utest/demos) ✅
|
||||
|
||||
**Files:** 多文件删除
|
||||
|
||||
**Commit:** `refactor(mobile): remove old luat_mobile_rfcal_* and nst_*`
|
||||
|
||||
- [x] **Step 1:** `luat_mobile.h` 删 851-917 整段 (rfcal_* 7 个声明)
|
||||
- [x] **Step 2:** `luat_mobile_pc.c` 删 493-615 整段 (rfcal_* PC 仿真实现)
|
||||
- [x] **Step 3:** `luat_lib_mobile.c` 删 nst_* + rfcal_* + l_mobile_utest 块, reg_mobile 表对应项
|
||||
- [x] **Step 4:** 新建 `components/mobile/README_rfa.md` (替代 README_rfcal.md)
|
||||
- [x] **Step 5:** 删 `lua/luat/rfcal_at_server.lua`
|
||||
- [x] **Step 6:** 删 `components/mobile/README_rfcal.md`
|
||||
- [x] **Step 7:** 删 `components/utest/mobile/luat_mobile_rfcal_utest.c`
|
||||
- [x] **Step 8:** 删 `testcase/utest/drv/mobile_rfcal_basic/` (整目录)
|
||||
- [x] **Step 9:** 删 `tools/rfcal_com0com/` (整目录)
|
||||
- [x] **Step 10:** `oldmodule/Air780E/demo/rf_test/main.lua` 加 deprecation 注释
|
||||
- [x] **Step 11:** `testcase/utest/drv/mobile_rfa_basic/scripts/mobile_rfa_test.lua` 改 nst_aliases 为反向验证
|
||||
- [x] **Step 12:** 编译 + 全测试, 验证 13/13 OVERALL_PASS
|
||||
|
||||
## Task 5: 写 spec/plan 落档 ✅
|
||||
|
||||
**Files:** `docs/superpowers/specs/...`, `docs/superpowers/plans/...`
|
||||
|
||||
**Commit:** `docs(mobile): spec + plan for rfa redesign`
|
||||
|
||||
- [x] **Step 1:** 新建 `docs/superpowers/specs/2026-06-13-mobile-rf-test-redesign-design.md`
|
||||
- [x] **Step 2:** 新建 `docs/superpowers/plans/2026-06-13-mobile-rf-test-redesign.md` (本文件)
|
||||
- [x] **Step 3:** 最终 commit
|
||||
|
||||
---
|
||||
|
||||
## Self-Review
|
||||
|
||||
### Spec coverage 检查表
|
||||
- [x] Context 解释两个根本性错误
|
||||
- [x] Goals 6 项明确
|
||||
- [x] Non-goals 4 项边界
|
||||
- [x] Chosen approach (Thin C / Fat Lua)
|
||||
- [x] Architecture 5 段 (C 接口 / PC 仿真 / Lua API / 状态机 / AT 派发)
|
||||
- [x] Failure modes 6 项
|
||||
- [x] Verification 4 段
|
||||
- [x] Critical files 完整列表 (Modify/Create/Delete)
|
||||
- [x] 风险点 6 项
|
||||
|
||||
### Placeholder scan
|
||||
- [x] 无 TBD / TODO
|
||||
- [x] 无空章节
|
||||
- [x] 无歧义需求
|
||||
|
||||
### Type consistency
|
||||
- [x] 5 个 C 函数签名一致 (mode/input void, 其他 int)
|
||||
- [x] 13 个 utest case 一致引用 mobile.rfTest*
|
||||
- [x] README 表格/代码一致
|
||||
|
||||
### 验证
|
||||
- [x] 13/13 utest OVERALL_PASS
|
||||
- [x] 编译 0 错误 0 警告 (除 C4090 第三方)
|
||||
- [x] smoke test 14/14 (阶段 1, 阶段 4 后已删)
|
||||
- [x] com0com 文件双轨存在 (阶段 3 后, 阶段 4 已删旧)
|
||||
|
||||
### 落地
|
||||
- [x] spec 落到 `docs/superpowers/specs/2026-06-13-mobile-rf-test-redesign-design.md`
|
||||
- [x] plan 落到 `docs/superpowers/plans/2026-06-13-mobile-rf-test-redesign.md`
|
||||
- [x] 5 个 commit 都在 `mobile-rf-test-rewrite` 分支
|
||||
- [x] 主仓 `master` 不动
|
||||
|
||||
---
|
||||
|
||||
## Commit 历史 (已落)
|
||||
|
||||
```
|
||||
1. refactor(mobile): realize luat_mobile_rf_test_mode/input; add param/imei/set_rx_cb
|
||||
2. feat(lua): add script/libs/rfa.lua state machine + dispatch
|
||||
3. feat(com0com): migrate rfcal_com0com → rfa_com0com (双轨运行期)
|
||||
4. refactor(mobile): remove old luat_mobile_rfcal_* and nst_*
|
||||
5. docs(mobile): spec + plan for rfa redesign
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 后续工作 (out of scope)
|
||||
|
||||
1. luatos-soc-2024 单独 PR — 实现真机端 5 个新 `luat_rfa_*` 函数 + 迁移 toupper 到 PLAT 层
|
||||
2. 真机端 com0com 回归 (EC718 模组) — 验证 Lua rfa 在真机 UART 上行为一致
|
||||
3. 产线工具对齐 — `AT+ECRFNST` 私有协议 cmdId 模板按需 `rfa.registerRfnst` 扩展
|
||||
@@ -0,0 +1,171 @@
|
||||
# EC718HM/EC718PM LuatOS AT 射频校准设计规格
|
||||
|
||||
> 日期:2026-06-15
|
||||
> 关联计划:`docs/superpowers/plans/2026-06-15-ec718hm-pm-rfa-at-plan.md`
|
||||
|
||||
---
|
||||
|
||||
## 1. 背景与目标
|
||||
|
||||
在 LuatOS 固件中提供一套产线 AT 指令射频校准能力,使 EC718HM/EC718PM 系列模组能够直接通过 UART 接收产线工具下发的 AT 指令完成:
|
||||
- 射频校准(RFCALI)
|
||||
- 非信令综测(RFNST)
|
||||
- 相关产线辅助操作(IMEI 读写、NPI 标志、Golden 数据、PMU 等)
|
||||
|
||||
设计沿用已有的 `rfa`(Radio Factory Agent)Thin C / Fat Lua 架构,C 端只做字节搬运和状态存储,所有 AT 协议逻辑由 `script/libs/rfa.lua` 完成。
|
||||
|
||||
---
|
||||
|
||||
## 2. 架构
|
||||
|
||||
```
|
||||
产线工具 (UART)
|
||||
|
|
||||
v
|
||||
+-----------------------------+
|
||||
| script/libs/rfa.lua | Fat Lua
|
||||
| - AT 解析 / 响应生成 |
|
||||
| - 7 阶段状态机 |
|
||||
| - ECRFNST 私有协议模板 |
|
||||
| - 扩展 register/registerRfnst|
|
||||
+-----------------------------+
|
||||
| mobile.rfTestMode/Input/Param/Imei/ImeiSet/GmData/GmDataSet
|
||||
v
|
||||
+-----------------------------+
|
||||
| components/mobile/ | Lua-C 绑定
|
||||
| luat_lib_mobile.c |
|
||||
+-----------------------------+
|
||||
| luat_mobile_rf_test_*
|
||||
v
|
||||
+-----------------------------+
|
||||
| luatos-soc-2024/interface/src/ | 真机 C 适配
|
||||
| luat_mobile_ec7xx.c |
|
||||
| - mode/input -> soc_mobile_* |
|
||||
| - param -> npi_config |
|
||||
| - imei -> appGet/SetImeiNumSync |
|
||||
| - gmdata -> luat_fs_* |
|
||||
+-----------------------------+
|
||||
| soc_mobile_* / RfAtNstCmdPreHandle
|
||||
v
|
||||
+-----------------------------+
|
||||
| PLAT 闭源库 / CP / PHY | RF 底层
|
||||
+-----------------------------+
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. C 端接口
|
||||
|
||||
所有函数沿用 `luat_mobile_rf_test_*` 前缀,声明在 `components/mobile/luat_mobile.h`。
|
||||
|
||||
| 函数 | 签名 | 用途 |
|
||||
|------|------|------|
|
||||
| `luat_mobile_rf_test_mode` | `void(uint8_t uart_id, uint8_t on_off)` | 进入/退出 RF 测试模式,绑定 UART |
|
||||
| `luat_mobile_rf_test_input` | `void(char *data, uint32_t data_len)` | 喂入字节;`data=NULL/0` 触发 flush |
|
||||
| `luat_mobile_rf_test_param` | `int(const char *key, int *value, int is_set)` | 读写 NPI / state / 扩展参数 |
|
||||
| `luat_mobile_rf_test_imei_get` | `int(char *out, uint32_t len)` | 读 15 位 IMEI |
|
||||
| `luat_mobile_rf_test_imei_set` | `int(const char *imei)` | 写 15 位 IMEI |
|
||||
| `luat_mobile_rf_test_gmdata_get` | `int(char *out, uint32_t len)` | 读 Golden Unit 数据 |
|
||||
| `luat_mobile_rf_test_gmdata_set` | `int(const char *data, uint32_t len)` | 写 Golden Unit 数据 |
|
||||
| `luat_mobile_rf_test_set_rx_cb` | `int(const luat_mobile_rf_test_rx_cb_t *cb)` | 注册 Rx 回调(PC 仿真用) |
|
||||
|
||||
### 3.1 `luat_mobile_rf_test_param` key 定义
|
||||
|
||||
| key | 读写 | PC 后端 | 真机后端 |
|
||||
|-----|------|---------|----------|
|
||||
| `rfCaliDone` | 读写 | s_rf_test 静态变量 | `NPI_PROCESS_STATUS_ITEM_RFCALI` |
|
||||
| `rfNSTDone` | 读写 | s_rf_test 静态变量 | `NPI_PROCESS_STATUS_ITEM_RFNST` |
|
||||
| `rfCTDone` | 读写 | s_rf_test 静态变量 | `NPI_PROCESS_STATUS_ITEM_RFCT` |
|
||||
| `state` | 读写 | s_rf_test 静态变量 | 本地静态变量 |
|
||||
| `erfMode` | 读写 | s_rf_test 静态变量 | 本地静态变量 |
|
||||
| `pmuEnable` | 读写 | s_rf_test 静态变量 | 占位 0(待 PLAT API) |
|
||||
| `pmuMode` | 读写 | s_rf_test 静态变量 | 占位 0(待 PLAT API) |
|
||||
| `chipVer` | 读 | s_rf_test 静态变量 | 占位 0(待 PLAT API) |
|
||||
| `bandList` | 读 | s_rf_test 静态变量 | 占位 0(待 PLAT API) |
|
||||
| `facChk` | 读 | s_rf_test 静态变量 | 占位 0(待 PLAT API) |
|
||||
| `save` | 写 | no-op | `npiSaveConfigToAPNV2()` |
|
||||
|
||||
---
|
||||
|
||||
## 4. Lua 端 `rfa.lua`
|
||||
|
||||
### 4.1 公共 API
|
||||
|
||||
- `rfa.start(id, baud)` / `rfa.stop()`:UART 绑定
|
||||
- `rfa.dispatch(line)`:纯函数 AT 派发,返回响应字符串
|
||||
- `rfa.feed(chunk)`:流式切行
|
||||
- `rfa.state()` / `rfa.setState(s)` / `rfa.reset()`:状态机
|
||||
- `rfa.npiGet(k)` / `rfa.npiSet(k, v)`:NPI 标志
|
||||
- `rfa.imei()` / `rfa.setImei(s)`:IMEI
|
||||
- `rfa.register(prefix, fn)` / `rfa.registerRfnst(cmdId, fn)`:扩展点
|
||||
|
||||
### 4.2 内建 AT 命令覆盖
|
||||
|
||||
覆盖 `EC CAT1产线校准综测相关AT命令.xlsx` 中的 16 条核心命令:
|
||||
|
||||
| No. | AT Command | 处理说明 |
|
||||
|-----|------------|----------|
|
||||
| 1 | `AT` | 握手 |
|
||||
| 2 | `ATE0`/`ATE1` | 回显开关 |
|
||||
| 3 | `AT+CFUN=0/1/4` | 飞行模式 |
|
||||
| 4 | `AT+CPIN?` | 固定 `+CME ERROR: 303` |
|
||||
| 5 | `AT+CGSN=1` | 读 IMEI |
|
||||
| 6 | `AT+ECPMUCFG` | 经 `mobile.rfTestParam` 读写 pmuEnable/pmuMode |
|
||||
| 7 | `AT+ECRST` | 调用 `mobile.restart()` |
|
||||
| 8 | `AT+ECCGSN=1,<imei>` | 写 IMEI |
|
||||
| 9 | `AT+ECNPICFG` | NPI 标志读写 |
|
||||
| 10 | `AT+ECGMDATA` | 经 `mobile.rfTestGmData/GmDataSet` 读写 |
|
||||
| 11 | `AT+ECCHIPVER?` | 经 `mobile.rfTestParam("chipVer")` |
|
||||
| 12 | `AT+ECRFNST=<hex>` | 私有协议模板响应 |
|
||||
| 13 | `AT+ECBAND=?` | 经 `mobile.rfTestParam("bandList")` |
|
||||
| 14 | `AT+ECICCID` | 经 `mobile.iccid()` |
|
||||
| 15 | `AT+ECFACCHK=1` | 经 `mobile.rfTestParam("facChk")` |
|
||||
|
||||
### 4.3 状态机
|
||||
|
||||
| 阶段 | 值 | 触发 |
|
||||
|------|---|------|
|
||||
| IDLE | 0 | 初始 / reset |
|
||||
| PREP | 1 | `AT+CGSN=1` |
|
||||
| CALIB | 2 | 任意 `AT+ECRFNST=...` |
|
||||
| SELF_CAL | 3 | cmdId `0x0D`/`0x0A` |
|
||||
| WRITE_NV | 4 | `AT+ECNPICFG=rfCaliDone,1` |
|
||||
| NST_TEST | 5 | cmdId `0x51~0x5A` |
|
||||
| DONE | 6 | `AT+ECNPICFG=rfNSTDone,1` |
|
||||
|
||||
---
|
||||
|
||||
## 5. 真机实现细节
|
||||
|
||||
### 5.1 文件
|
||||
- `luatos-soc-2024/interface/src/luat_mobile_ec7xx.c`
|
||||
- `luatos-soc-2024/project/project.lua`(EC718HM 构建排除 audio/i2s)
|
||||
|
||||
### 5.2 依赖的 PLAT API
|
||||
- `npi_config.h`: `npiGetProcessStatusItemValue`, `npiSetAndSaveProcessStatusItemValue`, `npiSaveConfigToAPNV2`
|
||||
- `ps_lib_api.h`: `appGetImeiNumSync`, `appSetImeiNumSync`
|
||||
- `luat_fs.h`: `luat_fs_fopen/fread/fwrite/fclose`
|
||||
|
||||
### 5.3 未实化部分
|
||||
以下命令在真机目前返回占位值,需在 PLAT 侧公开对应 API 后替换:
|
||||
- `AT+ECPMUCFG` 的 PMU 模式设置
|
||||
- `AT+ECCHIPVER?` 的芯片版本读取
|
||||
- `AT+ECBAND=?` 的支持 Band 查询
|
||||
- `AT+ECFACCHK=1` 的 NV 头校验
|
||||
|
||||
---
|
||||
|
||||
## 6. 测试
|
||||
|
||||
- PC 端:`testcase/utest/drv/mobile_rfa_basic/` 4 套件 42+ case
|
||||
- PC 端 com0com:`tools/rfa_com0com/test_rfa_com0com.py`
|
||||
- 真机端:EC718HM/PM 开发板 + 产线工具或串口助手
|
||||
|
||||
---
|
||||
|
||||
## 7. 风险
|
||||
|
||||
1. `soc_mobile_rf_test_input` 对长 hex 字符串可能有长度限制,需与 `ATC_ECRFNST_0_STR_MAX_LEN` 对齐。
|
||||
2. `AT+ECRFNST` 产线工具对响应时序敏感,需用逻辑分析仪/串口抓包对比 ec7xx-at。
|
||||
3. PMU/ChipVer/Band/FACCHK 依赖未公开 PLAT API,当前为占位实现。
|
||||
4. `mobile.rfTestParam` 的 `is_set` 语义在 Lua/C 边界易出错,业务代码应使用 `rfa.lua` 封装。
|
||||
@@ -0,0 +1,302 @@
|
||||
# EC718HM/EC718PM 系列模组 LuatOS AT 射频校准实施计划
|
||||
|
||||
> 基于 LuatOS rfa(Radio Factory Agent)框架,在 EC718HM/EC718PM 系列模组的 LuatOS 固件上实现产线 AT 指令射频校准功能。
|
||||
> 计划日期:2026-06-15
|
||||
|
||||
---
|
||||
|
||||
## 1. 目标与范围
|
||||
|
||||
### 1.1 总体目标
|
||||
在 LuatOS 固件中新增一个基于 rfa.lua 的 AT 服务器,通过指定 UART 接收产线校准/综测工具下发的 AT 指令,调用 mobile.rfTest* 系列 C API 与底层 RF 校准原语交互,最终使 EC718HM/EC718PM 系列模组能够用 LuatOS 固件完成产线射频校准与非信令综测。
|
||||
|
||||
### 1.2 覆盖命令(按 EC CAT1产线校准综测相关AT命令.xlsx)
|
||||
|
||||
| No. | AT Command | 属性 | 处理方式 | 备注 |
|
||||
|-----|------------|------|----------|------|
|
||||
| 1 | AT | 3GPP | rfa.lua 内置派发 | 握手 |
|
||||
| 2 | ATE0/ATE1 | 3GPP | rfa.lua 内置派发 | 回显 |
|
||||
| 3 | AT+CFUN=0 | 3GPP | rfa.lua 内置 + mobile.flymode | 进飞行模式 |
|
||||
| 4 | AT+CPIN? | 3GPP | rfa.lua 内置 | 返回 CME ERROR: 303 |
|
||||
| 5 | AT+CGSN | 3GPP | rfa.lua 内置 + mobile.rfTestImei | 读 IMEI |
|
||||
| 6 | AT+ECPMUCFG | EigenComm | 新增 rfa.lua 处理或 C 层 mobile.rfTestParam 扩展 | PMU 模式 |
|
||||
| 7 | AT+ECRST | EigenComm | 新增 rfa.lua 处理 | 软复位 |
|
||||
| 8 | AT+ECCGSN | EigenComm | 新增 rfa.lua 处理 + mobile.rfTestImeiSet | 写 IMEI/SN |
|
||||
| 9 | AT+ECNPICFG | EigenComm | rfa.lua 内置 + mobile.rfTestParam | 校准/综测标志位 |
|
||||
| 10 | AT+ECGMDATA | EigenComm | 新增 rfa.lua 处理 + C 层扩展 | 金机数据读写 |
|
||||
| 11 | AT+ECCHIPVER? | EigenComm | 新增 rfa.lua 处理或 C 层扩展 | 读芯片版本 |
|
||||
| 12 | AT+ECRFNST | EigenComm | rfa.lua 私有协议派发 + mobile.rfTestInput | 校准/非信令指令 |
|
||||
| 13 | AT+ECBAND=? | EigenComm | 新增 rfa.lua 处理或 C 层扩展 | 查支持 Band |
|
||||
| 14 | AT+ECICCID | EigenComm | 新增 rfa.lua 处理 + mobile.* ICCID 接口 | 读 ICCID |
|
||||
| 15 | AT+ECFACCHK=1 | EigenComm | 新增 rfa.lua 处理 + C 层扩展 | 查 NV 头 |
|
||||
|
||||
注:ECRFNST 的私有协议 cmdId 模板按产线工具需求通过 rfa.registerRfnst() 扩展;rfa.lua 默认输出占位响应。
|
||||
|
||||
### 1.3 不涉及范围(Non-goals)
|
||||
- 不修改 ec7xx-at 现有 AT 固件实现。
|
||||
- 不改动 PLAT 闭源预编译库中的 RfAtNstCmdPreHandle / RfAtTestCmd 内部逻辑。
|
||||
- 不实现 ec7xx-at 中的扩展命令如 AT+ECRFTEST、AT+ECRFSTAT、AT+ECVERSION、AT+ECDIEXY 等(如需后续另开 PR)。
|
||||
- 不替换现有产线工具,只保证 AT 协议层行为一致。
|
||||
|
||||
---
|
||||
|
||||
## 2. 现状分析
|
||||
|
||||
### 2.1 LuatOS 侧(框架已就绪)
|
||||
- script/libs/rfa.lua:已有 7 阶段状态机、内置 AT 派发、扩展点 register / registerRfnst、UART 绑定。
|
||||
- components/mobile/luat_mobile.h:已声明 6 个 luat_mobile_rf_test_* C API。
|
||||
- components/mobile/luat_lib_mobile.c:已绑定 5 个 Lua API(mobile.rfTestMode/Input/Param/Imei/ImeiSet)。
|
||||
- bsp/pc/port/luat_mobile_pc.c:PC 仿真后端完整实现,单元测试 testcase/utest/drv/mobile_rfa_basic/ 13 case 全过。
|
||||
|
||||
### 2.2 luatos-soc-2024 侧(真机后端待补齐)
|
||||
- interface/src/luat_mobile_ec7xx.c 已存在:
|
||||
- luat_mobile_rf_test_input():转发到 soc_mobile_rf_test_input(),并做 toupper()。
|
||||
- luat_mobile_rf_test_mode():转发到 soc_mobile_rf_test_mode()。
|
||||
- 尚未实现:
|
||||
- luat_mobile_rf_test_param():需映射到 npi_config.h 的 NPI 接口。
|
||||
- luat_mobile_rf_test_imei_get():需调用 appGetImeiNumSync()。
|
||||
- luat_mobile_rf_test_imei_set():需调用 appSetImeiNumSync()。
|
||||
- luat_mobile_rf_test_set_rx_cb():按头文件注释,真机无需实现,返回 0 或 -1 即可。
|
||||
|
||||
### 2.3 ec7xx-at 侧(参考实现)
|
||||
- PLAT/middleware/developed/at/atps/src/atec_rf.c:AT+ECRFNST 调用 RfAtNstCmdPreHandle()。
|
||||
- PLAT/middleware/developed/at/atcust/src/atec_product.c:AT+ECNPICFG、AT+ECGMDATA、AT+ECRFSTAT 等。
|
||||
- PLAT/middleware/developed/at/atcust/src/atec_plat_dev.c:AT+ECPMUCFG。
|
||||
- PLAT/middleware/developed/open_am/driver/src/am_service.c:soc_mobile_rf_test_mode/input 的实现入口,在闭源 libcore_airm2m.a 中。
|
||||
- 关键底层头文件:
|
||||
- PLAT/middleware/developed/common/inc/npi_config.h
|
||||
- PLAT/middleware/developed/ecapi/psapi/inc/ps_lib_api.h
|
||||
- PLAT/driver/hal/ec7xx/ap/inc/hal_rfCali.h
|
||||
|
||||
---
|
||||
|
||||
## 3. 架构设计
|
||||
|
||||
### 3.1 分层架构
|
||||
|
||||
```
|
||||
产线工具 (UART)
|
||||
|
|
||||
v
|
||||
+-----------------------------+
|
||||
| script/libs/rfa.lua | <- Fat Lua:AT 解析、状态机、响应生成、扩展钩子
|
||||
| - AT 命令派发 |
|
||||
| - ECRFNST 私有协议模板 |
|
||||
| - 状态机 / NPI / IMEI 管理 |
|
||||
+-----------------------------+
|
||||
| mobile.rfTestMode/Input/Param/Imei/ImeiSet
|
||||
v
|
||||
+-----------------------------+
|
||||
| components/mobile/ | <- Lua<-C 绑定
|
||||
| luat_lib_mobile.c |
|
||||
+-----------------------------+
|
||||
| luat_mobile_rf_test_*
|
||||
v
|
||||
+-----------------------------+
|
||||
| luatos-soc-2024/interface/src/ | <- 真机 C 适配
|
||||
| luat_mobile_ec7xx.c |
|
||||
| - mode/input -> soc_mobile_* |
|
||||
| - param -> npi_config |
|
||||
| - imei -> appGet/SetImeiNumSync |
|
||||
+-----------------------------+
|
||||
| soc_mobile_* / RfAtNstCmdPreHandle
|
||||
v
|
||||
+-----------------------------+
|
||||
| PLAT 闭源库 / CP / PHY | <- RF 底层
|
||||
+-----------------------------+
|
||||
```
|
||||
|
||||
### 3.2 关键设计决策
|
||||
|
||||
1. 沿用 Thin C / Fat Lua:已有 rfa.lua 承担全部 AT 协议逻辑,C 端只做字节透传与 NPI/IMEI 读写,避免在 C 端重复实现 AT 状态机。
|
||||
2. 真机端补齐 4 个 C API:param、imei_get、imei_set、set_rx_cb,其中 set_rx_cb 为无操作桩。
|
||||
3. AT+ECRFNST 透传路径:
|
||||
- rfa.lua 收到 AT+ECRFNST=<hex> 后,对已知 cmdId 模板生成同步响应;
|
||||
- 对未知/需要底层执行的 cmdId,通过 mobile.rfTestInput() 将 hex 字节流转发给 soc_mobile_rf_test_input(),由闭源库处理并异步返回。
|
||||
- 当前 rfa.lua 默认全部生成同步占位响应;若产线工具需要真响应,需按 cmdId 扩展 registerRfnst 回调。
|
||||
4. PMU/Golden/ChipVer/Band/ICCID/FACCHK:
|
||||
- 先尝试在 rfa.lua 中通过现有 mobile.* API(如 mobile.imei()、mobile.flymode())实现;
|
||||
- 缺少的接口优先扩展 mobile.rfTestParam 的 key 集合,由 C 层调用对应 PLAT API;
|
||||
- 若 PLAT 无公开 API,则通过 mobile.rfTestInput() 走 soc_mobile_rf_test_input() 的私有通道。
|
||||
5. EC718HM/EC718PM 共用同一接口文件:luat_mobile_ec7xx.c 不拆分;构建系统按 --chip_target 自动选择 PLAT/libs/ec718pm* 或 ec718hm* 预编译库。
|
||||
|
||||
---
|
||||
|
||||
## 4. 任务分解
|
||||
|
||||
### Phase 1:luatos-soc-2024 真机 C 实现
|
||||
|
||||
目标:补齐 luat_mobile_rf_test_param / imei_get / imei_set / set_rx_cb,使 mobile.rfTest* 在 EC718HM/PM 真机上可用。
|
||||
|
||||
文件:luatos-soc-2024/interface/src/luat_mobile_ec7xx.c
|
||||
|
||||
1. 包含必要头文件:
|
||||
- PLAT/middleware/developed/common/inc/npi_config.h
|
||||
- PLAT/middleware/developed/ecapi/psapi/inc/ps_lib_api.h
|
||||
2. 实现 luat_mobile_rf_test_param(const char *key, int *value, int is_set):
|
||||
- key "rfCaliDone" -> NPI_PROCESS_STATUS_ITEM_RFCALI
|
||||
- key "rfNSTDone" -> NPI_PROCESS_STATUS_ITEM_RFNST
|
||||
- key "rfCTDone" -> NPI_PROCESS_STATUS_ITEM_RFCT
|
||||
- key "state" / "erfMode" -> 本地静态变量(非持久化)
|
||||
- key "save" -> 调用 npiSaveConfigToAPNV2()(确认接口名)
|
||||
- 不支持的 key 返回 -1
|
||||
3. 实现 luat_mobile_rf_test_imei_get(char *out, uint32_t len):
|
||||
- 调用 appGetImeiNumSync(out),确保字符串结束。
|
||||
4. 实现 luat_mobile_rf_test_imei_set(const char *imei):
|
||||
- 校验长度 15,调用 appSetImeiNumSync((char*)imei)。
|
||||
5. 实现 luat_mobile_rf_test_set_rx_cb(...):
|
||||
- 真机无需,直接返回 0。
|
||||
6. 编译验证:
|
||||
cd luatos-soc-2024/project/example_mobile
|
||||
xmake f --chip_target=ec718pm
|
||||
xmake
|
||||
同样对 ec718hm 做一次编译验证。
|
||||
|
||||
### Phase 2:LuatOS rfa.lua 扩展
|
||||
|
||||
目标:支持 Excel 中的 16 条核心产线命令,并保留扩展点。
|
||||
|
||||
文件:LuatOS/script/libs/rfa.lua
|
||||
|
||||
1. 在 _builtin_dispatch 中新增:
|
||||
- AT+ECRST -> 调用 mobile.restart() 或 mobile.rfTestInput 私有通道;返回 OK 后触发复位。
|
||||
- AT+ECCGSN=<type>,<sn/imei> -> 校验类型与长度,调用 mobile.rfTestImeiSet()。
|
||||
- AT+ECGMDATA? -> 返回 Golden Unit 数据(先返回 OK 占位,后续接 Phase 4)。
|
||||
- AT+ECGMDATA=<data> -> 写入 Golden Unit 数据。
|
||||
- AT+ECCHIPVER? -> 返回芯片版本字符串。
|
||||
- AT+ECBAND=? -> 返回支持的 Band 列表。
|
||||
- AT+ECICCID -> 调用 mobile.iccid() 或等效 API。
|
||||
- AT+ECPMUCFG=<enable>[,<mode>] -> 设置 PMU 模式。
|
||||
- AT+ECPMUCFG? -> 查询 PMU 模式。
|
||||
- AT+ECFACCHK=1 -> 返回 NV 头校验结果。
|
||||
2. 对 AT+ECRFNST 处理增强:
|
||||
- 保留默认占位响应;
|
||||
- 增加常见 cmdId(如 0x0D、0x0A、0x51-0x5A)的模板响应;
|
||||
- 提供 rfa.registerRfnst() 让项目级 Lua 代码注入更多模板。
|
||||
3. 添加 rfa.atServerStart(id, baud) 别名(与 rfa.start 等价),便于产线工具文档对齐。
|
||||
|
||||
### Phase 3:LuatOS C 绑定修正(如需要)
|
||||
|
||||
文件:LuatOS/components/mobile/luat_lib_mobile.c
|
||||
|
||||
1. 检查 l_mobile_rf_test_param 的 is_set 参数处理:当前 lua_toboolean(L, 4) 对整数 0 判断为 true,需确认 rfa.lua 已用 nil/false 表示读;如需更健壮,可改为显式判断 lua_isnil/lua_isboolean。
|
||||
2. 检查 LUAT_USE_MOBILE_RFA 宏在目标 BSP(如 bsp/ec7xx)中是否已打开;未打开则添加。
|
||||
|
||||
### Phase 4:Golden / PMU / ChipVer / Band / ICCID / FACCHK 的 C 后端(按需)
|
||||
|
||||
目标:若 rfa.lua 缺少对应 mobile.* API,则通过扩展 mobile.rfTestParam 或新增 C API 实现。
|
||||
|
||||
文件:
|
||||
- LuatOS/components/mobile/luat_mobile.h(仅当新增 API 时)
|
||||
- LuatOS/components/mobile/luat_lib_mobile.c
|
||||
- luatos-soc-2024/interface/src/luat_mobile_ec7xx.c
|
||||
|
||||
1. AT+ECGMDATA:
|
||||
- 方案 A:通过 mobile.rfTestParam 新增 key "gmData"(读写 int 数组或字符串长度受限)。
|
||||
- 方案 B:新增 mobile.rfTestGmData(buf) / mobile.rfTestGmDataSet(buf) 字符串 API。
|
||||
- 推荐方案 B,因为 Golden 数据可能较长。
|
||||
2. AT+ECPMUCFG:
|
||||
- 新增 mobile.rfTestParam key "pmuMode" / "pmuEnable",C 层调用 apmuSetDeepestSleepMode() 或 PMU_SetSleepMode()。
|
||||
3. AT+ECCHIPVER?:
|
||||
- 新增 mobile.rfTestParam key "chipVer",C 层调用现有 chipver API。
|
||||
4. AT+ECBAND=?:
|
||||
- 新增 mobile.rfTestParam key "bandList",C 层返回支持的 Band 位图。
|
||||
5. AT+ECICCID:
|
||||
- 优先复用 mobile.iccid();若不可用,新增 mobile.rfTestIccid()。
|
||||
6. AT+ECFACCHK=1:
|
||||
- 新增 mobile.rfTestParam key "facChk",C 层调用 NV 头校验接口。
|
||||
|
||||
Phase 4 的具体命令可在进入开发后根据产线工具实际交互日志裁剪;本计划按“全部实现”排期。
|
||||
|
||||
### Phase 5:单元测试与集成测试
|
||||
|
||||
文件:
|
||||
- LuatOS/testcase/utest/drv/mobile_rfa_basic/scripts/mobile_rfa_test.lua
|
||||
- LuatOS/tools/rfa_com0com/test_rfa_com0com.py
|
||||
- 新增:testcase/utest/drv/mobile_rfa_basic/scripts/ec718_rfa_test.lua(真机行为 mock)
|
||||
|
||||
1. PC 端单元测试:
|
||||
- 扩展 mobile_rfa_test.lua,覆盖新增命令(ECRST、ECCGSN、ECGMDATA、ECPMUCFG、ECBAND、ECICCID、ECFACCHK、ECCHIPVER)。
|
||||
- 验证状态机推进、IMEI 读写、NPI 保存。
|
||||
2. PC 端 com0com 回归:
|
||||
- 扩展 test_rfa_com0com.py,覆盖 Excel 中的核心命令。
|
||||
3. 真机测试:
|
||||
- 在 EC718HM/PM 开发板上烧录 LuatOS 固件。
|
||||
- 使用 USB/UART 连接产线工具或串口助手,验证:
|
||||
- 握手与回显
|
||||
- CFUN=0 进入飞行模式
|
||||
- CGSN 读 IMEI
|
||||
- ECCGSN 写 IMEI
|
||||
- ECGMDATA 读写
|
||||
- ECRFNST 私有协议响应
|
||||
- ECNPICFG 标志位读写与掉电保持
|
||||
- ECRST 复位
|
||||
4. 产线工具对齐:
|
||||
- 用实际产线工具跑一遍校准/综测流程,对比 ec7xx-at 输出行为差异并修复。
|
||||
|
||||
### Phase 6:文档与落档
|
||||
|
||||
文件:
|
||||
- LuatOS/components/mobile/README_rfa.md(更新,补充 EC718HM/PM 真机适配说明)
|
||||
- LuatOS/docs/superpowers/specs/2026-06-15-ec718hm-pm-rfa-at-design.md(新增设计规格)
|
||||
- LuatOS/docs/superpowers/plans/2026-06-15-ec718hm-pm-rfa-at-plan.md(本计划落档)
|
||||
- LuatOS/docs/rfa/ 下同步 mirror
|
||||
|
||||
---
|
||||
|
||||
## 5. 时间线与里程碑
|
||||
|
||||
| 阶段 | 内容 | 预期输出 | 验收标准 |
|
||||
|------|------|----------|----------|
|
||||
| W1 | Phase 1:C 后端补齐 | PR 到 luatos-soc-2024 | ec718pm / ec718hm 编译通过;mobile.rfTestParam/Imei 真机可用 |
|
||||
| W1-W2 | Phase 2:rfa.lua 扩展 | PR 到 LuatOS | PC 端 13+ 新增 case 全过 |
|
||||
| W2 | Phase 3:C 绑定修正 | PR 到 LuatOS | 绑定参数行为与 rfa.lua 一致 |
|
||||
| W2-W3 | Phase 4:扩展命令 C 后端 | PR 到 luatos-soc-2024 + LuatOS | 所有 Excel 命令在 PC/真机有响应 |
|
||||
| W3 | Phase 5:测试与真机验证 | 测试报告 | com0com 回归通过;真机校准流程跑通 |
|
||||
| W3-W4 | Phase 6:文档与落档 | 文档 PR | README + spec + plan 合并 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 风险与应对
|
||||
|
||||
| 风险 | 影响 | 应对 |
|
||||
|------|------|------|
|
||||
| npi_config.h / appGetImeiNumSync 在 ec718hm 与 ec718pm 上行为不一致 | 中 | 在两个目标上分别编译并真机验证;若 API 有差异,用宏隔离 |
|
||||
| soc_mobile_rf_test_input 对长 hex 字符串(>8000 字符)有长度限制 | 中 | 与 ec7xx-at 中 ATC_ECRFNST_0_STR_MAX_LEN 对齐;超长时分片或报错 |
|
||||
| AT+ECGMDATA 需要文件系统(LittleFS)支持,LuatOS 真机文件路径不同 | 中 | 复用 LuatOS io/fs API 而非直接写 /rfTestFile;PC 端用内存缓冲 |
|
||||
| 产线工具对 AT+ECRFNST 响应时序敏感 | 高 | 使用逻辑分析仪/串口抓包对比 ec7xx-at 与 LuatOS 输出;必要时调整 rfa.lua 响应延迟 |
|
||||
| mobile.rfTestParam 的 is_set 参数语义在 Lua/C 边界易出错 | 中 | 在 luat_lib_mobile.c 中显式判断 lua_isboolean 或 lua_isnil,拒绝整数 0/1 |
|
||||
| 部分命令(ECCHIPVER、ECFACCHK、ECPMUCFG)可能依赖未公开的 PLAT API | 高 | 先在 ec7xx-at 中确认这些命令的底层调用;若无法直接调用,通过 soc_mobile_rf_test_input 私有通道透传 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 验证清单
|
||||
|
||||
- [ ] ec718pm 目标 xmake 0 错误 0 警告。
|
||||
- [ ] ec718hm 目标 xmake 0 错误 0 警告。
|
||||
- [ ] PC 端 mobile_rfa_basic utest OVERALL_PASS。
|
||||
- [ ] PC 端 com0com 回归覆盖 Excel 16 条命令。
|
||||
- [ ] 真机 AT+CGSN=1 返回正确 IMEI。
|
||||
- [ ] 真机 AT+ECCGSN=1,<imei> 写入并持久化 IMEI。
|
||||
- [ ] 真机 AT+ECNPICFG? 与 AT+ECNPICFG=rfCaliDone,1 读写正常,掉电保持。
|
||||
- [ ] 真机 AT+ECRFNST=<hex> 与产线工具交互无 ERROR/CRCERROR。
|
||||
- [ ] 真机校准/综测流程与 ec7xx-at 行为一致。
|
||||
|
||||
---
|
||||
|
||||
## 8. 仓库与分支建议
|
||||
|
||||
| 仓库 | 分支 | 说明 |
|
||||
|------|------|------|
|
||||
| LuatOS | feature/ec718-rfa-at | rfa.lua 扩展、C 绑定修正、测试与文档 |
|
||||
| luatos-soc-2024 | feature/ec718-rfa-cbackend | 真机 C 后端实现 |
|
||||
| ec7xx-at | 不修改 | 仅作为参考实现和对比基准 |
|
||||
|
||||
---
|
||||
|
||||
## 9. 后续可扩展
|
||||
|
||||
1. 支持 AT+ECRFTEST 等 ec7xx-at 扩展命令。
|
||||
2. 将 rfa.lua 状态机与 LuatOS fdb/kv 持久化对接,替代本地静态变量。
|
||||
3. 多 UART 同时校准(多 DUT 并行)支持。
|
||||
4. 与产线 MES 系统对接,上传校准结果。
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user