soc/tools/litex_term: continue cleanup

This commit is contained in:
Florent Kermarrec 2016-02-19 13:04:47 +01:00
parent ed2e623994
commit 247ecc5d8a
1 changed files with 28 additions and 47 deletions

View File

@ -32,20 +32,19 @@ else:
sfl_magic_len = 14 sfl_magic_len = 14
sfl_magic_req = bytes("sL5DdSMmkekro\n", "utf-8") sfl_magic_req = b"sL5DdSMmkekro\n"
sfl_magic_ack = bytes("z6IHG7cYDID6o\n", "utf-8") sfl_magic_ack = b"z6IHG7cYDID6o\n"
# General commands # General commands
sfl_cmd_abort = 0x00 sfl_cmd_abort = b"\x00"
sfl_cmd_load = 0x01 sfl_cmd_load = b"\x01"
sfl_cmd_jump = 0x02 sfl_cmd_jump = b"\x02"
# Replies # Replies
sfl_ack_success = 'K' sfl_ack_success = b"K"
sfl_ack_crcerror = 'C' sfl_ack_crcerror = b"C"
sfl_ack_unknown = 'U' sfl_ack_unknown = b"U"
sfl_ack_error = 'E' sfl_ack_error = b"E"
crc16_table = [ crc16_table = [
@ -93,30 +92,18 @@ def crc16(l):
class SFLFrame: class SFLFrame:
def __init__(self): def __init__(self):
self.length = None self.cmd = bytes()
self.cmd = None self.payload = bytes()
self.payload = []
self.crc = None
self.raw = []
def compute_crc(self): def compute_crc(self):
crc_data = [] return crc16(self.cmd + self.payload)
crc_data.append(self.cmd)
for d in self.payload:
crc_data.append(d)
self.crc = crc16(crc_data)
return self.crc
def encode(self): def encode(self):
self.raw = [] packet = bytes([len(self.payload)])
self.raw.append(self.length) packet += self.compute_crc().to_bytes(2, "big")
self.compute_crc() packet += self.cmd
for d in self.crc.to_bytes(2, "big"): packet += self.payload
self.raw.append(d) return packet
self.raw.append(self.cmd)
for d in self.payload:
self.raw.append(d)
class LiteXTerm: class LiteXTerm:
def __init__(self, kernel_image, kernel_address): def __init__(self, kernel_image, kernel_address):
@ -126,7 +113,7 @@ class LiteXTerm:
self.reader_alive = False self.reader_alive = False
self.writer_alive = False self.writer_alive = False
self.detect_magic_bytes = bytearray([0 for i in range(len(sfl_magic_req))]) self.detect_magic_bytes = bytes(len(sfl_magic_req))
def open(self, port, speed): def open(self, port, speed):
self.serial = serial.serial_for_url( self.serial = serial.serial_for_url(
@ -146,12 +133,11 @@ class LiteXTerm:
self.serial.close() self.serial.close()
def send_frame(self, frame): def send_frame(self, frame):
frame.encode()
retry = 1 retry = 1
while retry: while retry:
self.serial.write(frame.raw) self.serial.write(frame.encode())
# Get the reply from the device # Get the reply from the device
reply = self.serial.read().decode() reply = self.serial.read()
if reply == sfl_ack_success: if reply == sfl_ack_success:
retry = 0 retry = 0
elif reply == sfl_ack_crcerror: elif reply == sfl_ack_crcerror:
@ -173,12 +159,9 @@ class LiteXTerm:
print("{}%\r".format(100*position//length), end="") print("{}%\r".format(100*position//length), end="")
frame = SFLFrame() frame = SFLFrame()
frame_data = data[:251] frame_data = data[:251]
frame.length = len(frame_data) + 4
frame.cmd = sfl_cmd_load frame.cmd = sfl_cmd_load
for d in current_address.to_bytes(4, "big"): frame.payload = current_address.to_bytes(4, "big")
frame.payload.append(d) frame.payload += frame_data
for d in frame_data:
frame.payload.append(d)
if self.send_frame(frame) == 0: if self.send_frame(frame) == 0:
return return
current_address += len(frame_data) current_address += len(frame_data)
@ -195,10 +178,8 @@ class LiteXTerm:
def boot(self): def boot(self):
print("[TERM] Booting the device.") print("[TERM] Booting the device.")
frame = SFLFrame() frame = SFLFrame()
frame.length = 4
frame.cmd = sfl_cmd_jump frame.cmd = sfl_cmd_jump
for d in self.kernel_address.to_bytes(4, "big"): frame.payload = self.kernel_address.to_bytes(4, "big")
frame.payload.append(d)
self.send_frame(frame) self.send_frame(frame)
def detect_magic(self, data): def detect_magic(self, data):
@ -219,15 +200,15 @@ class LiteXTerm:
def reader(self): def reader(self):
try: try:
while self.reader_alive: while self.reader_alive:
c = self.serial.read().decode() c = self.serial.read()
if c == '\r': if c == b"\r":
sys.stdout.write('\n') sys.stdout.write(b"\n")
else: else:
sys.stdout.write(c) sys.stdout.write(c.decode())
sys.stdout.flush() sys.stdout.flush()
if self.kernel_image is not None: if self.kernel_image is not None:
if self.detect_magic(bytes(c, "utf-8")): if self.detect_magic(c):
self.answer_magic() self.answer_magic()
except serial.SerialException: except serial.SerialException: