backup codes

This commit is contained in:
vc4
2023-08-10 09:55:20 +08:00
parent e1584c1cb8
commit c0e0daeb6f

View File

@@ -208,8 +208,9 @@ class SerialTransport():
def write(self, data, flush=True): def write(self, data, flush=True):
if self.serial.inWaiting() > 0: if self.serial.inWaiting() > 0:
self.serial.flushInput() self.serial.flushInput()
self.serial.write(data) cnt = self.serial.write(data)
if flush: self.serial.flush() if flush: self.serial.flush()
return cnt
def read(self, length): def read(self, length):
return self.serial.read(length) return self.serial.read(length)
@@ -237,7 +238,7 @@ class SerialTransport():
self.write(b'\xB5\x34\x84\x52\xBF') self.write(b'\xB5\x34\x84\x52\xBF')
return self.read(1) == b'\x01' return self.read(1) == b'\x01'
def load_ramcode(self, _f): def load_ramcode(self, _f, tryCnt=50):
with open(_f, "rb") as fr: with open(_f, "rb") as fr:
dat = fr.read() dat = fr.read()
fr.close() fr.close()
@@ -248,7 +249,10 @@ class SerialTransport():
self.write(pkg+chksum) self.write(pkg+chksum)
if self.read(1) == b'\x01': if self.read(1) == b'\x01':
cnt = self.write(dat + bytes([sum(dat)&0xFF])) cnt = self.write(dat + bytes([sum(dat)&0xFF]))
return self.read(1) == b'\x01' while self.read(1) != b'\x01' and tryCnt > 0:
time.sleep(0.1)
tryCnt -= 1
return tryCnt > 0
return False return False
def run_ramcode(self): def run_ramcode(self):
@@ -297,12 +301,11 @@ class SerialTransport():
return self.read(9) == ack return self.read(9) == ack
def reboot(self): def reboot(self):
self.serial.rts = True
time.sleep(0.1)
self.serial.rts = False self.serial.rts = False
time.sleep(0.1)
self.serial.rts = True
return True return True
if __name__ == '__main__': if __name__ == '__main__':
# parse arguments or use defaults # parse arguments or use defaults
parser = argparse.ArgumentParser(description='HC32xx Flash Downloader.') parser = argparse.ArgumentParser(description='HC32xx Flash Downloader.')
@@ -346,12 +349,18 @@ if __name__ == '__main__':
sys.stdout.write('Page Size: %s\n' % hc32xx['PageSize']) sys.stdout.write('Page Size: %s\n' % hc32xx['PageSize'])
sys.stdout.write('Page Count: %s\n' % hc32xx['PageCount']) sys.stdout.write('Page Count: %s\n' % hc32xx['PageCount'])
sys.stdout.write('Flash Size: %s\n' % hc32xx['FlashSize']) sys.stdout.write('Flash Size: %s\n' % hc32xx['FlashSize'])
#sys.stdout.write('RameCode: %s\n' % hc32xx['RamCodeBinFile']) sys.stdout.write('RameCode: %s\n' % hc32xx['RamCodeBinFile'])
sys.stdout.write('\n%s\n' % hc32xx['IspConnection']) sys.stdout.write('\n%s\n' % hc32xx['IspConnection'])
# global vars # global vars
transport = SerialTransport(args.port, hc32xx['BootloaderBaudrate']) transport = SerialTransport(args.port, hc32xx['BootloaderBaudrate'])
base_dir = os.path.dirname(os.path.realpath(__file__)) base_dir = os.path.dirname(os.path.realpath(__file__))
if not args.goboot and args.reboot:
sys.stdout.write("[REBOOT] %s\n" %
(transport.reboot() and 'ok' or 'error'))
transport.close()
sys.exit(0)
# stage 1. goto bootloader # stage 1. goto bootloader
sys.stdout.write("Stage 1. Goto bootloader: ") sys.stdout.write("Stage 1. Goto bootloader: ")
sys.stdout.flush() sys.stdout.flush()
@@ -371,7 +380,7 @@ if __name__ == '__main__':
if args.unlock and transport.unlock(): if args.unlock and transport.unlock():
sys.stdout.write("unlock\n") sys.stdout.write("unlock\n")
else: else:
sys.stdout.write("%s\n" % args.unlock and "locked" or "unlock failed") sys.stdout.write("%s\n" % (args.unlock and "locked" or "unlock failed"))
sys.exit(1) sys.exit(1)
else: else:
sys.stdout.write("pass\n") sys.stdout.write("pass\n")
@@ -399,39 +408,53 @@ if __name__ == '__main__':
sys.stdout.write("error\n") sys.stdout.write("error\n")
sys.exit(1) sys.exit(1)
# erase device def exec_flash(args, transport):
if args.erase or args.wfile: # erase device
sys.stdout.write("[ ERASE] %s\n" % if args.erase or args.wfile:
(transport.flash_erase() and 'ok' or 'error')) sys.stdout.write("[ ERASE] %s\n" %
(transport.flash_erase() and 'ok' or 'error'))
# write, with erase # write, with erase
if args.wfile: if args.wfile:
with open(args.wfile, "rb") as fs: with open(args.wfile, "rb") as fs:
sys.stdout.write("[ WRITE] ") sys.stdout.write("[ WRITE] ")
psize = int(hc32xx['WritePacketSize']) psize = int(hc32xx['WritePacketSize'])
addr0 = int(hc32xx['StartAddress'], 16) addr0 = int(hc32xx['StartAddress'], 16)
addr = addr0 addr = addr0
while True: while True:
_last = False _last = False
dat = fs.read(psize) dat = fs.read(psize)
if len(dat) == 0: if len(dat) == 0:
_last = True
else:
if len(dat) < psize:
dat = dat + b'\xFF'*(psize-len(dat))
_last = True _last = True
if transport.flash_write(addr, dat):
sys.stdout.write("."); sys.stdout.flush()
else: else:
sys.stdout.write("flash write error: 0x%08X\n" % addr) if len(dat) < psize:
sys.exit(1) dat = dat + b'\xFF'*(psize-len(dat))
addr += psize _last = True
if _last: if transport.flash_write(addr, dat):
sys.stdout.write(" ok\n") sys.stdout.write("."); sys.stdout.flush()
fs.close() else:
if not args.vfile: sys.stdout.write("flash write error: 0x%08X\n" % addr)
args.vfile = args.wfile #sys.exit(1)
break return 1
addr += psize
if _last:
sys.stdout.write(" ok\n")
fs.close()
if not args.vfile:
args.vfile = args.wfile
break
return 0
_err = 0
while exec_flash(args, transport) != 0:
sys.stdout.write(".")
sys.stdout.flush()
_err += 1
if _err > (args.goboot and 10 or 0):
sys.stdout.write("error\n")
sys.exit(1)
sys.stdout.write("succ\n")
# read to file # read to file
if args.rfile: if args.rfile: