83 lines
2.5 KiB
Python
83 lines
2.5 KiB
Python
#!/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()
|