1 /***************************************************************************
2 * Copyright (C) 2007 by Pavel Chromy *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
26 /* project specific includes */
30 #include "configuration.h"
38 bitq_interface_t
*bitq_interface
; /* low level bit queue interface */
40 bitq_state_t bitq_in_state
; /* state of input queue */
42 u8
*bitq_in_buffer
; /* buffer dynamically reallocated as needed */
43 unsigned long bitq_in_bufsize
=32; /* min. buffer size */
47 * input queue processing does not use jtag_read_buffer() to avoid unnecessary overhead
48 * also the buffer for incomming data is reallocated only if necessary
49 * no parameters, makes use of stored state information
51 void bitq_in_proc(void)
53 /* static information preserved between calls to increase performance */
54 static u8
*in_buff
; /* pointer to buffer for scanned data */
55 static int in_idx
; /* index of byte being scanned */
56 static u8 in_mask
; /* mask of next bit to be scanned */
61 /* loop through the queue */
62 while (bitq_in_state
.cmd
) {
63 /* only JTAG_SCAN command may return data */
64 if (bitq_in_state
.cmd
->type
==JTAG_SCAN
) {
65 /* loop through the fields */
66 while (bitq_in_state
.field_idx
<bitq_in_state
.cmd
->cmd
.scan
->num_fields
) {
68 field
=&bitq_in_state
.cmd
->cmd
.scan
->fields
[bitq_in_state
.field_idx
];
69 if ( field
->in_value
|| field
->in_handler
) {
71 if (bitq_in_state
.bit_pos
==0) {
72 /* initialize field scanning */
75 if (field
->in_value
) in_buff
=field
->in_value
;
77 /* buffer reallocation needed? */
78 if (field
->num_bits
>bitq_in_bufsize
*8) {
79 /* buffer previously allocated? */
80 if (bitq_in_buffer
!=NULL
) {
85 /* double the buffer size until it fits */
86 while (field
->num_bits
>bitq_in_bufsize
*8) bitq_in_bufsize
*=2;
88 /* if necessary, allocate buffer and check for malloc error */
89 if (bitq_in_buffer
==NULL
&& (bitq_in_buffer
=malloc(bitq_in_bufsize
))==NULL
) {
90 LOG_ERROR("malloc error");
93 in_buff
=(void *)bitq_in_buffer
;
98 while (bitq_in_state
.bit_pos
<field
->num_bits
) {
99 if ((tdo
=bitq_interface
->in())<0) {
100 #ifdef _DEBUG_JTAG_IO_
101 LOG_DEBUG("bitq in EOF");
105 if (in_mask
==0x01) in_buff
[in_idx
]=0;
106 if (tdo
) in_buff
[in_idx
]|=in_mask
;
112 bitq_in_state
.bit_pos
++;
116 if (field
->in_handler
&& bitq_in_state
.status
==ERROR_OK
) {
117 bitq_in_state
.status
=(*field
->in_handler
)(in_buff
, field
->in_handler_priv
, field
);
122 bitq_in_state
.field_idx
++; /* advance to next field */
123 bitq_in_state
.bit_pos
=0; /* start next field from the first bit */
127 bitq_in_state
.cmd
=bitq_in_state
.cmd
->next
; /* advance to next command */
128 bitq_in_state
.field_idx
=0; /* preselect first field */
134 void bitq_io(int tms
, int tdi
, int tdo_req
)
136 bitq_interface
->out(tms
, tdi
, tdo_req
);
137 /* check and process the input queue */
138 if (bitq_interface
->in_rdy()) bitq_in_proc();
142 void bitq_end_state(enum tap_state state
)
144 if (state
==-1) return;
145 if (tap_move_map
[state
]==-1) {
146 LOG_ERROR("BUG: %i is not a valid end state", state
);
153 void bitq_state_move(enum tap_state new_state
)
158 if (tap_move_map
[cur_state
]==-1 || tap_move_map
[new_state
]==-1) {
159 LOG_ERROR("TAP move from or to unstable state");
163 tms_scan
=TAP_MOVE(cur_state
, new_state
);
165 for (i
=0; i
<7; i
++) {
166 bitq_io(tms_scan
&1, 0, 0);
170 cur_state
= new_state
;
174 void bitq_path_move(pathmove_command_t
*cmd
)
178 for (i
=0; i
<=cmd
->num_states
; i
++) {
179 if (tap_transitions
[cur_state
].low
== cmd
->path
[i
]) bitq_io(0, 0, 0);
180 else if (tap_transitions
[cur_state
].high
== cmd
->path
[i
]) bitq_io(1, 0, 0);
182 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings
[cur_state
], tap_state_strings
[cmd
->path
[i
]]);
186 cur_state
= cmd
->path
[i
];
189 end_state
= cur_state
;
193 void bitq_runtest(int num_cycles
)
197 /* only do a state_move when we're not already in RTI */
198 if (cur_state
!= TAP_RTI
) bitq_state_move(TAP_RTI
);
200 /* execute num_cycles */
201 for (i
= 0; i
< num_cycles
; i
++)
204 /* finish in end_state */
205 if (cur_state
!= end_state
) bitq_state_move(end_state
);
209 void bitq_scan_field(scan_field_t
*field
, int pause
)
217 if ( field
->in_value
|| field
->in_handler
) tdo_req
=1;
220 if (field
->out_value
==NULL
) {
221 /* just send zeros and request data from TDO */
222 for (bit_cnt
=field
->num_bits
; bit_cnt
>1; bit_cnt
--)
223 bitq_io(0, 0, tdo_req
);
224 bitq_io(pause
, 0, tdo_req
);
227 /* send data, and optionally request TDO */
229 out_ptr
=field
->out_value
;
230 for (bit_cnt
=field
->num_bits
; bit_cnt
>1; bit_cnt
--) {
231 bitq_io(0, ((*out_ptr
)&out_mask
)!=0, tdo_req
);
232 if (out_mask
==0x80) {
238 bitq_io(pause
, ((*out_ptr
)&out_mask
)!=0, tdo_req
);
243 if (cur_state
==TAP_SI
) cur_state
=TAP_PI
;
244 else if (cur_state
==TAP_SD
) cur_state
=TAP_PD
;
249 void bitq_scan(scan_command_t
*cmd
)
253 if (cmd
->ir_scan
) bitq_state_move(TAP_SI
);
254 else bitq_state_move(TAP_SD
);
256 for (i
=0; i
< cmd
->num_fields
-1; i
++)
257 bitq_scan_field(&cmd
->fields
[i
], 0);
258 bitq_scan_field(&cmd
->fields
[i
], 1);
262 int bitq_execute_queue(void)
264 jtag_command_t
*cmd
= jtag_command_queue
; /* currently processed command */
266 bitq_in_state
.cmd
= jtag_command_queue
;
267 bitq_in_state
.field_idx
= 0;
268 bitq_in_state
.bit_pos
= 0;
269 bitq_in_state
.status
= ERROR_OK
;
276 #ifdef _DEBUG_JTAG_IO_
277 LOG_DEBUG("end_state: %i", cmd
->cmd
.end_state
->end_state
);
279 bitq_end_state(cmd
->cmd
.end_state
->end_state
);
283 #ifdef _DEBUG_JTAG_IO_
284 LOG_DEBUG("reset trst: %i srst %i", cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
286 if ((cmd
->cmd
.reset
->trst
== 1) || (cmd
->cmd
.reset
->srst
&& (jtag_reset_config
& RESET_SRST_PULLS_TRST
)))
290 bitq_interface
->reset(cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
291 if (bitq_interface
->in_rdy()) bitq_in_proc();
295 #ifdef _DEBUG_JTAG_IO_
296 LOG_DEBUG("runtest %i cycles, end in %i", cmd
->cmd
.runtest
->num_cycles
, cmd
->cmd
.runtest
->end_state
);
298 bitq_end_state(cmd
->cmd
.runtest
->end_state
);
299 bitq_runtest(cmd
->cmd
.runtest
->num_cycles
);
303 #ifdef _DEBUG_JTAG_IO_
304 LOG_DEBUG("statemove end in %i", cmd
->cmd
.statemove
->end_state
);
306 bitq_end_state(cmd
->cmd
.statemove
->end_state
);
307 bitq_state_move(end_state
); /* uncoditional TAP move */
311 #ifdef _DEBUG_JTAG_IO_
312 LOG_DEBUG("pathmove: %i states, end in %i", cmd
->cmd
.pathmove
->num_states
, cmd
->cmd
.pathmove
->path
[cmd
->cmd
.pathmove
->num_states
- 1]);
314 bitq_path_move(cmd
->cmd
.pathmove
);
318 #ifdef _DEBUG_JTAG_IO_
319 LOG_DEBUG("scan end in %i", cmd
->cmd
.scan
->end_state
);
320 if (cmd
->cmd
.scan
->ir_scan
) LOG_DEBUG("scan ir");
321 else LOG_DEBUG("scan dr");
323 bitq_end_state(cmd
->cmd
.scan
->end_state
);
324 bitq_scan(cmd
->cmd
.scan
);
325 if (cur_state
!= end_state
) bitq_state_move(end_state
);
329 #ifdef _DEBUG_JTAG_IO_
330 LOG_DEBUG("sleep %i", cmd
->cmd
.sleep
->us
);
332 bitq_interface
->sleep(cmd
->cmd
.sleep
->us
);
333 if (bitq_interface
->in_rdy()) bitq_in_proc();
337 LOG_ERROR("BUG: unknown JTAG command type encountered");
344 bitq_interface
->flush();
347 if (bitq_in_state
.cmd
) {
348 LOG_ERROR("missing data from bitq interface");
349 return ERROR_JTAG_QUEUE_FAILED
;
351 if (bitq_interface
->in()>=0) {
352 LOG_ERROR("extra data from bitq interface");
353 return ERROR_JTAG_QUEUE_FAILED
;
356 return bitq_in_state
.status
;
360 void bitq_cleanup(void)
362 if (bitq_in_buffer
!=NULL
)
364 free(bitq_in_buffer
);