2 Commits
Author SHA1 Message Date
chenjintao 4b565958f9 Set default volume to 100 percent on legacy boards 2026-09-15 17:45:53 +08:00
chenjintao f283223b23 Support legacy boards without GNSS 2026-09-15 17:03:13 +08:00
8 changed files with 139 additions and 2 deletions
+9
View File
@@ -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)。
+6
View File
@@ -0,0 +1,6 @@
# Local firmware exports, build logs, verification output and build-file backups.
*.zip
*.log
*.disasm.txt
/verification.json
/build-backup/
+53
View File
@@ -0,0 +1,53 @@
# 无 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 模式、阻止休眠。
- 定位数据保持无效,不伪造坐标或定位成功状态。
- 未保存音量时默认使用 100% 档位;已有保存音量时仍使用保存值。
在 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,833 字节)。`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 等所需功能。
构建成功不能代替上述板上验证。
@@ -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", "<RTI_LOG>"),
("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"])
@@ -414,9 +414,9 @@ uint8_t app_get_volume(void)
printf("get volume:%d, ret:%d\r\n", value, ret);
//ret = read_volume_file(&value, 1);
if(ret<0){
g_cur_volume = 70;
g_cur_volume = 100;
hal_kv_set("volume", &g_cur_volume, 1);
return VOLUME_70;
return VOLUME_100;
}
g_cur_volume = value;
@@ -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
}
+7
View File
@@ -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
@@ -4,6 +4,7 @@
============================================================================*/
#include "gps_app.h"
#include "../../../../ql-config/config/board_features.h"
#include <string.h>
#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