46 lines
2.3 KiB
Python
46 lines
2.3 KiB
Python
"""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"])
|