5 from litex
.soc
.tools
.remote
.etherbone
import EtherbonePacket
, EtherboneRecord
, EtherboneWrites
6 from litex
.soc
.tools
.remote
.etherbone
import EtherboneIPC
9 class RemoteServer(EtherboneIPC
):
10 def __init__(self
, comm
, port
=1234, csr_data_width
=32):
13 self
.csr_data_width
= 32
16 if hasattr(self
, "socket"):
18 self
.socket
= socket
.socket(socket
.AF_INET
, socket
.SOCK_STREAM
)
19 self
.socket
.bind(("localhost", self
.port
))
21 self
.comm
.open(self
.csr_data_width
)
25 if not hasattr(self
, "socket"):
30 def _serve_thread(self
):
32 client_socket
, addr
= self
.socket
.accept()
33 print("Connected with " + addr
[0] + ":" + str(addr
[1]))
36 packet
= self
.receive_packet(client_socket
)
39 packet
= EtherbonePacket(packet
)
42 record
= packet
.records
.pop()
45 if record
.writes
!= None:
46 self
.comm
.write(record
.writes
.base_addr
, record
.writes
.get_datas())
49 if record
.reads
!= None:
51 for addr
in record
.reads
.get_addrs():
52 reads
.append(self
.comm
.read(addr
))
54 record
= EtherboneRecord()
55 record
.writes
= EtherboneWrites(datas
=reads
)
56 record
.wcount
= len(record
.writes
)
58 packet
= EtherbonePacket()
59 packet
.records
= [record
]
61 self
.send_packet(client_socket
, packet
)
67 self
.serve_thread
= threading
.Thread(target
=self
._serve
_thread
)
68 self
.serve_thread
.setDaemon(True)
69 self
.serve_thread
.start()
71 def join(self
, writer_only
=False):
72 if not hasattr(self
, "serve_thread"):
74 self
.serve_thread
.join()
77 parser
= argparse
.ArgumentParser()
78 parser
.add_argument("--comm", default
="uart", help="comm interface")
79 parser
.add_argument("--port", default
="2", help="UART port")
80 parser
.add_argument("--baudrate", default
=115200, help="UART baudrate")
81 parser
.add_argument("--csr_data_width", default
=32, help="CSR data_width")
82 return parser
.parse_args()
86 if args
.comm
== "uart":
87 from litex
.soc
.tools
.remote
import CommUART
88 port
= args
.port
if not args
.port
.isdigit() else int(args
.port
)
89 comm
= CommUART(args
.port
if not args
.port
.isdigit() else int(args
.port
),
93 raise NotImplementedError
95 server
= RemoteServer(comm
, csr_data_width
=args
.csr_data_width
)
100 except KeyboardInterrupt: # FIXME
103 if __name__
== "__main__":