From 513a799a394176ecb9aebb546c8a6baa6009f946 Mon Sep 17 00:00:00 2001 From: David Lattimore Date: Thu, 3 Dec 2020 13:28:49 +1100 Subject: [PATCH] lxterm: Don't attempt to recover from CRC errors during upload. This allows transfers to proceed at the full speed of the serial link. We still check all responses, but will now fail outright if a CRC error occurs. --- litex/tools/litex_term.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/litex/tools/litex_term.py b/litex/tools/litex_term.py index 4999cdd55..25e28b6a8 100755 --- a/litex/tools/litex_term.py +++ b/litex/tools/litex_term.py @@ -203,6 +203,19 @@ class LiteXTerm: retry = 0 return 1 + def receive_upload_response(self): + # If we're not doing CRC checking, then there's no response to read. + if self.no_crc: + return + reply = self.port.read() + if reply == sfl_ack_success: + return + elif reply == sfl_ack_crcerror: + print("[LXTERM] Upload to device failed due to data corruption (CRC error)") + else: + print(f"[LXTERM] Got unexpected response from device '{reply}'") + sys.exit(1) + def upload(self, filename, address): f = open(filename, "rb") f.seek(0, 2) @@ -214,6 +227,7 @@ class LiteXTerm: position = 0 start = time.time() remaining = length + outstanding = 0 while remaining: sys.stdout.write("|{}>{}| {}%\r".format('=' * (20*position//length), ' ' * (20-20*position//length), @@ -227,12 +241,17 @@ class LiteXTerm: frame.cmd = sfl_cmd_load if not self.no_crc else sfl_cmd_load_no_crc frame.payload = current_address.to_bytes(4, "big") frame.payload += frame_data - if self.send_frame(frame) == 0: - return + self.port.write(frame.encode()) + outstanding += 1 + if self.port.in_waiting: + self.receive_upload_response() + outstanding -= 1 current_address += len(frame_data) position += len(frame_data) remaining -= len(frame_data) time.sleep(1e-5) # Inter-frame delay for fast UARTs (ex: FT245). + for _ in range(outstanding): + self.receive_upload_response() end = time.time() elapsed = end - start f.close()