Compare commits
2
Commits
fix/ota
...
legacy-board
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4b565958f9 | ||
|
|
f283223b23 |
@@ -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)。
|
||||
@@ -0,0 +1,6 @@
|
||||
# Local firmware exports, build logs, verification output and build-file backups.
|
||||
*.zip
|
||||
*.log
|
||||
*.disasm.txt
|
||||
/verification.json
|
||||
/build-backup/
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user