From f283223b2387dd1491b4abc5616de142c8977a4f Mon Sep 17 00:00:00 2001 From: chenjintao Date: Tue, 15 Sep 2026 17:03:13 +0800 Subject: [PATCH] Support legacy boards without GNSS --- LEGACY_BOARD.md | 9 ++++ artifacts/legacy-no-gnss/.gitignore | 6 +++ artifacts/legacy-no-gnss/README.md | 52 +++++++++++++++++++ artifacts/legacy-no-gnss/verify_package.py | 45 ++++++++++++++++ .../threadx/interface/custom_app/gnss.c | 11 ++++ ql-config/config/board_features.h | 7 +++ ql-kernel/threadx/gnss/gps_app_core/gps_app.c | 6 +++ 7 files changed, 136 insertions(+) create mode 100644 LEGACY_BOARD.md create mode 100644 artifacts/legacy-no-gnss/.gitignore create mode 100644 artifacts/legacy-no-gnss/README.md create mode 100644 artifacts/legacy-no-gnss/verify_package.py create mode 100644 ql-config/config/board_features.h diff --git a/LEGACY_BOARD.md b/LEGACY_BOARD.md new file mode 100644 index 0000000..b31d6f5 --- /dev/null +++ b/LEGACY_BOARD.md @@ -0,0 +1,9 @@ +# 旧板专用分支:legacy-board + +此分支用于没有 GNSS 芯片的旧板,后续旧板修改在此分支维护。 + +`ql-config/config/board_features.h` 中 `NFC_GNSS_BOARD_HAS_GNSS` 默认为 `0`, +跳过内核 GNSS 型号识别,关闭应用定位任务和定位模式切换。 +切换到此版本时必须重新编译并更新内核和 APP。 + +修改说明、构建步骤和板上验收要求见 [旧板说明](artifacts/legacy-no-gnss/README.md)。 diff --git a/artifacts/legacy-no-gnss/.gitignore b/artifacts/legacy-no-gnss/.gitignore new file mode 100644 index 0000000..32d59b0 --- /dev/null +++ b/artifacts/legacy-no-gnss/.gitignore @@ -0,0 +1,6 @@ +# Local firmware exports, build logs, verification output and build-file backups. +*.zip +*.log +*.disasm.txt +/verification.json +/build-backup/ diff --git a/artifacts/legacy-no-gnss/README.md b/artifacts/legacy-no-gnss/README.md new file mode 100644 index 0000000..b42ad9e --- /dev/null +++ b/artifacts/legacy-no-gnss/README.md @@ -0,0 +1,52 @@ +# 无 GNSS 旧板调试版本 + +本分支名称为 `legacy-board`,用于后续无 GNSS 旧板开发。 +本目录的说明和验证脚本纳入版本控制;烧录包、日志、验证结果及备份仅保留在本地。 + +当前开关位于 `ql-config/config/board_features.h`: + +```c +#define NFC_GNSS_BOARD_HAS_GNSS 0 +``` + +- 内核不创建 `q_gocg` 型号识别任务,避免无定位芯片时触发 `gps_app.c` 的断言复位。 +- `app_gnss_init()` 不创建定位任务,包括联网成功后的调用。 +- `set_gnss_mode()` 忽略定位模式请求,避免无定位任务时无法退出 FAST 模式、阻止休眠。 +- 定位数据保持无效,不伪造坐标或定位成功状态。 + +在 SDK 根目录依次运行: + +```bat +build.bat kernel +build.bat app +build.bat firmware +``` + +必须更新内核和 APP;只烧 APP 无法移除旧内核中的断言。 +烧录输入使用生成目录中的内层 ZIP,不使用包含 DBG 的外层归档。 +`original-EG800AKCN_11LG.zip` 是修改前外层归档的备份。 + +本次已导出可直接交给烧录工具的 `EG800AKCN_11LG-legacy-no-gnss.zip` +(6,519,829 字节)。`EG800AKCN_11LG-legacy-no-gnss-debug.zip` 保存对应调试归档。 +仍沿用 EG800AKCN_11LG 的分区布局和 GNSS 资源文件;本修改关闭定位启动行为, +不是更换模组型号或重做其他硬件的板级适配。 + +验证结果:内核、APP 和打包完成;内层 ZIP 的 CRC 检查通过;包内 `cp.bin` +及 `customer_app.bin` 与本次构建输出逐字节一致;反汇编确认型号识别入口 +和应用定位初始化只输出日志,模式设置函数直接返回。 +详情和 SHA256 见 `verification.json`,构建日志及反汇编保存在同目录。 +本次未烧录设备,尚未完成板上功能验证。 + +重新构建后,将 `target/EG800AKCN_11LG/EG800AKCN_11LG.zip` 复制到本目录, +命名为 `EG800AKCN_11LG-legacy-no-gnss.zip`,在 SDK 根目录执行: + +```bat +ql-cross-tool\win32\owtoolchain\Python\python.exe artifacts\legacy-no-gnss\verify_package.py +``` + +恢复带 GNSS 板时将开关改为 `1`,重新编译内核和 APP 并打包。 +两份构建都必须重新编译对应 GNSS 源文件;检查日志,不要只依赖批处理退出码。 + +板上验收:启动后不再出现 `No model was found for val` / `q_gocg` 断言; +联网后继续运行至少一分钟,并实际检查网络、音频和 NFC 等所需功能。 +构建成功不能代替上述板上验证。 diff --git a/artifacts/legacy-no-gnss/verify_package.py b/artifacts/legacy-no-gnss/verify_package.py new file mode 100644 index 0000000..46096ca --- /dev/null +++ b/artifacts/legacy-no-gnss/verify_package.py @@ -0,0 +1,45 @@ +"""Verify the exported legacy-board package against this SDK build.""" +import hashlib +import json +import re +from pathlib import Path +import subprocess +import zipfile + +output = Path(__file__).resolve().parent +root = output.parent.parent +package = output / "EG800AKCN_11LG-legacy-no-gnss.zip" +objdump = root / "ql-cross-tool/win32/owtoolchain/gcc-arm-none-eabi/bin/arm-none-eabi-objdump.exe" +report = {"package": package.name, "sha256": hashlib.sha256(package.read_bytes()).hexdigest()} +app_symbols = subprocess.check_output( + [str(objdump.with_name("arm-none-eabi-nm.exe")), str(root / "ql-application/threadx/build/app.elf")], text=True +) +printf_address = int(re.search(r"^([0-9a-fA-F]+) T printf$", app_symbols, re.MULTILINE).group(1), 16) +with zipfile.ZipFile(package) as archive: + assert archive.testzip() is None, "ZIP CRC failure" + for entry, source in { + "cp.bin": "ql-kernel/threadx/build/release_kernel.bin", + "customer_app.bin": "ql-application/threadx/build/app.bin", + }.items(): + data = archive.read(entry) + assert data == (root / source).read_bytes(), f"Stale image: {entry}" + report[entry] = {"bytes": len(data), "sha256": hashlib.sha256(data).hexdigest()} + report["download_manifest"] = json.loads(archive.read("download.json")) + +for symbol, binary, required in [ + ("quec_get_gnssid_task", "ql-kernel/threadx/build/kernel.axf", ""), + ("app_gnss_init", "ql-application/threadx/build/app.elf", f"0x{printf_address | 1:08x}"), + ("set_gnss_mode", "ql-application/threadx/build/app.elf", "bx\tlr"), +]: + disassembly = subprocess.check_output( + [str(objdump), "-d", f"--disassemble={symbol}", str(root / binary)], text=True + ) + assert f"<{symbol}>:" in disassembly, f"Missing function: {symbol}" + assert required in disassembly, f"Unexpected function body: {symbol}" + assert "task_create" not in disassembly, f"Task still created: {symbol}" + (output / f"{symbol}.disasm.txt").write_text(disassembly, encoding="utf-8") +report["verification"] = "PASS: ZIP CRC, kernel and APP byte identity, GNSS entry disassembly" +report["hardware_test"] = "Not performed" +(output / "verification.json").write_text(json.dumps(report, indent=2), encoding="utf-8") +print(report["verification"]) +print("SHA256:", report["sha256"]) diff --git a/ql-application/threadx/interface/custom_app/gnss.c b/ql-application/threadx/interface/custom_app/gnss.c index a2e0682..93acf76 100644 --- a/ql-application/threadx/interface/custom_app/gnss.c +++ b/ql-application/threadx/interface/custom_app/gnss.c @@ -15,6 +15,7 @@ #include "sockets.h" #include "netdb.h" #include "app_inc.h" +#include "../../../../ql-config/config/board_features.h" // 新增宏定义(原代码中未定义) #define GNSS_FAST_MODE_HOLD_TIME (5 * 60 * 1000) // FAST模式持续5分钟后切SLOW @@ -320,9 +321,14 @@ void quec_gnss_callback(char *data, int len) *===========================================================================*/ void set_gnss_mode(gnss_mode_t mode) { +#if !NFC_GNSS_BOARD_HAS_GNSS + (void)mode; + return; /* No GNSS task exists to leave FAST mode and allow sleep. */ +#else g_gnss_mode = mode; printf("[GNSSMode] Set to %s Mode\n", (mode == GNSS_MODE_FAST) ? "Fast (30s)" : "Slow (5min)"); +#endif } gnss_mode_t get_gnss_mode(void) @@ -531,6 +537,11 @@ static void quec_gnss_test(void * argv) void app_gnss_init(void) { +#if !NFC_GNSS_BOARD_HAS_GNSS + printf("[GNSS] Legacy board: positioning disabled\n"); + return; +#else ql_task_t gnssTaskRef = NULL; ql_rtos_task_create(&gnssTaskRef, 1024*4, 100, "gnss_Task_Ref", quec_gnss_test, NULL); +#endif } diff --git a/ql-config/config/board_features.h b/ql-config/config/board_features.h new file mode 100644 index 0000000..1b3b312 --- /dev/null +++ b/ql-config/config/board_features.h @@ -0,0 +1,7 @@ +#ifndef NFC_GNSS_BOARD_FEATURES_H +#define NFC_GNSS_BOARD_FEATURES_H + +/* Legacy board has no GNSS. Set to 1 and rebuild kernel + app for GNSS boards. */ +#define NFC_GNSS_BOARD_HAS_GNSS 0 + +#endif diff --git a/ql-kernel/threadx/gnss/gps_app_core/gps_app.c b/ql-kernel/threadx/gnss/gps_app_core/gps_app.c index 79db573..df47b56 100644 --- a/ql-kernel/threadx/gnss/gps_app_core/gps_app.c +++ b/ql-kernel/threadx/gnss/gps_app_core/gps_app.c @@ -4,6 +4,7 @@ ============================================================================*/ #include "gps_app.h" +#include "../../../../ql-config/config/board_features.h" #include #include "gps_debug.h" #include "quec_hx_agps.h" @@ -840,6 +841,10 @@ void quec_get_ocname_by_gnss_task(void * argv) void quec_get_gnssid_task(void) { +#if !NFC_GNSS_BOARD_HAS_GNSS + RTI_LOG("[GNSS] Legacy board: skip GNSS ID detection"); + return; +#else QuecOSStatus err = kNoErr; quec_task_t quec_ocname_get = NULL; err = quec_rtos_task_create(&quec_ocname_get, 2048, QUEC_APP_TASK_PRIORITY,"q_gocg", quec_get_ocname_by_gnss_task, NULL); @@ -849,6 +854,7 @@ void quec_get_gnssid_task(void) RTI_LOG("quec_get_ocname_by_gnss_task create failed!"); } return; +#endif } #endif