David Brownell <david-b@pacbell.net>:
[fw/openocd] / src / jtag / jtag.c
1 /***************************************************************************
2  *   Copyright (C) 2005 by Dominic Rath                                    *
3  *   Dominic.Rath@gmx.de                                                   *
4  *                                                                         *
5  *   Copyright (C) 2007,2008 Ã˜yvind Harboe                                 *
6  *   oyvind.harboe@zylin.com                                               *
7  *                                                                         *
8  *   Copyright (C) 2009 SoftPLC Corporation                                *
9  *       http://softplc.com                                                *
10  *   dick@softplc.com                                                      *
11  *                                                                         *
12  *   This program is free software; you can redistribute it and/or modify  *
13  *   it under the terms of the GNU General Public License as published by  *
14  *   the Free Software Foundation; either version 2 of the License, or     *
15  *   (at your option) any later version.                                   *
16  *                                                                         *
17  *   This program is distributed in the hope that it will be useful,       *
18  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
19  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
20  *   GNU General Public License for more details.                          *
21  *                                                                         *
22  *   You should have received a copy of the GNU General Public License     *
23  *   along with this program; if not, write to the                         *
24  *   Free Software Foundation, Inc.,                                       *
25  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
26  ***************************************************************************/
27 #ifdef HAVE_CONFIG_H
28 #include "config.h"
29 #endif
30
31 #include "jtag.h"
32 #include "minidriver.h"
33 #include "interface.h"
34
35 #ifdef HAVE_STRINGS_H
36 #include <strings.h>
37 #endif
38
39
40 int jtag_flush_queue_count; /* count # of flushes for profiling / debugging purposes */
41
42 static void jtag_add_scan_check(void (*jtag_add_scan)(int in_num_fields, const scan_field_t *in_fields, tap_state_t state),
43                 int in_num_fields, scan_field_t *in_fields, tap_state_t state);
44
45 /* note that this is not marked as static as it must be available from outside jtag.c for those
46    that implement the jtag_xxx() minidriver layer
47 */
48 int jtag_error=ERROR_OK;
49
50 char* jtag_event_strings[] =
51 {
52         "JTAG controller reset (RESET or TRST)"
53 };
54
55 const Jim_Nvp nvp_jtag_tap_event[] = {
56         { .value = JTAG_TAP_EVENT_ENABLE,       .name = "tap-enable" },
57         { .value = JTAG_TAP_EVENT_DISABLE,      .name = "tap-disable" },
58
59         { .name = NULL, .value = -1 }
60 };
61
62 int jtag_trst = 0;
63 int jtag_srst = 0;
64
65 static jtag_tap_t *jtag_all_taps = NULL;
66
67 enum reset_types jtag_reset_config = RESET_NONE;
68 tap_state_t cmd_queue_end_state = TAP_RESET;
69 tap_state_t cmd_queue_cur_state = TAP_RESET;
70
71 int jtag_verify_capture_ir = 1;
72 int jtag_verify = 1;
73
74 /* how long the OpenOCD should wait before attempting JTAG communication after reset lines deasserted (in ms) */
75 static int jtag_nsrst_delay = 0; /* default to no nSRST delay */
76 static int jtag_ntrst_delay = 0; /* default to no nTRST delay */
77
78 /* maximum number of JTAG devices expected in the chain
79  */
80 #define JTAG_MAX_CHAIN_SIZE 20
81
82 /* callbacks to inform high-level handlers about JTAG state changes */
83 jtag_event_callback_t *jtag_event_callbacks;
84
85 /* speed in kHz*/
86 static int speed_khz = 0;
87 /* flag if the kHz speed was defined */
88 static int hasKHz = 0;
89
90 /* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
91  */
92
93 #if BUILD_ECOSBOARD == 1
94         extern jtag_interface_t zy1000_interface;
95 #endif
96
97 #if BUILD_PARPORT == 1
98         extern jtag_interface_t parport_interface;
99 #endif
100
101 #if BUILD_DUMMY == 1
102         extern jtag_interface_t dummy_interface;
103 #endif
104
105 #if BUILD_FT2232_FTD2XX == 1
106         extern jtag_interface_t ft2232_interface;
107 #endif
108
109 #if BUILD_FT2232_LIBFTDI == 1
110         extern jtag_interface_t ft2232_interface;
111 #endif
112
113 #if BUILD_AMTJTAGACCEL == 1
114         extern jtag_interface_t amt_jtagaccel_interface;
115 #endif
116
117 #if BUILD_EP93XX == 1
118         extern jtag_interface_t ep93xx_interface;
119 #endif
120
121 #if BUILD_AT91RM9200 == 1
122         extern jtag_interface_t at91rm9200_interface;
123 #endif
124
125 #if BUILD_GW16012 == 1
126         extern jtag_interface_t gw16012_interface;
127 #endif
128
129 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
130         extern jtag_interface_t presto_interface;
131 #endif
132
133 #if BUILD_USBPROG == 1
134         extern jtag_interface_t usbprog_interface;
135 #endif
136
137 #if BUILD_JLINK == 1
138         extern jtag_interface_t jlink_interface;
139 #endif
140
141 #if BUILD_VSLLINK == 1
142         extern jtag_interface_t vsllink_interface;
143 #endif
144
145 #if BUILD_RLINK == 1
146         extern jtag_interface_t rlink_interface;
147 #endif
148
149 #if BUILD_ARMJTAGEW == 1
150         extern jtag_interface_t armjtagew_interface;
151 #endif
152
153 jtag_interface_t *jtag_interfaces[] = {
154 #if BUILD_ECOSBOARD == 1
155         &zy1000_interface,
156 #endif
157 #if BUILD_PARPORT == 1
158         &parport_interface,
159 #endif
160 #if BUILD_DUMMY == 1
161         &dummy_interface,
162 #endif
163 #if BUILD_FT2232_FTD2XX == 1
164         &ft2232_interface,
165 #endif
166 #if BUILD_FT2232_LIBFTDI == 1
167         &ft2232_interface,
168 #endif
169 #if BUILD_AMTJTAGACCEL == 1
170         &amt_jtagaccel_interface,
171 #endif
172 #if BUILD_EP93XX == 1
173         &ep93xx_interface,
174 #endif
175 #if BUILD_AT91RM9200 == 1
176         &at91rm9200_interface,
177 #endif
178 #if BUILD_GW16012 == 1
179         &gw16012_interface,
180 #endif
181 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
182         &presto_interface,
183 #endif
184 #if BUILD_USBPROG == 1
185         &usbprog_interface,
186 #endif
187 #if BUILD_JLINK == 1
188         &jlink_interface,
189 #endif
190 #if BUILD_VSLLINK == 1
191         &vsllink_interface,
192 #endif
193 #if BUILD_RLINK == 1
194         &rlink_interface,
195 #endif
196 #if BUILD_ARMJTAGEW == 1
197         &armjtagew_interface,
198 #endif
199         NULL,
200 };
201
202 struct jtag_interface_s *jtag = NULL;
203
204 /* configuration */
205 static jtag_interface_t *jtag_interface = NULL;
206 int jtag_speed = 0;
207
208 /* jtag commands */
209 static int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
210 static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
211 static int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
212 static int handle_jtag_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
213 static int handle_reset_config_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
214 static int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
215 static int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
216
217 static int handle_scan_chain_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
218
219 static int handle_endstate_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
220 static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
221 static int handle_runtest_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
222 static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
223 static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
224 static int Jim_Command_flush_count(Jim_Interp *interp, int argc, Jim_Obj *const *args);
225
226 static int handle_verify_ircapture_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
227 static int handle_verify_jtag_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
228 static int handle_tms_sequence_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
229
230 jtag_tap_t *jtag_AllTaps(void)
231 {
232         return jtag_all_taps;
233 };
234
235 int jtag_NumTotalTaps(void)
236 {
237         jtag_tap_t *t;
238         int n;
239
240         n = 0;
241         t = jtag_AllTaps();
242         while(t){
243                 n++;
244                 t = t->next_tap;
245         }
246         return n;
247 }
248
249 int jtag_NumEnabledTaps(void)
250 {
251         jtag_tap_t *t;
252         int n;
253
254         n = 0;
255         t = jtag_AllTaps();
256         while(t){
257                 if( t->enabled ){
258                         n++;
259                 }
260                 t = t->next_tap;
261         }
262         return n;
263 }
264
265 jtag_tap_t *jtag_TapByString( const char *s )
266 {
267         jtag_tap_t *t;
268         char *cp;
269
270         t = jtag_AllTaps();
271         /* try name first */
272         while(t){
273                 if( 0 == strcmp( t->dotted_name, s ) ){
274                         break;
275                 } else {
276                         t = t->next_tap;
277                 }
278         }
279         /* backup plan is by number */
280         if( t == NULL ){
281                 /* ok - is "s" a number? */
282                 int n;
283                 n = strtol( s, &cp, 0 );
284                 if( (s != cp) && (*cp == 0) ){
285                         /* Then it is... */
286                         t = jtag_TapByAbsPosition(n);
287                 }
288         }
289         return t;
290 }
291
292 jtag_tap_t * jtag_TapByJimObj( Jim_Interp *interp, Jim_Obj *o )
293 {
294         jtag_tap_t *t;
295         const char *cp;
296
297         cp = Jim_GetString( o, NULL );
298         if(cp == NULL){
299                 cp = "(unknown)";
300                 t = NULL;
301         }  else {
302                 t = jtag_TapByString( cp );
303         }
304         if( t == NULL ){
305                 Jim_SetResult_sprintf(interp,"Tap: %s is unknown", cp );
306         }
307         return t;
308 }
309
310 /* returns a pointer to the n-th device in the scan chain */
311 jtag_tap_t * jtag_TapByAbsPosition( int n )
312 {
313         int orig_n;
314         jtag_tap_t *t;
315
316         orig_n = n;
317         t = jtag_AllTaps();
318
319         while( t && (n > 0)) {
320                 n--;
321                 t = t->next_tap;
322         }
323         return t;
324 }
325
326 int jtag_register_event_callback(int (*callback)(enum jtag_event event, void *priv), void *priv)
327 {
328         jtag_event_callback_t **callbacks_p = &jtag_event_callbacks;
329
330         if (callback == NULL)
331         {
332                 return ERROR_INVALID_ARGUMENTS;
333         }
334
335         if (*callbacks_p)
336         {
337                 while ((*callbacks_p)->next)
338                         callbacks_p = &((*callbacks_p)->next);
339                 callbacks_p = &((*callbacks_p)->next);
340         }
341
342         (*callbacks_p) = malloc(sizeof(jtag_event_callback_t));
343         (*callbacks_p)->callback = callback;
344         (*callbacks_p)->priv = priv;
345         (*callbacks_p)->next = NULL;
346
347         return ERROR_OK;
348 }
349
350 int jtag_unregister_event_callback(int (*callback)(enum jtag_event event, void *priv))
351 {
352         jtag_event_callback_t **callbacks_p = &jtag_event_callbacks;
353
354         if (callback == NULL)
355         {
356                 return ERROR_INVALID_ARGUMENTS;
357         }
358
359         while (*callbacks_p)
360         {
361                 jtag_event_callback_t **next = &((*callbacks_p)->next);
362                 if ((*callbacks_p)->callback == callback)
363                 {
364                         free(*callbacks_p);
365                         *callbacks_p = *next;
366                 }
367                 callbacks_p = next;
368         }
369
370         return ERROR_OK;
371 }
372
373 int jtag_call_event_callbacks(enum jtag_event event)
374 {
375         jtag_event_callback_t *callback = jtag_event_callbacks;
376
377         LOG_DEBUG("jtag event: %s", jtag_event_strings[event]);
378
379         while (callback)
380         {
381                 callback->callback(event, callback->priv);
382                 callback = callback->next;
383         }
384
385         return ERROR_OK;
386 }
387
388 static void jtag_prelude1(void)
389 {
390         assert(jtag_trst == 0);
391
392         if (cmd_queue_end_state == TAP_RESET)
393                 jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
394 }
395
396 static void jtag_prelude(tap_state_t state)
397 {
398         jtag_prelude1();
399
400         if (state != TAP_INVALID)
401                 jtag_add_end_state(state);
402
403         cmd_queue_cur_state = cmd_queue_end_state;
404 }
405
406 void jtag_alloc_in_value32(scan_field_t *field)
407 {
408         interface_jtag_alloc_in_value32(field);
409 }
410
411 void jtag_add_ir_scan_noverify(int in_num_fields, const scan_field_t *in_fields, tap_state_t state)
412 {
413         int retval;
414         jtag_prelude(state);
415
416         retval=interface_jtag_add_ir_scan(in_num_fields, in_fields, cmd_queue_end_state);
417         if (retval!=ERROR_OK)
418                 jtag_error=retval;
419
420 }
421
422
423 /**
424  * Generate an IR SCAN with a list of scan fields with one entry for each enabled TAP.
425  *
426  * If the input field list contains an instruction value for a TAP then that is used
427  * otherwise the TAP is set to bypass.
428  *
429  * TAPs for which no fields are passed are marked as bypassed for subsequent DR SCANs.
430  *
431  */
432 void jtag_add_ir_scan(int in_num_fields, scan_field_t *in_fields, tap_state_t state)
433 {
434         if (jtag_verify&&jtag_verify_capture_ir)
435         {
436                 /* 8 x 32 bit id's is enough for all invocations */
437
438                 for (int j = 0; j < in_num_fields; j++)
439                 {
440                         /* if we are to run a verification of the ir scan, we need to get the input back.
441                          * We may have to allocate space if the caller didn't ask for the input back.
442                          */
443                         in_fields[j].check_value=in_fields[j].tap->expected;
444                         in_fields[j].check_mask=in_fields[j].tap->expected_mask;
445                 }
446                 jtag_add_scan_check(jtag_add_ir_scan_noverify, in_num_fields, in_fields, state);
447         } else
448         {
449                 jtag_add_ir_scan_noverify(in_num_fields, in_fields, state);
450         }
451 }
452
453 /**
454  * Duplicate the scan fields passed into the function into an IR SCAN command
455  *
456  * This function assumes that the caller handles extra fields for bypassed TAPs
457  *
458  */
459 void jtag_add_plain_ir_scan(int in_num_fields, const scan_field_t *in_fields, tap_state_t state)
460 {
461         int retval;
462
463         jtag_prelude(state);
464
465         retval=interface_jtag_add_plain_ir_scan(in_num_fields, in_fields, cmd_queue_end_state);
466         if (retval!=ERROR_OK)
467                 jtag_error=retval;
468 }
469
470 void jtag_add_callback(jtag_callback1_t f, u8 *in)
471 {
472         interface_jtag_add_callback(f, in);
473 }
474
475 void jtag_add_callback4(jtag_callback_t f, u8 *in,
476                 jtag_callback_data_t data1, jtag_callback_data_t data2,
477                 jtag_callback_data_t data3)
478 {
479         interface_jtag_add_callback4(f, in, data1, data2, data3);
480 }
481
482 int jtag_check_value_inner(u8 *captured, u8 *in_check_value, u8 *in_check_mask, int num_bits);
483
484 static int jtag_check_value_mask_callback(u8 *in, jtag_callback_data_t data1, jtag_callback_data_t data2, jtag_callback_data_t data3)
485 {
486         return jtag_check_value_inner(in, (u8 *)data1, (u8 *)data2, (int)data3);
487 }
488
489 static void jtag_add_scan_check(void (*jtag_add_scan)(int in_num_fields, const scan_field_t *in_fields, tap_state_t state),
490                 int in_num_fields, scan_field_t *in_fields, tap_state_t state)
491 {
492         for (int i = 0; i < in_num_fields; i++)
493         {
494                 struct scan_field_s *field = &in_fields[i];
495                 field->allocated = 0;
496                 field->modified = 0;
497                 if (field->check_value || field->in_value)
498                         continue;
499                 interface_jtag_add_scan_check_alloc(field);
500                 field->modified = 1;
501         }
502
503         jtag_add_scan(in_num_fields, in_fields, state);
504
505         for (int i = 0; i < in_num_fields; i++)
506         {
507                 if ((in_fields[i].check_value != NULL) && (in_fields[i].in_value != NULL))
508                 {
509                         /* this is synchronous for a minidriver */
510                         jtag_add_callback4(jtag_check_value_mask_callback, in_fields[i].in_value,
511                                 (jtag_callback_data_t)in_fields[i].check_value,
512                                 (jtag_callback_data_t)in_fields[i].check_mask,
513                                 (jtag_callback_data_t)in_fields[i].num_bits);
514                 }
515                 if (in_fields[i].allocated)
516                 {
517                         free(in_fields[i].in_value);
518                 }
519                 if (in_fields[i].modified)
520                 {
521                         in_fields[i].in_value = NULL;
522                 }
523         }
524 }
525
526 void jtag_add_dr_scan_check(int in_num_fields, scan_field_t *in_fields, tap_state_t state)
527 {
528         if (jtag_verify)
529         {
530                 jtag_add_scan_check(jtag_add_dr_scan, in_num_fields, in_fields, state);
531         } else
532         {
533                 jtag_add_dr_scan(in_num_fields, in_fields, state);
534         }
535 }
536
537
538 /**
539  * Generate a DR SCAN using the fields passed to the function
540  *
541  * For not bypassed TAPs the function checks in_fields and uses fields specified there.
542  * For bypassed TAPs the function generates a dummy 1bit field.
543  *
544  * The bypass status of TAPs is set by jtag_add_ir_scan().
545  *
546  */
547 void jtag_add_dr_scan(int in_num_fields, const scan_field_t *in_fields, tap_state_t state)
548 {
549         int retval;
550
551         jtag_prelude(state);
552
553         retval=interface_jtag_add_dr_scan(in_num_fields, in_fields, cmd_queue_end_state);
554         if (retval!=ERROR_OK)
555                 jtag_error=retval;
556 }
557
558
559
560 /**
561  * Duplicate the scan fields passed into the function into a DR SCAN command
562  *
563  * This function assumes that the caller handles extra fields for bypassed TAPs
564  *
565  */
566 void jtag_add_plain_dr_scan(int in_num_fields, const scan_field_t *in_fields, tap_state_t state)
567 {
568         int retval;
569
570         jtag_prelude(state);
571
572         retval=interface_jtag_add_plain_dr_scan(in_num_fields, in_fields, cmd_queue_end_state);
573         if (retval!=ERROR_OK)
574                 jtag_error=retval;
575 }
576
577 void jtag_add_dr_out(jtag_tap_t* tap,
578                 int num_fields, const int* num_bits, const u32* value,
579                 tap_state_t end_state)
580 {
581         if (end_state != TAP_INVALID)
582                 cmd_queue_end_state = end_state;
583
584         cmd_queue_cur_state = cmd_queue_end_state;
585
586         interface_jtag_add_dr_out(tap,
587                         num_fields, num_bits, value,
588                         cmd_queue_end_state);
589 }
590
591 void jtag_add_tlr(void)
592 {
593         jtag_prelude(TAP_RESET);
594
595         int retval;
596         retval=interface_jtag_add_tlr();
597         if (retval!=ERROR_OK)
598                 jtag_error=retval;
599 }
600
601 void jtag_add_pathmove(int num_states, const tap_state_t *path)
602 {
603         tap_state_t cur_state = cmd_queue_cur_state;
604         int i;
605         int retval;
606
607         /* the last state has to be a stable state */
608         if (!tap_is_state_stable(path[num_states - 1]))
609         {
610                 LOG_ERROR("BUG: TAP path doesn't finish in a stable state");
611                 exit(-1);
612         }
613
614         for (i=0; i<num_states; i++)
615         {
616                 if (path[i] == TAP_RESET)
617                 {
618                         LOG_ERROR("BUG: TAP_RESET is not a valid state for pathmove sequences");
619                         exit(-1);
620                 }
621
622                 if ( tap_state_transition(cur_state, true)  != path[i]
623                   && tap_state_transition(cur_state, false) != path[i])
624                 {
625                         LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state), tap_state_name(path[i]));
626                         exit(-1);
627                 }
628                 cur_state = path[i];
629         }
630
631         jtag_prelude1();
632
633         retval = interface_jtag_add_pathmove(num_states, path);
634         cmd_queue_cur_state = path[num_states - 1];
635         if (retval!=ERROR_OK)
636                 jtag_error=retval;
637 }
638
639 void jtag_add_runtest(int num_cycles, tap_state_t state)
640 {
641         int retval;
642
643         jtag_prelude(state);
644
645         /* executed by sw or hw fifo */
646         retval=interface_jtag_add_runtest(num_cycles, cmd_queue_end_state);
647         if (retval!=ERROR_OK)
648                 jtag_error=retval;
649 }
650
651
652 void jtag_add_clocks( int num_cycles )
653 {
654         int retval;
655
656         if( !tap_is_state_stable(cmd_queue_cur_state) )
657         {
658                  LOG_ERROR( "jtag_add_clocks() was called with TAP in non-stable state \"%s\"",
659                                  tap_state_name(cmd_queue_cur_state) );
660                  jtag_error = ERROR_JTAG_NOT_STABLE_STATE;
661                  return;
662         }
663
664         if( num_cycles > 0 )
665         {
666                 jtag_prelude1();
667
668                 retval = interface_jtag_add_clocks(num_cycles);
669                 if (retval != ERROR_OK)
670                         jtag_error=retval;
671         }
672 }
673
674 void jtag_add_reset(int req_tlr_or_trst, int req_srst)
675 {
676         int trst_with_tlr = 0;
677         int retval;
678
679         /* FIX!!! there are *many* different cases here. A better
680          * approach is needed for legal combinations of transitions...
681          */
682         if ((jtag_reset_config & RESET_HAS_SRST)&&
683                         (jtag_reset_config & RESET_HAS_TRST)&&
684                         ((jtag_reset_config & RESET_SRST_PULLS_TRST)==0))
685         {
686                 if (((req_tlr_or_trst&&!jtag_trst)||
687                                 (!req_tlr_or_trst&&jtag_trst))&&
688                                 ((req_srst&&!jtag_srst)||
689                                                 (!req_srst&&jtag_srst)))
690                 {
691                         /* FIX!!! srst_pulls_trst allows 1,1 => 0,0 transition.... */
692                         //LOG_ERROR("BUG: transition of req_tlr_or_trst and req_srst in the same jtag_add_reset() call is undefined");
693                 }
694         }
695
696         /* Make sure that jtag_reset_config allows the requested reset */
697         /* if SRST pulls TRST, we can't fulfill srst == 1 with trst == 0 */
698         if (((jtag_reset_config & RESET_SRST_PULLS_TRST) && (req_srst == 1)) && (!req_tlr_or_trst))
699         {
700                 LOG_ERROR("BUG: requested reset would assert trst");
701                 jtag_error=ERROR_FAIL;
702                 return;
703         }
704
705         /* if TRST pulls SRST, we reset with TAP T-L-R */
706         if (((jtag_reset_config & RESET_TRST_PULLS_SRST) && (req_tlr_or_trst)) && (req_srst == 0))
707         {
708                 trst_with_tlr = 1;
709         }
710
711         if (req_srst && !(jtag_reset_config & RESET_HAS_SRST))
712         {
713                 LOG_ERROR("BUG: requested SRST assertion, but the current configuration doesn't support this");
714                 jtag_error=ERROR_FAIL;
715                 return;
716         }
717
718         if (req_tlr_or_trst)
719         {
720                 if (!trst_with_tlr && (jtag_reset_config & RESET_HAS_TRST))
721                 {
722                         jtag_trst = 1;
723                 } else
724                 {
725                         trst_with_tlr = 1;
726                 }
727         } else
728         {
729                 jtag_trst = 0;
730         }
731
732         jtag_srst = req_srst;
733
734         retval = interface_jtag_add_reset(jtag_trst, jtag_srst);
735         if (retval!=ERROR_OK)
736         {
737                 jtag_error=retval;
738                 return;
739         }
740         jtag_execute_queue();
741
742         if (jtag_srst)
743         {
744                 LOG_DEBUG("SRST line asserted");
745         }
746         else
747         {
748                 LOG_DEBUG("SRST line released");
749                 if (jtag_nsrst_delay)
750                         jtag_add_sleep(jtag_nsrst_delay * 1000);
751         }
752
753         if (trst_with_tlr)
754         {
755                 LOG_DEBUG("JTAG reset with RESET instead of TRST");
756                 jtag_add_end_state(TAP_RESET);
757                 jtag_add_tlr();
758                 jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
759                 return;
760         }
761
762         if (jtag_trst)
763         {
764                 /* we just asserted nTRST, so we're now in Test-Logic-Reset,
765                  * and inform possible listeners about this
766                  */
767                 LOG_DEBUG("TRST line asserted");
768                 tap_set_state(TAP_RESET);
769                 jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
770         }
771         else
772         {
773                 if (jtag_ntrst_delay)
774                         jtag_add_sleep(jtag_ntrst_delay * 1000);
775         }
776 }
777
778 void jtag_add_end_state(tap_state_t state)
779 {
780         cmd_queue_end_state = state;
781         if ((cmd_queue_end_state == TAP_DRSHIFT)||(cmd_queue_end_state == TAP_IRSHIFT))
782         {
783                 LOG_ERROR("BUG: TAP_DRSHIFT/IRSHIFT can't be end state. Calling code should use a larger scan field");
784         }
785 }
786
787 void jtag_add_sleep(u32 us)
788 {
789         keep_alive(); /* we might be running on a very slow JTAG clk */
790         int retval=interface_jtag_add_sleep(us);
791         if (retval!=ERROR_OK)
792                 jtag_error=retval;
793         return;
794 }
795
796 static const char *jtag_tap_name(const jtag_tap_t *tap)
797 {
798         return (tap == NULL) ? "(unknown)" : tap->dotted_name;
799 }
800
801 int jtag_check_value_inner(u8 *captured, u8 *in_check_value, u8 *in_check_mask, int num_bits)
802 {
803         int retval = ERROR_OK;
804
805         int compare_failed = 0;
806
807         if (in_check_mask)
808                 compare_failed = buf_cmp_mask(captured, in_check_value, in_check_mask, num_bits);
809         else
810                 compare_failed = buf_cmp(captured, in_check_value, num_bits);
811
812         if (compare_failed){
813                 /* An error handler could have caught the failing check
814                  * only report a problem when there wasn't a handler, or if the handler
815                  * acknowledged the error
816                  */
817                 /*
818                 LOG_WARNING("TAP %s:",
819                                         jtag_tap_name(field->tap));
820                                         */
821                 if (compare_failed)
822                 {
823                         char *captured_char = buf_to_str(captured, (num_bits > DEBUG_JTAG_IOZ) ? DEBUG_JTAG_IOZ : num_bits, 16);
824                         char *in_check_value_char = buf_to_str(in_check_value, (num_bits > DEBUG_JTAG_IOZ) ? DEBUG_JTAG_IOZ : num_bits, 16);
825
826                         if (in_check_mask)
827                         {
828                                 char *in_check_mask_char;
829                                 in_check_mask_char = buf_to_str(in_check_mask, (num_bits > DEBUG_JTAG_IOZ) ? DEBUG_JTAG_IOZ : num_bits, 16);
830                                 LOG_WARNING("value captured during scan didn't pass the requested check:");
831                                 LOG_WARNING("captured: 0x%s check_value: 0x%s check_mask: 0x%s",
832                                                         captured_char, in_check_value_char, in_check_mask_char);
833                                 free(in_check_mask_char);
834                         }
835                         else
836                         {
837                                 LOG_WARNING("value captured during scan didn't pass the requested check: captured: 0x%s check_value: 0x%s", captured_char, in_check_value_char);
838                         }
839
840                         free(captured_char);
841                         free(in_check_value_char);
842
843                         retval = ERROR_JTAG_QUEUE_FAILED;
844                 }
845
846         }
847         return retval;
848 }
849
850 void jtag_check_value_mask(scan_field_t *field, u8 *value, u8 *mask)
851 {
852         assert(field->in_value != NULL);
853
854         if (value==NULL)
855         {
856                 /* no checking to do */
857                 return;
858         }
859
860         jtag_execute_queue_noclear();
861
862         int retval=jtag_check_value_inner(field->in_value, value, mask, field->num_bits);
863         jtag_set_error(retval);
864 }
865
866
867
868 int default_interface_jtag_execute_queue(void)
869 {
870         if (NULL == jtag)
871         {
872                 LOG_ERROR("No JTAG interface configured yet.  "
873                         "Issue 'init' command in startup scripts "
874                         "before communicating with targets.");
875                 return ERROR_FAIL;
876         }
877
878         return jtag->execute_queue();
879 }
880
881 void jtag_execute_queue_noclear(void)
882 {
883         /* each flush can take as much as 1-2ms on high bandwidth low latency interfaces.
884          * E.g. a JTAG over TCP/IP or USB....
885          */
886         jtag_flush_queue_count++;
887
888         int retval=interface_jtag_execute_queue();
889         /* we keep the first error */
890         if ((jtag_error==ERROR_OK)&&(retval!=ERROR_OK))
891         {
892                 jtag_error=retval;
893         }
894 }
895
896 int jtag_execute_queue(void)
897 {
898         int retval;
899         jtag_execute_queue_noclear();
900         retval=jtag_error;
901         jtag_error=ERROR_OK;
902         return retval;
903 }
904
905 int jtag_reset_callback(enum jtag_event event, void *priv)
906 {
907         jtag_tap_t *tap = priv;
908
909         LOG_DEBUG("-");
910
911         if (event == JTAG_TRST_ASSERTED)
912         {
913                 buf_set_ones(tap->cur_instr, tap->ir_length);
914                 tap->bypass = 1;
915         }
916
917         return ERROR_OK;
918 }
919
920 void jtag_sleep(u32 us)
921 {
922         alive_sleep(us/1000);
923 }
924
925 /* Try to examine chain layout according to IEEE 1149.1 Â§12
926  */
927 int jtag_examine_chain(void)
928 {
929         jtag_tap_t *tap;
930         scan_field_t field;
931         u8 idcode_buffer[JTAG_MAX_CHAIN_SIZE * 4];
932         int i;
933         int bit_count;
934         int device_count = 0;
935         u8 zero_check = 0x0;
936         u8 one_check = 0xff;
937
938         field.tap = NULL;
939         field.num_bits = sizeof(idcode_buffer) * 8;
940         field.out_value = idcode_buffer;
941
942         field.in_value = idcode_buffer;
943
944
945
946
947         for (i = 0; i < JTAG_MAX_CHAIN_SIZE; i++)
948         {
949                 buf_set_u32(idcode_buffer, i * 32, 32, 0x000000FF);
950         }
951
952         jtag_add_plain_dr_scan(1, &field, TAP_RESET);
953         jtag_execute_queue();
954
955         for (i = 0; i < JTAG_MAX_CHAIN_SIZE * 4; i++)
956         {
957                 zero_check |= idcode_buffer[i];
958                 one_check &= idcode_buffer[i];
959         }
960
961         /* if there wasn't a single non-zero bit or if all bits were one, the scan isn't valid */
962         if ((zero_check == 0x00) || (one_check == 0xff))
963         {
964                 LOG_ERROR("JTAG communication failure, check connection, JTAG interface, target power etc.");
965                 return ERROR_JTAG_INIT_FAILED;
966         }
967
968         /* point at the 1st tap */
969         tap = jtag_NextEnabledTap(NULL);
970         if( tap == NULL ){
971                 LOG_ERROR("JTAG: No taps enabled?");
972                 return ERROR_JTAG_INIT_FAILED;
973         }
974
975         for (bit_count = 0; bit_count < (JTAG_MAX_CHAIN_SIZE * 32) - 31;)
976         {
977                 u32 idcode = buf_get_u32(idcode_buffer, bit_count, 32);
978                 if ((idcode & 1) == 0)
979                 {
980                         /* LSB must not be 0, this indicates a device in bypass */
981                         LOG_WARNING("Tap/Device does not have IDCODE");
982                         idcode=0;
983
984                         bit_count += 1;
985                 }
986                 else
987                 {
988                         u32 manufacturer;
989                         u32 part;
990                         u32 version;
991
992                         /* some devices, such as AVR will output all 1's instead of TDI
993                         input value at end of chain. */
994                         if ((idcode == 0x000000FF)||(idcode == 0xFFFFFFFF))
995                         {
996                                 int unexpected=0;
997                                 /* End of chain (invalid manufacturer ID)
998                                  *
999                                  * The JTAG examine is the very first thing that happens
1000                                  *
1001                                  * A single JTAG device requires only 64 bits to be read back correctly.
1002                                  *
1003                                  * The code below adds a check that the rest of the data scanned (640 bits)
1004                                  * are all as expected. This helps diagnose/catch problems with the JTAG chain
1005                                  *
1006                                  * earlier and gives more helpful/explicit error messages.
1007                                  */
1008                                 for (bit_count += 32; bit_count < (JTAG_MAX_CHAIN_SIZE * 32) - 31;bit_count += 32)
1009                                 {
1010                                         idcode = buf_get_u32(idcode_buffer, bit_count, 32);
1011                                         if (unexpected||((idcode != 0x000000FF)&&(idcode != 0xFFFFFFFF)))
1012                                         {
1013                                                 LOG_WARNING("Unexpected idcode after end of chain! %d 0x%08x", bit_count, idcode);
1014                                                 unexpected = 1;
1015                                         }
1016                                 }
1017
1018                                 break;
1019                         }
1020
1021 #define EXTRACT_MFG(X)  (((X) & 0xffe) >> 1)
1022                         manufacturer = EXTRACT_MFG(idcode);
1023 #define EXTRACT_PART(X) (((X) & 0xffff000) >> 12)
1024                         part = EXTRACT_PART(idcode);
1025 #define EXTRACT_VER(X)  (((X) & 0xf0000000) >> 28)
1026                         version = EXTRACT_VER(idcode);
1027
1028                         LOG_INFO("JTAG tap: %s tap/device found: 0x%8.8x (Manufacturer: 0x%3.3x, Part: 0x%4.4x, Version: 0x%1.1x)",
1029                                          ((tap != NULL) ? (tap->dotted_name) : "(not-named)"),
1030                                 idcode, manufacturer, part, version);
1031
1032                         bit_count += 32;
1033                 }
1034                 if (tap)
1035                 {
1036                         tap->idcode = idcode;
1037
1038                         if (tap->expected_ids_cnt > 0) {
1039                                 /* Loop over the expected identification codes and test for a match */
1040                                 u8 ii;
1041                                 for (ii = 0; ii < tap->expected_ids_cnt; ii++) {
1042                                         if( tap->idcode == tap->expected_ids[ii] ){
1043                                                 break;
1044                                         }
1045                                 }
1046
1047                                 /* If none of the expected ids matched, log an error */
1048                                 if (ii == tap->expected_ids_cnt) {
1049                                         LOG_ERROR("JTAG tap: %s             got: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1050                                                           tap->dotted_name,
1051                                                           idcode,
1052                                                           EXTRACT_MFG( tap->idcode ),
1053                                                           EXTRACT_PART( tap->idcode ),
1054                                                           EXTRACT_VER( tap->idcode ) );
1055                                         for (ii = 0; ii < tap->expected_ids_cnt; ii++) {
1056                                                 LOG_ERROR("JTAG tap: %s expected %hhu of %hhu: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1057                                                                   tap->dotted_name,
1058                                                                   ii + 1,
1059                                                                   tap->expected_ids_cnt,
1060                                                                   tap->expected_ids[ii],
1061                                                                   EXTRACT_MFG( tap->expected_ids[ii] ),
1062                                                                   EXTRACT_PART( tap->expected_ids[ii] ),
1063                                                                   EXTRACT_VER( tap->expected_ids[ii] ) );
1064                                         }
1065
1066                                         return ERROR_JTAG_INIT_FAILED;
1067                                 } else {
1068                                         LOG_INFO("JTAG Tap/device matched");
1069                                 }
1070                         } else {
1071 #if 0
1072                                 LOG_INFO("JTAG TAP ID: 0x%08x - Unknown - please report (A) chipname and (B) idcode to the openocd project",
1073                                                  tap->idcode);
1074 #endif
1075                         }
1076                         tap = jtag_NextEnabledTap(tap);
1077                 }
1078                 device_count++;
1079         }
1080
1081         /* see if number of discovered devices matches configuration */
1082         if (device_count != jtag_NumEnabledTaps())
1083         {
1084                 LOG_ERROR("number of discovered devices in JTAG chain (%i) doesn't match (enabled) configuration (%i), total taps: %d",
1085                                   device_count, jtag_NumEnabledTaps(), jtag_NumTotalTaps());
1086                 LOG_ERROR("check the config file and ensure proper JTAG communication (connections, speed, ...)");
1087                 return ERROR_JTAG_INIT_FAILED;
1088         }
1089
1090         return ERROR_OK;
1091 }
1092
1093 int jtag_validate_chain(void)
1094 {
1095         jtag_tap_t *tap;
1096         int total_ir_length = 0;
1097         u8 *ir_test = NULL;
1098         scan_field_t field;
1099         int chain_pos = 0;
1100
1101         tap = NULL;
1102         total_ir_length = 0;
1103         for(;;){
1104                 tap = jtag_NextEnabledTap(tap);
1105                 if( tap == NULL ){
1106                         break;
1107                 }
1108                 total_ir_length += tap->ir_length;
1109         }
1110
1111         total_ir_length += 2;
1112         ir_test = malloc(CEIL(total_ir_length, 8));
1113         buf_set_ones(ir_test, total_ir_length);
1114
1115         field.tap = NULL;
1116         field.num_bits = total_ir_length;
1117         field.out_value = ir_test;
1118         field.in_value = ir_test;
1119
1120
1121         jtag_add_plain_ir_scan(1, &field, TAP_RESET);
1122         jtag_execute_queue();
1123
1124         tap = NULL;
1125         chain_pos = 0;
1126         int val;
1127         for(;;){
1128                 tap = jtag_NextEnabledTap(tap);
1129                 if( tap == NULL ){
1130                         break;
1131                 }
1132
1133                 val = buf_get_u32(ir_test, chain_pos, 2);
1134                 if (val != 0x1)
1135                 {
1136                         char *cbuf = buf_to_str(ir_test, total_ir_length, 16);
1137                         LOG_ERROR("Could not validate JTAG scan chain, IR mismatch, scan returned 0x%s. tap=%s pos=%d expected 0x1 got %0x", cbuf, jtag_tap_name(tap), chain_pos, val);
1138                         free(cbuf);
1139                         free(ir_test);
1140                         return ERROR_JTAG_INIT_FAILED;
1141                 }
1142                 chain_pos += tap->ir_length;
1143         }
1144
1145         val = buf_get_u32(ir_test, chain_pos, 2);
1146         if (val != 0x3)
1147         {
1148                 char *cbuf = buf_to_str(ir_test, total_ir_length, 16);
1149                 LOG_ERROR("Could not validate end of JTAG scan chain, IR mismatch, scan returned 0x%s. pos=%d expected 0x3 got %0x", cbuf, chain_pos, val);
1150                 free(cbuf);
1151                 free(ir_test);
1152                 return ERROR_JTAG_INIT_FAILED;
1153         }
1154
1155         free(ir_test);
1156
1157         return ERROR_OK;
1158 }
1159
1160 enum jtag_tap_cfg_param {
1161         JCFG_EVENT
1162 };
1163
1164 static Jim_Nvp nvp_config_opts[] = {
1165         { .name = "-event",      .value = JCFG_EVENT },
1166
1167         { .name = NULL,          .value = -1 }
1168 };
1169
1170 static int jtag_tap_configure_cmd( Jim_GetOptInfo *goi, jtag_tap_t * tap)
1171 {
1172         Jim_Nvp *n;
1173         Jim_Obj *o;
1174         int e;
1175
1176         /* parse config or cget options */
1177         while (goi->argc > 0) {
1178                 Jim_SetEmptyResult (goi->interp);
1179
1180                 e = Jim_GetOpt_Nvp(goi, nvp_config_opts, &n);
1181                 if (e != JIM_OK) {
1182                         Jim_GetOpt_NvpUnknown(goi, nvp_config_opts, 0);
1183                         return e;
1184                 }
1185
1186                 switch (n->value) {
1187                         case JCFG_EVENT:
1188                                 if (goi->argc == 0) {
1189                                         Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ..." );
1190                                         return JIM_ERR;
1191                                 }
1192
1193                                 e = Jim_GetOpt_Nvp( goi, nvp_jtag_tap_event, &n );
1194                                 if (e != JIM_OK) {
1195                                         Jim_GetOpt_NvpUnknown(goi, nvp_jtag_tap_event, 1);
1196                                         return e;
1197                                 }
1198
1199                                 if (goi->isconfigure) {
1200                                         if (goi->argc != 1) {
1201                                                 Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name? ?EVENT-BODY?");
1202                                                 return JIM_ERR;
1203                                         }
1204                                 } else {
1205                                         if (goi->argc != 0) {
1206                                                 Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name?");
1207                                                 return JIM_ERR;
1208                                         }
1209                                 }
1210
1211                                 {
1212                                         jtag_tap_event_action_t *jteap;
1213
1214                                         jteap = tap->event_action;
1215                                         /* replace existing? */
1216                                         while (jteap) {
1217                                                 if (jteap->event == (enum jtag_tap_event)n->value) {
1218                                                         break;
1219                                                 }
1220                                                 jteap = jteap->next;
1221                                         }
1222
1223                                         if (goi->isconfigure) {
1224                                                 if (jteap == NULL) {
1225                                                         /* create new */
1226                                                         jteap = calloc(1, sizeof (*jteap));
1227                                                 }
1228                                                 jteap->event = n->value;
1229                                                 Jim_GetOpt_Obj( goi, &o);
1230                                                 if (jteap->body) {
1231                                                         Jim_DecrRefCount(interp, jteap->body);
1232                                                 }
1233                                                 jteap->body = Jim_DuplicateObj(goi->interp, o);
1234                                                 Jim_IncrRefCount(jteap->body);
1235
1236                                                 /* add to head of event list */
1237                                                 jteap->next = tap->event_action;
1238                                                 tap->event_action = jteap;
1239                                                 Jim_SetEmptyResult(goi->interp);
1240                                         } else {
1241                                                 /* get */
1242                                                 if (jteap == NULL) {
1243                                                         Jim_SetEmptyResult(goi->interp);
1244                                                 } else {
1245                                                         Jim_SetResult(goi->interp, Jim_DuplicateObj(goi->interp, jteap->body));
1246                                                 }
1247                                         }
1248                                 }
1249                                 /* loop for more */
1250                                 break;
1251                 }
1252         } /* while (goi->argc) */
1253
1254         return JIM_OK;
1255 }
1256
1257 static int jim_newtap_cmd( Jim_GetOptInfo *goi )
1258 {
1259         jtag_tap_t *pTap;
1260         jtag_tap_t **ppTap;
1261         jim_wide w;
1262         int x;
1263         int e;
1264         int reqbits;
1265         Jim_Nvp *n;
1266         char *cp;
1267         const Jim_Nvp opts[] = {
1268 #define NTAP_OPT_IRLEN     0
1269                 { .name = "-irlen"                      ,       .value = NTAP_OPT_IRLEN },
1270 #define NTAP_OPT_IRMASK    1
1271                 { .name = "-irmask"                     ,       .value = NTAP_OPT_IRMASK },
1272 #define NTAP_OPT_IRCAPTURE 2
1273                 { .name = "-ircapture"          ,       .value = NTAP_OPT_IRCAPTURE },
1274 #define NTAP_OPT_ENABLED   3
1275                 { .name = "-enable"                     ,       .value = NTAP_OPT_ENABLED },
1276 #define NTAP_OPT_DISABLED  4
1277                 { .name = "-disable"            ,       .value = NTAP_OPT_DISABLED },
1278 #define NTAP_OPT_EXPECTED_ID 5
1279                 { .name = "-expected-id"        ,       .value = NTAP_OPT_EXPECTED_ID },
1280                 { .name = NULL                          ,       .value = -1 },
1281         };
1282
1283         pTap = malloc( sizeof(jtag_tap_t) );
1284         memset( pTap, 0, sizeof(*pTap) );
1285         if( !pTap ){
1286                 Jim_SetResult_sprintf( goi->interp, "no memory");
1287                 return JIM_ERR;
1288         }
1289         /*
1290          * we expect CHIP + TAP + OPTIONS
1291          * */
1292         if( goi->argc < 3 ){
1293                 Jim_SetResult_sprintf(goi->interp, "Missing CHIP TAP OPTIONS ....");
1294                 return JIM_ERR;
1295         }
1296         Jim_GetOpt_String( goi, &cp, NULL );
1297         pTap->chip = strdup(cp);
1298
1299         Jim_GetOpt_String( goi, &cp, NULL );
1300         pTap->tapname = strdup(cp);
1301
1302         /* name + dot + name + null */
1303         x = strlen(pTap->chip) + 1 + strlen(pTap->tapname) + 1;
1304         cp = malloc( x );
1305         sprintf( cp, "%s.%s", pTap->chip, pTap->tapname );
1306         pTap->dotted_name = cp;
1307
1308         LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
1309                           pTap->chip, pTap->tapname, pTap->dotted_name, goi->argc);
1310
1311         /* default is enabled */
1312         pTap->enabled = 1;
1313
1314         /* deal with options */
1315 #define NTREQ_IRLEN      1
1316 #define NTREQ_IRCAPTURE  2
1317 #define NTREQ_IRMASK     4
1318
1319         /* clear them as we find them */
1320         reqbits = (NTREQ_IRLEN | NTREQ_IRCAPTURE | NTREQ_IRMASK);
1321
1322         while( goi->argc ){
1323                 e = Jim_GetOpt_Nvp( goi, opts, &n );
1324                 if( e != JIM_OK ){
1325                         Jim_GetOpt_NvpUnknown( goi, opts, 0 );
1326                         return e;
1327                 }
1328                 LOG_DEBUG("Processing option: %s", n->name );
1329                 switch( n->value ){
1330                 case NTAP_OPT_ENABLED:
1331                         pTap->enabled = 1;
1332                         break;
1333                 case NTAP_OPT_DISABLED:
1334                         pTap->enabled = 0;
1335                         break;
1336                 case NTAP_OPT_EXPECTED_ID:
1337                 {
1338                         u32 *new_expected_ids;
1339
1340                         e = Jim_GetOpt_Wide( goi, &w );
1341                         if( e != JIM_OK) {
1342                                 Jim_SetResult_sprintf(goi->interp, "option: %s bad parameter", n->name);
1343                                 return e;
1344                         }
1345
1346                         new_expected_ids = malloc(sizeof(u32) * (pTap->expected_ids_cnt + 1));
1347                         if (new_expected_ids == NULL) {
1348                                 Jim_SetResult_sprintf( goi->interp, "no memory");
1349                                 return JIM_ERR;
1350                         }
1351
1352                         memcpy(new_expected_ids, pTap->expected_ids, sizeof(u32) * pTap->expected_ids_cnt);
1353
1354                         new_expected_ids[pTap->expected_ids_cnt] = w;
1355
1356                         free(pTap->expected_ids);
1357                         pTap->expected_ids = new_expected_ids;
1358                         pTap->expected_ids_cnt++;
1359                         break;
1360                 }
1361                 case NTAP_OPT_IRLEN:
1362                 case NTAP_OPT_IRMASK:
1363                 case NTAP_OPT_IRCAPTURE:
1364                         e = Jim_GetOpt_Wide( goi, &w );
1365                         if( e != JIM_OK ){
1366                                 Jim_SetResult_sprintf( goi->interp, "option: %s bad parameter", n->name );
1367                                 return e;
1368                         }
1369                         if( (w < 0) || (w > 0xffff) ){
1370                                 /* wacky value */
1371                                 Jim_SetResult_sprintf( goi->interp, "option: %s - wacky value: %d (0x%x)",
1372                                                                            n->name, (int)(w), (int)(w));
1373                                 return JIM_ERR;
1374                         }
1375                         switch(n->value){
1376                         case NTAP_OPT_IRLEN:
1377                                 pTap->ir_length = w;
1378                                 reqbits &= (~(NTREQ_IRLEN));
1379                                 break;
1380                         case NTAP_OPT_IRMASK:
1381                                 pTap->ir_capture_mask = w;
1382                                 reqbits &= (~(NTREQ_IRMASK));
1383                                 break;
1384                         case NTAP_OPT_IRCAPTURE:
1385                                 pTap->ir_capture_value = w;
1386                                 reqbits &= (~(NTREQ_IRCAPTURE));
1387                                 break;
1388                         }
1389                 } /* switch(n->value) */
1390         } /* while( goi->argc ) */
1391
1392         /* Did we get all the options? */
1393         if( reqbits ){
1394                 // no
1395                 Jim_SetResult_sprintf( goi->interp,
1396                                                            "newtap: %s missing required parameters",
1397                                                            pTap->dotted_name);
1398                 /* TODO: Tell user what is missing :-( */
1399                 /* no memory leaks pelase */
1400                 free(((void *)(pTap->expected_ids)));
1401                 free(((void *)(pTap->chip)));
1402                 free(((void *)(pTap->tapname)));
1403                 free(((void *)(pTap->dotted_name)));
1404                 free(((void *)(pTap)));
1405                 return JIM_ERR;
1406         }
1407
1408         pTap->expected      = malloc( pTap->ir_length );
1409         pTap->expected_mask = malloc( pTap->ir_length );
1410         pTap->cur_instr     = malloc( pTap->ir_length );
1411
1412         buf_set_u32( pTap->expected,
1413                                  0,
1414                                  pTap->ir_length,
1415                                  pTap->ir_capture_value );
1416         buf_set_u32( pTap->expected_mask,
1417                                  0,
1418                                  pTap->ir_length,
1419                                  pTap->ir_capture_mask );
1420         buf_set_ones( pTap->cur_instr,
1421                                   pTap->ir_length );
1422
1423         pTap->bypass = 1;
1424
1425         jtag_register_event_callback(jtag_reset_callback, pTap );
1426
1427         ppTap = &(jtag_all_taps);
1428         while( (*ppTap) != NULL ){
1429                 ppTap = &((*ppTap)->next_tap);
1430         }
1431         *ppTap = pTap;
1432         {
1433                 static int n_taps = 0;
1434                 pTap->abs_chain_position = n_taps++;
1435         }
1436         LOG_DEBUG( "Created Tap: %s @ abs position %d, irlen %d, capture: 0x%x mask: 0x%x",
1437                                 (*ppTap)->dotted_name,
1438                                 (*ppTap)->abs_chain_position,
1439                                 (*ppTap)->ir_length,
1440                                 (*ppTap)->ir_capture_value,
1441                                 (*ppTap)->ir_capture_mask );
1442
1443         return ERROR_OK;
1444 }
1445
1446 static int jim_jtag_command( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
1447 {
1448         Jim_GetOptInfo goi;
1449         int e;
1450         Jim_Nvp *n;
1451         Jim_Obj *o;
1452         struct command_context_s *context;
1453
1454         enum {
1455                 JTAG_CMD_INTERFACE,
1456                 JTAG_CMD_INIT_RESET,
1457                 JTAG_CMD_NEWTAP,
1458                 JTAG_CMD_TAPENABLE,
1459                 JTAG_CMD_TAPDISABLE,
1460                 JTAG_CMD_TAPISENABLED,
1461                 JTAG_CMD_CONFIGURE,
1462                 JTAG_CMD_CGET
1463         };
1464
1465         const Jim_Nvp jtag_cmds[] = {
1466                 { .name = "interface"     , .value = JTAG_CMD_INTERFACE },
1467                 { .name = "arp_init-reset", .value = JTAG_CMD_INIT_RESET },
1468                 { .name = "newtap"        , .value = JTAG_CMD_NEWTAP },
1469                 { .name = "tapisenabled"     , .value = JTAG_CMD_TAPISENABLED },
1470                 { .name = "tapenable"     , .value = JTAG_CMD_TAPENABLE },
1471                 { .name = "tapdisable"    , .value = JTAG_CMD_TAPDISABLE },
1472                 { .name = "configure"     , .value = JTAG_CMD_CONFIGURE },
1473                 { .name = "cget"          , .value = JTAG_CMD_CGET },
1474
1475                 { .name = NULL, .value = -1 },
1476         };
1477
1478         context = Jim_GetAssocData(interp, "context");
1479         /* go past the command */
1480         Jim_GetOpt_Setup( &goi, interp, argc-1, argv+1 );
1481
1482         e = Jim_GetOpt_Nvp( &goi, jtag_cmds, &n );
1483         if( e != JIM_OK ){
1484                 Jim_GetOpt_NvpUnknown( &goi, jtag_cmds, 0 );
1485                 return e;
1486         }
1487                 Jim_SetEmptyResult( goi.interp );
1488         switch( n->value ){
1489         case JTAG_CMD_INTERFACE:
1490                 /* return the name of the interface */
1491                 /* TCL code might need to know the exact type... */
1492                 /* FUTURE: we allow this as a means to "set" the interface. */
1493                 if( goi.argc != 0 ){
1494                         Jim_WrongNumArgs( goi.interp, 1, goi.argv-1, "(no params)");
1495                         return JIM_ERR;
1496                 }
1497                 Jim_SetResultString( goi.interp, jtag_interface->name, -1 );
1498                 return JIM_OK;
1499         case JTAG_CMD_INIT_RESET:
1500                 if( goi.argc != 0 ){
1501                         Jim_WrongNumArgs( goi.interp, 1, goi.argv-1, "(no params)");
1502                         return JIM_ERR;
1503                 }
1504                 e = jtag_init_reset(context);
1505                 if( e != ERROR_OK ){
1506                         Jim_SetResult_sprintf( goi.interp, "error: %d", e);
1507                         return JIM_ERR;
1508                 }
1509                 return JIM_OK;
1510         case JTAG_CMD_NEWTAP:
1511                 return jim_newtap_cmd( &goi );
1512                 break;
1513         case JTAG_CMD_TAPISENABLED:
1514         case JTAG_CMD_TAPENABLE:
1515         case JTAG_CMD_TAPDISABLE:
1516                 if( goi.argc != 1 ){
1517                         Jim_SetResultString( goi.interp, "Too many parameters",-1 );
1518                         return JIM_ERR;
1519                 }
1520
1521                 {
1522                         jtag_tap_t *t;
1523                         t = jtag_TapByJimObj( goi.interp, goi.argv[0] );
1524                         if( t == NULL ){
1525                                 return JIM_ERR;
1526                         }
1527                         switch( n->value ){
1528                         case JTAG_CMD_TAPISENABLED:
1529                                 e = t->enabled;
1530                                 break;
1531                         case JTAG_CMD_TAPENABLE:
1532                                 jtag_tap_handle_event( t, JTAG_TAP_EVENT_ENABLE);
1533                                 e = 1;
1534                                 t->enabled = e;
1535                                 break;
1536                         case JTAG_CMD_TAPDISABLE:
1537                                 jtag_tap_handle_event( t, JTAG_TAP_EVENT_DISABLE);
1538                                 e = 0;
1539                                 t->enabled = e;
1540                                 break;
1541                         }
1542                         Jim_SetResult( goi.interp, Jim_NewIntObj( goi.interp, e ) );
1543                         return JIM_OK;
1544                 }
1545                 break;
1546
1547         case JTAG_CMD_CGET:
1548                 if( goi.argc < 2 ){
1549                         Jim_WrongNumArgs( goi.interp, 0, NULL, "?tap-name? -option ...");
1550                         return JIM_ERR;
1551                 }
1552
1553                 {
1554                         jtag_tap_t *t;
1555
1556                         Jim_GetOpt_Obj(&goi, &o);
1557                         t = jtag_TapByJimObj( goi.interp, o );
1558                         if( t == NULL ){
1559                                 return JIM_ERR;
1560                         }
1561
1562                         goi.isconfigure = 0;
1563                         return jtag_tap_configure_cmd( &goi, t);
1564                 }
1565                 break;
1566
1567         case JTAG_CMD_CONFIGURE:
1568                 if( goi.argc < 3 ){
1569                         Jim_WrongNumArgs( goi.interp, 0, NULL, "?tap-name? -option ?VALUE? ...");
1570                         return JIM_ERR;
1571                 }
1572
1573                 {
1574                         jtag_tap_t *t;
1575
1576                         Jim_GetOpt_Obj(&goi, &o);
1577                         t = jtag_TapByJimObj( goi.interp, o );
1578                         if( t == NULL ){
1579                                 return JIM_ERR;
1580                         }
1581
1582                         goi.isconfigure = 1;
1583                         return jtag_tap_configure_cmd( &goi, t);
1584                 }
1585         }
1586
1587         return JIM_ERR;
1588 }
1589
1590 int jtag_register_commands(struct command_context_s *cmd_ctx)
1591 {
1592         register_jim( cmd_ctx, "jtag", jim_jtag_command, "perform jtag tap actions");
1593
1594         register_command(cmd_ctx, NULL, "interface", handle_interface_command,
1595                 COMMAND_CONFIG, "try to configure interface");
1596         register_command(cmd_ctx, NULL, "jtag_speed", handle_jtag_speed_command,
1597                 COMMAND_ANY, "(DEPRECATED) set jtag speed (if supported)");
1598         register_command(cmd_ctx, NULL, "jtag_khz", handle_jtag_khz_command,
1599                 COMMAND_ANY, "set maximum jtag speed (if supported); "
1600                 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
1601         register_command(cmd_ctx, NULL, "jtag_device", handle_jtag_device_command,
1602                 COMMAND_CONFIG, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
1603         register_command(cmd_ctx, NULL, "reset_config", handle_reset_config_command,
1604                 COMMAND_ANY,
1605                 "[none/trst_only/srst_only/trst_and_srst] [srst_pulls_trst/trst_pulls_srst] [combined/separate] [trst_push_pull/trst_open_drain] [srst_push_pull/srst_open_drain]");
1606         register_command(cmd_ctx, NULL, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command,
1607                 COMMAND_ANY, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
1608         register_command(cmd_ctx, NULL, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command,
1609                 COMMAND_ANY, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
1610
1611         register_command(cmd_ctx, NULL, "scan_chain", handle_scan_chain_command,
1612                 COMMAND_EXEC, "print current scan chain configuration");
1613
1614         register_command(cmd_ctx, NULL, "endstate", handle_endstate_command,
1615                 COMMAND_EXEC, "finish JTAG operations in <tap_state>");
1616         register_command(cmd_ctx, NULL, "jtag_reset", handle_jtag_reset_command,
1617                 COMMAND_EXEC, "toggle reset lines <trst> <srst>");
1618         register_command(cmd_ctx, NULL, "runtest", handle_runtest_command,
1619                 COMMAND_EXEC, "move to Run-Test/Idle, and execute <num_cycles>");
1620         register_command(cmd_ctx, NULL, "irscan", handle_irscan_command,
1621                 COMMAND_EXEC, "execute IR scan <device> <instr> [dev2] [instr2] ...");
1622         register_jim(cmd_ctx, "drscan", Jim_Command_drscan, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
1623         register_jim(cmd_ctx, "flush_count", Jim_Command_flush_count, "returns number of times the JTAG queue has been flushed");
1624
1625         register_command(cmd_ctx, NULL, "verify_ircapture", handle_verify_ircapture_command,
1626                 COMMAND_ANY, "verify value captured during Capture-IR <enable|disable>");
1627         register_command(cmd_ctx, NULL, "verify_jtag", handle_verify_jtag_command,
1628                 COMMAND_ANY, "verify value capture <enable|disable>");
1629         register_command(cmd_ctx, NULL, "tms_sequence", handle_tms_sequence_command,
1630                 COMMAND_ANY, "choose short(default) or long tms_sequence <short|long>");
1631         return ERROR_OK;
1632 }
1633
1634 int jtag_interface_init(struct command_context_s *cmd_ctx)
1635 {
1636         if (jtag)
1637                 return ERROR_OK;
1638
1639         if (!jtag_interface)
1640         {
1641                 /* nothing was previously specified by "interface" command */
1642                 LOG_ERROR("JTAG interface has to be specified, see \"interface\" command");
1643                 return ERROR_JTAG_INVALID_INTERFACE;
1644         }
1645         if(hasKHz)
1646         {
1647                 jtag_interface->khz(speed_khz, &jtag_speed);
1648                 hasKHz = 0;
1649         }
1650
1651         if (jtag_interface->init() != ERROR_OK)
1652                 return ERROR_JTAG_INIT_FAILED;
1653
1654         jtag = jtag_interface;
1655         return ERROR_OK;
1656 }
1657
1658 static int jtag_init_inner(struct command_context_s *cmd_ctx)
1659 {
1660         jtag_tap_t *tap;
1661         int retval;
1662
1663         LOG_DEBUG("Init JTAG chain");
1664
1665         tap = jtag_NextEnabledTap(NULL);
1666         if( tap == NULL ){
1667                 LOG_ERROR("There are no enabled taps?");
1668                 return ERROR_JTAG_INIT_FAILED;
1669         }
1670
1671         jtag_add_tlr();
1672         if ((retval=jtag_execute_queue())!=ERROR_OK)
1673                 return retval;
1674
1675         /* examine chain first, as this could discover the real chain layout */
1676         if (jtag_examine_chain() != ERROR_OK)
1677         {
1678                 LOG_ERROR("trying to validate configured JTAG chain anyway...");
1679         }
1680
1681         if (jtag_validate_chain() != ERROR_OK)
1682         {
1683                 LOG_WARNING("Could not validate JTAG chain, continuing anyway...");
1684         }
1685
1686         return ERROR_OK;
1687 }
1688
1689 int jtag_interface_quit(void)
1690 {
1691         if (!jtag || !jtag->quit)
1692                 return ERROR_OK;
1693
1694         // close the JTAG interface
1695         int result = jtag->quit();
1696         if (ERROR_OK != result)
1697                 LOG_ERROR("failed: %d", result);
1698
1699         return ERROR_OK;
1700 }
1701
1702
1703 int jtag_init_reset(struct command_context_s *cmd_ctx)
1704 {
1705         int retval;
1706
1707         if ((retval=jtag_interface_init(cmd_ctx)) != ERROR_OK)
1708                 return retval;
1709
1710         LOG_DEBUG("Trying to bring the JTAG controller to life by asserting TRST / RESET");
1711
1712         /* Reset can happen after a power cycle.
1713          *
1714          * Ideally we would only assert TRST or run RESET before the target reset.
1715          *
1716          * However w/srst_pulls_trst, trst is asserted together with the target
1717          * reset whether we want it or not.
1718          *
1719          * NB! Some targets have JTAG circuitry disabled until a
1720          * trst & srst has been asserted.
1721          *
1722          * NB! here we assume nsrst/ntrst delay are sufficient!
1723          *
1724          * NB! order matters!!!! srst *can* disconnect JTAG circuitry
1725          *
1726          */
1727         jtag_add_reset(1, 0); /* RESET or TRST */
1728         if (jtag_reset_config & RESET_HAS_SRST)
1729         {
1730                 jtag_add_reset(1, 1);
1731                 if ((jtag_reset_config & RESET_SRST_PULLS_TRST)==0)
1732                         jtag_add_reset(0, 1);
1733         }
1734         jtag_add_reset(0, 0);
1735         if ((retval = jtag_execute_queue()) != ERROR_OK)
1736                 return retval;
1737
1738         /* Check that we can communication on the JTAG chain + eventually we want to
1739          * be able to perform enumeration only after OpenOCD has started
1740          * telnet and GDB server
1741          *
1742          * That would allow users to more easily perform any magic they need to before
1743          * reset happens.
1744          */
1745         return jtag_init_inner(cmd_ctx);
1746 }
1747
1748 int jtag_init(struct command_context_s *cmd_ctx)
1749 {
1750         int retval;
1751         if ((retval=jtag_interface_init(cmd_ctx)) != ERROR_OK)
1752                 return retval;
1753         if (jtag_init_inner(cmd_ctx)==ERROR_OK)
1754         {
1755                 return ERROR_OK;
1756         }
1757         return jtag_init_reset(cmd_ctx);
1758 }
1759
1760 static int default_khz(int khz, int *jtag_speed)
1761 {
1762         LOG_ERROR("Translation from khz to jtag_speed not implemented");
1763         return ERROR_FAIL;
1764 }
1765
1766 static int default_speed_div(int speed, int *khz)
1767 {
1768         LOG_ERROR("Translation from jtag_speed to khz not implemented");
1769         return ERROR_FAIL;
1770 }
1771
1772 static int default_power_dropout(int *dropout)
1773 {
1774         *dropout=0; /* by default we can't detect power dropout */
1775         return ERROR_OK;
1776 }
1777
1778 static int default_srst_asserted(int *srst_asserted)
1779 {
1780         *srst_asserted=0; /* by default we can't detect srst asserted */
1781         return ERROR_OK;
1782 }
1783
1784 static int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1785 {
1786         int i;
1787         int retval;
1788
1789         /* check whether the interface is already configured */
1790         if (jtag_interface)
1791         {
1792                 LOG_WARNING("Interface already configured, ignoring");
1793                 return ERROR_OK;
1794         }
1795
1796         /* interface name is a mandatory argument */
1797         if (argc < 1 || args[0][0] == '\0')
1798         {
1799                 return ERROR_COMMAND_SYNTAX_ERROR;
1800         }
1801
1802         for (i=0; jtag_interfaces[i]; i++)
1803         {
1804                 if (strcmp(args[0], jtag_interfaces[i]->name) == 0)
1805                 {
1806                         if ((retval = jtag_interfaces[i]->register_commands(cmd_ctx)) != ERROR_OK)
1807                         {
1808                                 return retval;
1809                         }
1810
1811                         jtag_interface = jtag_interfaces[i];
1812
1813                         if (jtag_interface->khz == NULL)
1814                         {
1815                                 jtag_interface->khz = default_khz;
1816                         }
1817                         if (jtag_interface->speed_div == NULL)
1818                         {
1819                                 jtag_interface->speed_div = default_speed_div;
1820                         }
1821                         if (jtag_interface->power_dropout == NULL)
1822                         {
1823                                 jtag_interface->power_dropout = default_power_dropout;
1824                         }
1825                         if (jtag_interface->srst_asserted == NULL)
1826                         {
1827                                 jtag_interface->srst_asserted = default_srst_asserted;
1828                         }
1829
1830                         return ERROR_OK;
1831                 }
1832         }
1833
1834         /* no valid interface was found (i.e. the configuration option,
1835          * didn't match one of the compiled-in interfaces
1836          */
1837         LOG_ERROR("No valid jtag interface found (%s)", args[0]);
1838         LOG_ERROR("compiled-in jtag interfaces:");
1839         for (i = 0; jtag_interfaces[i]; i++)
1840         {
1841                 LOG_ERROR("%i: %s", i, jtag_interfaces[i]->name);
1842         }
1843
1844         return ERROR_JTAG_INVALID_INTERFACE;
1845 }
1846
1847 static int handle_jtag_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1848 {
1849         int e;
1850         char buf[1024];
1851         Jim_Obj *newargs[ 10 ];
1852         /*
1853          * CONVERT SYNTAX
1854          * argv[-1] = command
1855          * argv[ 0] = ir length
1856          * argv[ 1] = ir capture
1857          * argv[ 2] = ir mask
1858          * argv[ 3] = not actually used by anything but in the docs
1859          */
1860
1861         if( argc < 4 ){
1862                 command_print( cmd_ctx, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
1863                 return ERROR_OK;
1864         }
1865         command_print( cmd_ctx, "OLD SYNTAX: DEPRECATED - translating to new syntax");
1866         command_print( cmd_ctx, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
1867                                    args[0],
1868                                    args[1],
1869                                    args[2] );
1870         command_print( cmd_ctx, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
1871         command_print( cmd_ctx, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
1872         command_print( cmd_ctx, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
1873         command_print( cmd_ctx, "And then refer to the taps by the dotted name.");
1874
1875         newargs[0] = Jim_NewStringObj( interp, "jtag", -1   );
1876         newargs[1] = Jim_NewStringObj( interp, "newtap", -1 );
1877         sprintf( buf, "chip%d", jtag_NumTotalTaps() );
1878         newargs[2] = Jim_NewStringObj( interp, buf, -1 );
1879         sprintf( buf, "tap%d", jtag_NumTotalTaps() );
1880         newargs[3] = Jim_NewStringObj( interp, buf, -1  );
1881         newargs[4] = Jim_NewStringObj( interp, "-irlen", -1  );
1882         newargs[5] = Jim_NewStringObj( interp, args[0], -1  );
1883         newargs[6] = Jim_NewStringObj( interp, "-ircapture", -1  );
1884         newargs[7] = Jim_NewStringObj( interp, args[1], -1  );
1885         newargs[8] = Jim_NewStringObj( interp, "-irmask", -1  );
1886         newargs[9] = Jim_NewStringObj( interp, args[2], -1  );
1887
1888         command_print( cmd_ctx, "NEW COMMAND:");
1889         sprintf( buf, "%s %s %s %s %s %s %s %s %s %s",
1890                          Jim_GetString( newargs[0], NULL ),
1891                          Jim_GetString( newargs[1], NULL ),
1892                          Jim_GetString( newargs[2], NULL ),
1893                          Jim_GetString( newargs[3], NULL ),
1894                          Jim_GetString( newargs[4], NULL ),
1895                          Jim_GetString( newargs[5], NULL ),
1896                          Jim_GetString( newargs[6], NULL ),
1897                          Jim_GetString( newargs[7], NULL ),
1898                          Jim_GetString( newargs[8], NULL ),
1899                          Jim_GetString( newargs[9], NULL ) );
1900
1901         e = jim_jtag_command( interp, 10, newargs );
1902         if( e != JIM_OK ){
1903                 command_print( cmd_ctx, "%s", Jim_GetString( Jim_GetResult(interp), NULL ) );
1904         }
1905         return e;
1906 }
1907
1908 static int handle_scan_chain_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1909 {
1910         jtag_tap_t *tap;
1911
1912         tap = jtag_all_taps;
1913         command_print(cmd_ctx, "     TapName            | Enabled |   IdCode      Expected    IrLen IrCap  IrMask Instr     ");
1914         command_print(cmd_ctx, "---|--------------------|---------|------------|------------|------|------|------|---------");
1915
1916         while( tap ){
1917                 u32 expected, expected_mask, cur_instr, ii;
1918                 expected = buf_get_u32(tap->expected, 0, tap->ir_length);
1919                 expected_mask = buf_get_u32(tap->expected_mask, 0, tap->ir_length);
1920                 cur_instr = buf_get_u32(tap->cur_instr, 0, tap->ir_length);
1921
1922                 command_print(cmd_ctx,
1923                                           "%2d | %-18s |    %c    | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
1924                                           tap->abs_chain_position,
1925                                           tap->dotted_name,
1926                                           tap->enabled ? 'Y' : 'n',
1927                                           tap->idcode,
1928                                           (tap->expected_ids_cnt > 0 ? tap->expected_ids[0] : 0),
1929                                           tap->ir_length,
1930                                           expected,
1931                                           expected_mask,
1932                                           cur_instr);
1933
1934                 for (ii = 1; ii < tap->expected_ids_cnt; ii++) {
1935                         command_print(cmd_ctx, "   |                    |         |            | 0x%08x |      |      |      |         ",
1936                                                   tap->expected_ids[ii]);
1937                 }
1938
1939                 tap = tap->next_tap;
1940         }
1941
1942         return ERROR_OK;
1943 }
1944
1945 static int handle_reset_config_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1946 {
1947         int new_cfg = 0;
1948         int mask = 0;
1949
1950         if (argc < 1)
1951                 return ERROR_COMMAND_SYNTAX_ERROR;
1952
1953         /* Original versions cared about the order of these tokens:
1954          *   reset_config signals [combination [trst_type [srst_type]]]
1955          * They also clobbered the previous configuration even on error.
1956          *
1957          * Here we don't care about the order, and only change values
1958          * which have been explicitly specified.
1959          */
1960         for (; argc; argc--, args++) {
1961                 int tmp = 0;
1962                 int m;
1963
1964                 /* signals */
1965                 m = RESET_HAS_TRST | RESET_HAS_SRST;
1966                 if (strcmp(*args, "none") == 0)
1967                         tmp = RESET_NONE;
1968                 else if (strcmp(*args, "trst_only") == 0)
1969                         tmp = RESET_HAS_TRST;
1970                 else if (strcmp(*args, "srst_only") == 0)
1971                         tmp = RESET_HAS_SRST;
1972                 else if (strcmp(*args, "trst_and_srst") == 0)
1973                         tmp = RESET_HAS_TRST | RESET_HAS_SRST;
1974                 else
1975                         m = 0;
1976                 if (mask & m) {
1977                         LOG_ERROR("extra reset_config %s spec (%s)",
1978                                         "signal", *args);
1979                         return ERROR_INVALID_ARGUMENTS;
1980                 }
1981                 if (m)
1982                         goto next;
1983
1984                 /* combination (options for broken wiring) */
1985                 m = RESET_SRST_PULLS_TRST | RESET_TRST_PULLS_SRST;
1986                 if (strcmp(*args, "separate") == 0)
1987                         /* separate reset lines - default */;
1988                 else if (strcmp(*args, "srst_pulls_trst") == 0)
1989                         tmp |= RESET_SRST_PULLS_TRST;
1990                 else if (strcmp(*args, "trst_pulls_srst") == 0)
1991                         tmp |= RESET_TRST_PULLS_SRST;
1992                 else if (strcmp(*args, "combined") == 0)
1993                         tmp |= RESET_SRST_PULLS_TRST | RESET_TRST_PULLS_SRST;
1994                 else
1995                         m = 0;
1996                 if (mask & m) {
1997                         LOG_ERROR("extra reset_config %s spec (%s)",
1998                                         "combination", *args);
1999                         return ERROR_INVALID_ARGUMENTS;
2000                 }
2001                 if (m)
2002                         goto next;
2003
2004                 /* trst_type (NOP without HAS_TRST) */
2005                 m = RESET_TRST_OPEN_DRAIN;
2006                 if (strcmp(*args, "trst_open_drain") == 0)
2007                         tmp |= RESET_TRST_OPEN_DRAIN;
2008                 else if (strcmp(*args, "trst_push_pull") == 0)
2009                         /* push/pull from adapter - default */;
2010                 else
2011                         m = 0;
2012                 if (mask & m) {
2013                         LOG_ERROR("extra reset_config %s spec (%s)",
2014                                         "trst_type", *args);
2015                         return ERROR_INVALID_ARGUMENTS;
2016                 }
2017                 if (m)
2018                         goto next;
2019
2020                 /* srst_type (NOP without HAS_SRST) */
2021                 m |= RESET_SRST_PUSH_PULL;
2022                 if (strcmp(*args, "srst_push_pull") == 0)
2023                         tmp |= RESET_SRST_PUSH_PULL;
2024                 else if (strcmp(*args, "srst_open_drain") == 0)
2025                         /* open drain from adapter - default */;
2026                 else
2027                         m = 0;
2028                 if (mask & m) {
2029                         LOG_ERROR("extra reset_config %s spec (%s)",
2030                                         "srst_type", *args);
2031                         return ERROR_INVALID_ARGUMENTS;
2032                 }
2033                 if (m)
2034                         goto next;
2035
2036                 /* caller provided nonsense; fail */
2037                 LOG_ERROR("unknown reset_config flag (%s)", *args);
2038                 return ERROR_INVALID_ARGUMENTS;
2039
2040 next:
2041                 /* Remember the bits which were specified (mask)
2042                  * and their new values (new_cfg).
2043                  */
2044                 mask |= m;
2045                 new_cfg |= tmp;
2046         }
2047
2048         /* clear previous values of those bits, save new values */
2049         jtag_reset_config &= ~mask;
2050         jtag_reset_config |= new_cfg;
2051
2052         return ERROR_OK;
2053 }
2054
2055 static int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2056 {
2057         if (argc < 1)
2058         {
2059                 LOG_ERROR("jtag_nsrst_delay <ms> command takes one required argument");
2060                 exit(-1);
2061         }
2062         else
2063         {
2064                 jtag_nsrst_delay = strtoul(args[0], NULL, 0);
2065         }
2066
2067         return ERROR_OK;
2068 }
2069
2070 static int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2071 {
2072         if (argc < 1)
2073         {
2074                 LOG_ERROR("jtag_ntrst_delay <ms> command takes one required argument");
2075                 exit(-1);
2076         }
2077         else
2078         {
2079                 jtag_ntrst_delay = strtoul(args[0], NULL, 0);
2080         }
2081
2082         return ERROR_OK;
2083 }
2084
2085 static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2086 {
2087         int retval=ERROR_OK;
2088
2089         if (argc == 1)
2090         {
2091                 LOG_DEBUG("handle jtag speed");
2092
2093                 int cur_speed = 0;
2094                 cur_speed = jtag_speed = strtoul(args[0], NULL, 0);
2095
2096                 /* this command can be called during CONFIG,
2097                  * in which case jtag isn't initialized */
2098                 if (jtag)
2099                 {
2100                         retval=jtag->speed(cur_speed);
2101                 }
2102         } else if (argc == 0)
2103         {
2104         } else
2105         {
2106                 return ERROR_COMMAND_SYNTAX_ERROR;
2107         }
2108         command_print(cmd_ctx, "jtag_speed: %d", jtag_speed);
2109
2110         return retval;
2111 }
2112
2113 static int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2114 {
2115         int retval=ERROR_OK;
2116         LOG_DEBUG("handle jtag khz");
2117
2118         if(argc == 1)
2119         {
2120                 speed_khz = strtoul(args[0], NULL, 0);
2121                 if (jtag != NULL)
2122                 {
2123                         int cur_speed = 0;
2124                         LOG_DEBUG("have interface set up");
2125                         int speed_div1;
2126                         if ((retval=jtag->khz(speed_khz, &speed_div1))!=ERROR_OK)
2127                         {
2128                                 speed_khz = 0;
2129                                 return retval;
2130                         }
2131
2132                         cur_speed = jtag_speed = speed_div1;
2133
2134                         retval=jtag->speed(cur_speed);
2135                 } else
2136                 {
2137                         hasKHz = 1;
2138                 }
2139         } else if (argc==0)
2140         {
2141         } else
2142         {
2143                 return ERROR_COMMAND_SYNTAX_ERROR;
2144         }
2145
2146         if (jtag!=NULL)
2147         {
2148                 if ((retval=jtag->speed_div(jtag_speed, &speed_khz))!=ERROR_OK)
2149                         return retval;
2150         }
2151
2152         if (speed_khz==0)
2153         {
2154                 command_print(cmd_ctx, "RCLK - adaptive");
2155         } else
2156         {
2157                 command_print(cmd_ctx, "%d kHz", speed_khz);
2158         }
2159         return retval;
2160
2161 }
2162
2163 static int handle_endstate_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2164 {
2165         tap_state_t state;
2166
2167         if (argc < 1)
2168         {
2169                 return ERROR_COMMAND_SYNTAX_ERROR;
2170         }
2171         else
2172         {
2173                 state = tap_state_by_name( args[0] );
2174                 if( state < 0 ){
2175                         command_print( cmd_ctx, "Invalid state name: %s\n", args[0] );
2176                         return ERROR_COMMAND_SYNTAX_ERROR;
2177                 }
2178                 jtag_add_end_state(state);
2179                 jtag_execute_queue();
2180         }
2181         command_print(cmd_ctx, "current endstate: %s", tap_state_name(cmd_queue_end_state));
2182
2183         return ERROR_OK;
2184 }
2185
2186 static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2187 {
2188         int trst = -1;
2189         int srst = -1;
2190
2191         if (argc < 2)
2192         {
2193                 return ERROR_COMMAND_SYNTAX_ERROR;
2194         }
2195
2196         if (args[0][0] == '1')
2197                 trst = 1;
2198         else if (args[0][0] == '0')
2199                 trst = 0;
2200         else
2201         {
2202                 return ERROR_COMMAND_SYNTAX_ERROR;
2203         }
2204
2205         if (args[1][0] == '1')
2206                 srst = 1;
2207         else if (args[1][0] == '0')
2208                 srst = 0;
2209         else
2210         {
2211                 return ERROR_COMMAND_SYNTAX_ERROR;
2212         }
2213
2214         if (jtag_interface_init(cmd_ctx) != ERROR_OK)
2215                 return ERROR_JTAG_INIT_FAILED;
2216
2217         jtag_add_reset(trst, srst);
2218         jtag_execute_queue();
2219
2220         return ERROR_OK;
2221 }
2222
2223 static int handle_runtest_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2224 {
2225         if (argc < 1)
2226         {
2227                 return ERROR_COMMAND_SYNTAX_ERROR;
2228         }
2229
2230         jtag_add_runtest(strtol(args[0], NULL, 0), TAP_INVALID);
2231         jtag_execute_queue();
2232
2233         return ERROR_OK;
2234
2235 }
2236
2237 /*
2238  * For "irscan" or "drscan" commands, the "end" (really, "next") state
2239  * should be stable ... and *NOT* a shift state, otherwise free-running
2240  * jtag clocks could change the values latched by the update state.
2241  */
2242 static bool scan_is_safe(tap_state_t state)
2243 {
2244         switch (state)
2245         {
2246         case TAP_RESET:
2247         case TAP_IDLE:
2248         case TAP_DRPAUSE:
2249         case TAP_IRPAUSE:
2250                 return true;
2251         default:
2252                 return false;
2253         }
2254 }
2255
2256
2257 static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2258 {
2259         int i;
2260         scan_field_t *fields;
2261         jtag_tap_t *tap;
2262         tap_state_t endstate;
2263
2264         if ((argc < 2) || (argc % 2))
2265         {
2266                 return ERROR_COMMAND_SYNTAX_ERROR;
2267         }
2268
2269         /* optional "-endstate" "statename" at the end of the arguments,
2270          * so that e.g. IRPAUSE can let us load the data register before
2271          * entering RUN/IDLE to execute the instruction we load here.
2272          */
2273         endstate = TAP_IDLE;
2274
2275         if( argc >= 4 ){
2276                 /* have at least one pair of numbers. */
2277                 /* is last pair the magic text? */
2278                 if( 0 == strcmp( "-endstate", args[ argc - 2 ] ) ){
2279                         const char *cpA;
2280                         const char *cpS;
2281                         cpA = args[ argc-1 ];
2282                         for( endstate = 0 ; endstate < TAP_NUM_STATES ; endstate++ ){
2283                                 cpS = tap_state_name( endstate );
2284                                 if( 0 == strcmp( cpA, cpS ) ){
2285                                         break;
2286                                 }
2287                         }
2288                         if( endstate >= TAP_NUM_STATES ){
2289                                 return ERROR_COMMAND_SYNTAX_ERROR;
2290                         } else {
2291                                 if (!scan_is_safe(endstate))
2292                                         LOG_WARNING("irscan with unsafe "
2293                                                         "endstate \"%s\"", cpA);
2294                                 /* found - remove the last 2 args */
2295                                 argc -= 2;
2296                         }
2297                 }
2298         }
2299
2300         int num_fields = argc / 2;
2301
2302         fields = malloc(sizeof(scan_field_t) * num_fields);
2303
2304         for (i = 0; i < num_fields; i++)
2305         {
2306                 tap = jtag_TapByString( args[i*2] );
2307                 if (tap==NULL)
2308                 {
2309                         command_print( cmd_ctx, "Tap: %s unknown", args[i*2] );
2310                         return ERROR_FAIL;
2311                 }
2312                 int field_size = tap->ir_length;
2313                 fields[i].tap = tap;
2314                 fields[i].num_bits = field_size;
2315                 fields[i].out_value = malloc(CEIL(field_size, 8));
2316                 buf_set_u32(fields[i].out_value, 0, field_size, strtoul(args[i*2+1], NULL, 0));
2317                 fields[i].in_value = NULL;
2318         }
2319
2320         /* did we have an endstate? */
2321         jtag_add_ir_scan(num_fields, fields, endstate);
2322
2323         int retval=jtag_execute_queue();
2324
2325         for (i = 0; i < num_fields; i++)
2326                 free(fields[i].out_value);
2327
2328         free (fields);
2329
2330         return retval;
2331 }
2332
2333 static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args)
2334 {
2335         int retval;
2336         scan_field_t *fields;
2337         int num_fields;
2338         int field_count = 0;
2339         int i, e;
2340         jtag_tap_t *tap;
2341         tap_state_t endstate;
2342
2343         /* args[1] = device
2344          * args[2] = num_bits
2345          * args[3] = hex string
2346          * ... repeat num bits and hex string ...
2347          *
2348          * .. optionally:
2349         *     args[N-2] = "-endstate"
2350          *     args[N-1] = statename
2351          */
2352         if ((argc < 4) || ((argc % 2)!=0))
2353         {
2354                 Jim_WrongNumArgs(interp, 1, args, "wrong arguments");
2355                 return JIM_ERR;
2356         }
2357
2358         endstate = TAP_IDLE;
2359
2360         /* validate arguments as numbers */
2361         e = JIM_OK;
2362         for (i = 2; i < argc; i+=2)
2363         {
2364                 long bits;
2365                 const char *cp;
2366
2367                 e = Jim_GetLong(interp, args[i], &bits);
2368                 /* If valid - try next arg */
2369                 if( e == JIM_OK ){
2370                         continue;
2371                 }
2372
2373                 /* Not valid.. are we at the end? */
2374                 if ( ((i+2) != argc) ){
2375                         /* nope, then error */
2376                         return e;
2377                 }
2378
2379                 /* it could be: "-endstate FOO"
2380                  * e.g. DRPAUSE so we can issue more instructions
2381                  * before entering RUN/IDLE and executing them.
2382                  */
2383
2384                 /* get arg as a string. */
2385                 cp = Jim_GetString( args[i], NULL );
2386                 /* is it the magic? */
2387                 if( 0 == strcmp( "-endstate", cp ) ){
2388                         /* is the statename valid? */
2389                         cp = Jim_GetString( args[i+1], NULL );
2390
2391                         /* see if it is a valid state name */
2392                         endstate = tap_state_by_name(cp);
2393                         if( endstate < 0 ){
2394                                 /* update the error message */
2395                                 Jim_SetResult_sprintf(interp,"endstate: %s invalid", cp );
2396                         } else {
2397                                 if (!scan_is_safe(endstate))
2398                                         LOG_WARNING("drscan with unsafe "
2399                                                         "endstate \"%s\"", cp);
2400
2401                                 /* valid - so clear the error */
2402                                 e = JIM_OK;
2403                                 /* and remove the last 2 args */
2404                                 argc -= 2;
2405                         }
2406                 }
2407
2408                 /* Still an error? */
2409                 if( e != JIM_OK ){
2410                         return e; /* too bad */
2411                 }
2412         } /* validate args */
2413
2414         tap = jtag_TapByJimObj( interp, args[1] );
2415         if( tap == NULL ){
2416                 return JIM_ERR;
2417         }
2418
2419         num_fields=(argc-2)/2;
2420         fields = malloc(sizeof(scan_field_t) * num_fields);
2421         for (i = 2; i < argc; i+=2)
2422         {
2423                 long bits;
2424                 int len;
2425                 const char *str;
2426
2427                 Jim_GetLong(interp, args[i], &bits);
2428                 str = Jim_GetString(args[i+1], &len);
2429
2430                 fields[field_count].tap = tap;
2431                 fields[field_count].num_bits = bits;
2432                 fields[field_count].out_value = malloc(CEIL(bits, 8));
2433                 str_to_buf(str, len, fields[field_count].out_value, bits, 0);
2434                 fields[field_count].in_value = fields[field_count].out_value;
2435                 field_count++;
2436         }
2437
2438         jtag_add_dr_scan(num_fields, fields, endstate);
2439
2440         retval = jtag_execute_queue();
2441         if (retval != ERROR_OK)
2442         {
2443                 Jim_SetResultString(interp, "drscan: jtag execute failed",-1);
2444                 return JIM_ERR;
2445         }
2446
2447         field_count=0;
2448         Jim_Obj *list = Jim_NewListObj(interp, NULL, 0);
2449         for (i = 2; i < argc; i+=2)
2450         {
2451                 long bits;
2452                 char *str;
2453
2454                 Jim_GetLong(interp, args[i], &bits);
2455                 str = buf_to_str(fields[field_count].in_value, bits, 16);
2456                 free(fields[field_count].out_value);
2457
2458                 Jim_ListAppendElement(interp, list, Jim_NewStringObj(interp, str, strlen(str)));
2459                 free(str);
2460                 field_count++;
2461         }
2462
2463         Jim_SetResult(interp, list);
2464
2465         free(fields);
2466
2467         return JIM_OK;
2468 }
2469
2470
2471 static int Jim_Command_flush_count(Jim_Interp *interp, int argc, Jim_Obj *const *args)
2472 {
2473         Jim_SetResult(interp, Jim_NewIntObj(interp, jtag_flush_queue_count));
2474
2475         return JIM_OK;
2476 }
2477
2478
2479 static int handle_verify_ircapture_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2480 {
2481         if (argc == 1)
2482         {
2483                 if (strcmp(args[0], "enable") == 0)
2484                 {
2485                         jtag_verify_capture_ir = 1;
2486                 }
2487                 else if (strcmp(args[0], "disable") == 0)
2488                 {
2489                         jtag_verify_capture_ir = 0;
2490                 } else
2491                 {
2492                         return ERROR_COMMAND_SYNTAX_ERROR;
2493                 }
2494         } else if (argc != 0)
2495         {
2496                 return ERROR_COMMAND_SYNTAX_ERROR;
2497         }
2498
2499         command_print(cmd_ctx, "verify Capture-IR is %s", (jtag_verify_capture_ir) ? "enabled": "disabled");
2500
2501         return ERROR_OK;
2502 }
2503
2504 static int handle_verify_jtag_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2505 {
2506         if (argc == 1)
2507         {
2508                 if (strcmp(args[0], "enable") == 0)
2509                 {
2510                         jtag_verify = 1;
2511                 }
2512                 else if (strcmp(args[0], "disable") == 0)
2513                 {
2514                         jtag_verify = 0;
2515                 } else
2516                 {
2517                         return ERROR_COMMAND_SYNTAX_ERROR;
2518                 }
2519         } else if (argc != 0)
2520         {
2521                 return ERROR_COMMAND_SYNTAX_ERROR;
2522         }
2523
2524         command_print(cmd_ctx, "verify jtag capture is %s", (jtag_verify) ? "enabled": "disabled");
2525
2526         return ERROR_OK;
2527 }
2528
2529
2530 int jtag_power_dropout(int *dropout)
2531 {
2532         return jtag->power_dropout(dropout);
2533 }
2534
2535 int jtag_srst_asserted(int *srst_asserted)
2536 {
2537         return jtag->srst_asserted(srst_asserted);
2538 }
2539
2540 void jtag_tap_handle_event( jtag_tap_t * tap, enum jtag_tap_event e)
2541 {
2542         jtag_tap_event_action_t * jteap;
2543         int done;
2544
2545         jteap = tap->event_action;
2546
2547         done = 0;
2548         while (jteap) {
2549                 if (jteap->event == e) {
2550                         done = 1;
2551                         LOG_DEBUG( "JTAG tap: %s event: %d (%s) action: %s\n",
2552                                         tap->dotted_name,
2553                                         e,
2554                                         Jim_Nvp_value2name_simple(nvp_jtag_tap_event, e)->name,
2555                                         Jim_GetString(jteap->body, NULL) );
2556                         if (Jim_EvalObj(interp, jteap->body) != JIM_OK) {
2557                                 Jim_PrintErrorMessage(interp);
2558                         }
2559                 }
2560
2561                 jteap = jteap->next;
2562         }
2563
2564         if (!done) {
2565                 LOG_DEBUG( "event %d %s - no action",
2566                                 e,
2567                                 Jim_Nvp_value2name_simple( nvp_jtag_tap_event, e)->name);
2568         }
2569 }
2570
2571 static int handle_tms_sequence_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2572 {
2573         if (argc > 1)
2574                 return ERROR_COMMAND_SYNTAX_ERROR;
2575
2576         if (argc == 1)
2577         {
2578                 bool use_new_table;
2579                 if (strcmp(args[0], "short") == 0)
2580                         use_new_table = true;
2581                 else if (strcmp(args[0], "long") == 0)
2582                         use_new_table = false;
2583                 else
2584                         return ERROR_COMMAND_SYNTAX_ERROR;
2585
2586                 tap_use_new_tms_table(use_new_table);
2587         }
2588
2589         command_print(cmd_ctx, "tms sequence is  %s",
2590                         tap_uses_new_tms_table() ? "short": "long");
2591
2592         return ERROR_OK;
2593 }
2594
2595 /**
2596  * Function jtag_add_statemove
2597  * moves from the current state to the goal \a state. This needs
2598  * to be handled according to the xsvf spec, see the XSTATE command
2599  * description.
2600  */
2601 int jtag_add_statemove(tap_state_t goal_state)
2602 {
2603         int retval = ERROR_OK;
2604
2605         tap_state_t moves[8];
2606         tap_state_t cur_state = cmd_queue_cur_state;
2607         int i;
2608         int tms_bits;
2609         int     tms_count;
2610
2611         LOG_DEBUG( "cur_state=%s goal_state=%s",
2612                 tap_state_name(cur_state),
2613                 tap_state_name(goal_state) );
2614
2615
2616         /*      From the XSVF spec, pertaining to XSTATE:
2617
2618                 For special states known as stable states (Test-Logic-Reset,
2619                 Run-Test/Idle, Pause-DR, Pause- IR), an XSVF interpreter follows
2620                 predefined TAP state paths when the starting state is a stable state and
2621                 when the XSTATE specifies a new stable state (see the STATE command in
2622                 the [Ref 5] for the TAP state paths between stable states). For
2623                 non-stable states, XSTATE should specify a state that is only one TAP
2624                 state transition distance from the current TAP state to avoid undefined
2625                 TAP state paths. A sequence of multiple XSTATE commands can be issued to
2626                 transition the TAP through a specific state path.
2627         */
2628
2629         if (goal_state==cur_state )
2630                 ;       /* nothing to do */
2631
2632         else if( goal_state==TAP_RESET )
2633         {
2634                 jtag_add_tlr();
2635         }
2636
2637         else if( tap_is_state_stable(cur_state) && tap_is_state_stable(goal_state) )
2638         {
2639                 /*      note: unless tms_bits holds a path that agrees with [Ref 5] in above
2640                         spec, then this code is not fully conformant to the xsvf spec.  This
2641                         puts a burden on tap_get_tms_path() function from the xsvf spec.
2642                         If in doubt, you should confirm that that burden is being met.
2643                 */
2644
2645                 tms_bits  = tap_get_tms_path(cur_state, goal_state);
2646                 tms_count = tap_get_tms_path_len(cur_state, goal_state);
2647
2648                 assert( (unsigned) tms_count < DIM(moves) );
2649
2650                 for (i=0;   i<tms_count;   i++, tms_bits>>=1)
2651                 {
2652                         bool bit = tms_bits & 1;
2653
2654                         cur_state = tap_state_transition(cur_state, bit);
2655                         moves[i] = cur_state;
2656                 }
2657
2658                 jtag_add_pathmove(tms_count, moves);
2659         }
2660
2661         /*      else state must be immediately reachable in one clock cycle, and does not
2662                 need to be a stable state.
2663         */
2664         else if( tap_state_transition(cur_state, true)  == goal_state
2665                 ||   tap_state_transition(cur_state, false) == goal_state )
2666         {
2667                 /* move a single state */
2668                 moves[0] = goal_state;
2669                 jtag_add_pathmove( 1, moves );
2670         }
2671
2672         else
2673         {
2674                 retval = ERROR_FAIL;
2675         }
2676
2677         return retval;
2678 }
2679