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
.bus
.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_read_write_reg(dut
, addr
, d_len
, d_in
=0):
75 yield from jtag_set_run(dut
)
76 yield from jtag_set_shift_ir(dut
)
77 yield from tms_data_getset(dut
, 0, dut
._ir
_width
, addr
)
78 yield from jtag_set_idle(dut
)
80 yield from jtag_set_shift_dr(dut
)
81 result
= yield from tms_data_getset(dut
, 0, d_len
, d_in
)
82 yield from jtag_set_idle(dut
)
88 # loop and receive data from client
89 tdo
= yield dut
.bus
.tdo
90 #print ("server tdo data", tdo)
91 data
= dut
.s
.jtagremote_server_recv(tdo
)
92 #print ("server recv data", data)
97 yield dut
.bus
.tck
.eq(tck
)
98 yield dut
.bus
.tms
.eq(tms
)
99 yield dut
.bus
.tdi
.eq(tdi
)
104 def get_data(s
, length
=1024, timeout
=None):
105 r
, w
, e
= select
.select( [s
], [], [], timeout
)
108 #incoming message from remote server
110 return sock
.recv(length
)
114 def __init__(self
, debug
=False):
118 s
= socket
.socket(AF_INET
, SOCK_STREAM
)
119 s
.setsockopt(socket
.SOL_SOCKET
, socket
.SO_REUSEADDR
, 1)
120 s
.setsockopt(socket
.SOL_TCP
, socket
.TCP_NODELAY
, 1)
122 s
.listen(1) #only needs to receive one connection (the client)
131 def get_connection(self
, timeout
=0):
132 r
, w
, e
= select
.select( [self
.s
], [], [], timeout
)
134 #incoming message from remote server
136 conn
, addr
= self
.s
.accept() #accepts the connection
138 print("Connected by: ", addr
) #prints the connection
139 conn
.setsockopt(socket
.SOL_TCP
, socket
.TCP_NODELAY
, 1)
144 def get_data(self
, length
=1024, timeout
=None):
145 return get_data(self
.conn
, length
, timeout
)
147 def send(self
, data
):
148 return self
.conn
.sendall(data
)
150 def jtagremote_server_recv(self
, tdo
):
151 data
= self
.get_data(1, 0) # read 1 byte, non-blocking
153 return None # no data read
154 data
= bytes
.decode(data
)
156 print ("jtagremote_server_recv", data
)
157 # request to read TDO
159 self
.send(str.encode(chr(ord('0') + tdo
)))
161 # decode tck, tms, tdi
162 data
= ord(data
) - ord('0')
163 # encode tck, tms and tdi as number from 0-7
164 tdi
= 1 if (data
& 1) else 0
165 tms
= 1 if (data
& 2) else 0
166 tck
= 1 if (data
& 4) else 0
168 return (tck
, tms
, tdi
)
173 def __init__(self
, debug
=False):
177 s
= socket
.socket(AF_INET
, SOCK_STREAM
)
178 s
.setsockopt(socket
.SOL_TCP
, socket
.TCP_NODELAY
, 1)
179 s
.connect((HOST
, PORT
))
185 def get_data(self
, length
=1024, timeout
=None):
186 return get_data(self
.s
, length
, timeout
)
188 def send(self
, data
):
189 return self
.s
.sendall(data
)
191 def jtagremote_client_send(self
, to_send
):
192 # encode tck, tms and tdi as number from 0-7
193 tck
, tms
, tdi
= to_send
198 data
= chr(ord('0') + data
)
199 self
.send(str.encode(data
))
201 print ("jtagremote_client_send", data
)
203 self
.send(str.encode('R'))
206 def jtagremote_client_recv(self
, timeout
=None):
207 data
= self
.get_data(1, timeout
) # read 1 byte, blocking
211 print ("client recv", data
)
212 data
= bytes
.decode(data
)
213 return ord(data
) - ord('0') # subtract ASCII for "0" to give 0 or 1