|
@@ -18,6 +18,8 @@ from greaseweazle import usb as USB
|
|
|
# Updates the Greaseweazle firmware using the specified Update File.
|
|
|
def update_firmware(usb, args):
|
|
|
|
|
|
+ req_type = b'BL' if args.bootloader else b'GW'
|
|
|
+
|
|
|
filename = args.file
|
|
|
if filename == "auto":
|
|
|
# Get the absolute path to the root Greaseweazle folder.
|
|
@@ -35,7 +37,8 @@ def update_firmware(usb, args):
|
|
|
# Search the catalogue for a match on our Weazle's hardware type.
|
|
|
while dat:
|
|
|
upd_len, hw_type = struct.unpack("<2H", dat[:4])
|
|
|
- if hw_type == usb.hw_type:
|
|
|
+ upd_type, = struct.unpack("2s", dat[upd_len-4:upd_len-2])
|
|
|
+ if hw_type == usb.hw_type and upd_type == req_type:
|
|
|
# Match: Pull out the embedded update file.
|
|
|
dat = dat[4:upd_len+4]
|
|
|
break
|
|
@@ -48,7 +51,7 @@ def update_firmware(usb, args):
|
|
|
|
|
|
# Check the matching update file's footer.
|
|
|
sig, maj, min, hw_type = struct.unpack("<2s2BH", dat[-8:-2])
|
|
|
- if len(dat) & 3 != 0 or sig != b'GW' or hw_type != usb.hw_type:
|
|
|
+ if len(dat) & 3 != 0 or sig != req_type or hw_type != usb.hw_type:
|
|
|
print("%s: Bad update file" % (filename))
|
|
|
return
|
|
|
crc16 = crcmod.predefined.Crc('crc-ccitt-false')
|
|
@@ -58,17 +61,27 @@ def update_firmware(usb, args):
|
|
|
return
|
|
|
|
|
|
# Perform the update.
|
|
|
- print("Updating to v%u.%u..." % (maj, min))
|
|
|
- ack = usb.update_firmware(dat)
|
|
|
- if ack != 0:
|
|
|
- print("** UPDATE FAILED: Please retry!")
|
|
|
- return
|
|
|
- print("Done.")
|
|
|
-
|
|
|
- if usb.hw_type == 7:
|
|
|
- util.usb_reopen(usb, is_update=False)
|
|
|
+ print("Updating %s to v%u.%u..."
|
|
|
+ % ("Bootloader" if args.bootloader else "Main Firmware", maj, min))
|
|
|
+ if args.bootloader:
|
|
|
+ ack = usb.update_bootloader(dat)
|
|
|
+ if ack != 0:
|
|
|
+ print("""\
|
|
|
+** UPDATE FAILED: Please retry immediately or your Weazle may need
|
|
|
+ full reflashing via a suitable programming adapter!""")
|
|
|
+ return
|
|
|
+ print("Done.")
|
|
|
else:
|
|
|
- print("** Disconnect Greaseweazle and remove the Programming Jumper.")
|
|
|
+ ack = usb.update_firmware(dat)
|
|
|
+ if ack != 0:
|
|
|
+ print("** UPDATE FAILED: Please retry!")
|
|
|
+ return
|
|
|
+ print("Done.")
|
|
|
+
|
|
|
+ if usb.hw_type == 7:
|
|
|
+ util.usb_reopen(usb, is_update=False)
|
|
|
+ else:
|
|
|
+ print("** Disconnect Greaseweazle and remove the Programming Jumper.")
|
|
|
|
|
|
|
|
|
def main(argv):
|
|
@@ -79,10 +92,12 @@ def main(argv):
|
|
|
help="update filename")
|
|
|
parser.add_argument("device", nargs="?", default="auto",
|
|
|
help="serial device")
|
|
|
+ parser.add_argument("--bootloader", action="store_true",
|
|
|
+ help="update the bootloader (WARNING: Use with caution!)")
|
|
|
parser.prog += ' ' + argv[1]
|
|
|
args = parser.parse_args(argv[2:])
|
|
|
|
|
|
- usb = util.usb_open(args.device, is_update=True)
|
|
|
+ usb = util.usb_open(args.device, is_update=not args.bootloader)
|
|
|
|
|
|
try:
|
|
|
update_firmware(usb, args)
|