Files

83 lines
2.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
将固件 bin 文件尾部补齐到整页大小,便于仅支持整页传输的 Bootloader 升级。
默认参数针对 GD32E230F8
- 页大小: 1024 字节
- 填充值: 0xFF
用法:
python fill_bin.py firmware.bin
python fill_bin.py firmware.bin -o firmware_UPDATE.bin
python fill_bin.py firmware.bin --page-size 1024 --fill 0xFF
"""
import argparse
import os
import sys
def build_default_output_path(input_path):
base, ext = os.path.splitext(input_path)
return f"{base}_UPDATE{ext}"
def pad_to_page(data, page_size, fill_byte):
remainder = len(data) % page_size
if remainder == 0:
return data, 0
pad_len = page_size - remainder
padded = data + bytes([fill_byte]) * pad_len
return padded, pad_len
def main():
parser = argparse.ArgumentParser(description="将固件尾部补齐到整页大小")
parser.add_argument("input", help="输入固件 bin 路径")
parser.add_argument("-o", "--output", default=None, help="输出文件路径 (默认: 输入文件名_UPDATE.bin)")
parser.add_argument("--page-size", type=int, default=1024, help="Flash 页大小,单位字节 (默认: 1024)")
parser.add_argument("--fill", default="0xFF", help="补齐字节值,支持十进制或十六进制 (默认: 0xFF)")
args = parser.parse_args()
if args.page_size <= 0:
print("错误:--page-size 必须大于 0", file=sys.stderr)
sys.exit(1)
try:
fill_byte = int(args.fill, 0)
except ValueError:
print(f"错误:--fill 无法解析为整数: {args.fill}", file=sys.stderr)
sys.exit(1)
if fill_byte < 0 or fill_byte > 0xFF:
print("错误:--fill 必须在 0~255 范围内", file=sys.stderr)
sys.exit(1)
if not os.path.isfile(args.input):
print(f"错误:找不到输入文件 {args.input}", file=sys.stderr)
sys.exit(1)
output_path = args.output if args.output else build_default_output_path(args.input)
with open(args.input, "rb") as f:
data = f.read()
padded_data, pad_len = pad_to_page(data, args.page_size, fill_byte)
with open(output_path, "wb") as f:
f.write(padded_data)
print(f"处理完成: {output_path}")
print(f" 原始大小: {len(data)} 字节")
print(f" 页大小 : {args.page_size} 字节")
print(f" 补齐大小: {pad_len} 字节")
print(f" 输出大小: {len(padded_data)} 字节")
if pad_len == 0:
print(" 说明 : 输入文件已是整页对齐,已原样输出")
if __name__ == "__main__":
main()