mirror of
https://git.proxmox.com/git/fwupd
synced 2025-05-29 04:52:15 +00:00
56 lines
1.5 KiB
Python
Executable File
56 lines
1.5 KiB
Python
Executable File
#!/usr/bin/python3
|
|
# -*- coding: utf-8 -*-
|
|
#
|
|
# Copyright (C) 2020 Richard Hughes <richard@hughsie.com>
|
|
#
|
|
# SPDX-License-Identifier: LGPL-2.1+
|
|
|
|
import struct
|
|
import zlib
|
|
import argparse
|
|
|
|
|
|
def main(bin_fn, dfu_fn, pad, vid, pid, rev):
|
|
|
|
# read binary file
|
|
with open(bin_fn, "rb") as f:
|
|
blob = f.read()
|
|
|
|
# pad blob to a specific size
|
|
if pad:
|
|
while len(blob) < int(pad, 16):
|
|
blob += b"\0"
|
|
|
|
# create DFU footer with checksum
|
|
blob += struct.pack(
|
|
"<HHHH3sB",
|
|
int(rev, 16), # version
|
|
int(pid, 16), # PID
|
|
int(vid, 16), # VID
|
|
0x0100, # DFU version
|
|
b"UFD", # signature
|
|
0x10,
|
|
) # hdrlen
|
|
crc32 = zlib.crc32(blob) ^ 0xFFFFFFFF
|
|
blob += struct.pack("<L", crc32)
|
|
|
|
# write binary file
|
|
with open(dfu_fn, "wb") as f:
|
|
f.write(blob)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
# parse args
|
|
parser = argparse.ArgumentParser(description="Add DFU footer on firmware")
|
|
parser.add_argument("--bin", help="Path to the .bin file", required=True)
|
|
parser.add_argument("--dfu", help="Output DFU file path", required=True)
|
|
parser.add_argument(
|
|
"--pad", help="Pad to a specific size, e.g. 0x4000", default=None
|
|
)
|
|
parser.add_argument("--vid", help="Vendor ID, e.g. 0x273f", required=True)
|
|
parser.add_argument("--pid", help="Product ID, e.g. 0x1002", required=True)
|
|
parser.add_argument("--rev", help="Revision, e.g. 0x1000", required=True)
|
|
args = parser.parse_args()
|
|
main(args.bin, args.dfu, args.pad, args.vid, args.pid, args.rev)
|