- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码 - 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等) - 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
6.5 KiB
6.5 KiB
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):IMEIrfa.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.cluatos-soc-2024/project/project.lua(EC718HM 构建排除 audio/i2s)
5.2 依赖的 PLAT API
npi_config.h:npiGetProcessStatusItemValue,npiSetAndSaveProcessStatusItemValue,npiSaveConfigToAPNV2ps_lib_api.h:appGetImeiNumSync,appSetImeiNumSyncluat_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. 风险
soc_mobile_rf_test_input对长 hex 字符串可能有长度限制,需与ATC_ECRFNST_0_STR_MAX_LEN对齐。AT+ECRFNST产线工具对响应时序敏感,需用逻辑分析仪/串口抓包对比 ec7xx-at。- PMU/ChipVer/Band/FACCHK 依赖未公开 PLAT API,当前为占位实现。
mobile.rfTestParam的is_set语义在 Lua/C 边界易出错,业务代码应使用rfa.lua封装。