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):
15 if hasattr(self
, "socket"):
17 self
.socket
= socket
.socket(socket
.AF_INET
, socket
.SOCK_STREAM
)
18 self
.socket
.bind(("localhost", self
.port
))
24 if not hasattr(self
, "socket"):
29 def _serve_thread(self
):
31 client_socket
, addr
= self
.socket
.accept()
32 print("Connected with " + addr
[0] + ":" + str(addr
[1]))
35 packet
= self
.receive_packet(client_socket
)
38 packet
= EtherbonePacket(packet
)
41 record
= packet
.records
.pop()
44 if record
.writes
!= None:
45 self
.comm
.write(record
.writes
.base_addr
, record
.writes
.get_datas())
48 if record
.reads
!= None:
50 for addr
in record
.reads
.get_addrs():
51 reads
.append(self
.comm
.read(addr
))
53 record
= EtherboneRecord()
54 record
.writes
= EtherboneWrites(datas
=reads
)
55 record
.wcount
= len(record
.writes
)
57 packet
= EtherbonePacket()
58 packet
.records
= [record
]
60 self
.send_packet(client_socket
, packet
)
66 self
.serve_thread
= threading
.Thread(target
=self
._serve
_thread
)
67 self
.serve_thread
.setDaemon(True)
68 self
.serve_thread
.start()
72 parser
= argparse
.ArgumentParser()
73 parser
.add_argument("--comm", default
="uart", help="comm interface")
74 parser
.add_argument("--port", default
="2", help="UART port")
75 parser
.add_argument("--baudrate", default
=115200, help="UART baudrate")
76 parser
.add_argument("--debug", action
="store_true", help="enable debug")
77 return parser
.parse_args()
80 print("LiteX remote server")
82 if args
.comm
== "uart":
83 from litex
.soc
.tools
.remote
import CommUART
84 print("Using CommUART, port: {} / baudrate: {}".format(args
.port
, args
.baudrate
))
85 comm
= CommUART(args
.port
if not args
.port
.isdigit() else int(args
.port
),
89 raise NotImplementedError
91 server
= RemoteServer(comm
)
96 while True: time
.sleep(100)
97 except KeyboardInterrupt:
100 if __name__
== "__main__":