3 from socket
import close
, AF_INET
, SOCK_STREAM
10 tck
= yield dut
.cbus
.tck
11 tms
= yield dut
.cbus
.tms
12 tdi
= yield dut
.cbus
.tdi
13 dut
.c
.jtagremote_client_send((tck
, tms
, tdi
))
14 #print ("about to client recv")
16 tdo
= dut
.c
.jtagremote_client_recv(timeout
=0)
20 yield dut
.cbus
.tdo
.eq(tdo
)
23 def tms_state_set(dut
, bits
):
25 yield dut
.cbus
.tck
.eq(1)
26 yield dut
.cbus
.tms
.eq(bit
)
27 yield from client_sync(dut
)
29 yield dut
.cbus
.tck
.eq(0)
30 yield from client_sync(dut
)
32 yield from client_sync(dut
)
33 yield dut
.cbus
.tms
.eq(0)
34 yield from client_sync(dut
)
37 def tms_data_getset(dut
, tms
, d_len
, d_in
=0):
39 yield dut
.cbus
.tms
.eq(tms
)
40 for i
in range(d_len
):
41 tdi
= 1 if (d_in
& (1<<i
)) else 0
42 yield dut
.cbus
.tck
.eq(1)
43 yield from client_sync(dut
)
44 res |
= (1<<i
) if (yield dut
.cbus
.tdo
) else 0
46 yield from client_sync(dut
)
47 yield dut
.cbus
.tdi
.eq(tdi
)
48 yield dut
.cbus
.tck
.eq(0)
49 yield from client_sync(dut
)
51 yield from client_sync(dut
)
52 yield dut
.cbus
.tms
.eq(0)
53 yield from client_sync(dut
)
58 def jtag_set_reset(dut
):
59 yield from tms_state_set(dut
, [1, 1, 1, 1, 1])
61 def jtag_set_shift_dr(dut
):
62 yield from tms_state_set(dut
, [1, 0, 0])
64 def jtag_set_shift_ir(dut
):
65 yield from tms_state_set(dut
, [1, 1, 0])
67 def jtag_set_run(dut
):
68 yield from tms_state_set(dut
, [0])
70 def jtag_set_idle(dut
):
71 yield from tms_state_set(dut
, [1, 1, 0])
74 def jtag_set_ir(dut
, addr
):
75 yield from jtag_set_run(dut
)
76 yield from jtag_set_shift_ir(dut
)
77 result
= yield from tms_data_getset(dut
, 0, dut
._ir
_width
, addr
)
78 yield from jtag_set_idle(dut
)
82 def jtag_set_get_dr(dut
, d_len
, d_in
=0):
83 yield from jtag_set_shift_dr(dut
)
84 result
= yield from tms_data_getset(dut
, 0, d_len
, d_in
)
85 yield from jtag_set_idle(dut
)
88 def jtag_read_write_reg(dut
, addr
, d_len
, d_in
=0):
89 yield from jtag_set_ir(dut
, addr
)
90 return (yield from jtag_set_get_dr(dut
, d_len
, d_in
))
95 # loop and receive data from client
96 tdo
= yield dut
.bus
.tdo
97 #print ("server tdo data", tdo)
98 data
= dut
.s
.jtagremote_server_recv(tdo
)
99 #print ("server recv data", data)
104 yield dut
.bus
.tck
.eq(tck
)
105 yield dut
.bus
.tms
.eq(tms
)
106 yield dut
.bus
.tdi
.eq(tdi
)
108 print ("jtag srv stopping")
111 def get_data(s
, length
=1024, timeout
=None):
112 r
, w
, e
= select
.select( [s
], [], [], timeout
)
115 #incoming message from remote server
117 return sock
.recv(length
)
121 def __init__(self
, debug
=False):
125 s
= socket
.socket(AF_INET
, SOCK_STREAM
)
126 s
.setsockopt(socket
.SOL_SOCKET
, socket
.SO_REUSEADDR
, 1)
127 s
.setsockopt(socket
.SOL_TCP
, socket
.TCP_NODELAY
, 1)
129 s
.listen(1) #only needs to receive one connection (the client)
138 def get_connection(self
, timeout
=0):
139 r
, w
, e
= select
.select( [self
.s
], [], [], timeout
)
141 #incoming message from remote server
143 conn
, addr
= self
.s
.accept() #accepts the connection
145 print("Connected by: ", addr
) #prints the connection
146 conn
.setsockopt(socket
.SOL_TCP
, socket
.TCP_NODELAY
, 1)
151 def get_data(self
, length
=1024, timeout
=None):
152 return get_data(self
.conn
, length
, timeout
)
154 def send(self
, data
):
155 return self
.conn
.sendall(data
)
157 def jtagremote_server_recv(self
, tdo
):
158 data
= self
.get_data(1, 0) # read 1 byte, non-blocking
160 return None # no data read
161 data
= bytes
.decode(data
)
163 print ("jtagremote_server_recv", data
)
164 # request to read TDO
166 self
.send(str.encode(chr(ord('0') + tdo
)))
168 # decode tck, tms, tdi
169 data
= ord(data
) - ord('0')
170 # encode tck, tms and tdi as number from 0-7
171 tdi
= 1 if (data
& 1) else 0
172 tms
= 1 if (data
& 2) else 0
173 tck
= 1 if (data
& 4) else 0
175 return (tck
, tms
, tdi
)
180 def __init__(self
, debug
=False):
184 s
= socket
.socket(AF_INET
, SOCK_STREAM
)
185 s
.setsockopt(socket
.SOL_TCP
, socket
.TCP_NODELAY
, 1)
186 s
.connect((HOST
, PORT
))
192 def get_data(self
, length
=1024, timeout
=None):
193 return get_data(self
.s
, length
, timeout
)
195 def send(self
, data
):
196 return self
.s
.sendall(data
)
198 def jtagremote_client_send(self
, to_send
):
199 # encode tck, tms and tdi as number from 0-7
200 tck
, tms
, tdi
= to_send
205 data
= chr(ord('0') + data
)
206 self
.send(str.encode(data
))
208 print ("jtagremote_client_send", data
)
210 self
.send(str.encode('R'))
213 def jtagremote_client_recv(self
, timeout
=None):
214 data
= self
.get_data(1, timeout
) # read 1 byte, blocking
218 print ("client recv", data
)
219 data
= bytes
.decode(data
)
220 return ord(data
) - ord('0') # subtract ASCII for "0" to give 0 or 1