diff --git a/fw_pack.py b/fw_pack.py index b9242ec..94809be 100644 --- a/fw_pack.py +++ b/fw_pack.py @@ -10,7 +10,7 @@ fw_pack — GD32E230 双固件打包公共库 (CLI 与 FlashTool GUI 共用) 锚点擦除态 → A 向量非法 → 落 B 记录校验 → 跳出厂固件) *.md5.txt 产物 MD5 清单 + 布局摘要 -规则与 BL dev_fact 侧 (v5.1) 逐字一致: +规则与双固件 bootloader 侧逐字一致: - CRC-16/XMODEM (poly 0x1021, init 0x0000, 不反转, 无 xorout), 自检向量 b"123456789" -> 0x31C3; - A 包: 补 0xFF 至整 N 页; body 恰整页或 余量 < 记录长 R -> 向后扩 1 页; @@ -197,7 +197,7 @@ class SlotSpec: # ═══════════════════════════════════════════════════════════ BUILTIN_PROFILES = { - # CeramixNano-MB v5.1 双固件 BL 的布局 (BL dev_fact@512bf7a) + # CeramixNano-MB 双固件 bootloader 的布局 'CeramixNano_MB_Dual_FW': { 'profile': 'CeramixNano_MB_Dual_FW', 'chip': 'GD32E230F8', @@ -214,6 +214,24 @@ BUILTIN_PROFILES = { 'flag': {'page': 'last', 'addr': '0x0800FFFC', 'value': '0xEEEE'}, 'crc': 'xmodem', }, + # CeramixNano EDDY (LDC1612) 双固件布局——Flash 分配与 MB 完全相同; + # BL 直接复用 bootloader_CeramixNano_MB 同一 bin(RS485 引脚/波特率一致,仅 LED 引脚差异) + 'CeramixNano_EDDY_Dual_FW': { + 'profile': 'CeramixNano_EDDY_Dual_FW', + 'chip': 'GD32E230F8', + 'flash_base': '0x08000000', + 'flash_size': '64K', + 'page_size': 1024, + 'bl': {'addr': '0x08000000', 'size': '8K'}, + 'slot_a': {'addr': '0x08002000', 'size': '36K', + 'anchor': 'slot_end-4', + 'record': '{pages16@+0, crc16@+2}'}, + 'slot_b': {'addr': '0x0800B000', 'size': '19K', 'fixed_slot': True, + 'record': '{magic16@+0=0xC0DE, pages16@+2, crc16@+4}', + 'record_addr': 'slot_end-8'}, + 'flag': {'page': 'last', 'addr': '0x0800FFFC', 'value': '0xEEEE'}, + 'crc': 'xmodem', + }, # 无保底槽的单槽布局 (旧 BL 升级过渡 / 无 B 槽工程) 'f8_single_slot': { 'profile': 'f8_single_slot', @@ -555,7 +573,7 @@ def build_full(profile, bl_data, a_pack, b_pack=None): def build_factory(profile, bl_data, b_pack): """工厂烧录镜像: BL + B 满槽(含记录) + flag, **无 A 包、无锚点**。 - 上电判定链(v5.1 BL): A 锚点为擦除态(0xFFFF...) → legacy flag + A 向量校验 + 上电判定链(双固件 BL): A 锚点为擦除态(0xFFFF...) → legacy flag + A 向量校验 (A 槽全 0xFF → 向量非法) → 落 B 记录 {magic|pages|crc} 校验 → 跳出厂固件; 后续 OTA 写入 A 槽后即切运行固件。 """