9.6 KiB
班班硬件独立产测程序
1. 目标和边界
本分支提供独立于主业务程序的硬件产测固件。ql-application/threadx/Makefile
只编译 interface/factory_test,不会启动原 custom_app、MQTT、WSS、FOTA、
业务按键或业务 NFC 线程。
产测固件复用 SDK 底层接口、ES8311 配置、DP1312EA 驱动和 Type A 读卡实现。
测试结果通过 USB CDC 和调试串口输出。上位机只需解析以 FT1 开头的行,
其他 SDK 调试信息可以忽略。
默认通信参数:
- USB CDC,115200 8N1;
- 同一条协议也通过
printf输出到调试日志; - 每条协议消息为一行 UTF-8/ASCII JSON,以
\r\n结束; - 协议前缀固定为
FT1,协议版本为1。
2. 测试流程
长按电源键开机
-> 等待音频子系统就绪
-> ES8311 ID/初始化,设置所有播放音量为 100%
-> 播放开机提示音
-> 电源 ADC
-> 按住对话键录音,松开后回放,最多录 5 秒
-> 工人判断音质
正常:按另一个按键三次
异常:不再操作,60 秒后 KEY_TRIPLE 失败
-> eSIM READY 和 ICCID
-> 4G 注册、PDP 激活、获取 IPv4
-> Ping 业务域名
-> 前面全部通过后启用 NFC 测试
-> 读取 NTAG213 UID
-> 播放“全部测试通过”
-> 播放关机提示音
-> 输出最终报告
-> 正常关机
任何节点失败后立即输出 node_result=FAIL 和 session_result=FAIL,随后停留在
当前失败状态,不继续后续测试、不开放 NFC、也不自动关机。重新测试需要重新开机。
3. 节点定义
| ID | 名称 | 测试方法 | 通过条件 | 超时 |
|---|---|---|---|---|
| 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 |
按住电源/对话键录音,松开后按原音量回放 | 录音和回放 API 成功且至少有一帧 PCM | 等待按键 60 秒,录音最长 5 秒 |
| 3 | KEY_TRIPLE |
GPIO84 按下并释放三次,每次输出进度 PASS | 60 秒内累计三次有效按键 | 60 秒 |
| 4 | ESIM |
查询 SIM 状态并读取 ICCID | READY,ICCID 为 18-22 位十进制数字 |
30 秒 |
| 5 | DATA_CALL |
等待注册、激活 CID 1 IPv4 PDP | 返回非 0.0.0.0 的 IPv4 |
注册等待 120 秒 |
| 6 | PING |
Ping banban.api.talkingq.com 3 次 |
至少收到 2 次回复 | 单包 4 秒,总等待 20 秒 |
| 7 | NFC |
检查 DP1312EA 版本并轮询 NTAG213 | 版本 0x82,成功读取 UID |
60 秒 |
说明:AUDIO_LOOPBACK 的软件通过仅代表数据链路完成。最终声学判断由工人完成;
如果声音异常,工人不按三击键,随后 KEY_TRIPLE 超时,整机产测失败。这避免了
上位机额外的人工确认按钮。
4. 音频和文件系统接口
固件只通过以下固定路径访问提示音:
U:/factory_boot_zh.mp3
U:/factory_pass_zh.mp3
U:/factory_shutdown_zh.mp3
对应资源源目录为:
audio_prompts/factory_test/customer_fs/
资源为 16kHz、单声道、48kbps MP3。代码不会下载提示音,也不会在运行时回退到
业务网络资源。缺少开机提示音会返回 1002;最终提示音缺失或播放失败会返回
1801,并禁止自动关机。
本分支不生成、不覆盖 ql-config/config/EG800AKCN_11LG/customer_fs.bin。
Windows 打包方法见 factory_test_windows_fs.md。
5. 上位机协议
5.1 公共字段
| 字段 | 说明 |
|---|---|
v |
协议版本,当前为 1 |
type |
session_start、node_start、node_progress、node_result、session_result 或 power_off |
seq |
本次开机内单调递增的消息序号 |
session |
RTC 有效时使用时间生成,否则为 BOOT-<uptime> |
uptime_ms |
开机后的毫秒数,不依赖网络校时 |
imei |
模组 IMEI;读取失败时为空字符串 |
iccid |
eSIM 节点通过后填写,此前为空字符串 |
nfc_uid |
NFC 节点通过后填写,此前为空字符串 |
code / fail_code |
0 表示成功,非零值见失败码表 |
elapsed_ms |
单个节点耗时 |
duration_ms |
整次产测耗时 |
5.2 会话开始
FT1 {"v":1,"type":"session_start","seq":1,"session":"20260923-163010","uptime_ms":2050,"imei":"860123456789012","iccid":"","nfc_uid":"","fw":"FACTORY_TEST_1.0.0","ping_host":"banban.api.talkingq.com","start_time":"2026-09-23T16:30:10"}
RTC 无效时 start_time 为 null。RTC 无效不会导致产测失败;测试耗时始终以
uptime_ms 为准。
5.3 节点开始
FT1 {"v":1,"type":"node_start","seq":2,"session":"20260923-163010","uptime_ms":2100,"imei":"860123456789012","iccid":"","nfc_uid":"","node":1,"name":"POWER_ADC"}
5.4 ADC 通过
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}}
5.5 三击按键进度
每次完整按下并释放都输出一条 node_progress:
FT1 {"v":1,"type":"node_progress","seq":8,"session":"20260923-163010","uptime_ms":12300,"imei":"860123456789012","iccid":"","nfc_uid":"","node":3,"name":"KEY_TRIPLE","result":"PASS","data":{"current":1,"required":3}}
第三次松开后再输出正式的 node_result=PASS。
5.6 网络和 Ping
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":1,"type":"node_result","seq":16,"session":"20260923-163010","uptime_ms":31500,"imei":"860123456789012","iccid":"89860xxxxxxxxxxxxxxx","nfc_uid":"","node":6,"name":"PING","result":"PASS","code":0,"elapsed_ms":3400,"data":{"host":"banban.api.talkingq.com","sent":3,"received":3,"lost":0,"avg_rtt_ms":86}}
5.7 NFC 和最终报告
FT1 {"v":1,"type":"node_result","seq":18,"session":"20260923-163010","uptime_ms":34000,"imei":"860123456789012","iccid":"89860xxxxxxxxxxxxxxx","nfc_uid":"04A1B2C3D4E5F6","node":7,"name":"NFC","result":"PASS","code":0,"elapsed_ms":1900,"data":{"chip_version":"0x82","uid":"04A1B2C3D4E5F6"}}
最终报告包含 IMEI、ICCID、NFC UID、失败码、开始时间、总耗时和全部节点状态:
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","KEY_TRIPLE":"PASS","ESIM":"PASS","DATA_CALL":"PASS","PING":"PASS","NFC":"PASS"}}
上位机收到 power_off 后应立即落盘本次记录:
FT1 {"v":1,"type":"power_off","seq":20,"session":"20260923-163010","uptime_ms":40150,"imei":"860123456789012","iccid":"89860xxxxxxxxxxxxxxx","nfc_uid":"04A1B2C3D4E5F6","code":0}
6. 失败码
| 失败码 | 含义 |
|---|---|
| 0 | 成功 |
| 1001 | ES8311 初始化或设备 ID 检查失败 |
| 1002 | 开机提示音文件不存在 |
| 1003 | 开机提示音播放失败或超时 |
| 1101 | ADC 初始化或读取失败 |
| 1102 | 电压低于 3500mV |
| 1103 | 电压高于 4200mV |
| 1201 | 录音句柄或 160KB 缓冲区创建失败 |
| 1202 | 没有录到一帧有效 PCM |
| 1203 | PCM 回放失败 |
| 1204 | 60 秒内未按下对话键 |
| 1301 | 音质异常未继续,或 60 秒内未完成三击 |
| 1401 | eSIM 未进入 READY |
| 1402 | ICCID 读取失败 |
| 1403 | ICCID 长度或字符格式错误 |
| 1501 | 4G 网络注册超时 |
| 1502 | IPv4 PDP 激活失败 |
| 1503 | 未获取有效 IPv4 地址 |
| 1601 | Ping 上下文或同步对象创建失败 |
| 1602 | Ping 启动或等待回调失败 |
| 1603 | 3 包中收到少于 2 包 |
| 1701 | 前置节点未全部通过,NFC 锁定 |
| 1702 | DP1312EA 版本寄存器不是 0x82 |
| 1703 | 60 秒内没有成功刷卡 |
| 1704 | NFC UID 无效(预留) |
| 1801 | 最终通过/关机提示音播放失败 |
| 1802 | 正常关机接口返回(理论上不应返回) |
7. 代码位置和可调参数
interface/factory_test/factory_test.c:顺序状态机和具体测试;interface/factory_test/factory_audio.c:ES8311、100% 音量、MP3、录音回放;interface/factory_test/factory_protocol.c:FT1 JSON 日志;interface/factory_test/factory_test.h:阈值、超时、业务域名、GPIO 和文件路径;interface/factory_test/Makefile:独立产测编译单元。
修改 Ping 地址时只需修改 FT_PING_HOST。ADC 阈值、按键超时和 NFC 超时也集中在
factory_test.h。GPIO84 是第二个按键,GPIO68 是功放控制;产测代码不会把 GPIO68
当作 LED,也不会把 GPIO86 当作红色 LED,避免和 NFC 复位冲突。
8. 上板前检查
- 确认 PCB 上对话键确实连接模组 PWRKEY,第二按键连接 GPIO84。
- 确认 GPIO68 为 NS4150B
PA_CTL,GPIO86 为 NFC Reset。 - 将三段 MP3 打入 U 盘文件系统,不能只更新 APP。
- 首板先观察 ES8311 ID、ADC 原始值、IP 和 DP1312EA 版本日志。
- 上位机只把
FT1行作为协议消息,SDK 的普通printf不应进入数据库。