7
7
"""JTAG tools.
8
8
"""
9
9
10
+ from binascii import hexlify
10
11
from logging import getLogger
11
12
from time import sleep
12
13
from typing import Optional , Union
@@ -132,8 +133,7 @@ def system_reset(self) -> None:
132
133
def quit (self ) -> None :
133
134
self .close ()
134
135
135
- def write_tms (self , modesel : BitSequence , immediate : bool = True ) \
136
- -> BitSequence :
136
+ def write_tms (self , modesel : BitSequence ) -> BitSequence :
137
137
if not isinstance (modesel , BitSequence ):
138
138
raise ValueError ('Not a BitSequence' )
139
139
length = len (modesel )
@@ -153,38 +153,32 @@ def write_tms(self, modesel: BitSequence, immediate: bool = True) \
153
153
fcmd = Ftdi .RW_BITS_TMS_PVE_NVE
154
154
else :
155
155
self ._log .debug ('WRITE TMS [%d] %s' , length , modesel )
156
- fcmd = Ftdi .WRITE_BITS_TMS_NVE
156
+ fcmd = Ftdi .RW_BITS_TMS_PVE_NVE
157
157
self ._log .debug ('TMS %02x' , byte )
158
158
cmd = bytes ((fcmd , length - 1 , byte ))
159
- self ._ftdi .purge_rx_buffer ()
159
+ # self._ftdi.purge_rx_buffer()
160
160
self ._push_bytes (cmd )
161
- if immediate or lbit :
162
- self ._flush ()
163
- if lbit :
164
- bs = self ._read_bits (length )
165
- return bs .pop_right ()
166
- return BitSequence ()
161
+ self ._flush ()
162
+ bs = self ._read_bits (length )
163
+ return bs
167
164
168
- def write (self , out : BitSequence , immediate : bool = True ) -> None :
165
+ def write (self , out : BitSequence ) -> None :
169
166
if not isinstance (out , BitSequence ):
170
167
raise ValueError ('Not a BitSequence' )
171
168
self ._last_tdi = out .pop_left_bit ()
172
- self ._log .debug ("WRITE TDI %s [+%u]" , out , self ._last_tdi )
173
169
byte_count = len (out )// 8
174
170
pos = 8 * byte_count
175
171
bit_count = len (out )- pos
176
- self ._log .debug ('%dB , %db len %d' , byte_count , bit_count , len (out ))
172
+ self ._log .debug ('%d B , %d b len %d' , byte_count , bit_count , len (out ))
177
173
if byte_count :
178
174
self ._prepare_write_bytes (byte_count )
179
- self ._write_bytes (out [: pos ])
175
+ self ._write_bytes (out [bit_count : ])
180
176
if bit_count :
181
177
self ._prepare_write_bits (bit_count )
182
- self ._write_bits (out [pos :])
183
- if immediate :
184
- self ._flush ()
178
+ self ._write_bits (out [:bit_count ])
179
+ self ._flush ()
185
180
186
- def read (self , length : int , tdi : Optional [bool ] = None ) -> BitSequence :
187
- # tdi argument is not used with PyFtdi for now
181
+ def read (self , length : int ) -> BitSequence :
188
182
self ._log .debug ("READ TDO %d" , length )
189
183
byte_count = length // 8
190
184
bit_count = length - 8 * byte_count
@@ -197,24 +191,24 @@ def read(self, length: int, tdi: Optional[bool] = None) -> BitSequence:
197
191
if byte_count :
198
192
bs .push_right (self ._read_bytes (byte_count ))
199
193
if bit_count :
200
- bs .push_right (self ._read_bits (bit_count ))
194
+ bs .push_left (self ._read_bits (bit_count ))
201
195
return bs
202
196
203
197
def exchange (self , out : BitSequence ) -> BitSequence :
204
198
self ._last_tdi = out .pop_left_bit ()
205
199
length = len (out )
206
- self ._log .debug ("WRITE TDI %s [+%u] + READ TDO %u" , out , self . _last_tdi ,
207
- length )
200
+ self ._log .debug ("WRITE TDI %s [+%u] + READ TDO %u" ,
201
+ out , self . _last_tdi , length )
208
202
byte_count = length // 8
209
203
bit_count = length - 8 * byte_count
210
204
pos = 8 * byte_count
211
205
bs = BitSequence ()
212
206
if byte_count :
213
207
self ._prepare_exchange_bytes (byte_count )
214
- self ._write_bytes (out [: pos ])
208
+ self ._write_bytes (out [- pos : ])
215
209
if bit_count :
216
210
self ._prepare_exchange_bits (bit_count )
217
- self ._write_bits (out [pos : ])
211
+ self ._write_bits (out [: - pos ])
218
212
self ._flush ()
219
213
if byte_count :
220
214
bs = self ._read_bytes (byte_count )
@@ -234,6 +228,7 @@ def _push_bytes(self, cmd: Union[bytes, bytearray]):
234
228
235
229
def _flush (self ):
236
230
self ._log .debug ('flushing %d bytes' , len (self ._write_buff ))
231
+ self ._log .debug (' [%s]' , hexlify (self ._write_buff ).decode ())
237
232
if self ._write_buff :
238
233
self ._ftdi .write_data (self ._write_buff )
239
234
self ._write_buff = bytearray ()
@@ -253,7 +248,7 @@ def _prepare_write_bits(self, length: int) -> None:
253
248
def _write_bits (self , out : BitSequence ) -> None :
254
249
"""Output bits on TDI"""
255
250
byte = out .to_byte ()
256
- self ._log .debug ('WRITE BITS %s / 0x%02x' , out , byte )
251
+ self ._log .debug ('%s ( 0x%02x) ' , out , byte )
257
252
self ._push_bytes (bytes ((byte ,)))
258
253
259
254
def _prepare_exchange_bits (self , length : int ) -> None :
@@ -299,11 +294,10 @@ def _read_bytes(self, length: int) -> BitSequence:
299
294
data = self ._ftdi .read_data_bytes (length , 4 )
300
295
if len (data ) != length :
301
296
raise JtagError ('Failed to read from FTDI' )
302
- bs = BitSequence .from_bytestream (data , lsbyte = True )
303
- self ._log .debug ('READ BYTES %s' , bs )
297
+ bs = BitSequence .from_bytestream (data , True )
304
298
return bs
305
299
306
300
def _write_bytes (self , out : BitSequence ) -> None :
307
301
"""Output bytes on TDI"""
308
- self ._log .debug ('WRITE BYTES %s' , out )
309
- self ._push_bytes (out .to_bytestream ())
302
+ self ._log .debug ('%s' , out )
303
+ self ._push_bytes (out .to_bytestream (True ))
0 commit comments