soc/tools/remote/server: add --debug parameter
[litex.git] / litex / soc / tools / remote / comm_uart.py
1 import serial
2 import struct
3
4
5 class CommUART:
6 msg_type = {
7 "write": 0x01,
8 "read": 0x02
9 }
10 def __init__(self, port, baudrate=115200, debug=False):
11 self.port = port
12 self.baudrate = str(baudrate)
13 self.debug = debug
14 self.port = serial.serial_for_url(port, baudrate)
15
16 def open(self):
17 if hasattr(self, "port"):
18 return
19 self.port.open()
20
21 def close(self):
22 if not hasattr(self, "port"):
23 return
24 del self.port
25
26 def _read(self, length):
27 r = bytes()
28 while len(r) < length:
29 r += self.port.read(length - len(r))
30 return r
31
32 def _write(self, data):
33 remaining = len(data)
34 pos = 0
35 while remaining:
36 written = self.port.write(data[pos:])
37 remaining -= written
38 pos += written
39
40 def read(self, addr, length=None):
41 data = []
42 length_int = 1 if length is None else length
43 self._write([self.msg_type["read"], length_int])
44 self._write(list((addr//4).to_bytes(4, byteorder="big")))
45 for i in range(length_int):
46 value = int.from_bytes(self._read(4), "big")
47 if self.debug:
48 print("read {:08x} @ {:08x}".format(value, addr + 4*i))
49 if length is None:
50 return value
51 data.append(value)
52 return data
53
54 def write(self, addr, data):
55 data = data if isinstance(data, list) else [data]
56 length = len(data)
57 self._write([self.msg_type["write"], length])
58 self._write(list((addr//4).to_bytes(4, byteorder="big")))
59 for i, value in enumerate(data):
60 self._write(list(value.to_bytes(4, byteorder="big")))
61 if self.debug:
62 print("write {:08x} @ {:08x}".format(value, addr + 4*i))