diff --git a/.gitignore b/.gitignore index 012ede6..115550f 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,6 @@ FlashTool/flash_gui_settings.json FlashTool/release/ FlashTool/src/build/ FlashTool/toolchain/ +# BL 反汇编分析副产物(不入库, 见 AGENTS 2026-10-22 留档) +bootloader_disasm*.txt diff --git a/AGENTS.md b/AGENTS.md index 40c8ad3..6637895 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -17,7 +17,7 @@ GD32E230 系列固件处理与烧录工具仓库。本文件为项目标杆文 MD5 清单),`test_fw_pack.py` 回归测试套件(55 项,含 CeramixNano 实测基准); `merge_bin.py`/`fill_bin.py` 旧版脚本保留兼容, `gd32e230f8_bootloader_hulk.bin` 出厂 bootloader; - - `FlashTool/`:DAPLink Flash GUI v2.6.0(烧录 + 打包 v2 + 补齐 Pad + 拼接 + - `FlashTool/`:DAPLink Flash GUI v2.6.1(烧录 + 打包 v2 + 补齐 Pad + 拼接 Merge),源码在 `src/`(`flash_gui.py` 入口与 CLI、`app_gui.py` 界面、 `openocd_runner.py` 命令构建、`fw_image.py` 旧补齐/拼接、`config.py` 设置、 `build_exe.py`/`package_release.py`/`publish_gitea.py` 发布流水线); @@ -102,6 +102,14 @@ GD32E230 系列固件处理与烧录工具仓库。本文件为项目标杆文 `*_UPDATE_V5.bin` 更名 `*_UPDATE.bin`(含验收包内 1.0.18),测试引用同步; 55 项回归全过。注:BL 侧 `bootloader.c` 同日清理 3 处注释标签(注释不影响 代码生成,已烧 BL bin 仍有效)。 +- 2026-10-25 **v2.6.1 发布**(tag `DAPLinkFlash-v2.6.1`,Release id 47):GUI + 升版 2.6.1 重建 onedir 并组 zip 23.1 MB(24,177,112B,MD5 + `ae9aa6590bf46b8e46472dc2d1f1ebc7`)上传 Release——fw_pack 2.2 + (`CeramixNano_EDDY_Dual_FW`)首次随 GUI 安装包分发,CLI 与「打包 v2」弹窗 + 均可用;同 Release 附 MB/EDDY 两板 BL bin + `bootloader_bins.md5.txt`, + **BL bin 分发渠道自此为本仓库 Release**(不再从 BL 仓库 Build 目录取); + 发布脚本 `publish_bl_release.py` 入库(建 Release + 传 BL 附件)。zip 由 + 本次提交树构建(tag `5a85f68` 之后叠加出清与升版),复现核对以 MD5 为准。 ### 计划 / TODO diff --git a/FlashTool/src/app_gui.py b/FlashTool/src/app_gui.py index 6004603..0491cf6 100644 --- a/FlashTool/src/app_gui.py +++ b/FlashTool/src/app_gui.py @@ -41,7 +41,7 @@ BOLD = ('Microsoft YaHei UI', 13, 'bold') TITLE_FONT = ('Microsoft YaHei UI', 18, 'bold') APP_NAME = 'DAPLink Flash' -APP_VERSION = '2.6.0' +APP_VERSION = '2.6.1' REPO_URL = 'https://gitea.hulk.wang/hulk/gd32e230f8_firmware_merge_tool' OK_BLUE = '#3B8ED0' diff --git a/publish_bl_release.py b/publish_bl_release.py new file mode 100644 index 0000000..2a4a800 --- /dev/null +++ b/publish_bl_release.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +"""发布 DAPLinkFlash-v2.6.1:fw_pack 2.2(EDDY profile)+ 随 Release 附板卡 BL bin""" +import hashlib +import json +import os +import ssl +import time +import urllib.request +from pathlib import Path + +BASE = "https://gitea.hulk.wang/api/v1" +REPO = "hulk/gd32e230f8_firmware_merge_tool" +TOKEN = os.environ["GITEA_TOKEN"] +CTX = ssl._create_unverified_context() + +BL_DIR = Path(r"E:\Hulk-Coding\gd32e230_bootloader\Build\Release") +BLS = [ + BL_DIR / "gd32e23x_V0.1.0_bootloader_CeramixNano_MB_2026-10-22.bin", + BL_DIR / "gd32e23x_V0.1.0_bootloader_CeramixNano_EDDY_2026-10-24.bin", +] +MANIFEST = BL_DIR / "bootloader_bins.md5.txt" + +BODY = """## 本版变更 + +- **fw_pack 2.1 → 2.2**:新增内置布局 profile `CeramixNano_EDDY_Dual_FW`(CeramixNano EDDY 板 / LDC1612 电涡流传感器单板;Flash 分配与 MB 逐字节相同,BL 用各自的板卡分支 bin)。 +- **DAPLinkFlash GUI 无改动**——需要 GUI 请继续用 [v2.6.0](https://gitea.hulk.wang/hulk/gd32e230f8_firmware_merge_tool/releases/tag/DAPLinkFlash-v2.6.0) 的安装包。 +- **新增:随 Release 分发各板卡双固件 BL bin**(拼 FULL/FACTORY 时 `-b` 传入): + +| 附件 | 板卡 | 大小 | MD5 | 来源 | +|---|---|---|---|---| +| `gd32e23x_V0.1.0_bootloader_CeramixNano_MB_2026-10-22.bin` | CeramixNano-MB(LED=PA14) | 4,044B | f7b447cf800e062cdf15abd8d7edc723 | BL 仓库 `bootloader_CeramixNano_MB` 分支,tag `v0.1.0` | +| `gd32e23x_V0.1.0_bootloader_CeramixNano_EDDY_2026-10-24.bin` | CeramixNano-EDDY(LED=PB1,升级会话期间 SWD 可用) | 4,040B | 1dcc17bf530930a9686afa4dd04d30db | BL 仓库 `bootloader_CeramixNano_EDDY` 分支,V0.1.0 | +| `bootloader_bins.md5.txt` | 清单 | — | — | 上述两文件的 MD5 | + +## 用法 + +```bash +# MB 双固件打包(在 APP bin 所在目录) +python gd32e230_firmware_tool.py app_a.bin app_b.bin -b gd32e23x_V0.1.0_bootloader_CeramixNano_MB_2026-10-22.bin + +# EDDY 双固件打包 +python gd32e230_firmware_tool.py app_a.bin app_b.bin \ + -b gd32e23x_V0.1.0_bootloader_CeramixNano_EDDY_2026-10-24.bin \ + --profile CeramixNano_EDDY_Dual_FW +``` + +两块板 Flash 布局完全一致(BL 8K + FW_A 36K + FW_B 19K + 末页标志),仅 LED 引脚不同; +**BL 版本号按板卡分支独立编号,勿跨板混烧**(MB 版 LED=PA14 会占 SWCLK)。 +""" + + +def api(method, path, data=None, ctype="application/json", tries=6): + for i in range(tries): + try: + r = urllib.request.Request(BASE + path, method=method) + r.add_header("Authorization", "token " + TOKEN) + body = None + if data is not None: + body = json.dumps(data).encode() if ctype == "application/json" else data + r.add_header("Content-Type", ctype) + with urllib.request.urlopen(r, body, context=CTX) as resp: + txt = resp.read() + return resp.status, (json.loads(txt) if txt else {}) + except Exception as e: + print(f" retry {i + 1} {method} {path.split('?')[0]}: {e!r}") + time.sleep(8) + raise SystemExit(f"API 多次重试失败: {method} {path}") + + +# 0) 生成 BL 清单 +lines = ["# 双固件板卡 BL bin 清单(来源:gd32e230_bootloader 仓库对应板卡分支)"] +for p in BLS: + md5 = hashlib.md5(p.read_bytes()).hexdigest() + lines.append(f"{md5} {p.stat().st_size:>6}B {p.name}") +MANIFEST.write_text("\n".join(lines) + "\n", encoding="utf-8") +print(MANIFEST.read_text(encoding="utf-8")) + +# 1) 创建 Release(tag 打在 main 顶端) +st, rel = api("POST", f"/repos/{REPO}/releases", { + "tag_name": "DAPLinkFlash-v2.6.1", + "target_commitish": "main", + "name": "DAPLinkFlash v2.6.1 — fw_pack 2.2(EDDY profile)+ 板卡 BL 分发", + "body": BODY, +}) +print("release:", st, rel.get("id"), rel.get("html_url")) +rid = rel["id"] + +# 2) 附件 +boundary = "----zcodebl" +for p in BLS + [MANIFEST]: + blob = p.read_bytes() + parts = ( + f"--{boundary}\r\n" + f'Content-Disposition: form-data; name="attachment"; filename="{p.name}"\r\n' + f"Content-Type: application/octet-stream\r\n\r\n" + ).encode() + blob + f"\r\n--{boundary}--\r\n".encode() + st, res = api("POST", f"/repos/{REPO}/releases/{rid}/assets?name={p.name}", parts, + ctype=f"multipart/form-data; boundary={boundary}") + print("asset:", st, p.name)