3 # This file is Copyright (c) 2015-2019 Florent Kermarrec <florent@enjoy-digital.fr>
4 # This file is Copyright (c) 2019 Sean Cross <sean@xobs.io>
5 # This file is Copyright (c) 2018 Felix Held <felix-github@felixheld.de>
15 from litex
.tools
.remote
.etherbone
import EtherbonePacket
, EtherboneRecord
, EtherboneWrites
16 from litex
.tools
.remote
.etherbone
import EtherboneIPC
19 class RemoteServer(EtherboneIPC
):
20 def __init__(self
, comm
, bind_ip
, bind_port
=1234):
22 self
.bind_ip
= bind_ip
23 self
.bind_port
= bind_port
27 if hasattr(self
, "socket"):
30 if hasattr(socket
, "SO_REUSEADDR"):
31 socket_flags
= socket_flags | socket
.SO_REUSEADDR
32 if hasattr(socket
, "SO_REUSEPORT"):
33 socket_flags
= socket_flags | socket
.SO_REUSEPORT
34 self
.socket
= socket
.socket(socket
.AF_INET
, socket
.SOCK_STREAM
)
35 self
.socket
.setsockopt(socket
.SOL_SOCKET
, socket_flags
, 1)
36 self
.socket
.bind((self
.bind_ip
, self
.bind_port
))
37 print("tcp port: {:d}".format(self
.bind_port
))
43 if not hasattr(self
, "socket"):
48 def _serve_thread(self
):
50 client_socket
, addr
= self
.socket
.accept()
51 print("Connected with " + addr
[0] + ":" + str(addr
[1]))
55 packet
= self
.receive_packet(client_socket
)
60 packet
= EtherbonePacket(packet
)
63 record
= packet
.records
.pop()
73 if record
.writes
!= None:
74 self
.comm
.write(record
.writes
.base_addr
, record
.writes
.get_datas())
77 if record
.reads
!= None:
79 for addr
in record
.reads
.get_addrs():
80 reads
.append(self
.comm
.read(addr
))
82 record
= EtherboneRecord()
83 record
.writes
= EtherboneWrites(datas
=reads
)
84 record
.wcount
= len(record
.writes
)
86 packet
= EtherbonePacket()
87 packet
.records
= [record
]
89 self
.send_packet(client_socket
, packet
)
98 def start(self
, nthreads
):
99 for i
in range(nthreads
):
100 self
.serve_thread
= threading
.Thread(target
=self
._serve
_thread
)
101 self
.serve_thread
.setDaemon(True)
102 self
.serve_thread
.start()
106 print("LiteX remote server")
107 parser
= argparse
.ArgumentParser()
109 parser
.add_argument("--bind-ip", default
="localhost",
110 help="Host bind address")
111 parser
.add_argument("--bind-port", default
=1234,
112 help="Host bind port")
115 parser
.add_argument("--uart", action
="store_true",
116 help="Select UART interface")
117 parser
.add_argument("--uart-port", default
=None,
118 help="Set UART port")
119 parser
.add_argument("--uart-baudrate", default
=115200,
120 help="Set UART baudrate")
123 parser
.add_argument("--udp", action
="store_true",
124 help="Select UDP interface")
125 parser
.add_argument("--udp-ip", default
="192.168.1.50",
126 help="Set UDP remote IP address")
127 parser
.add_argument("--udp-port", default
=1234,
128 help="Set UDP remote port")
131 parser
.add_argument("--pcie", action
="store_true",
132 help="Select PCIe interface")
133 parser
.add_argument("--pcie-bar", default
=None,
137 parser
.add_argument("--usb", action
="store_true",
138 help="Select USB interface")
139 parser
.add_argument("--usb-vid", default
=None,
140 help="Set USB vendor ID")
141 parser
.add_argument("--usb-pid", default
=None,
142 help="Set USB product ID")
143 parser
.add_argument("--usb-max-retries", default
=10,
144 help="Number of times to try reconnecting to USB")
145 args
= parser
.parse_args()
149 from litex
.tools
.remote
.comm_uart
import CommUART
150 if args
.uart_port
is None:
151 print("Need to specify --uart-port, exiting.")
153 uart_port
= args
.uart_port
154 uart_baudrate
= int(float(args
.uart_baudrate
))
155 print("[CommUART] port: {} / baudrate: {} / ".format(uart_port
, uart_baudrate
), end
="")
156 comm
= CommUART(uart_port
, uart_baudrate
)
158 from litex
.tools
.remote
.comm_udp
import CommUDP
160 udp_port
= int(args
.udp_port
)
161 print("[CommUDP] ip: {} / port: {} / ".format(udp_ip
, udp_port
), end
="")
162 comm
= CommUDP(udp_ip
, udp_port
)
164 from litex
.tools
.remote
.comm_pcie
import CommPCIe
165 pcie_bar
= args
.pcie_bar
166 if args
.pcie_bar
is None:
167 print("Need to speficy --pcie-bar, exiting.")
169 print("[CommPCIe] bar: {} / ".format(args
.pcie_bar
), end
="")
170 comm
= CommPCIe(args
.pcie_bar
)
172 from litex
.tools
.remote
.comm_usb
import CommUSB
173 if args
.usb_pid
is None and args
.usb_vid
is None:
174 print("Need to speficy --usb-vid or --usb-pid, exiting.")
176 print("[CommUSB] vid: {} / pid: {} / ".format(args
.usb_vid
, args
.usb_pid
), end
="")
179 pid
= int(pid
, base
=0)
182 vid
= int(vid
, base
=0)
183 comm
= CommUSB(vid
=vid
, pid
=pid
, max_retries
=args
.usb_max_retries
)
188 server
= RemoteServer(comm
, args
.bind_ip
, int(args
.bind_port
))
193 while True: time
.sleep(100)
194 except KeyboardInterrupt:
197 if __name__
== "__main__":