soc/tools: initialize wishbone remote control (for now only uart)
[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.csr_data_width = None
14 self.debug = debug
15 self.port = serial.serial_for_url(port, baudrate)
16
17 def open(self, csr_data_width):
18 self.csr_data_width = csr_data_width
19 if hasattr(self, "port"):
20 return
21 self.port.open()
22
23 def close(self):
24 if not hasattr(self, "port"):
25 return
26 del self.port
27
28 def _read(self, length):
29 r = bytes()
30 while len(r) < length:
31 r += self.port.read(length - len(r))
32 return r
33
34 def _write(self, data):
35 remaining = len(data)
36 pos = 0
37 while remaining:
38 written = self.port.write(data[pos:])
39 remaining -= written
40 pos += written
41
42 def read(self, addr, length=None):
43 r = []
44 length_int = 1 if length is None else length
45 self._write([self.msg_type["read"], length_int])
46 self._write(list((addr//4).to_bytes(4, byteorder="big")))
47 for i in range(length_int):
48 data = int.from_bytes(self._read(4), "big")
49 if self.debug:
50 print("read {:08x} @ {:08x}".format(data, addr + 4*i))
51 if length is None:
52 return data
53 r.append(data)
54 return r
55
56 def write(self, addr, data):
57 data = data if isinstance(data, list) else [data]
58 length = len(data)
59 self._write([self.msg_type["write"], length])
60 self._write(list((addr//4).to_bytes(4, byteorder="big")))
61 for i in range(len(data)):
62 self._write(list(data[i].to_bytes(4, byteorder="big")))
63 if self.debug:
64 print("write {:08x} @ {:08x}".format(data[i], addr + 4*i))