feat(factory): add GNSS test and LED status modes
This commit is contained in:
+38
-32
@@ -7,20 +7,21 @@
|
||||
业务按键或业务 NFC 线程。
|
||||
|
||||
产测固件复用 SDK 底层接口、ES8311 配置、DP1312EA 驱动和 Type A 读卡实现。
|
||||
测试结果通过 USB CDC 和调试串口输出。上位机只需解析以 `FT1 ` 开头的行,
|
||||
测试结果通过 DBG UART 输出。上位机只需解析以 `FT1 ` 开头的行,
|
||||
其他 SDK 调试信息可以忽略。
|
||||
|
||||
默认通信参数:
|
||||
|
||||
- USB CDC,115200 8N1;
|
||||
- 同一条协议也通过 `printf` 输出到调试日志;
|
||||
- DBG UART(GPIO29/30),115200 8N1;
|
||||
- 协议与 SDK 调试日志共用 `printf` 输出;
|
||||
- 每条协议消息为一行 UTF-8/ASCII JSON,以 `\r\n` 结束;
|
||||
- 协议前缀固定为 `FT1 `,协议版本为 `1`。
|
||||
- 协议前缀固定为 `FT1 `,协议版本为 `2`。
|
||||
|
||||
## 2. 测试流程
|
||||
|
||||
```text
|
||||
长按电源键开机
|
||||
-> 立即在后台打开 GNSS,持续累计 NMEA、卫星数和定位状态
|
||||
-> 等待音频子系统就绪
|
||||
-> ES8311 ID/初始化,设置所有播放音量为 100%
|
||||
-> 播放开机提示音
|
||||
@@ -31,7 +32,9 @@
|
||||
-> 4G 注册、PDP 激活、获取 IPv4
|
||||
-> 前面全部通过后启用 NFC 测试
|
||||
-> 读取 NTAG213 UID
|
||||
-> 播放“全部测试通过”
|
||||
-> 播放一次 GNSS 测试提示音并读取后台累计结果
|
||||
-> 未达到门槛时保持呼吸灯并持续等待
|
||||
-> GNSS 通过后结束搜索
|
||||
-> 播放关机提示音
|
||||
-> 输出最终报告
|
||||
-> 正常关机
|
||||
@@ -47,29 +50,29 @@
|
||||
| 0 | `BOOT_AUDIO` | 读取 ES8311 ID,初始化外置 Codec,播放 `U:/factory_boot_zh.mp3` | Codec ID 为 `0x83`,文件存在且播放结束 | 15 秒播放超时 |
|
||||
| 1 | `POWER_ADC` | 读取 6 次 VBAT,去掉最大值和最小值后平均 | `3500mV <= 平均值 <= 4200mV` | - |
|
||||
| 2 | `AUDIO_LOOPBACK` | 按住 GPIO84 录音,松开后按原音量回放 | 录音和回放 API 成功且至少有一帧 PCM | 等待按键 60 秒,录音最长 5 秒 |
|
||||
| 3 | `ESIM` | 查询 SIM 状态并读取 ICCID | `READY`,ICCID 为 18-22 位十进制数字 | 30 秒 |
|
||||
| 3 | `ESIM` | 查询 SIM 状态并读取 ICCID | `READY`,且能读到 18-22 位 ICCID | 30 秒 |
|
||||
| 4 | `DATA_CALL` | 等待注册、激活 CID 1 IPv4 PDP | 返回非 `0.0.0.0` 的 IPv4 | 注册等待 120 秒 |
|
||||
| 5 | `NFC` | 检查 DP1312EA 版本并轮询 NTAG213 | 版本 `0x82`,成功读取 UID | 60 秒 |
|
||||
| 6 | `GNSS` | 开机后后台搜索,到节点后循环读取累计值 | `open_ret=0`、`nmea_count>=1`,且 `sat_count>=1` 或 `fix_status>0` | 无限等待直到通过;打开失败时每 2 秒重试 |
|
||||
|
||||
说明:`AUDIO_LOOPBACK` 使用 GPIO84 按键,软件通过仅代表录放数据链路完成。
|
||||
最终声学判断由工人完成。
|
||||
|
||||
GPIO70 蓝色状态灯在普通流程中长亮,Loopback 使用 250ms 慢闪,NFC 使用 100ms
|
||||
快闪,GNSS 使用 PWM1 做约 1.4 秒一轮的呼吸效果。如果 PWM 配置或使能失败,
|
||||
GNSS 会自动降级为两次 80ms 短闪后熄灭 520ms,不影响测试判定。GNSS 未达到
|
||||
基础硬件门槛时不会报失败或退出节点,指示灯持续呼吸;通过后才恢复常亮并进入关机流程。
|
||||
|
||||
## 4. 音频和文件系统接口
|
||||
|
||||
固件只通过以下固定路径访问提示音:
|
||||
|
||||
```text
|
||||
U:/factory_boot_zh.mp3
|
||||
U:/factory_pass_zh.mp3
|
||||
U:/factory_shutdown_zh.mp3
|
||||
```
|
||||
|
||||
文件系统同时预留三段快速节点提示音,供后续接入测试节点时使用:
|
||||
|
||||
```text
|
||||
U:/factory_audio_loopback_zh.mp3
|
||||
U:/factory_nfc_test_zh.mp3
|
||||
U:/factory_gnss_test_zh.mp3
|
||||
U:/factory_shutdown_zh.mp3
|
||||
```
|
||||
|
||||
对应资源源目录为:
|
||||
@@ -79,8 +82,8 @@ audio_prompts/factory_test/customer_fs/
|
||||
```
|
||||
|
||||
资源为 16kHz、单声道、48kbps MP3。代码不会下载提示音,也不会在运行时回退到
|
||||
业务网络资源。缺少开机提示音会返回 `1002`;最终提示音缺失或播放失败会返回
|
||||
`1801`,并禁止自动关机。
|
||||
业务网络资源。节点提示音缺失或播放失败会返回 `1002`/`1003`;关机提示音播放
|
||||
失败会返回 `1801`,并禁止自动关机。本固件没有“全部测试通过”音频。
|
||||
|
||||
本分支不生成、不覆盖 `ql-config/config/EG800AKCN_11LG/customer_fs.bin`。
|
||||
Windows 打包方法见 [factory_test_windows_fs.md](factory_test_windows_fs.md)。
|
||||
@@ -91,7 +94,7 @@ Windows 打包方法见 [factory_test_windows_fs.md](factory_test_windows_fs.md)
|
||||
|
||||
| 字段 | 说明 |
|
||||
|---|---|
|
||||
| `v` | 协议版本,当前为 1 |
|
||||
| `v` | 协议版本,当前为 2 |
|
||||
| `type` | `session_start`、`node_start`、`node_progress`、`node_result`、`session_result` 或 `power_off` |
|
||||
| `seq` | 本次开机内单调递增的消息序号 |
|
||||
| `session` | RTC 有效时使用时间生成,否则为 `BOOT-<uptime>` |
|
||||
@@ -106,6 +109,7 @@ Windows 打包方法见 [factory_test_windows_fs.md](factory_test_windows_fs.md)
|
||||
### 5.2 会话开始
|
||||
|
||||
```text
|
||||
FT1 {"v":2,"type":"session_start","seq":1,"session":"20260923-163010","uptime_ms":2050,"imei":"860123456789012","iccid":"","nfc_uid":"","fw":"FACTORY_TEST_1.1.0","start_time":"2026-09-23T16:30:10"}
|
||||
```
|
||||
|
||||
RTC 无效时 `start_time` 为 `null`。RTC 无效不会导致产测失败;测试耗时始终以
|
||||
@@ -114,40 +118,38 @@ RTC 无效时 `start_time` 为 `null`。RTC 无效不会导致产测失败;测
|
||||
### 5.3 节点开始
|
||||
|
||||
```text
|
||||
FT1 {"v":1,"type":"node_start","seq":2,"session":"20260923-163010","uptime_ms":2100,"imei":"860123456789012","iccid":"","nfc_uid":"","node":1,"name":"POWER_ADC"}
|
||||
FT1 {"v":2,"type":"node_start","seq":2,"session":"20260923-163010","uptime_ms":2100,"imei":"860123456789012","iccid":"","nfc_uid":"","node":1,"name":"POWER_ADC"}
|
||||
```
|
||||
|
||||
### 5.4 ADC 通过
|
||||
|
||||
```text
|
||||
FT1 {"v":1,"type":"node_result","seq":3,"session":"20260923-163010","uptime_ms":2450,"imei":"860123456789012","iccid":"","nfc_uid":"","node":1,"name":"POWER_ADC","result":"PASS","code":0,"elapsed_ms":350,"data":{"voltage_mv":3865,"sample_min_mv":3858,"sample_max_mv":3873,"limit_min_mv":3500,"limit_max_mv":4200}}
|
||||
FT1 {"v":2,"type":"node_result","seq":3,"session":"20260923-163010","uptime_ms":2450,"imei":"860123456789012","iccid":"","nfc_uid":"","node":1,"name":"POWER_ADC","result":"PASS","code":0,"elapsed_ms":350,"data":{"voltage_mv":3865,"sample_min_mv":3858,"sample_max_mv":3873,"limit_min_mv":3500,"limit_max_mv":4200}}
|
||||
```
|
||||
|
||||
### 5.5 NFC 和最终报告
|
||||
### 5.5 数据连接
|
||||
|
||||
```text
|
||||
FT1 {"v":1,"type":"node_result","seq":14,"session":"20260923-163010","uptime_ms":28000,"imei":"860123456789012","iccid":"89860xxxxxxxxxxxxxxx","nfc_uid":"","node":5,"name":"DATA_CALL","result":"PASS","code":0,"elapsed_ms":8200,"data":{"ip":"10.23.45.67","ip_type":"IPv4"}}
|
||||
FT1 {"v":2,"type":"node_result","seq":14,"session":"20260923-163010","uptime_ms":28000,"imei":"860123456789012","iccid":"89860xxxxxxxxxxxxxxx","nfc_uid":"","node":4,"name":"DATA_CALL","result":"PASS","code":0,"elapsed_ms":8200,"data":{"ip":"10.23.45.67","ip_type":"IPv4"}}
|
||||
```
|
||||
|
||||
```text
|
||||
```
|
||||
|
||||
### 5.6 NFC 和最终报告
|
||||
### 5.6 NFC、GNSS 和最终报告
|
||||
|
||||
```text
|
||||
FT1 {"v":1,"type":"node_result","seq":18,"session":"20260923-163010","uptime_ms":34000,"imei":"860123456789012","iccid":"89860xxxxxxxxxxxxxxx","nfc_uid":"04A1B2C3D4E5F6","node":5,"name":"NFC","result":"PASS","code":0,"elapsed_ms":1900,"data":{"chip_version":"0x82","uid":"04A1B2C3D4E5F6"}}
|
||||
FT1 {"v":2,"type":"node_result","seq":18,"session":"20260923-163010","uptime_ms":34000,"imei":"860123456789012","iccid":"89860xxxxxxxxxxxxxxx","nfc_uid":"04A1B2C3D4E5F6","node":5,"name":"NFC","result":"PASS","code":0,"elapsed_ms":1900,"data":{"chip_version":"0x82","uid":"04A1B2C3D4E5F6"}}
|
||||
FT1 {"v":2,"type":"node_result","seq":20,"session":"20260923-163010","uptime_ms":35200,"imei":"860123456789012","iccid":"89860xxxxxxxxxxxxxxx","nfc_uid":"04A1B2C3D4E5F6","node":6,"name":"GNSS","result":"PASS","code":0,"elapsed_ms":950,"data":{"open_ret":0,"nmea_count":65,"sat_count":1,"fix_status":0,"search_ms":35100,"required_nmea_count":1,"required_sat_count":1}}
|
||||
```
|
||||
|
||||
最终报告包含 IMEI、ICCID、NFC UID、失败码、开始时间、总耗时和全部节点状态:
|
||||
|
||||
```text
|
||||
FT1 {"v":1,"type":"session_result","seq":19,"session":"20260923-163010","uptime_ms":40120,"result":"PASS","fail_code":0,"imei":"860123456789012","iccid":"89860xxxxxxxxxxxxxxx","nfc_uid":"04A1B2C3D4E5F6","start_time":"2026-09-23T16:30:10","duration_ms":38070,"nodes":{"BOOT_AUDIO":"PASS","POWER_ADC":"PASS","AUDIO_LOOPBACK":"PASS","ESIM":"PASS","DATA_CALL":"PASS","NFC":"PASS"}}
|
||||
FT1 {"v":2,"type":"session_result","seq":21,"session":"20260923-163010","uptime_ms":40120,"result":"PASS","fail_code":0,"imei":"860123456789012","iccid":"89860xxxxxxxxxxxxxxx","nfc_uid":"04A1B2C3D4E5F6","start_time":"2026-09-23T16:30:10","duration_ms":38070,"nodes":{"BOOT_AUDIO":"PASS","POWER_ADC":"PASS","AUDIO_LOOPBACK":"PASS","ESIM":"PASS","DATA_CALL":"PASS","NFC":"PASS","GNSS":"PASS"}}
|
||||
```
|
||||
|
||||
上位机收到 `power_off` 后应立即落盘本次记录:
|
||||
|
||||
```text
|
||||
FT1 {"v":1,"type":"power_off","seq":20,"session":"20260923-163010","uptime_ms":40150,"imei":"860123456789012","iccid":"89860xxxxxxxxxxxxxxx","nfc_uid":"04A1B2C3D4E5F6","code":0}
|
||||
FT1 {"v":2,"type":"power_off","seq":22,"session":"20260923-163010","uptime_ms":40150,"imei":"860123456789012","iccid":"89860xxxxxxxxxxxxxxx","nfc_uid":"04A1B2C3D4E5F6","code":0}
|
||||
```
|
||||
|
||||
## 6. 失败码
|
||||
@@ -156,8 +158,8 @@ FT1 {"v":1,"type":"power_off","seq":20,"session":"20260923-163010","uptime_ms":4
|
||||
|---:|---|
|
||||
| 0 | 成功 |
|
||||
| 1001 | ES8311 初始化或设备 ID 检查失败 |
|
||||
| 1002 | 开机提示音文件不存在 |
|
||||
| 1003 | 开机提示音播放失败或超时 |
|
||||
| 1002 | 当前节点提示音文件不存在 |
|
||||
| 1003 | 当前节点提示音播放失败或超时 |
|
||||
| 1101 | ADC 初始化或读取失败 |
|
||||
| 1102 | 电压低于 3500mV |
|
||||
| 1103 | 电压高于 4200mV |
|
||||
@@ -167,10 +169,13 @@ FT1 {"v":1,"type":"power_off","seq":20,"session":"20260923-163010","uptime_ms":4
|
||||
| 1204 | 60 秒内未按下 Loopback 按键 |
|
||||
| 1401 | eSIM 未进入 READY |
|
||||
| 1402 | ICCID 读取失败 |
|
||||
| 1403 | ICCID 长度或字符格式错误 |
|
||||
| 1403 | ICCID 长度不在 18-22 位范围内 |
|
||||
| 1501 | 4G 网络注册超时 |
|
||||
| 1502 | IPv4 PDP 激活失败 |
|
||||
| 1503 | 未获取有效 IPv4 地址 |
|
||||
| 1601 | GNSS 打开失败 |
|
||||
| 1602 | GNSS 打开成功但未收到 NMEA |
|
||||
| 1603 | GNSS 已收到 NMEA,但未发现卫星且没有有效定位 |
|
||||
| 1701 | 前置节点未全部通过,NFC 锁定 |
|
||||
| 1702 | DP1312EA 版本寄存器不是 `0x82` |
|
||||
| 1703 | 60 秒内没有成功刷卡 |
|
||||
@@ -182,6 +187,7 @@ FT1 {"v":1,"type":"power_off","seq":20,"session":"20260923-163010","uptime_ms":4
|
||||
|
||||
- `interface/factory_test/factory_test.c`:顺序状态机和具体测试;
|
||||
- `interface/factory_test/factory_audio.c`:ES8311、100% 音量、MP3、录音回放;
|
||||
- `interface/factory_test/factory_gnss.c`:开机后台搜星、NMEA/GSV/GGA 累计;
|
||||
- `interface/factory_test/factory_protocol.c`:FT1 JSON 日志;
|
||||
- `interface/factory_test/factory_test.h`:阈值、超时、业务域名、GPIO 和文件路径;
|
||||
- `interface/factory_test/Makefile`:独立产测编译单元。
|
||||
@@ -193,6 +199,6 @@ ADC 阈值、按键超时和 NFC 超时集中在 `factory_test.h`。GPIO84 是
|
||||
|
||||
1. 确认 PCB 上对话键确实连接模组 PWRKEY,第二按键连接 GPIO84。
|
||||
2. 确认 GPIO68 为 NS4150B `PA_CTL`,GPIO86 为 NFC Reset。
|
||||
3. 将三段 MP3 打入 U 盘文件系统,不能只更新 APP。
|
||||
4. 首板先观察 ES8311 ID、ADC 原始值、IP 和 DP1312EA 版本日志。
|
||||
3. 将五段 MP3 打入 U 盘文件系统,不能只更新 APP。
|
||||
4. 首板先观察 ES8311 ID、ADC 原始值、IP、DP1312EA 版本和 GNSS 累计值。
|
||||
5. 上位机只把 `FT1 ` 行作为协议消息,SDK 的普通 `printf` 不应进入数据库。
|
||||
|
||||
Reference in New Issue
Block a user