63 lines
2.7 KiB
Python
63 lines
2.7 KiB
Python
"""Independent byte-level verification of gd32e230_firmware_tool.py outputs.
|
|
|
|
Layout (GD32E230F8, 64KB):
|
|
0x08000000 Bootloader (8KB region)
|
|
0x08002000 APP (max 54KB = 55296B)
|
|
0x0800F800 Calibration page (1KB, must stay 0xFF)
|
|
0x0800FC00 Flag page (1KB); flag word 0x0000EEEE at 0x0800FFFC
|
|
0x08010000 Flash end
|
|
"""
|
|
import hashlib
|
|
import struct
|
|
import sys
|
|
|
|
ok = True
|
|
|
|
|
|
def check(cond, label):
|
|
global ok
|
|
print(('PASS ' if cond else 'FAIL ') + label)
|
|
if not cond:
|
|
ok = False
|
|
|
|
|
|
bl_img = open('LDC1612_V1.0.1_APP_2026-09-26_BL.bin', 'rb').read()
|
|
upd = open('LDC1612_V1.0.1_APP_2026-09-26_update.bin', 'rb').read()
|
|
boot = open('gd32e230f8_bootloader_hulk.bin', 'rb').read()
|
|
app = open(r'E:\Hulk-Coding\ldc1612_cmake_vscode\Build\codex-bootloader-test'
|
|
r'\LDC1612_V1.0.1_APP_2026-09-26.bin', 'rb').read()
|
|
|
|
print('=== sizes / SHA-256 ===')
|
|
for name, blob in [('BL image', bl_img), ('OTA update', upd),
|
|
('bootloader', boot), ('APP bin', app)]:
|
|
print('%-11s %6dB %s' % (name, len(blob), hashlib.sha256(blob).hexdigest()))
|
|
|
|
print('=== BL image (full-chip) ===')
|
|
check(len(bl_img) == 65536, 'BL image total length == 64KB (65536B)')
|
|
check(bl_img[0:len(boot)] == boot, 'offset 0x0000: bootloader image (3512B) matches source bin')
|
|
check(all(b == 0xFF for b in bl_img[len(boot):0x2000]),
|
|
'gap 0x0DB8-0x2000 filled with 0xFF (erased flash)')
|
|
check(bl_img[0x2000:0x2000 + len(app)] == app, 'offset 0x2000: APP image (12280B) matches source bin')
|
|
check(all(b == 0xFF for b in bl_img[0x2000 + len(app):0xF800]),
|
|
'APP tail up to cal page filled with 0xFF')
|
|
check(all(b == 0xFF for b in bl_img[0xF800:0xFC00]),
|
|
'calibration page 0x0800F800-0x0800FBFF untouched (0xFF)')
|
|
check(all(b == 0xFF for b in bl_img[0xFC00:0xFFFC]),
|
|
'flag page body 0x0800FC00-0x0800FFFB stays 0xFF')
|
|
flag = struct.unpack_from('<I', bl_img, 0xFFFC)[0]
|
|
check(flag == 0x0000EEEE, 'flag word @0x0800FFFC == 0x0000EEEE (LE bytes EE EE 00 00), got 0x%08X' % flag)
|
|
check(bl_img[0xFFFC:0x10000] == b'\xee\xee\x00\x00', 'flag raw bytes @0x0800FFFC == EE EE 00 00')
|
|
check(bl_img[0xFFF0:0xFFFC] == b'\xff' * 12, 'bytes before flag untouched (0xFF)')
|
|
|
|
print('=== OTA update package ===')
|
|
check(len(upd) == 12288, 'OTA size == 12288B (12 x 1KB, page aligned)')
|
|
check(len(upd) % 1024 == 0, 'OTA size 1KB aligned')
|
|
check(len(upd) - len(app) == 8, 'OTA pad length == 8B (12280 -> 12288)')
|
|
check(upd[0:len(app)] == app, 'OTA payload == APP bin')
|
|
check(all(b == 0xFF for b in upd[len(app):]), 'OTA pad bytes all 0xFF')
|
|
check(len(upd) <= 55296, 'OTA size within 54KB APP limit')
|
|
|
|
print()
|
|
print('OVERALL: ' + ('ALL CHECKS PASSED' if ok else 'FAILURES PRESENT'))
|
|
sys.exit(0 if ok else 1)
|