]> git.sur5r.net Git - openocd/blob - src/jtag/jtag.c
refactor to be able to remove more in_handler stuff
[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 "replacements.h"
32
33 #include "jtag.h"
34
35 #include "command.h"
36 #include "log.h"
37
38 #include <stdlib.h>
39 #include <string.h>
40 #include <unistd.h>
41 #ifdef HAVE_STRINGS_H
42 #include <strings.h>
43 #endif
44
45
46
47 /* note that this is not marked as static as it must be available from outside jtag.c for those
48    that implement the jtag_xxx() minidriver layer
49 */
50 int jtag_error=ERROR_OK;
51
52 typedef struct cmd_queue_page_s
53 {
54         void *address;
55         size_t used;
56         struct cmd_queue_page_s *next;
57 } cmd_queue_page_t;
58
59 #define CMD_QUEUE_PAGE_SIZE (1024 * 1024)
60 static cmd_queue_page_t *cmd_queue_pages = NULL;
61
62 char* jtag_event_strings[] =
63 {
64         "JTAG controller reset (RESET or TRST)"
65 };
66
67 const Jim_Nvp nvp_jtag_tap_event[] = {
68         { .value = JTAG_TAP_EVENT_ENABLE,       .name = "tap-enable" },
69         { .value = JTAG_TAP_EVENT_DISABLE,      .name = "tap-disable" },
70
71         { .name = NULL, .value = -1 }
72 };
73
74 int jtag_trst = 0;
75 int jtag_srst = 0;
76
77 jtag_command_t *jtag_command_queue = NULL;
78 jtag_command_t **last_comand_pointer = &jtag_command_queue;
79 static jtag_tap_t *jtag_all_taps = NULL;
80
81 enum reset_types jtag_reset_config = RESET_NONE;
82 tap_state_t cmd_queue_end_state = TAP_RESET;
83 tap_state_t cmd_queue_cur_state = TAP_RESET;
84
85 int jtag_verify_capture_ir = 1;
86
87 /* how long the OpenOCD should wait before attempting JTAG communication after reset lines deasserted (in ms) */
88 static int jtag_nsrst_delay = 0; /* default to no nSRST delay */
89 static int jtag_ntrst_delay = 0; /* default to no nTRST delay */
90
91 /* maximum number of JTAG devices expected in the chain
92  */
93 #define JTAG_MAX_CHAIN_SIZE 20
94
95 /* callbacks to inform high-level handlers about JTAG state changes */
96 jtag_event_callback_t *jtag_event_callbacks;
97
98 /* speed in kHz*/
99 static int speed_khz = 0;
100 /* flag if the kHz speed was defined */
101 static int hasKHz = 0;
102
103 /* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
104  */
105
106 #if BUILD_ECOSBOARD == 1
107         extern jtag_interface_t zy1000_interface;
108 #endif
109
110 #if BUILD_PARPORT == 1
111         extern jtag_interface_t parport_interface;
112 #endif
113
114 #if BUILD_DUMMY == 1
115         extern jtag_interface_t dummy_interface;
116 #endif
117
118 #if BUILD_FT2232_FTD2XX == 1
119         extern jtag_interface_t ft2232_interface;
120 #endif
121
122 #if BUILD_FT2232_LIBFTDI == 1
123         extern jtag_interface_t ft2232_interface;
124 #endif
125
126 #if BUILD_AMTJTAGACCEL == 1
127         extern jtag_interface_t amt_jtagaccel_interface;
128 #endif
129
130 #if BUILD_EP93XX == 1
131         extern jtag_interface_t ep93xx_interface;
132 #endif
133
134 #if BUILD_AT91RM9200 == 1
135         extern jtag_interface_t at91rm9200_interface;
136 #endif
137
138 #if BUILD_GW16012 == 1
139         extern jtag_interface_t gw16012_interface;
140 #endif
141
142 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
143         extern jtag_interface_t presto_interface;
144 #endif
145
146 #if BUILD_USBPROG == 1
147         extern jtag_interface_t usbprog_interface;
148 #endif
149
150 #if BUILD_JLINK == 1
151         extern jtag_interface_t jlink_interface;
152 #endif
153
154 #if BUILD_VSLLINK == 1
155         extern jtag_interface_t vsllink_interface;
156 #endif
157
158 #if BUILD_RLINK == 1
159         extern jtag_interface_t rlink_interface;
160 #endif
161
162 #if BUILD_ARMJTAGEW == 1
163         extern jtag_interface_t armjtagew_interface;
164 #endif
165
166 jtag_interface_t *jtag_interfaces[] = {
167 #if BUILD_ECOSBOARD == 1
168         &zy1000_interface,
169 #endif
170 #if BUILD_PARPORT == 1
171         &parport_interface,
172 #endif
173 #if BUILD_DUMMY == 1
174         &dummy_interface,
175 #endif
176 #if BUILD_FT2232_FTD2XX == 1
177         &ft2232_interface,
178 #endif
179 #if BUILD_FT2232_LIBFTDI == 1
180         &ft2232_interface,
181 #endif
182 #if BUILD_AMTJTAGACCEL == 1
183         &amt_jtagaccel_interface,
184 #endif
185 #if BUILD_EP93XX == 1
186         &ep93xx_interface,
187 #endif
188 #if BUILD_AT91RM9200 == 1
189         &at91rm9200_interface,
190 #endif
191 #if BUILD_GW16012 == 1
192         &gw16012_interface,
193 #endif
194 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
195         &presto_interface,
196 #endif
197 #if BUILD_USBPROG == 1
198         &usbprog_interface,
199 #endif
200 #if BUILD_JLINK == 1
201         &jlink_interface,
202 #endif
203 #if BUILD_VSLLINK == 1
204         &vsllink_interface,
205 #endif
206 #if BUILD_RLINK == 1
207         &rlink_interface,
208 #endif
209 #if BUILD_ARMJTAGEW == 1
210         &armjtagew_interface,
211 #endif
212         NULL,
213 };
214
215 jtag_interface_t *jtag = NULL;
216
217 /* configuration */
218 static jtag_interface_t *jtag_interface = NULL;
219 int jtag_speed = 0;
220
221 /* forward declarations */
222 //void jtag_add_pathmove(int num_states, tap_state_t *path);
223 //void jtag_add_runtest(int num_cycles, tap_state_t endstate);
224 //void jtag_add_end_state(tap_state_t endstate);
225 //void jtag_add_sleep(u32 us);
226 //int jtag_execute_queue(void);
227 static tap_state_t tap_state_by_name(const char *name);
228
229 /* jtag commands */
230 static int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
231 static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
232 static int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
233 static int handle_jtag_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
234 static int handle_reset_config_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
235 static int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
236 static int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
237
238 static int handle_scan_chain_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
239
240 static int handle_endstate_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
241 static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
242 static int handle_runtest_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
243 static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
244 static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
245
246 static int handle_verify_ircapture_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
247
248 jtag_tap_t *jtag_AllTaps(void)
249 {
250         return jtag_all_taps;
251 };
252
253 int jtag_NumTotalTaps(void)
254 {
255         jtag_tap_t *t;
256         int n;
257
258         n = 0;
259         t = jtag_AllTaps();
260         while(t){
261                 n++;
262                 t = t->next_tap;
263         }
264         return n;
265 }
266
267 int jtag_NumEnabledTaps(void)
268 {
269         jtag_tap_t *t;
270         int n;
271
272         n = 0;
273         t = jtag_AllTaps();
274         while(t){
275                 if( t->enabled ){
276                         n++;
277                 }
278                 t = t->next_tap;
279         }
280         return n;
281 }
282
283 jtag_tap_t *jtag_TapByString( const char *s )
284 {
285         jtag_tap_t *t;
286         char *cp;
287
288         t = jtag_AllTaps();
289         /* try name first */
290         while(t){
291                 if( 0 == strcmp( t->dotted_name, s ) ){
292                         break;
293                 } else {
294                         t = t->next_tap;
295                 }
296         }
297         /* backup plan is by number */
298         if( t == NULL ){
299                 /* ok - is "s" a number? */
300                 int n;
301                 n = strtol( s, &cp, 0 );
302                 if( (s != cp) && (*cp == 0) ){
303                         /* Then it is... */
304                         t = jtag_TapByAbsPosition(n);
305                 }
306         }
307         return t;
308 }
309
310 jtag_tap_t * jtag_TapByJimObj( Jim_Interp *interp, Jim_Obj *o )
311 {
312         jtag_tap_t *t;
313         const char *cp;
314
315         cp = Jim_GetString( o, NULL );
316         if(cp == NULL){
317                 cp = "(unknown)";
318                 t = NULL;
319         }  else {
320                 t = jtag_TapByString( cp );
321         }
322         if( t == NULL ){
323                 Jim_SetResult_sprintf(interp,"Tap: %s is unknown", cp );
324         }
325         return t;
326 }
327
328 /* returns a pointer to the n-th device in the scan chain */
329 jtag_tap_t * jtag_TapByAbsPosition( int n )
330 {
331         int orig_n;
332         jtag_tap_t *t;
333
334         orig_n = n;
335         t = jtag_AllTaps();
336
337         while( t && (n > 0)) {
338                 n--;
339                 t = t->next_tap;
340         }
341         return t;
342 }
343
344 int jtag_register_event_callback(int (*callback)(enum jtag_event event, void *priv), void *priv)
345 {
346         jtag_event_callback_t **callbacks_p = &jtag_event_callbacks;
347
348         if (callback == NULL)
349         {
350                 return ERROR_INVALID_ARGUMENTS;
351         }
352
353         if (*callbacks_p)
354         {
355                 while ((*callbacks_p)->next)
356                         callbacks_p = &((*callbacks_p)->next);
357                 callbacks_p = &((*callbacks_p)->next);
358         }
359
360         (*callbacks_p) = malloc(sizeof(jtag_event_callback_t));
361         (*callbacks_p)->callback = callback;
362         (*callbacks_p)->priv = priv;
363         (*callbacks_p)->next = NULL;
364
365         return ERROR_OK;
366 }
367
368 int jtag_unregister_event_callback(int (*callback)(enum jtag_event event, void *priv))
369 {
370         jtag_event_callback_t **callbacks_p = &jtag_event_callbacks;
371
372         if (callback == NULL)
373         {
374                 return ERROR_INVALID_ARGUMENTS;
375         }
376
377         while (*callbacks_p)
378         {
379                 jtag_event_callback_t **next = &((*callbacks_p)->next);
380                 if ((*callbacks_p)->callback == callback)
381                 {
382                         free(*callbacks_p);
383                         *callbacks_p = *next;
384                 }
385                 callbacks_p = next;
386         }
387
388         return ERROR_OK;
389 }
390
391 int jtag_call_event_callbacks(enum jtag_event event)
392 {
393         jtag_event_callback_t *callback = jtag_event_callbacks;
394
395         LOG_DEBUG("jtag event: %s", jtag_event_strings[event]);
396
397         while (callback)
398         {
399                 callback->callback(event, callback->priv);
400                 callback = callback->next;
401         }
402
403         return ERROR_OK;
404 }
405
406 /* returns a pointer to the pointer of the last command in queue
407  * this may be a pointer to the root pointer (jtag_command_queue)
408  * or to the next member of the last but one command
409  */
410 jtag_command_t** jtag_get_last_command_p(void)
411 {
412 /*      jtag_command_t *cmd = jtag_command_queue;
413
414         if (cmd)
415                 while (cmd->next)
416                         cmd = cmd->next;
417         else
418                 return &jtag_command_queue;
419
420         return &cmd->next;*/
421
422         return last_comand_pointer;
423 }
424
425 void* cmd_queue_alloc(size_t size)
426 {
427         cmd_queue_page_t **p_page = &cmd_queue_pages;
428         int offset;
429         u8 *t;
430
431         /*
432          * WARNING:
433          *    We align/round the *SIZE* per below
434          *    so that all pointers returned by
435          *    this function are reasonably well
436          *    aligned.
437          *
438          * If we did not, then an "odd-length" request would cause the
439          * *next* allocation to be at an *odd* address, and because
440          * this function has the same type of api as malloc() - we
441          * must also return pointers that have the same type of
442          * alignment.
443          *
444          * What I do not/have is a reasonable portable means
445          * to align by...
446          *
447          * The solution here, is based on these suggestions.
448          * http://gcc.gnu.org/ml/gcc-help/2008-12/msg00041.html
449          *
450          */
451         union worse_case_align {
452                 int i;
453                 long l;
454                 float f;
455                 void *v;
456         };
457 #define ALIGN_SIZE  (sizeof(union worse_case_align))
458
459         /* The alignment process. */
460         size = (size + ALIGN_SIZE -1) & (~(ALIGN_SIZE-1));
461         /* Done... */
462
463         if (*p_page)
464         {
465                 while ((*p_page)->next)
466                         p_page = &((*p_page)->next);
467                 if (CMD_QUEUE_PAGE_SIZE - (*p_page)->used < size)
468                         p_page = &((*p_page)->next);
469         }
470
471         if (!*p_page)
472         {
473                 *p_page = malloc(sizeof(cmd_queue_page_t));
474                 (*p_page)->used = 0;
475                 (*p_page)->address = malloc(CMD_QUEUE_PAGE_SIZE);
476                 (*p_page)->next = NULL;
477         }
478
479         offset = (*p_page)->used;
480         (*p_page)->used += size;
481
482         t=(u8 *)((*p_page)->address);
483         return t + offset;
484 }
485
486 void cmd_queue_free(void)
487 {
488         cmd_queue_page_t *page = cmd_queue_pages;
489
490         while (page)
491         {
492                 cmd_queue_page_t *last = page;
493                 free(page->address);
494                 page = page->next;
495                 free(last);
496         }
497
498         cmd_queue_pages = NULL;
499 }
500
501 static void jtag_prelude1(void)
502 {
503         if (jtag_trst == 1)
504         {
505                 LOG_WARNING("JTAG command queued, while TRST is low (TAP in reset)");
506                 jtag_error=ERROR_JTAG_TRST_ASSERTED;
507                 return;
508         }
509
510         if (cmd_queue_end_state == TAP_RESET)
511                 jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
512 }
513
514 static void jtag_prelude(tap_state_t state)
515 {
516         jtag_prelude1();
517
518         if (state != TAP_INVALID)
519                 jtag_add_end_state(state);
520
521         cmd_queue_cur_state = cmd_queue_end_state;
522 }
523
524 void jtag_add_ir_scan(int num_fields, scan_field_t *fields, tap_state_t state)
525 {
526         int retval;
527
528         jtag_prelude(state);
529
530         retval=interface_jtag_add_ir_scan(num_fields, fields, cmd_queue_end_state);
531         if (retval!=ERROR_OK)
532                 jtag_error=retval;
533 }
534
535 int MINIDRIVER(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
536 {
537         jtag_command_t **last_cmd;
538         jtag_tap_t *tap;
539         int j;
540         int x;
541         int nth_tap;
542         int scan_size = 0;
543
544         last_cmd = jtag_get_last_command_p();
545
546         /* allocate memory for a new list member */
547         *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
548         (*last_cmd)->next = NULL;
549         last_comand_pointer = &((*last_cmd)->next);
550         (*last_cmd)->type = JTAG_SCAN;
551
552         /* allocate memory for ir scan command */
553         (*last_cmd)->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t));
554         (*last_cmd)->cmd.scan->ir_scan = 1;
555         x = jtag_NumEnabledTaps();
556         (*last_cmd)->cmd.scan->num_fields = x;  /* one field per device */
557         (*last_cmd)->cmd.scan->fields = cmd_queue_alloc(x  * sizeof(scan_field_t));
558         (*last_cmd)->cmd.scan->end_state = state;
559
560         nth_tap = -1;
561         tap = NULL;
562         for(;;){
563                 int found = 0;
564
565                 /* do this here so it is not forgotten */
566                 tap = jtag_NextEnabledTap(tap);
567                 if( tap == NULL ){
568                         break;
569                 }
570                 nth_tap++;
571                 scan_size = tap->ir_length;
572                 (*last_cmd)->cmd.scan->fields[nth_tap].tap = tap;
573                 (*last_cmd)->cmd.scan->fields[nth_tap].num_bits = scan_size;
574                 (*last_cmd)->cmd.scan->fields[nth_tap].in_value = NULL;
575                 (*last_cmd)->cmd.scan->fields[nth_tap].in_handler = NULL;       /* disable verification by default */
576
577                 /* search the list */
578                 for (j = 0; j < num_fields; j++)
579                 {
580                         if (tap == fields[j].tap)
581                         {
582                                 found = 1;
583                                 (*last_cmd)->cmd.scan->fields[nth_tap].out_value = buf_cpy(fields[j].out_value, cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
584
585                                 if (jtag_verify_capture_ir)
586                                 {
587                                         if (fields[j].in_handler==NULL)
588                                         {
589                                                 jtag_set_check_value((*last_cmd)->cmd.scan->fields+nth_tap, tap->expected, tap->expected_mask, NULL);
590                                         } else
591                                         {
592                                                 (*last_cmd)->cmd.scan->fields[nth_tap].in_handler = fields[j].in_handler;
593                                                 (*last_cmd)->cmd.scan->fields[nth_tap].in_handler_priv = fields[j].in_handler_priv;
594                                                 (*last_cmd)->cmd.scan->fields[nth_tap].in_check_value = tap->expected;
595                                                 (*last_cmd)->cmd.scan->fields[nth_tap].in_check_mask = tap->expected_mask;
596                                         }
597                                 }
598
599                                 tap->bypass = 0;
600                                 break;
601                         }
602                 }
603
604                 if (!found)
605                 {
606                         /* if a tap isn't listed, set it to BYPASS */
607                         (*last_cmd)->cmd.scan->fields[nth_tap].out_value = buf_set_ones(cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
608                         tap->bypass = 1;
609                 }
610
611                 /* update device information */
612                 buf_cpy((*last_cmd)->cmd.scan->fields[nth_tap].out_value, tap->cur_instr, scan_size);
613         }
614
615         return ERROR_OK;
616 }
617
618 void jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, tap_state_t state)
619 {
620         int retval;
621
622         jtag_prelude(state);
623
624         retval=interface_jtag_add_plain_ir_scan(num_fields, fields, cmd_queue_end_state);
625         if (retval!=ERROR_OK)
626                 jtag_error=retval;
627 }
628
629 int MINIDRIVER(interface_jtag_add_plain_ir_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
630 {
631         int i;
632         jtag_command_t **last_cmd;
633
634         last_cmd = jtag_get_last_command_p();
635
636         /* allocate memory for a new list member */
637         *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
638         (*last_cmd)->next = NULL;
639         last_comand_pointer = &((*last_cmd)->next);
640         (*last_cmd)->type = JTAG_SCAN;
641
642         /* allocate memory for ir scan command */
643         (*last_cmd)->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t));
644         (*last_cmd)->cmd.scan->ir_scan = 1;
645         (*last_cmd)->cmd.scan->num_fields = num_fields;
646         (*last_cmd)->cmd.scan->fields = cmd_queue_alloc(num_fields * sizeof(scan_field_t));
647         (*last_cmd)->cmd.scan->end_state = state;
648
649         for( i = 0 ; i < num_fields ; i++ ){
650                 int num_bits = fields[i].num_bits;
651                 int num_bytes = CEIL(fields[i].num_bits, 8);
652                 (*last_cmd)->cmd.scan->fields[i].tap = fields[i].tap;
653                 (*last_cmd)->cmd.scan->fields[i].num_bits = num_bits;
654                 (*last_cmd)->cmd.scan->fields[i].out_value = buf_cpy(fields[i].out_value, cmd_queue_alloc(num_bytes), num_bits);
655                 (*last_cmd)->cmd.scan->fields[i].in_value = fields[i].in_value;
656                 (*last_cmd)->cmd.scan->fields[i].in_check_value = fields[i].in_check_value;
657                 (*last_cmd)->cmd.scan->fields[i].in_check_mask = fields[i].in_check_mask;
658                 (*last_cmd)->cmd.scan->fields[i].in_handler = NULL;
659                 (*last_cmd)->cmd.scan->fields[i].in_handler_priv = NULL;
660         }
661         return ERROR_OK;
662 }
663
664 void jtag_add_dr_scan(int num_fields, scan_field_t *fields, tap_state_t state)
665 {
666         int retval;
667
668         jtag_prelude(state);
669
670         retval=interface_jtag_add_dr_scan(num_fields, fields, cmd_queue_end_state);
671         if (retval!=ERROR_OK)
672                 jtag_error=retval;
673 }
674
675 void jtag_add_dr_scan_now(int num_fields, scan_field_t *fields, tap_state_t state)
676 {
677         jtag_add_dr_scan(num_fields, fields, state);
678         jtag_execute_queue_noclear();
679 }
680
681 int MINIDRIVER(interface_jtag_add_dr_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
682 {
683         int j;
684         int nth_tap;
685         int bypass_devices = 0;
686         int field_count = 0;
687         int scan_size;
688
689         jtag_command_t **last_cmd = jtag_get_last_command_p();
690         jtag_tap_t *tap;
691
692         /* count devices in bypass */
693         tap = NULL;
694         bypass_devices = 0;
695         for(;;){
696                 tap = jtag_NextEnabledTap(tap);
697                 if( tap == NULL ){
698                         break;
699                 }
700                 if( tap->bypass ){
701                         bypass_devices++;
702                 }
703         }
704
705         /* allocate memory for a new list member */
706         *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
707         last_comand_pointer = &((*last_cmd)->next);
708         (*last_cmd)->next = NULL;
709         (*last_cmd)->type = JTAG_SCAN;
710
711         /* allocate memory for dr scan command */
712         (*last_cmd)->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t));
713         (*last_cmd)->cmd.scan->ir_scan = 0;
714         (*last_cmd)->cmd.scan->num_fields = num_fields + bypass_devices;
715         (*last_cmd)->cmd.scan->fields = cmd_queue_alloc((num_fields + bypass_devices) * sizeof(scan_field_t));
716         (*last_cmd)->cmd.scan->end_state = state;
717
718         tap = NULL;
719         nth_tap = -1;
720         for(;;){
721                 nth_tap++;
722                 tap = jtag_NextEnabledTap(tap);
723                 if( tap == NULL ){
724                         break;
725                 }
726                 int found = 0;
727                 (*last_cmd)->cmd.scan->fields[field_count].tap = tap;
728
729                 for (j = 0; j < num_fields; j++)
730                 {
731                         if (tap == fields[j].tap)
732                         {
733                                 found = 1;
734                                 scan_size = fields[j].num_bits;
735                                 (*last_cmd)->cmd.scan->fields[field_count].num_bits = scan_size;
736                                 (*last_cmd)->cmd.scan->fields[field_count].out_value = buf_cpy(fields[j].out_value, cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
737                                 (*last_cmd)->cmd.scan->fields[field_count].in_value = fields[j].in_value;
738                                 (*last_cmd)->cmd.scan->fields[field_count].in_check_value = fields[j].in_check_value;
739                                 (*last_cmd)->cmd.scan->fields[field_count].in_check_mask = fields[j].in_check_mask;
740                                 (*last_cmd)->cmd.scan->fields[field_count].in_handler = fields[j].in_handler;
741                                 (*last_cmd)->cmd.scan->fields[field_count++].in_handler_priv = fields[j].in_handler_priv;
742                         }
743                 }
744                 if (!found)
745                 {
746 #ifdef _DEBUG_JTAG_IO_
747                         /* if a device isn't listed, the BYPASS register should be selected */
748                         if (! tap->bypass)
749                         {
750                                 LOG_ERROR("BUG: no scan data for a device not in BYPASS");
751                                 exit(-1);
752                         }
753 #endif
754                         /* program the scan field to 1 bit length, and ignore it's value */
755                         (*last_cmd)->cmd.scan->fields[field_count].num_bits = 1;
756                         (*last_cmd)->cmd.scan->fields[field_count].out_value = NULL;
757                         (*last_cmd)->cmd.scan->fields[field_count].in_value = NULL;
758                         (*last_cmd)->cmd.scan->fields[field_count].in_check_value = NULL;
759                         (*last_cmd)->cmd.scan->fields[field_count].in_check_mask = NULL;
760                         (*last_cmd)->cmd.scan->fields[field_count].in_handler = NULL;
761                         (*last_cmd)->cmd.scan->fields[field_count++].in_handler_priv = NULL;
762                 }
763                 else
764                 {
765 #ifdef _DEBUG_JTAG_IO_
766                         /* if a device is listed, the BYPASS register must not be selected */
767                         if (tap->bypass)
768                         {
769                                 LOG_ERROR("BUG: scan data for a device in BYPASS");
770                                 exit(-1);
771                         }
772 #endif
773                 }
774         }
775         return ERROR_OK;
776 }
777
778 void MINIDRIVER(interface_jtag_add_dr_out)(jtag_tap_t *target_tap,
779                 int num_fields,
780                 const int *num_bits,
781                 const u32 *value,
782                 tap_state_t end_state)
783 {
784         int nth_tap;
785         int field_count = 0;
786         int scan_size;
787         int bypass_devices = 0;
788
789         jtag_command_t **last_cmd = jtag_get_last_command_p();
790         jtag_tap_t *tap;
791
792         /* count devices in bypass */
793         tap = NULL;
794         bypass_devices = 0;
795         for(;;){
796                 tap = jtag_NextEnabledTap(tap);
797                 if( tap == NULL ){
798                         break;
799                 }
800                 if( tap->bypass ){
801                         bypass_devices++;
802                 }
803         }
804
805         /* allocate memory for a new list member */
806         *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
807         last_comand_pointer = &((*last_cmd)->next);
808         (*last_cmd)->next = NULL;
809         (*last_cmd)->type = JTAG_SCAN;
810
811         /* allocate memory for dr scan command */
812         (*last_cmd)->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t));
813         (*last_cmd)->cmd.scan->ir_scan = 0;
814         (*last_cmd)->cmd.scan->num_fields = num_fields + bypass_devices;
815         (*last_cmd)->cmd.scan->fields = cmd_queue_alloc((num_fields + bypass_devices) * sizeof(scan_field_t));
816         (*last_cmd)->cmd.scan->end_state = end_state;
817
818         tap = NULL;
819         nth_tap = -1;
820         for(;;){
821                 tap = jtag_NextEnabledTap(tap);
822                 if( tap == NULL ){
823                         break;
824                 }
825                 nth_tap++;
826                 (*last_cmd)->cmd.scan->fields[field_count].tap = tap;
827
828                 if (tap == target_tap)
829                 {
830                         int j;
831 #ifdef _DEBUG_JTAG_IO_
832                         /* if a device is listed, the BYPASS register must not be selected */
833                         if (tap->bypass)
834                         {
835                                 LOG_ERROR("BUG: scan data for a device in BYPASS");
836                                 exit(-1);
837                         }
838 #endif
839                         for (j = 0; j < num_fields; j++)
840                         {
841                                 u8 out_value[4];
842                                 scan_size = num_bits[j];
843                                 buf_set_u32(out_value, 0, scan_size, value[j]);
844                                 (*last_cmd)->cmd.scan->fields[field_count].num_bits = scan_size;
845                                 (*last_cmd)->cmd.scan->fields[field_count].out_value = buf_cpy(out_value, cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
846                                 (*last_cmd)->cmd.scan->fields[field_count].in_value = NULL;
847                                 (*last_cmd)->cmd.scan->fields[field_count].in_check_value = NULL;
848                                 (*last_cmd)->cmd.scan->fields[field_count].in_check_mask = NULL;
849                                 (*last_cmd)->cmd.scan->fields[field_count].in_handler = NULL;
850                                 (*last_cmd)->cmd.scan->fields[field_count++].in_handler_priv = NULL;
851                         }
852                 } else
853                 {
854 #ifdef _DEBUG_JTAG_IO_
855                         /* if a device isn't listed, the BYPASS register should be selected */
856                         if (! tap->bypass)
857                         {
858                                 LOG_ERROR("BUG: no scan data for a device not in BYPASS");
859                                 exit(-1);
860                         }
861 #endif
862                         /* program the scan field to 1 bit length, and ignore it's value */
863                         (*last_cmd)->cmd.scan->fields[field_count].num_bits = 1;
864                         (*last_cmd)->cmd.scan->fields[field_count].out_value = NULL;
865                         (*last_cmd)->cmd.scan->fields[field_count].in_value = NULL;
866                         (*last_cmd)->cmd.scan->fields[field_count].in_check_value = NULL;
867                         (*last_cmd)->cmd.scan->fields[field_count].in_check_mask = NULL;
868                         (*last_cmd)->cmd.scan->fields[field_count].in_handler = NULL;
869                         (*last_cmd)->cmd.scan->fields[field_count++].in_handler_priv = NULL;
870                 }
871         }
872 }
873
874 void jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, tap_state_t state)
875 {
876         int retval;
877
878         jtag_prelude(state);
879
880         retval=interface_jtag_add_plain_dr_scan(num_fields, fields, cmd_queue_end_state);
881         if (retval!=ERROR_OK)
882                 jtag_error=retval;
883 }
884
885 int MINIDRIVER(interface_jtag_add_plain_dr_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
886 {
887         int i;
888         jtag_command_t **last_cmd = jtag_get_last_command_p();
889
890         /* allocate memory for a new list member */
891         *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
892         last_comand_pointer = &((*last_cmd)->next);
893         (*last_cmd)->next = NULL;
894         (*last_cmd)->type = JTAG_SCAN;
895
896         /* allocate memory for scan command */
897         (*last_cmd)->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t));
898         (*last_cmd)->cmd.scan->ir_scan = 0;
899         (*last_cmd)->cmd.scan->num_fields = num_fields;
900         (*last_cmd)->cmd.scan->fields = cmd_queue_alloc(num_fields * sizeof(scan_field_t));
901         (*last_cmd)->cmd.scan->end_state = state;
902
903         for (i = 0; i < num_fields; i++)
904         {
905                 int num_bits = fields[i].num_bits;
906                 int num_bytes = CEIL(fields[i].num_bits, 8);
907                 (*last_cmd)->cmd.scan->fields[i].tap = fields[i].tap;
908                 (*last_cmd)->cmd.scan->fields[i].num_bits = num_bits;
909                 (*last_cmd)->cmd.scan->fields[i].out_value = buf_cpy(fields[i].out_value, cmd_queue_alloc(num_bytes), num_bits);
910                 (*last_cmd)->cmd.scan->fields[i].in_value = fields[i].in_value;
911                 (*last_cmd)->cmd.scan->fields[i].in_check_value = fields[i].in_check_value;
912                 (*last_cmd)->cmd.scan->fields[i].in_check_mask = fields[i].in_check_mask;
913                 (*last_cmd)->cmd.scan->fields[i].in_handler = fields[i].in_handler;
914                 (*last_cmd)->cmd.scan->fields[i].in_handler_priv = fields[i].in_handler_priv;
915         }
916
917         return ERROR_OK;
918 }
919
920 void jtag_add_tlr(void)
921 {
922         jtag_prelude(TAP_RESET);
923
924         int retval;
925         retval=interface_jtag_add_tlr();
926         if (retval!=ERROR_OK)
927                 jtag_error=retval;
928 }
929
930 int MINIDRIVER(interface_jtag_add_tlr)(void)
931 {
932         tap_state_t state = TAP_RESET;
933         jtag_command_t **last_cmd = jtag_get_last_command_p();
934
935         /* allocate memory for a new list member */
936         *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
937         last_comand_pointer = &((*last_cmd)->next);
938         (*last_cmd)->next = NULL;
939         (*last_cmd)->type = JTAG_STATEMOVE;
940
941         (*last_cmd)->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
942         (*last_cmd)->cmd.statemove->end_state = state;
943
944         return ERROR_OK;
945 }
946
947 void jtag_add_pathmove(int num_states, tap_state_t *path)
948 {
949         tap_state_t cur_state = cmd_queue_cur_state;
950         int i;
951         int retval;
952
953         /* the last state has to be a stable state */
954         if (!tap_is_state_stable(path[num_states - 1]))
955         {
956                 LOG_ERROR("BUG: TAP path doesn't finish in a stable state");
957                 exit(-1);
958         }
959
960         for (i=0; i<num_states; i++)
961         {
962                 if (path[i] == TAP_RESET)
963                 {
964                         LOG_ERROR("BUG: TAP_RESET is not a valid state for pathmove sequences");
965                         exit(-1);
966                 }
967
968                 if ( tap_state_transition(cur_state, true)  != path[i]
969                   && tap_state_transition(cur_state, false) != path[i])
970                 {
971                         LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state), tap_state_name(path[i]));
972                         exit(-1);
973                 }
974                 cur_state = path[i];
975         }
976
977         jtag_prelude1();
978
979         retval = interface_jtag_add_pathmove(num_states, path);
980         cmd_queue_cur_state = path[num_states - 1];
981         if (retval!=ERROR_OK)
982                 jtag_error=retval;
983 }
984
985 int MINIDRIVER(interface_jtag_add_pathmove)(int num_states, tap_state_t *path)
986 {
987         jtag_command_t **last_cmd = jtag_get_last_command_p();
988         int i;
989
990         /* allocate memory for a new list member */
991         *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
992         last_comand_pointer = &((*last_cmd)->next);
993         (*last_cmd)->next = NULL;
994         (*last_cmd)->type = JTAG_PATHMOVE;
995
996         (*last_cmd)->cmd.pathmove = cmd_queue_alloc(sizeof(pathmove_command_t));
997         (*last_cmd)->cmd.pathmove->num_states = num_states;
998         (*last_cmd)->cmd.pathmove->path = cmd_queue_alloc(sizeof(tap_state_t) * num_states);
999
1000         for (i = 0; i < num_states; i++)
1001                 (*last_cmd)->cmd.pathmove->path[i] = path[i];
1002
1003         return ERROR_OK;
1004 }
1005
1006 int MINIDRIVER(interface_jtag_add_runtest)(int num_cycles, tap_state_t state)
1007 {
1008         jtag_command_t **last_cmd = jtag_get_last_command_p();
1009
1010         /* allocate memory for a new list member */
1011         *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
1012         (*last_cmd)->next = NULL;
1013         last_comand_pointer = &((*last_cmd)->next);
1014         (*last_cmd)->type = JTAG_RUNTEST;
1015
1016         (*last_cmd)->cmd.runtest = cmd_queue_alloc(sizeof(runtest_command_t));
1017         (*last_cmd)->cmd.runtest->num_cycles = num_cycles;
1018         (*last_cmd)->cmd.runtest->end_state = state;
1019
1020         return ERROR_OK;
1021 }
1022
1023 void jtag_add_runtest(int num_cycles, tap_state_t state)
1024 {
1025         int retval;
1026
1027         jtag_prelude(state);
1028
1029         /* executed by sw or hw fifo */
1030         retval=interface_jtag_add_runtest(num_cycles, cmd_queue_end_state);
1031         if (retval!=ERROR_OK)
1032                 jtag_error=retval;
1033 }
1034
1035
1036 int MINIDRIVER(interface_jtag_add_clocks)( int num_cycles )
1037 {
1038         jtag_command_t **last_cmd = jtag_get_last_command_p();
1039
1040         /* allocate memory for a new list member */
1041         *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
1042         (*last_cmd)->next = NULL;
1043         last_comand_pointer = &((*last_cmd)->next);
1044         (*last_cmd)->type = JTAG_STABLECLOCKS;
1045
1046         (*last_cmd)->cmd.stableclocks = cmd_queue_alloc(sizeof(stableclocks_command_t));
1047         (*last_cmd)->cmd.stableclocks->num_cycles = num_cycles;
1048         return ERROR_OK;
1049 }
1050
1051 void jtag_add_clocks( int num_cycles )
1052 {
1053         int retval;
1054
1055         if( !tap_is_state_stable(cmd_queue_cur_state) )
1056         {
1057                  LOG_ERROR( "jtag_add_clocks() was called with TAP in non-stable state \"%s\"",
1058                                  tap_state_name(cmd_queue_cur_state) );
1059                  jtag_error = ERROR_JTAG_NOT_STABLE_STATE;
1060                  return;
1061         }
1062
1063         if( num_cycles > 0 )
1064         {
1065                 jtag_prelude1();
1066
1067                 retval = interface_jtag_add_clocks(num_cycles);
1068                 if (retval != ERROR_OK)
1069                         jtag_error=retval;
1070         }
1071 }
1072
1073 void jtag_add_reset(int req_tlr_or_trst, int req_srst)
1074 {
1075         int trst_with_tlr = 0;
1076         int retval;
1077
1078         /* FIX!!! there are *many* different cases here. A better
1079          * approach is needed for legal combinations of transitions...
1080          */
1081         if ((jtag_reset_config & RESET_HAS_SRST)&&
1082                         (jtag_reset_config & RESET_HAS_TRST)&&
1083                         ((jtag_reset_config & RESET_SRST_PULLS_TRST)==0))
1084         {
1085                 if (((req_tlr_or_trst&&!jtag_trst)||
1086                                 (!req_tlr_or_trst&&jtag_trst))&&
1087                                 ((req_srst&&!jtag_srst)||
1088                                                 (!req_srst&&jtag_srst)))
1089                 {
1090                         /* FIX!!! srst_pulls_trst allows 1,1 => 0,0 transition.... */
1091                         //LOG_ERROR("BUG: transition of req_tlr_or_trst and req_srst in the same jtag_add_reset() call is undefined");
1092                 }
1093         }
1094
1095         /* Make sure that jtag_reset_config allows the requested reset */
1096         /* if SRST pulls TRST, we can't fulfill srst == 1 with trst == 0 */
1097         if (((jtag_reset_config & RESET_SRST_PULLS_TRST) && (req_srst == 1)) && (!req_tlr_or_trst))
1098         {
1099                 LOG_ERROR("BUG: requested reset would assert trst");
1100                 jtag_error=ERROR_FAIL;
1101                 return;
1102         }
1103
1104         /* if TRST pulls SRST, we reset with TAP T-L-R */
1105         if (((jtag_reset_config & RESET_TRST_PULLS_SRST) && (req_tlr_or_trst)) && (req_srst == 0))
1106         {
1107                 trst_with_tlr = 1;
1108         }
1109
1110         if (req_srst && !(jtag_reset_config & RESET_HAS_SRST))
1111         {
1112                 LOG_ERROR("BUG: requested SRST assertion, but the current configuration doesn't support this");
1113                 jtag_error=ERROR_FAIL;
1114                 return;
1115         }
1116
1117         if (req_tlr_or_trst)
1118         {
1119                 if (!trst_with_tlr && (jtag_reset_config & RESET_HAS_TRST))
1120                 {
1121                         jtag_trst = 1;
1122                 } else
1123                 {
1124                         trst_with_tlr = 1;
1125                 }
1126         } else
1127         {
1128                 jtag_trst = 0;
1129         }
1130
1131         jtag_srst = req_srst;
1132
1133         retval = interface_jtag_add_reset(jtag_trst, jtag_srst);
1134         if (retval!=ERROR_OK)
1135         {
1136                 jtag_error=retval;
1137                 return;
1138         }
1139
1140         if (jtag_srst)
1141         {
1142                 LOG_DEBUG("SRST line asserted");
1143         }
1144         else
1145         {
1146                 LOG_DEBUG("SRST line released");
1147                 if (jtag_nsrst_delay)
1148                         jtag_add_sleep(jtag_nsrst_delay * 1000);
1149         }
1150
1151         if (trst_with_tlr)
1152         {
1153                 LOG_DEBUG("JTAG reset with RESET instead of TRST");
1154                 jtag_add_end_state(TAP_RESET);
1155                 jtag_add_tlr();
1156                 jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
1157                 return;
1158         }
1159
1160         if (jtag_trst)
1161         {
1162                 /* we just asserted nTRST, so we're now in Test-Logic-Reset,
1163                  * and inform possible listeners about this
1164                  */
1165                 LOG_DEBUG("TRST line asserted");
1166                 cmd_queue_cur_state = TAP_RESET;
1167                 jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
1168         }
1169         else
1170         {
1171                 if (jtag_ntrst_delay)
1172                         jtag_add_sleep(jtag_ntrst_delay * 1000);
1173         }
1174 }
1175
1176 int MINIDRIVER(interface_jtag_add_reset)(int req_trst, int req_srst)
1177 {
1178         jtag_command_t **last_cmd = jtag_get_last_command_p();
1179
1180         /* allocate memory for a new list member */
1181         *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
1182         (*last_cmd)->next = NULL;
1183         last_comand_pointer = &((*last_cmd)->next);
1184         (*last_cmd)->type = JTAG_RESET;
1185
1186         (*last_cmd)->cmd.reset = cmd_queue_alloc(sizeof(reset_command_t));
1187         (*last_cmd)->cmd.reset->trst = req_trst;
1188         (*last_cmd)->cmd.reset->srst = req_srst;
1189
1190         return ERROR_OK;
1191 }
1192
1193 void jtag_add_end_state(tap_state_t state)
1194 {
1195         cmd_queue_end_state = state;
1196         if ((cmd_queue_end_state == TAP_DRSHIFT)||(cmd_queue_end_state == TAP_IRSHIFT))
1197         {
1198                 LOG_ERROR("BUG: TAP_DRSHIFT/IRSHIFT can't be end state. Calling code should use a larger scan field");
1199         }
1200 }
1201
1202 int MINIDRIVER(interface_jtag_add_sleep)(u32 us)
1203 {
1204         jtag_command_t **last_cmd = jtag_get_last_command_p();
1205
1206         /* allocate memory for a new list member */
1207         *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
1208         (*last_cmd)->next = NULL;
1209         last_comand_pointer = &((*last_cmd)->next);
1210         (*last_cmd)->type = JTAG_SLEEP;
1211
1212         (*last_cmd)->cmd.sleep = cmd_queue_alloc(sizeof(sleep_command_t));
1213         (*last_cmd)->cmd.sleep->us = us;
1214
1215         return ERROR_OK;
1216 }
1217
1218 void jtag_add_sleep(u32 us)
1219 {
1220         keep_alive(); /* we might be running on a very slow JTAG clk */
1221         int retval=interface_jtag_add_sleep(us);
1222         if (retval!=ERROR_OK)
1223                 jtag_error=retval;
1224         return;
1225 }
1226
1227 int jtag_scan_size(scan_command_t *cmd)
1228 {
1229         int bit_count = 0;
1230         int i;
1231
1232         /* count bits in scan command */
1233         for (i = 0; i < cmd->num_fields; i++)
1234         {
1235                 bit_count += cmd->fields[i].num_bits;
1236         }
1237
1238         return bit_count;
1239 }
1240
1241 int jtag_build_buffer(scan_command_t *cmd, u8 **buffer)
1242 {
1243         int bit_count = 0;
1244         int i;
1245
1246         bit_count = jtag_scan_size(cmd);
1247         *buffer = malloc(CEIL(bit_count, 8));
1248
1249         bit_count = 0;
1250
1251 #ifdef _DEBUG_JTAG_IO_
1252         LOG_DEBUG("%s num_fields: %i", cmd->ir_scan ? "IRSCAN" : "DRSCAN", cmd->num_fields);
1253 #endif
1254
1255         for (i = 0; i < cmd->num_fields; i++)
1256         {
1257                 if (cmd->fields[i].out_value)
1258                 {
1259 #ifdef _DEBUG_JTAG_IO_
1260                         char* char_buf = buf_to_str(cmd->fields[i].out_value, (cmd->fields[i].num_bits > DEBUG_JTAG_IOZ) ? DEBUG_JTAG_IOZ : cmd->fields[i].num_bits, 16);
1261 #endif
1262                         buf_set_buf(cmd->fields[i].out_value, 0, *buffer, bit_count, cmd->fields[i].num_bits);
1263 #ifdef _DEBUG_JTAG_IO_
1264                         LOG_DEBUG("fields[%i].out_value[%i]: 0x%s", i, cmd->fields[i].num_bits, char_buf);
1265                         free(char_buf);
1266 #endif
1267                 }
1268                 else
1269                 {
1270 #ifdef _DEBUG_JTAG_IO_
1271                         LOG_DEBUG("fields[%i].out_value[%i]: NULL", i, cmd->fields[i].num_bits);
1272 #endif
1273                 }
1274
1275                 bit_count += cmd->fields[i].num_bits;
1276         }
1277
1278 #ifdef _DEBUG_JTAG_IO_
1279         //LOG_DEBUG("bit_count totalling: %i",  bit_count );
1280 #endif
1281
1282         return bit_count;
1283 }
1284
1285 int jtag_read_buffer(u8 *buffer, scan_command_t *cmd)
1286 {
1287         int i;
1288         int bit_count = 0;
1289         int retval;
1290
1291         /* we return ERROR_OK, unless a check fails, or a handler reports a problem */
1292         retval = ERROR_OK;
1293
1294         for (i = 0; i < cmd->num_fields; i++)
1295         {
1296                 /* if neither in_value nor in_handler
1297                  * are specified we don't have to examine this field
1298                  */
1299                 if (cmd->fields[i].in_value || cmd->fields[i].in_handler)
1300                 {
1301                         int num_bits = cmd->fields[i].num_bits;
1302                         u8 *captured = buf_set_buf(buffer, bit_count, malloc(CEIL(num_bits, 8)), 0, num_bits);
1303
1304 #ifdef _DEBUG_JTAG_IO_
1305                         char *char_buf = buf_to_str(captured, (num_bits > DEBUG_JTAG_IOZ) ? DEBUG_JTAG_IOZ : num_bits, 16);
1306                         LOG_DEBUG("fields[%i].in_value[%i]: 0x%s", i, num_bits, char_buf);
1307                         free(char_buf);
1308 #endif
1309
1310                         if (cmd->fields[i].in_value)
1311                         {
1312                                 buf_cpy(captured, cmd->fields[i].in_value, num_bits);
1313
1314                                 if (cmd->fields[i].in_handler)
1315                                 {
1316                                         if (cmd->fields[i].in_handler(cmd->fields[i].in_value, cmd->fields[i].in_handler_priv, cmd->fields+i) != ERROR_OK)
1317                                         {
1318                                                 LOG_WARNING("in_handler: with \"in_value\", mismatch in %s", cmd->ir_scan ? "SIR" : "SDR" );
1319                                                 retval = ERROR_JTAG_QUEUE_FAILED;
1320                                         }
1321                                 }
1322                         }
1323
1324                         /* no in_value specified, but a handler takes care of the scanned data */
1325                         if (cmd->fields[i].in_handler && (!cmd->fields[i].in_value))
1326                         {
1327                                 if (cmd->fields[i].in_handler(captured, cmd->fields[i].in_handler_priv, cmd->fields+i) != ERROR_OK)
1328                                 {
1329                                         /* We're going to call the error:handler later, but if the in_handler
1330                                          * reported an error we report this failure upstream
1331                                          */
1332                                         LOG_WARNING("in_handler: w/o \"in_value\", mismatch in %s",  cmd->ir_scan ? "SIR" : "SDR" );
1333                                         retval = ERROR_JTAG_QUEUE_FAILED;
1334                                 }
1335                         }
1336
1337                         free(captured);
1338                 }
1339                 bit_count += cmd->fields[i].num_bits;
1340         }
1341
1342         return retval;
1343 }
1344
1345 static const char *jtag_tap_name(jtag_tap_t *tap)
1346 {
1347         return (tap == NULL) ? "(unknown)" : tap->dotted_name;
1348 }
1349
1350 int jtag_check_value_inner(u8 *captured, scan_field_t *field, u8 *in_check_value, u8 *in_check_mask)
1351 {
1352         int retval = ERROR_OK;
1353         int num_bits = field->num_bits;
1354
1355         int compare_failed = 0;
1356
1357         if (field->in_check_mask)
1358                 compare_failed = buf_cmp_mask(captured, in_check_value, in_check_mask, num_bits);
1359         else
1360                 compare_failed = buf_cmp(captured, in_check_value, num_bits);
1361
1362         if (compare_failed){
1363                 /* An error handler could have caught the failing check
1364                  * only report a problem when there wasn't a handler, or if the handler
1365                  * acknowledged the error
1366                  */
1367                 LOG_WARNING("TAP %s:",
1368                                         jtag_tap_name(field->tap));
1369                 if (compare_failed)
1370                 {
1371                         char *captured_char = buf_to_str(captured, (num_bits > DEBUG_JTAG_IOZ) ? DEBUG_JTAG_IOZ : num_bits, 16);
1372                         char *in_check_value_char = buf_to_str(in_check_value, (num_bits > DEBUG_JTAG_IOZ) ? DEBUG_JTAG_IOZ : num_bits, 16);
1373
1374                         if (in_check_mask)
1375                         {
1376                                 char *in_check_mask_char;
1377                                 in_check_mask_char = buf_to_str(in_check_mask, (num_bits > DEBUG_JTAG_IOZ) ? DEBUG_JTAG_IOZ : num_bits, 16);
1378                                 LOG_WARNING("value captured during scan didn't pass the requested check:");
1379                                 LOG_WARNING("captured: 0x%s check_value: 0x%s check_mask: 0x%s",
1380                                                         captured_char, in_check_value_char, in_check_mask_char);
1381                                 free(in_check_mask_char);
1382                         }
1383                         else
1384                         {
1385                                 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);
1386                         }
1387
1388                         free(captured_char);
1389                         free(in_check_value_char);
1390
1391                         retval = ERROR_JTAG_QUEUE_FAILED;
1392                 }
1393
1394         }
1395         return retval;
1396 }
1397
1398 int jtag_check_value(u8 *captured, void *priv, scan_field_t *field)
1399 {
1400         return jtag_check_value_inner(captured, field, field->in_check_value, field->in_check_mask);
1401 }
1402
1403 /*
1404   set up checking of this field using the in_handler. The values passed in must be valid until
1405   after jtag_execute() has completed.
1406  */
1407 void jtag_set_check_value(scan_field_t *field, u8 *value, u8 *mask, struct invalidstruct *obsolete)
1408 {
1409         if (value)
1410                 field->in_handler = jtag_check_value;
1411         else
1412                 field->in_handler = NULL;       /* No check, e.g. embeddedice uses value==NULL to indicate no check */
1413         field->in_handler_priv = NULL;
1414         field->in_check_value = value;
1415         field->in_check_mask = mask;
1416 }
1417
1418 void jtag_check_value_mask(scan_field_t *field, u8 *value, u8 *mask)
1419 {
1420         jtag_execute_queue_noclear();
1421         
1422         int retval=jtag_check_value_inner(field->in_value, field, value, mask);
1423         jtag_set_error(retval);
1424         
1425 }
1426
1427
1428
1429 enum scan_type jtag_scan_type(scan_command_t *cmd)
1430 {
1431         int i;
1432         int type = 0;
1433
1434         for (i = 0; i < cmd->num_fields; i++)
1435         {
1436                 if (cmd->fields[i].in_value || cmd->fields[i].in_handler)
1437                         type |= SCAN_IN;
1438                 if (cmd->fields[i].out_value)
1439                         type |= SCAN_OUT;
1440         }
1441
1442         return type;
1443 }
1444
1445 int MINIDRIVER(interface_jtag_execute_queue)(void)
1446 {
1447         int retval;
1448
1449         if (jtag==NULL)
1450         {
1451                 LOG_ERROR("No JTAG interface configured yet. Issue 'init' command in startup scripts before communicating with targets.");
1452                 return ERROR_FAIL;
1453         }
1454
1455         retval = jtag->execute_queue();
1456
1457         cmd_queue_free();
1458
1459         jtag_command_queue = NULL;
1460         last_comand_pointer = &jtag_command_queue;
1461
1462         return retval;
1463 }
1464
1465 void jtag_execute_queue_noclear(void)
1466 {
1467         int retval=interface_jtag_execute_queue();
1468         /* we keep the first error */
1469         if ((jtag_error==ERROR_OK)&&(retval!=ERROR_OK))
1470         {
1471                 jtag_error=retval;
1472         }
1473 }
1474
1475 int jtag_execute_queue(void)
1476 {
1477         int retval;
1478         jtag_execute_queue_noclear();
1479         retval=jtag_error;
1480         jtag_error=ERROR_OK;
1481         return retval;
1482 }
1483
1484 int jtag_reset_callback(enum jtag_event event, void *priv)
1485 {
1486         jtag_tap_t *tap = priv;
1487
1488         LOG_DEBUG("-");
1489
1490         if (event == JTAG_TRST_ASSERTED)
1491         {
1492                 buf_set_ones(tap->cur_instr, tap->ir_length);
1493                 tap->bypass = 1;
1494         }
1495
1496         return ERROR_OK;
1497 }
1498
1499 void jtag_sleep(u32 us)
1500 {
1501         alive_sleep(us/1000);
1502 }
1503
1504 /* Try to examine chain layout according to IEEE 1149.1 Â§12
1505  */
1506 int jtag_examine_chain(void)
1507 {
1508         jtag_tap_t *tap;
1509         scan_field_t field;
1510         u8 idcode_buffer[JTAG_MAX_CHAIN_SIZE * 4];
1511         int i;
1512         int bit_count;
1513         int device_count = 0;
1514         u8 zero_check = 0x0;
1515         u8 one_check = 0xff;
1516
1517         field.tap = NULL;
1518         field.num_bits = sizeof(idcode_buffer) * 8;
1519         field.out_value = idcode_buffer;
1520
1521         field.in_value = idcode_buffer;
1522
1523
1524         field.in_handler = NULL;
1525
1526         for (i = 0; i < JTAG_MAX_CHAIN_SIZE; i++)
1527         {
1528                 buf_set_u32(idcode_buffer, i * 32, 32, 0x000000FF);
1529         }
1530
1531         jtag_add_plain_dr_scan(1, &field, TAP_RESET);
1532         jtag_execute_queue();
1533
1534         for (i = 0; i < JTAG_MAX_CHAIN_SIZE * 4; i++)
1535         {
1536                 zero_check |= idcode_buffer[i];
1537                 one_check &= idcode_buffer[i];
1538         }
1539
1540         /* if there wasn't a single non-zero bit or if all bits were one, the scan isn't valid */
1541         if ((zero_check == 0x00) || (one_check == 0xff))
1542         {
1543                 LOG_ERROR("JTAG communication failure, check connection, JTAG interface, target power etc.");
1544                 return ERROR_JTAG_INIT_FAILED;
1545         }
1546
1547         /* point at the 1st tap */
1548         tap = jtag_NextEnabledTap(NULL);
1549         if( tap == NULL ){
1550                 LOG_ERROR("JTAG: No taps enabled?");
1551                 return ERROR_JTAG_INIT_FAILED;
1552         }
1553
1554         for (bit_count = 0; bit_count < (JTAG_MAX_CHAIN_SIZE * 32) - 31;)
1555         {
1556                 u32 idcode = buf_get_u32(idcode_buffer, bit_count, 32);
1557                 if ((idcode & 1) == 0)
1558                 {
1559                         /* LSB must not be 0, this indicates a device in bypass */
1560                         LOG_WARNING("Tap/Device does not have IDCODE");
1561                         idcode=0;
1562
1563                         bit_count += 1;
1564                 }
1565                 else
1566                 {
1567                         u32 manufacturer;
1568                         u32 part;
1569                         u32 version;
1570
1571                         /* some devices, such as AVR will output all 1's instead of TDI
1572                         input value at end of chain. */
1573                         if ((idcode == 0x000000FF)||(idcode == 0xFFFFFFFF))
1574                         {
1575                                 int unexpected=0;
1576                                 /* End of chain (invalid manufacturer ID)
1577                                  *
1578                                  * The JTAG examine is the very first thing that happens
1579                                  *
1580                                  * A single JTAG device requires only 64 bits to be read back correctly.
1581                                  *
1582                                  * The code below adds a check that the rest of the data scanned (640 bits)
1583                                  * are all as expected. This helps diagnose/catch problems with the JTAG chain
1584                                  *
1585                                  * earlier and gives more helpful/explicit error messages.
1586                                  */
1587                                 for (bit_count += 32; bit_count < (JTAG_MAX_CHAIN_SIZE * 32) - 31;bit_count += 32)
1588                                 {
1589                                         idcode = buf_get_u32(idcode_buffer, bit_count, 32);
1590                                         if (unexpected||((idcode != 0x000000FF)&&(idcode != 0xFFFFFFFF)))
1591                                         {
1592                                                 LOG_WARNING("Unexpected idcode after end of chain! %d 0x%08x", bit_count, idcode);
1593                                                 unexpected = 1;
1594                                         }
1595                                 }
1596
1597                                 break;
1598                         }
1599
1600 #define EXTRACT_MFG(X)  (((X) & 0xffe) >> 1)
1601                         manufacturer = EXTRACT_MFG(idcode);
1602 #define EXTRACT_PART(X) (((X) & 0xffff000) >> 12)
1603                         part = EXTRACT_PART(idcode);
1604 #define EXTRACT_VER(X)  (((X) & 0xf0000000) >> 28)
1605                         version = EXTRACT_VER(idcode);
1606
1607                         LOG_INFO("JTAG tap: %s tap/device found: 0x%8.8x (Manufacturer: 0x%3.3x, Part: 0x%4.4x, Version: 0x%1.1x)",
1608                                          ((tap != NULL) ? (tap->dotted_name) : "(not-named)"),
1609                                 idcode, manufacturer, part, version);
1610
1611                         bit_count += 32;
1612                 }
1613                 if (tap)
1614                 {
1615                         tap->idcode = idcode;
1616
1617                         if (tap->expected_ids_cnt > 0) {
1618                                 /* Loop over the expected identification codes and test for a match */
1619                                 u8 ii;
1620                                 for (ii = 0; ii < tap->expected_ids_cnt; ii++) {
1621                                         if( tap->idcode == tap->expected_ids[ii] ){
1622                                                 break;
1623                                         }
1624                                 }
1625
1626                                 /* If none of the expected ids matched, log an error */
1627                                 if (ii == tap->expected_ids_cnt) {
1628                                         LOG_ERROR("JTAG tap: %s             got: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1629                                                           tap->dotted_name,
1630                                                           idcode,
1631                                                           EXTRACT_MFG( tap->idcode ),
1632                                                           EXTRACT_PART( tap->idcode ),
1633                                                           EXTRACT_VER( tap->idcode ) );
1634                                         for (ii = 0; ii < tap->expected_ids_cnt; ii++) {
1635                                                 LOG_ERROR("JTAG tap: %s expected %hhu of %hhu: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1636                                                                   tap->dotted_name,
1637                                                                   ii + 1,
1638                                                                   tap->expected_ids_cnt,
1639                                                                   tap->expected_ids[ii],
1640                                                                   EXTRACT_MFG( tap->expected_ids[ii] ),
1641                                                                   EXTRACT_PART( tap->expected_ids[ii] ),
1642                                                                   EXTRACT_VER( tap->expected_ids[ii] ) );
1643                                         }
1644
1645                                         return ERROR_JTAG_INIT_FAILED;
1646                                 } else {
1647                                         LOG_INFO("JTAG Tap/device matched");
1648                                 }
1649                         } else {
1650 #if 0
1651                                 LOG_INFO("JTAG TAP ID: 0x%08x - Unknown - please report (A) chipname and (B) idcode to the openocd project",
1652                                                  tap->idcode);
1653 #endif
1654                         }
1655                         tap = jtag_NextEnabledTap(tap);
1656                 }
1657                 device_count++;
1658         }
1659
1660         /* see if number of discovered devices matches configuration */
1661         if (device_count != jtag_NumEnabledTaps())
1662         {
1663                 LOG_ERROR("number of discovered devices in JTAG chain (%i) doesn't match (enabled) configuration (%i), total taps: %d",
1664                                   device_count, jtag_NumEnabledTaps(), jtag_NumTotalTaps());
1665                 LOG_ERROR("check the config file and ensure proper JTAG communication (connections, speed, ...)");
1666                 return ERROR_JTAG_INIT_FAILED;
1667         }
1668
1669         return ERROR_OK;
1670 }
1671
1672 int jtag_validate_chain(void)
1673 {
1674         jtag_tap_t *tap;
1675         int total_ir_length = 0;
1676         u8 *ir_test = NULL;
1677         scan_field_t field;
1678         int chain_pos = 0;
1679
1680         tap = NULL;
1681         total_ir_length = 0;
1682         for(;;){
1683                 tap = jtag_NextEnabledTap(tap);
1684                 if( tap == NULL ){
1685                         break;
1686                 }
1687                 total_ir_length += tap->ir_length;
1688         }
1689
1690         total_ir_length += 2;
1691         ir_test = malloc(CEIL(total_ir_length, 8));
1692         buf_set_ones(ir_test, total_ir_length);
1693
1694         field.tap = NULL;
1695         field.num_bits = total_ir_length;
1696         field.out_value = ir_test;
1697         field.in_value = ir_test;
1698         field.in_handler = NULL;
1699
1700         jtag_add_plain_ir_scan(1, &field, TAP_RESET);
1701         jtag_execute_queue();
1702
1703         tap = NULL;
1704         chain_pos = 0;
1705         int val;
1706         for(;;){
1707                 tap = jtag_NextEnabledTap(tap);
1708                 if( tap == NULL ){
1709                         break;
1710                 }
1711
1712                 val = buf_get_u32(ir_test, chain_pos, 2);
1713                 if (val != 0x1)
1714                 {
1715                         char *cbuf = buf_to_str(ir_test, total_ir_length, 16);
1716                         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);
1717                         free(cbuf);
1718                         free(ir_test);
1719                         return ERROR_JTAG_INIT_FAILED;
1720                 }
1721                 chain_pos += tap->ir_length;
1722         }
1723
1724         val = buf_get_u32(ir_test, chain_pos, 2);
1725         if (val != 0x3)
1726         {
1727                 char *cbuf = buf_to_str(ir_test, total_ir_length, 16);
1728                 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);
1729                 free(cbuf);
1730                 free(ir_test);
1731                 return ERROR_JTAG_INIT_FAILED;
1732         }
1733
1734         free(ir_test);
1735
1736         return ERROR_OK;
1737 }
1738
1739 enum jtag_tap_cfg_param {
1740         JCFG_EVENT
1741 };
1742
1743 static Jim_Nvp nvp_config_opts[] = {
1744         { .name = "-event",      .value = JCFG_EVENT },
1745
1746         { .name = NULL,          .value = -1 }
1747 };
1748
1749 static int jtag_tap_configure_cmd( Jim_GetOptInfo *goi, jtag_tap_t * tap)
1750 {
1751         Jim_Nvp *n;
1752         Jim_Obj *o;
1753         int e;
1754
1755         /* parse config or cget options */
1756         while (goi->argc > 0) {
1757                 Jim_SetEmptyResult (goi->interp);
1758
1759                 e = Jim_GetOpt_Nvp(goi, nvp_config_opts, &n);
1760                 if (e != JIM_OK) {
1761                         Jim_GetOpt_NvpUnknown(goi, nvp_config_opts, 0);
1762                         return e;
1763                 }
1764
1765                 switch (n->value) {
1766                         case JCFG_EVENT:
1767                                 if (goi->argc == 0) {
1768                                         Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ..." );
1769                                         return JIM_ERR;
1770                                 }
1771
1772                                 e = Jim_GetOpt_Nvp( goi, nvp_jtag_tap_event, &n );
1773                                 if (e != JIM_OK) {
1774                                         Jim_GetOpt_NvpUnknown(goi, nvp_jtag_tap_event, 1);
1775                                         return e;
1776                                 }
1777
1778                                 if (goi->isconfigure) {
1779                                         if (goi->argc != 1) {
1780                                                 Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name? ?EVENT-BODY?");
1781                                                 return JIM_ERR;
1782                                         }
1783                                 } else {
1784                                         if (goi->argc != 0) {
1785                                                 Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name?");
1786                                                 return JIM_ERR;
1787                                         }
1788                                 }
1789
1790                                 {
1791                                         jtag_tap_event_action_t *jteap;
1792
1793                                         jteap = tap->event_action;
1794                                         /* replace existing? */
1795                                         while (jteap) {
1796                                                 if (jteap->event == (enum jtag_tap_event)n->value) {
1797                                                         break;
1798                                                 }
1799                                                 jteap = jteap->next;
1800                                         }
1801
1802                                         if (goi->isconfigure) {
1803                                                 if (jteap == NULL) {
1804                                                         /* create new */
1805                                                         jteap = calloc(1, sizeof (*jteap));
1806                                                 }
1807                                                 jteap->event = n->value;
1808                                                 Jim_GetOpt_Obj( goi, &o);
1809                                                 if (jteap->body) {
1810                                                         Jim_DecrRefCount(interp, jteap->body);
1811                                                 }
1812                                                 jteap->body = Jim_DuplicateObj(goi->interp, o);
1813                                                 Jim_IncrRefCount(jteap->body);
1814
1815                                                 /* add to head of event list */
1816                                                 jteap->next = tap->event_action;
1817                                                 tap->event_action = jteap;
1818                                                 Jim_SetEmptyResult(goi->interp);
1819                                         } else {
1820                                                 /* get */
1821                                                 if (jteap == NULL) {
1822                                                         Jim_SetEmptyResult(goi->interp);
1823                                                 } else {
1824                                                         Jim_SetResult(goi->interp, Jim_DuplicateObj(goi->interp, jteap->body));
1825                                                 }
1826                                         }
1827                                 }
1828                                 /* loop for more */
1829                                 break;
1830                 }
1831         } /* while (goi->argc) */
1832
1833         return JIM_OK;
1834 }
1835
1836 static int jim_newtap_cmd( Jim_GetOptInfo *goi )
1837 {
1838         jtag_tap_t *pTap;
1839         jtag_tap_t **ppTap;
1840         jim_wide w;
1841         int x;
1842         int e;
1843         int reqbits;
1844         Jim_Nvp *n;
1845         char *cp;
1846         const Jim_Nvp opts[] = {
1847 #define NTAP_OPT_IRLEN     0
1848                 { .name = "-irlen"                      ,       .value = NTAP_OPT_IRLEN },
1849 #define NTAP_OPT_IRMASK    1
1850                 { .name = "-irmask"                     ,       .value = NTAP_OPT_IRMASK },
1851 #define NTAP_OPT_IRCAPTURE 2
1852                 { .name = "-ircapture"          ,       .value = NTAP_OPT_IRCAPTURE },
1853 #define NTAP_OPT_ENABLED   3
1854                 { .name = "-enable"                     ,       .value = NTAP_OPT_ENABLED },
1855 #define NTAP_OPT_DISABLED  4
1856                 { .name = "-disable"            ,       .value = NTAP_OPT_DISABLED },
1857 #define NTAP_OPT_EXPECTED_ID 5
1858                 { .name = "-expected-id"        ,       .value = NTAP_OPT_EXPECTED_ID },
1859                 { .name = NULL                          ,       .value = -1 },
1860         };
1861
1862         pTap = malloc( sizeof(jtag_tap_t) );
1863         memset( pTap, 0, sizeof(*pTap) );
1864         if( !pTap ){
1865                 Jim_SetResult_sprintf( goi->interp, "no memory");
1866                 return JIM_ERR;
1867         }
1868         /*
1869          * we expect CHIP + TAP + OPTIONS
1870          * */
1871         if( goi->argc < 3 ){
1872                 Jim_SetResult_sprintf(goi->interp, "Missing CHIP TAP OPTIONS ....");
1873                 return JIM_ERR;
1874         }
1875         Jim_GetOpt_String( goi, &cp, NULL );
1876         pTap->chip = strdup(cp);
1877
1878         Jim_GetOpt_String( goi, &cp, NULL );
1879         pTap->tapname = strdup(cp);
1880
1881         /* name + dot + name + null */
1882         x = strlen(pTap->chip) + 1 + strlen(pTap->tapname) + 1;
1883         cp = malloc( x );
1884         sprintf( cp, "%s.%s", pTap->chip, pTap->tapname );
1885         pTap->dotted_name = cp;
1886
1887         LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
1888                           pTap->chip, pTap->tapname, pTap->dotted_name, goi->argc);
1889
1890         /* default is enabled */
1891         pTap->enabled = 1;
1892
1893         /* deal with options */
1894 #define NTREQ_IRLEN      1
1895 #define NTREQ_IRCAPTURE  2
1896 #define NTREQ_IRMASK     4
1897
1898         /* clear them as we find them */
1899         reqbits = (NTREQ_IRLEN | NTREQ_IRCAPTURE | NTREQ_IRMASK);
1900
1901         while( goi->argc ){
1902                 e = Jim_GetOpt_Nvp( goi, opts, &n );
1903                 if( e != JIM_OK ){
1904                         Jim_GetOpt_NvpUnknown( goi, opts, 0 );
1905                         return e;
1906                 }
1907                 LOG_DEBUG("Processing option: %s", n->name );
1908                 switch( n->value ){
1909                 case NTAP_OPT_ENABLED:
1910                         pTap->enabled = 1;
1911                         break;
1912                 case NTAP_OPT_DISABLED:
1913                         pTap->enabled = 0;
1914                         break;
1915                 case NTAP_OPT_EXPECTED_ID:
1916                 {
1917                         u32 *new_expected_ids;
1918
1919                         e = Jim_GetOpt_Wide( goi, &w );
1920                         if( e != JIM_OK) {
1921                                 Jim_SetResult_sprintf(goi->interp, "option: %s bad parameter", n->name);
1922                                 return e;
1923                         }
1924
1925                         new_expected_ids = malloc(sizeof(u32) * (pTap->expected_ids_cnt + 1));
1926                         if (new_expected_ids == NULL) {
1927                                 Jim_SetResult_sprintf( goi->interp, "no memory");
1928                                 return JIM_ERR;
1929                         }
1930
1931                         memcpy(new_expected_ids, pTap->expected_ids, sizeof(u32) * pTap->expected_ids_cnt);
1932
1933                         new_expected_ids[pTap->expected_ids_cnt] = w;
1934
1935                         free(pTap->expected_ids);
1936                         pTap->expected_ids = new_expected_ids;
1937                         pTap->expected_ids_cnt++;
1938                         break;
1939                 }
1940                 case NTAP_OPT_IRLEN:
1941                 case NTAP_OPT_IRMASK:
1942                 case NTAP_OPT_IRCAPTURE:
1943                         e = Jim_GetOpt_Wide( goi, &w );
1944                         if( e != JIM_OK ){
1945                                 Jim_SetResult_sprintf( goi->interp, "option: %s bad parameter", n->name );
1946                                 return e;
1947                         }
1948                         if( (w < 0) || (w > 0xffff) ){
1949                                 /* wacky value */
1950                                 Jim_SetResult_sprintf( goi->interp, "option: %s - wacky value: %d (0x%x)",
1951                                                                            n->name, (int)(w), (int)(w));
1952                                 return JIM_ERR;
1953                         }
1954                         switch(n->value){
1955                         case NTAP_OPT_IRLEN:
1956                                 pTap->ir_length = w;
1957                                 reqbits &= (~(NTREQ_IRLEN));
1958                                 break;
1959                         case NTAP_OPT_IRMASK:
1960                                 pTap->ir_capture_mask = w;
1961                                 reqbits &= (~(NTREQ_IRMASK));
1962                                 break;
1963                         case NTAP_OPT_IRCAPTURE:
1964                                 pTap->ir_capture_value = w;
1965                                 reqbits &= (~(NTREQ_IRCAPTURE));
1966                                 break;
1967                         }
1968                 } /* switch(n->value) */
1969         } /* while( goi->argc ) */
1970
1971         /* Did we get all the options? */
1972         if( reqbits ){
1973                 // no
1974                 Jim_SetResult_sprintf( goi->interp,
1975                                                            "newtap: %s missing required parameters",
1976                                                            pTap->dotted_name);
1977                 /* TODO: Tell user what is missing :-( */
1978                 /* no memory leaks pelase */
1979                 free(((void *)(pTap->expected_ids)));
1980                 free(((void *)(pTap->chip)));
1981                 free(((void *)(pTap->tapname)));
1982                 free(((void *)(pTap->dotted_name)));
1983                 free(((void *)(pTap)));
1984                 return JIM_ERR;
1985         }
1986
1987         pTap->expected      = malloc( pTap->ir_length );
1988         pTap->expected_mask = malloc( pTap->ir_length );
1989         pTap->cur_instr     = malloc( pTap->ir_length );
1990
1991         buf_set_u32( pTap->expected,
1992                                  0,
1993                                  pTap->ir_length,
1994                                  pTap->ir_capture_value );
1995         buf_set_u32( pTap->expected_mask,
1996                                  0,
1997                                  pTap->ir_length,
1998                                  pTap->ir_capture_mask );
1999         buf_set_ones( pTap->cur_instr,
2000                                   pTap->ir_length );
2001
2002         pTap->bypass = 1;
2003
2004         jtag_register_event_callback(jtag_reset_callback, pTap );
2005
2006         ppTap = &(jtag_all_taps);
2007         while( (*ppTap) != NULL ){
2008                 ppTap = &((*ppTap)->next_tap);
2009         }
2010         *ppTap = pTap;
2011         {
2012                 static int n_taps = 0;
2013                 pTap->abs_chain_position = n_taps++;
2014         }
2015         LOG_DEBUG( "Created Tap: %s @ abs position %d, irlen %d, capture: 0x%x mask: 0x%x",
2016                                 (*ppTap)->dotted_name,
2017                                 (*ppTap)->abs_chain_position,
2018                                 (*ppTap)->ir_length,
2019                                 (*ppTap)->ir_capture_value,
2020                                 (*ppTap)->ir_capture_mask );
2021
2022         return ERROR_OK;
2023 }
2024
2025 static int jim_jtag_command( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
2026 {
2027         Jim_GetOptInfo goi;
2028         int e;
2029         Jim_Nvp *n;
2030         Jim_Obj *o;
2031         struct command_context_s *context;
2032
2033         enum {
2034                 JTAG_CMD_INTERFACE,
2035                 JTAG_CMD_INIT_RESET,
2036                 JTAG_CMD_NEWTAP,
2037                 JTAG_CMD_TAPENABLE,
2038                 JTAG_CMD_TAPDISABLE,
2039                 JTAG_CMD_TAPISENABLED,
2040                 JTAG_CMD_CONFIGURE,
2041                 JTAG_CMD_CGET
2042         };
2043
2044         const Jim_Nvp jtag_cmds[] = {
2045                 { .name = "interface"     , .value = JTAG_CMD_INTERFACE },
2046                 { .name = "arp_init-reset", .value = JTAG_CMD_INIT_RESET },
2047                 { .name = "newtap"        , .value = JTAG_CMD_NEWTAP },
2048                 { .name = "tapisenabled"     , .value = JTAG_CMD_TAPISENABLED },
2049                 { .name = "tapenable"     , .value = JTAG_CMD_TAPENABLE },
2050                 { .name = "tapdisable"    , .value = JTAG_CMD_TAPDISABLE },
2051                 { .name = "configure"     , .value = JTAG_CMD_CONFIGURE },
2052                 { .name = "cget"          , .value = JTAG_CMD_CGET },
2053
2054                 { .name = NULL, .value = -1 },
2055         };
2056
2057         context = Jim_GetAssocData(interp, "context");
2058         /* go past the command */
2059         Jim_GetOpt_Setup( &goi, interp, argc-1, argv+1 );
2060
2061         e = Jim_GetOpt_Nvp( &goi, jtag_cmds, &n );
2062         if( e != JIM_OK ){
2063                 Jim_GetOpt_NvpUnknown( &goi, jtag_cmds, 0 );
2064                 return e;
2065         }
2066                 Jim_SetEmptyResult( goi.interp );
2067         switch( n->value ){
2068         case JTAG_CMD_INTERFACE:
2069                 /* return the name of the interface */
2070                 /* TCL code might need to know the exact type... */
2071                 /* FUTURE: we allow this as a means to "set" the interface. */
2072                 if( goi.argc != 0 ){
2073                         Jim_WrongNumArgs( goi.interp, 1, goi.argv-1, "(no params)");
2074                         return JIM_ERR;
2075                 }
2076                 Jim_SetResultString( goi.interp, jtag_interface->name, -1 );
2077                 return JIM_OK;
2078         case JTAG_CMD_INIT_RESET:
2079                 if( goi.argc != 0 ){
2080                         Jim_WrongNumArgs( goi.interp, 1, goi.argv-1, "(no params)");
2081                         return JIM_ERR;
2082                 }
2083                 e = jtag_init_reset(context);
2084                 if( e != ERROR_OK ){
2085                         Jim_SetResult_sprintf( goi.interp, "error: %d", e);
2086                         return JIM_ERR;
2087                 }
2088                 return JIM_OK;
2089         case JTAG_CMD_NEWTAP:
2090                 return jim_newtap_cmd( &goi );
2091                 break;
2092         case JTAG_CMD_TAPISENABLED:
2093         case JTAG_CMD_TAPENABLE:
2094         case JTAG_CMD_TAPDISABLE:
2095                 if( goi.argc != 1 ){
2096                         Jim_SetResultString( goi.interp, "Too many parameters",-1 );
2097                         return JIM_ERR;
2098                 }
2099
2100                 {
2101                         jtag_tap_t *t;
2102                         t = jtag_TapByJimObj( goi.interp, goi.argv[0] );
2103                         if( t == NULL ){
2104                                 return JIM_ERR;
2105                         }
2106                         switch( n->value ){
2107                         case JTAG_CMD_TAPISENABLED:
2108                                 e = t->enabled;
2109                                 break;
2110                         case JTAG_CMD_TAPENABLE:
2111                                 jtag_tap_handle_event( t, JTAG_TAP_EVENT_ENABLE);
2112                                 e = 1;
2113                                 t->enabled = e;
2114                                 break;
2115                         case JTAG_CMD_TAPDISABLE:
2116                                 jtag_tap_handle_event( t, JTAG_TAP_EVENT_DISABLE);
2117                                 e = 0;
2118                                 t->enabled = e;
2119                                 break;
2120                         }
2121                         Jim_SetResult( goi.interp, Jim_NewIntObj( goi.interp, e ) );
2122                         return JIM_OK;
2123                 }
2124                 break;
2125
2126         case JTAG_CMD_CGET:
2127                 if( goi.argc < 2 ){
2128                         Jim_WrongNumArgs( goi.interp, 0, NULL, "?tap-name? -option ...");
2129                         return JIM_ERR;
2130                 }
2131
2132                 {
2133                         jtag_tap_t *t;
2134
2135                         Jim_GetOpt_Obj(&goi, &o);
2136                         t = jtag_TapByJimObj( goi.interp, o );
2137                         if( t == NULL ){
2138                                 return JIM_ERR;
2139                         }
2140
2141                         goi.isconfigure = 0;
2142                         return jtag_tap_configure_cmd( &goi, t);
2143                 }
2144                 break;
2145
2146         case JTAG_CMD_CONFIGURE:
2147                 if( goi.argc < 3 ){
2148                         Jim_WrongNumArgs( goi.interp, 0, NULL, "?tap-name? -option ?VALUE? ...");
2149                         return JIM_ERR;
2150                 }
2151
2152                 {
2153                         jtag_tap_t *t;
2154
2155                         Jim_GetOpt_Obj(&goi, &o);
2156                         t = jtag_TapByJimObj( goi.interp, o );
2157                         if( t == NULL ){
2158                                 return JIM_ERR;
2159                         }
2160
2161                         goi.isconfigure = 1;
2162                         return jtag_tap_configure_cmd( &goi, t);
2163                 }
2164         }
2165
2166         return JIM_ERR;
2167 }
2168
2169 int jtag_register_commands(struct command_context_s *cmd_ctx)
2170 {
2171         register_jim( cmd_ctx, "jtag", jim_jtag_command, "perform jtag tap actions");
2172
2173         register_command(cmd_ctx, NULL, "interface", handle_interface_command,
2174                 COMMAND_CONFIG, "try to configure interface");
2175         register_command(cmd_ctx, NULL, "jtag_speed", handle_jtag_speed_command,
2176                 COMMAND_ANY, "set jtag speed (if supported)");
2177         register_command(cmd_ctx, NULL, "jtag_khz", handle_jtag_khz_command,
2178                 COMMAND_ANY, "same as jtag_speed, except it takes maximum khz as arguments. 0 KHz = RTCK.");
2179         register_command(cmd_ctx, NULL, "jtag_device", handle_jtag_device_command,
2180                 COMMAND_CONFIG, "jtag_device <ir_length> <ir_expected> <ir_mask>");
2181         register_command(cmd_ctx, NULL, "reset_config", handle_reset_config_command,
2182                 COMMAND_ANY,
2183                 "[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]");
2184         register_command(cmd_ctx, NULL, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command,
2185                 COMMAND_ANY, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
2186         register_command(cmd_ctx, NULL, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command,
2187                 COMMAND_ANY, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
2188
2189         register_command(cmd_ctx, NULL, "scan_chain", handle_scan_chain_command,
2190                 COMMAND_EXEC, "print current scan chain configuration");
2191
2192         register_command(cmd_ctx, NULL, "endstate", handle_endstate_command,
2193                 COMMAND_EXEC, "finish JTAG operations in <tap_state>");
2194         register_command(cmd_ctx, NULL, "jtag_reset", handle_jtag_reset_command,
2195                 COMMAND_EXEC, "toggle reset lines <trst> <srst>");
2196         register_command(cmd_ctx, NULL, "runtest", handle_runtest_command,
2197                 COMMAND_EXEC, "move to Run-Test/Idle, and execute <num_cycles>");
2198         register_command(cmd_ctx, NULL, "irscan", handle_irscan_command,
2199                 COMMAND_EXEC, "execute IR scan <device> <instr> [dev2] [instr2] ...");
2200         register_jim(cmd_ctx, "drscan", Jim_Command_drscan, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
2201
2202         register_command(cmd_ctx, NULL, "verify_ircapture", handle_verify_ircapture_command,
2203                 COMMAND_ANY, "verify value captured during Capture-IR <enable|disable>");
2204         return ERROR_OK;
2205 }
2206
2207 int jtag_interface_init(struct command_context_s *cmd_ctx)
2208 {
2209         if (jtag)
2210                 return ERROR_OK;
2211
2212         if (!jtag_interface)
2213         {
2214                 /* nothing was previously specified by "interface" command */
2215                 LOG_ERROR("JTAG interface has to be specified, see \"interface\" command");
2216                 return ERROR_JTAG_INVALID_INTERFACE;
2217         }
2218         if(hasKHz)
2219         {
2220                 jtag_interface->khz(speed_khz, &jtag_speed);
2221                 hasKHz = 0;
2222         }
2223
2224         if (jtag_interface->init() != ERROR_OK)
2225                 return ERROR_JTAG_INIT_FAILED;
2226
2227         jtag = jtag_interface;
2228         return ERROR_OK;
2229 }
2230
2231 static int jtag_init_inner(struct command_context_s *cmd_ctx)
2232 {
2233         jtag_tap_t *tap;
2234         int retval;
2235
2236         LOG_DEBUG("Init JTAG chain");
2237
2238         tap = jtag_NextEnabledTap(NULL);
2239         if( tap == NULL ){
2240                 LOG_ERROR("There are no enabled taps?");
2241                 return ERROR_JTAG_INIT_FAILED;
2242         }
2243
2244         jtag_add_tlr();
2245         if ((retval=jtag_execute_queue())!=ERROR_OK)
2246                 return retval;
2247
2248         /* examine chain first, as this could discover the real chain layout */
2249         if (jtag_examine_chain() != ERROR_OK)
2250         {
2251                 LOG_ERROR("trying to validate configured JTAG chain anyway...");
2252         }
2253
2254         if (jtag_validate_chain() != ERROR_OK)
2255         {
2256                 LOG_WARNING("Could not validate JTAG chain, continuing anyway...");
2257         }
2258
2259         return ERROR_OK;
2260 }
2261
2262 int jtag_init_reset(struct command_context_s *cmd_ctx)
2263 {
2264         int retval;
2265
2266         if ((retval=jtag_interface_init(cmd_ctx)) != ERROR_OK)
2267                 return retval;
2268
2269         LOG_DEBUG("Trying to bring the JTAG controller to life by asserting TRST / RESET");
2270
2271         /* Reset can happen after a power cycle.
2272          *
2273          * Ideally we would only assert TRST or run RESET before the target reset.
2274          *
2275          * However w/srst_pulls_trst, trst is asserted together with the target
2276          * reset whether we want it or not.
2277          *
2278          * NB! Some targets have JTAG circuitry disabled until a
2279          * trst & srst has been asserted.
2280          *
2281          * NB! here we assume nsrst/ntrst delay are sufficient!
2282          *
2283          * NB! order matters!!!! srst *can* disconnect JTAG circuitry
2284          *
2285          */
2286         jtag_add_reset(1, 0); /* RESET or TRST */
2287         if (jtag_reset_config & RESET_HAS_SRST)
2288         {
2289                 jtag_add_reset(1, 1);
2290                 if ((jtag_reset_config & RESET_SRST_PULLS_TRST)==0)
2291                         jtag_add_reset(0, 1);
2292         }
2293         jtag_add_reset(0, 0);
2294         if ((retval = jtag_execute_queue()) != ERROR_OK)
2295                 return retval;
2296
2297         /* Check that we can communication on the JTAG chain + eventually we want to
2298          * be able to perform enumeration only after OpenOCD has started
2299          * telnet and GDB server
2300          *
2301          * That would allow users to more easily perform any magic they need to before
2302          * reset happens.
2303          */
2304         return jtag_init_inner(cmd_ctx);
2305 }
2306
2307 int jtag_init(struct command_context_s *cmd_ctx)
2308 {
2309         int retval;
2310         if ((retval=jtag_interface_init(cmd_ctx)) != ERROR_OK)
2311                 return retval;
2312         if (jtag_init_inner(cmd_ctx)==ERROR_OK)
2313         {
2314                 return ERROR_OK;
2315         }
2316         return jtag_init_reset(cmd_ctx);
2317 }
2318
2319 static int default_khz(int khz, int *jtag_speed)
2320 {
2321         LOG_ERROR("Translation from khz to jtag_speed not implemented");
2322         return ERROR_FAIL;
2323 }
2324
2325 static int default_speed_div(int speed, int *khz)
2326 {
2327         LOG_ERROR("Translation from jtag_speed to khz not implemented");
2328         return ERROR_FAIL;
2329 }
2330
2331 static int default_power_dropout(int *dropout)
2332 {
2333         *dropout=0; /* by default we can't detect power dropout */
2334         return ERROR_OK;
2335 }
2336
2337 static int default_srst_asserted(int *srst_asserted)
2338 {
2339         *srst_asserted=0; /* by default we can't detect srst asserted */
2340         return ERROR_OK;
2341 }
2342
2343 static int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2344 {
2345         int i;
2346         int retval;
2347
2348         /* check whether the interface is already configured */
2349         if (jtag_interface)
2350         {
2351                 LOG_WARNING("Interface already configured, ignoring");
2352                 return ERROR_OK;
2353         }
2354
2355         /* interface name is a mandatory argument */
2356         if (argc < 1 || args[0][0] == '\0')
2357         {
2358                 return ERROR_COMMAND_SYNTAX_ERROR;
2359         }
2360
2361         for (i=0; jtag_interfaces[i]; i++)
2362         {
2363                 if (strcmp(args[0], jtag_interfaces[i]->name) == 0)
2364                 {
2365                         if ((retval = jtag_interfaces[i]->register_commands(cmd_ctx)) != ERROR_OK)
2366                         {
2367                                 return retval;
2368                         }
2369
2370                         jtag_interface = jtag_interfaces[i];
2371
2372                         if (jtag_interface->khz == NULL)
2373                         {
2374                                 jtag_interface->khz = default_khz;
2375                         }
2376                         if (jtag_interface->speed_div == NULL)
2377                         {
2378                                 jtag_interface->speed_div = default_speed_div;
2379                         }
2380                         if (jtag_interface->power_dropout == NULL)
2381                         {
2382                                 jtag_interface->power_dropout = default_power_dropout;
2383                         }
2384                         if (jtag_interface->srst_asserted == NULL)
2385                         {
2386                                 jtag_interface->srst_asserted = default_srst_asserted;
2387                         }
2388
2389                         return ERROR_OK;
2390                 }
2391         }
2392
2393         /* no valid interface was found (i.e. the configuration option,
2394          * didn't match one of the compiled-in interfaces
2395          */
2396         LOG_ERROR("No valid jtag interface found (%s)", args[0]);
2397         LOG_ERROR("compiled-in jtag interfaces:");
2398         for (i = 0; jtag_interfaces[i]; i++)
2399         {
2400                 LOG_ERROR("%i: %s", i, jtag_interfaces[i]->name);
2401         }
2402
2403         return ERROR_JTAG_INVALID_INTERFACE;
2404 }
2405
2406 static int handle_jtag_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2407 {
2408         int e;
2409         char buf[1024];
2410         Jim_Obj *newargs[ 10 ];
2411         /*
2412          * CONVERT SYNTAX
2413          * argv[-1] = command
2414          * argv[ 0] = ir length
2415          * argv[ 1] = ir capture
2416          * argv[ 2] = ir mask
2417          * argv[ 3] = not actually used by anything but in the docs
2418          */
2419
2420         if( argc < 4 ){
2421                 command_print( cmd_ctx, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
2422                 return ERROR_OK;
2423         }
2424         command_print( cmd_ctx, "OLD SYNTAX: DEPRECATED - translating to new syntax");
2425         command_print( cmd_ctx, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
2426                                    args[0],
2427                                    args[1],
2428                                    args[2] );
2429         command_print( cmd_ctx, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
2430         command_print( cmd_ctx, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
2431         command_print( cmd_ctx, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
2432         command_print( cmd_ctx, "And then refer to the taps by the dotted name.");
2433
2434         newargs[0] = Jim_NewStringObj( interp, "jtag", -1   );
2435         newargs[1] = Jim_NewStringObj( interp, "newtap", -1 );
2436         sprintf( buf, "chip%d", jtag_NumTotalTaps() );
2437         newargs[2] = Jim_NewStringObj( interp, buf, -1 );
2438         sprintf( buf, "tap%d", jtag_NumTotalTaps() );
2439         newargs[3] = Jim_NewStringObj( interp, buf, -1  );
2440         newargs[4] = Jim_NewStringObj( interp, "-irlen", -1  );
2441         newargs[5] = Jim_NewStringObj( interp, args[0], -1  );
2442         newargs[6] = Jim_NewStringObj( interp, "-ircapture", -1  );
2443         newargs[7] = Jim_NewStringObj( interp, args[1], -1  );
2444         newargs[8] = Jim_NewStringObj( interp, "-irmask", -1  );
2445         newargs[9] = Jim_NewStringObj( interp, args[2], -1  );
2446
2447         command_print( cmd_ctx, "NEW COMMAND:");
2448         sprintf( buf, "%s %s %s %s %s %s %s %s %s %s",
2449                          Jim_GetString( newargs[0], NULL ),
2450                          Jim_GetString( newargs[1], NULL ),
2451                          Jim_GetString( newargs[2], NULL ),
2452                          Jim_GetString( newargs[3], NULL ),
2453                          Jim_GetString( newargs[4], NULL ),
2454                          Jim_GetString( newargs[5], NULL ),
2455                          Jim_GetString( newargs[6], NULL ),
2456                          Jim_GetString( newargs[7], NULL ),
2457                          Jim_GetString( newargs[8], NULL ),
2458                          Jim_GetString( newargs[9], NULL ) );
2459
2460         e = jim_jtag_command( interp, 10, newargs );
2461         if( e != JIM_OK ){
2462                 command_print( cmd_ctx, "%s", Jim_GetString( Jim_GetResult(interp), NULL ) );
2463         }
2464         return e;
2465 }
2466
2467 static int handle_scan_chain_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2468 {
2469         jtag_tap_t *tap;
2470
2471         tap = jtag_all_taps;
2472         command_print(cmd_ctx, "     TapName            | Enabled |   IdCode      Expected    IrLen IrCap  IrMask Instr     ");
2473         command_print(cmd_ctx, "---|--------------------|---------|------------|------------|------|------|------|---------");
2474
2475         while( tap ){
2476                 u32 expected, expected_mask, cur_instr, ii;
2477                 expected = buf_get_u32(tap->expected, 0, tap->ir_length);
2478                 expected_mask = buf_get_u32(tap->expected_mask, 0, tap->ir_length);
2479                 cur_instr = buf_get_u32(tap->cur_instr, 0, tap->ir_length);
2480
2481                 command_print(cmd_ctx,
2482                                           "%2d | %-18s |    %c    | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
2483                                           tap->abs_chain_position,
2484                                           tap->dotted_name,
2485                                           tap->enabled ? 'Y' : 'n',
2486                                           tap->idcode,
2487                                           (tap->expected_ids_cnt > 0 ? tap->expected_ids[0] : 0),
2488                                           tap->ir_length,
2489                                           expected,
2490                                           expected_mask,
2491                                           cur_instr);
2492
2493                 for (ii = 1; ii < tap->expected_ids_cnt; ii++) {
2494                         command_print(cmd_ctx, "   |                    |         |            | 0x%08x |      |      |      |         ",
2495                                                   tap->expected_ids[ii]);
2496                 }
2497
2498                 tap = tap->next_tap;
2499         }
2500
2501         return ERROR_OK;
2502 }
2503
2504 static int handle_reset_config_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2505 {
2506         if (argc < 1)
2507                 return ERROR_COMMAND_SYNTAX_ERROR;
2508
2509         if (argc >= 1)
2510         {
2511                 if (strcmp(args[0], "none") == 0)
2512                         jtag_reset_config = RESET_NONE;
2513                 else if (strcmp(args[0], "trst_only") == 0)
2514                         jtag_reset_config = RESET_HAS_TRST;
2515                 else if (strcmp(args[0], "srst_only") == 0)
2516                         jtag_reset_config = RESET_HAS_SRST;
2517                 else if (strcmp(args[0], "trst_and_srst") == 0)
2518                         jtag_reset_config = RESET_TRST_AND_SRST;
2519                 else
2520                 {
2521                         LOG_ERROR("(1) invalid reset_config argument (%s), defaulting to none", args[0]);
2522                         jtag_reset_config = RESET_NONE;
2523                         return ERROR_INVALID_ARGUMENTS;
2524                 }
2525         }
2526
2527         if (argc >= 2)
2528         {
2529                 if (strcmp(args[1], "separate") == 0)
2530                 {
2531                         /* seperate reset lines - default */
2532                 } else
2533                 {
2534                         if (strcmp(args[1], "srst_pulls_trst") == 0)
2535                                 jtag_reset_config |= RESET_SRST_PULLS_TRST;
2536                         else if (strcmp(args[1], "trst_pulls_srst") == 0)
2537                                 jtag_reset_config |= RESET_TRST_PULLS_SRST;
2538                         else if (strcmp(args[1], "combined") == 0)
2539                                 jtag_reset_config |= RESET_SRST_PULLS_TRST | RESET_TRST_PULLS_SRST;
2540                         else
2541                         {
2542                                 LOG_ERROR("(2) invalid reset_config argument (%s), defaulting to none", args[1]);
2543                                 jtag_reset_config = RESET_NONE;
2544                                 return ERROR_INVALID_ARGUMENTS;
2545                         }
2546                 }
2547         }
2548
2549         if (argc >= 3)
2550         {
2551                 if (strcmp(args[2], "trst_open_drain") == 0)
2552                         jtag_reset_config |= RESET_TRST_OPEN_DRAIN;
2553                 else if (strcmp(args[2], "trst_push_pull") == 0)
2554                         jtag_reset_config &= ~RESET_TRST_OPEN_DRAIN;
2555                 else
2556                 {
2557                         LOG_ERROR("(3) invalid reset_config argument (%s) defaulting to none", args[2] );
2558                         jtag_reset_config = RESET_NONE;
2559                         return ERROR_INVALID_ARGUMENTS;
2560                 }
2561         }
2562
2563         if (argc >= 4)
2564         {
2565                 if (strcmp(args[3], "srst_push_pull") == 0)
2566                         jtag_reset_config |= RESET_SRST_PUSH_PULL;
2567                 else if (strcmp(args[3], "srst_open_drain") == 0)
2568                         jtag_reset_config &= ~RESET_SRST_PUSH_PULL;
2569                 else
2570                 {
2571                         LOG_ERROR("(4) invalid reset_config argument (%s), defaulting to none", args[3]);
2572                         jtag_reset_config = RESET_NONE;
2573                         return ERROR_INVALID_ARGUMENTS;
2574                 }
2575         }
2576
2577         return ERROR_OK;
2578 }
2579
2580 static int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2581 {
2582         if (argc < 1)
2583         {
2584                 LOG_ERROR("jtag_nsrst_delay <ms> command takes one required argument");
2585                 exit(-1);
2586         }
2587         else
2588         {
2589                 jtag_nsrst_delay = strtoul(args[0], NULL, 0);
2590         }
2591
2592         return ERROR_OK;
2593 }
2594
2595 static int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2596 {
2597         if (argc < 1)
2598         {
2599                 LOG_ERROR("jtag_ntrst_delay <ms> command takes one required argument");
2600                 exit(-1);
2601         }
2602         else
2603         {
2604                 jtag_ntrst_delay = strtoul(args[0], NULL, 0);
2605         }
2606
2607         return ERROR_OK;
2608 }
2609
2610 static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2611 {
2612         int retval=ERROR_OK;
2613
2614         if (argc == 1)
2615         {
2616                 LOG_DEBUG("handle jtag speed");
2617
2618                 int cur_speed = 0;
2619                 cur_speed = jtag_speed = strtoul(args[0], NULL, 0);
2620
2621                 /* this command can be called during CONFIG,
2622                  * in which case jtag isn't initialized */
2623                 if (jtag)
2624                 {
2625                         retval=jtag->speed(cur_speed);
2626                 }
2627         } else if (argc == 0)
2628         {
2629         } else
2630         {
2631                 return ERROR_COMMAND_SYNTAX_ERROR;
2632         }
2633         command_print(cmd_ctx, "jtag_speed: %d", jtag_speed);
2634
2635         return retval;
2636 }
2637
2638 static int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2639 {
2640         int retval=ERROR_OK;
2641         LOG_DEBUG("handle jtag khz");
2642
2643         if(argc == 1)
2644         {
2645                 speed_khz = strtoul(args[0], NULL, 0);
2646                 if (jtag != NULL)
2647                 {
2648                         int cur_speed = 0;
2649                         LOG_DEBUG("have interface set up");
2650                         int speed_div1;
2651                         if ((retval=jtag->khz(speed_khz, &speed_div1))!=ERROR_OK)
2652                         {
2653                                 speed_khz = 0;
2654                                 return retval;
2655                         }
2656
2657                         cur_speed = jtag_speed = speed_div1;
2658
2659                         retval=jtag->speed(cur_speed);
2660                 } else
2661                 {
2662                         hasKHz = 1;
2663                 }
2664         } else if (argc==0)
2665         {
2666         } else
2667         {
2668                 return ERROR_COMMAND_SYNTAX_ERROR;
2669         }
2670
2671         if (jtag!=NULL)
2672         {
2673                 if ((retval=jtag->speed_div(jtag_speed, &speed_khz))!=ERROR_OK)
2674                         return retval;
2675         }
2676
2677         if (speed_khz==0)
2678         {
2679                 command_print(cmd_ctx, "RCLK - adaptive");
2680         } else
2681         {
2682                 command_print(cmd_ctx, "%d kHz", speed_khz);
2683         }
2684         return retval;
2685
2686 }
2687
2688 static int handle_endstate_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2689 {
2690         tap_state_t state;
2691
2692         if (argc < 1)
2693         {
2694                 return ERROR_COMMAND_SYNTAX_ERROR;
2695         }
2696         else
2697         {
2698                 state = tap_state_by_name( args[0] );
2699                 if( state < 0 ){
2700                         command_print( cmd_ctx, "Invalid state name: %s\n", args[0] );
2701                         return ERROR_COMMAND_SYNTAX_ERROR;
2702                 }
2703                 jtag_add_end_state(state);
2704                 jtag_execute_queue();
2705         }
2706         command_print(cmd_ctx, "current endstate: %s", tap_state_name(cmd_queue_end_state));
2707
2708         return ERROR_OK;
2709 }
2710
2711 static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2712 {
2713         int trst = -1;
2714         int srst = -1;
2715
2716         if (argc < 2)
2717         {
2718                 return ERROR_COMMAND_SYNTAX_ERROR;
2719         }
2720
2721         if (args[0][0] == '1')
2722                 trst = 1;
2723         else if (args[0][0] == '0')
2724                 trst = 0;
2725         else
2726         {
2727                 return ERROR_COMMAND_SYNTAX_ERROR;
2728         }
2729
2730         if (args[1][0] == '1')
2731                 srst = 1;
2732         else if (args[1][0] == '0')
2733                 srst = 0;
2734         else
2735         {
2736                 return ERROR_COMMAND_SYNTAX_ERROR;
2737         }
2738
2739         if (jtag_interface_init(cmd_ctx) != ERROR_OK)
2740                 return ERROR_JTAG_INIT_FAILED;
2741
2742         jtag_add_reset(trst, srst);
2743         jtag_execute_queue();
2744
2745         return ERROR_OK;
2746 }
2747
2748 static int handle_runtest_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2749 {
2750         if (argc < 1)
2751         {
2752                 return ERROR_COMMAND_SYNTAX_ERROR;
2753         }
2754
2755         jtag_add_runtest(strtol(args[0], NULL, 0), TAP_INVALID);
2756         jtag_execute_queue();
2757
2758         return ERROR_OK;
2759
2760 }
2761
2762 static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2763 {
2764         int i;
2765         scan_field_t *fields;
2766         jtag_tap_t *tap;
2767         tap_state_t endstate;
2768
2769         if ((argc < 2) || (argc % 2))
2770         {
2771                 return ERROR_COMMAND_SYNTAX_ERROR;
2772         }
2773
2774         /* optional "-endstate" */
2775         /*          "statename" */
2776         /* at the end of the arguments. */
2777         /* assume none. */
2778         endstate = TAP_INVALID;
2779         if( argc >= 4 ){
2780                 /* have at least one pair of numbers. */
2781                 /* is last pair the magic text? */
2782                 if( 0 == strcmp( "-endstate", args[ argc - 2 ] ) ){
2783                         const char *cpA;
2784                         const char *cpS;
2785                         cpA = args[ argc-1 ];
2786                         for( endstate = 0 ; endstate < TAP_NUM_STATES ; endstate++ ){
2787                                 cpS = tap_state_name( endstate );
2788                                 if( 0 == strcmp( cpA, cpS ) ){
2789                                         break;
2790                                 }
2791                         }
2792                         if( endstate >= TAP_NUM_STATES ){
2793                                 return ERROR_COMMAND_SYNTAX_ERROR;
2794                         } else {
2795                                 /* found - remove the last 2 args */
2796                                 argc -= 2;
2797                         }
2798                 }
2799         }
2800
2801         fields = malloc(sizeof(scan_field_t) * argc / 2);
2802
2803         for (i = 0; i < argc / 2; i++)
2804         {
2805                 tap = jtag_TapByString( args[i*2] );
2806                 if (tap==NULL)
2807                 {
2808                         command_print( cmd_ctx, "Tap: %s unknown", args[i*2] );
2809                         return ERROR_FAIL;
2810                 }
2811                 int field_size = tap->ir_length;
2812                 fields[i].tap = tap;
2813                 fields[i].out_value = malloc(CEIL(field_size, 8));
2814                 buf_set_u32(fields[i].out_value, 0, field_size, strtoul(args[i*2+1], NULL, 0));
2815                 fields[i].in_value = NULL;
2816                 fields[i].in_check_mask = NULL;
2817                 fields[i].in_handler = NULL;
2818                 fields[i].in_handler_priv = NULL;
2819         }
2820
2821         jtag_add_ir_scan(argc / 2, fields, TAP_INVALID);
2822         /* did we have an endstate? */
2823         if (endstate != TAP_INVALID)
2824                 jtag_add_end_state(endstate);
2825
2826         jtag_execute_queue();
2827
2828         for (i = 0; i < argc / 2; i++)
2829                 free(fields[i].out_value);
2830
2831         free (fields);
2832
2833         return ERROR_OK;
2834 }
2835
2836 static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args)
2837 {
2838         int retval;
2839         scan_field_t *fields;
2840         int num_fields;
2841         int field_count = 0;
2842         int i, e;
2843         jtag_tap_t *tap;
2844         tap_state_t endstate;
2845
2846         /* args[1] = device
2847          * args[2] = num_bits
2848          * args[3] = hex string
2849          * ... repeat num bits and hex string ...
2850          *
2851          * .. optionally:
2852         *     args[N-2] = "-endstate"
2853          *     args[N-1] = statename
2854          */
2855         if ((argc < 4) || ((argc % 2)!=0))
2856         {
2857                 Jim_WrongNumArgs(interp, 1, args, "wrong arguments");
2858                 return JIM_ERR;
2859         }
2860
2861         /* assume no endstate */
2862         endstate = TAP_INVALID;
2863         /* validate arguments as numbers */
2864         e = JIM_OK;
2865         for (i = 2; i < argc; i+=2)
2866         {
2867                 long bits;
2868                 const char *cp;
2869
2870                 e = Jim_GetLong(interp, args[i], &bits);
2871                 /* If valid - try next arg */
2872                 if( e == JIM_OK ){
2873                         continue;
2874                 }
2875
2876                 /* Not valid.. are we at the end? */
2877                 if ( ((i+2) != argc) ){
2878                         /* nope, then error */
2879                         return e;
2880                 }
2881
2882                 /* it could be: "-endstate FOO" */
2883
2884                 /* get arg as a string. */
2885                 cp = Jim_GetString( args[i], NULL );
2886                 /* is it the magic? */
2887                 if( 0 == strcmp( "-endstate", cp ) ){
2888                         /* is the statename valid? */
2889                         cp = Jim_GetString( args[i+1], NULL );
2890
2891                         /* see if it is a valid state name */
2892                         endstate = tap_state_by_name(cp);
2893                         if( endstate < 0 ){
2894                                 /* update the error message */
2895                                 Jim_SetResult_sprintf(interp,"endstate: %s invalid", cp );
2896                         } else {
2897                                 /* valid - so clear the error */
2898                                 e = JIM_OK;
2899                                 /* and remove the last 2 args */
2900                                 argc -= 2;
2901                         }
2902                 }
2903
2904                 /* Still an error? */
2905                 if( e != JIM_OK ){
2906                         return e; /* too bad */
2907                 }
2908         } /* validate args */
2909
2910         tap = jtag_TapByJimObj( interp, args[1] );
2911         if( tap == NULL ){
2912                 return JIM_ERR;
2913         }
2914
2915         num_fields=(argc-2)/2;
2916         fields = malloc(sizeof(scan_field_t) * num_fields);
2917         for (i = 2; i < argc; i+=2)
2918         {
2919                 long bits;
2920                 int len;
2921                 const char *str;
2922
2923                 Jim_GetLong(interp, args[i], &bits);
2924                 str = Jim_GetString(args[i+1], &len);
2925
2926                 fields[field_count].tap = tap;
2927                 fields[field_count].num_bits = bits;
2928                 fields[field_count].out_value = malloc(CEIL(bits, 8));
2929                 str_to_buf(str, len, fields[field_count].out_value, bits, 0);
2930                 fields[field_count].in_value = fields[field_count].out_value;
2931                 fields[field_count].in_check_mask = NULL;
2932                 fields[field_count].in_check_value = NULL;
2933                 fields[field_count].in_handler = NULL;
2934                 fields[field_count++].in_handler_priv = NULL;
2935         }
2936
2937         jtag_add_dr_scan(num_fields, fields, TAP_INVALID);
2938         /* did we get an end state? */
2939         if (endstate != TAP_INVALID)
2940                 jtag_add_end_state(endstate);
2941
2942         retval = jtag_execute_queue();
2943         if (retval != ERROR_OK)
2944         {
2945                 Jim_SetResultString(interp, "drscan: jtag execute failed",-1);
2946                 return JIM_ERR;
2947         }
2948
2949         field_count=0;
2950         Jim_Obj *list = Jim_NewListObj(interp, NULL, 0);
2951         for (i = 2; i < argc; i+=2)
2952         {
2953                 long bits;
2954                 char *str;
2955
2956                 Jim_GetLong(interp, args[i], &bits);
2957                 str = buf_to_str(fields[field_count].in_value, bits, 16);
2958                 free(fields[field_count].out_value);
2959
2960                 Jim_ListAppendElement(interp, list, Jim_NewStringObj(interp, str, strlen(str)));
2961                 free(str);
2962                 field_count++;
2963         }
2964
2965         Jim_SetResult(interp, list);
2966
2967         free(fields);
2968
2969         return JIM_OK;
2970 }
2971
2972 static int handle_verify_ircapture_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2973 {
2974         if (argc == 1)
2975         {
2976                 if (strcmp(args[0], "enable") == 0)
2977                 {
2978                         jtag_verify_capture_ir = 1;
2979                 }
2980                 else if (strcmp(args[0], "disable") == 0)
2981                 {
2982                         jtag_verify_capture_ir = 0;
2983                 } else
2984                 {
2985                         return ERROR_COMMAND_SYNTAX_ERROR;
2986                 }
2987         } else if (argc != 0)
2988         {
2989                 return ERROR_COMMAND_SYNTAX_ERROR;
2990         }
2991
2992         command_print(cmd_ctx, "verify Capture-IR is %s", (jtag_verify_capture_ir) ? "enabled": "disabled");
2993
2994         return ERROR_OK;
2995 }
2996
2997 int jtag_power_dropout(int *dropout)
2998 {
2999         return jtag->power_dropout(dropout);
3000 }
3001
3002 int jtag_srst_asserted(int *srst_asserted)
3003 {
3004         return jtag->srst_asserted(srst_asserted);
3005 }
3006
3007 void jtag_tap_handle_event( jtag_tap_t * tap, enum jtag_tap_event e)
3008 {
3009         jtag_tap_event_action_t * jteap;
3010         int done;
3011
3012         jteap = tap->event_action;
3013
3014         done = 0;
3015         while (jteap) {
3016                 if (jteap->event == e) {
3017                         done = 1;
3018                         LOG_DEBUG( "JTAG tap: %s event: %d (%s) action: %s\n",
3019                                         tap->dotted_name,
3020                                         e,
3021                                         Jim_Nvp_value2name_simple(nvp_jtag_tap_event, e)->name,
3022                                         Jim_GetString(jteap->body, NULL) );
3023                         if (Jim_EvalObj(interp, jteap->body) != JIM_OK) {
3024                                 Jim_PrintErrorMessage(interp);
3025                         }
3026                 }
3027
3028                 jteap = jteap->next;
3029         }
3030
3031         if (!done) {
3032                 LOG_DEBUG( "event %d %s - no action",
3033                                 e,
3034                                 Jim_Nvp_value2name_simple( nvp_jtag_tap_event, e)->name);
3035         }
3036 }
3037
3038 /*-----<Cable Helper API>---------------------------------------*/
3039
3040 /*  these Cable Helper API functions are all documented in the jtag.h header file,
3041         using a Doxygen format.  And since Doxygen's configuration file "Doxyfile",
3042         is setup to prefer its docs in the header file, no documentation is here, for
3043         if it were, it would have to be doubly maintained.
3044 */
3045
3046 /**
3047  * @see tap_set_state() and tap_get_state() accessors.
3048  * Actual name is not important since accessors hide it.
3049  */
3050 static tap_state_t state_follower = TAP_RESET;
3051
3052 void tap_set_state_impl( tap_state_t new_state )
3053 {
3054         /* this is the state we think the TAPs are in now, was cur_state */
3055         state_follower = new_state;
3056 }
3057
3058 tap_state_t tap_get_state()
3059 {
3060         return state_follower;
3061 }
3062
3063 /**
3064  * @see tap_set_end_state() and tap_get_end_state() accessors.
3065  * Actual name is not important because accessors hide it.
3066  */
3067 static tap_state_t end_state_follower = TAP_RESET;
3068
3069 void tap_set_end_state( tap_state_t new_end_state )
3070 {
3071         /* this is the state we think the TAPs will be in at completion of the
3072            current TAP operation, was end_state
3073         */
3074         end_state_follower = new_end_state;
3075 }
3076
3077 tap_state_t tap_get_end_state()
3078 {
3079         return end_state_follower;
3080 }
3081
3082
3083 int tap_move_ndx( tap_state_t astate )
3084 {
3085         /* given a stable state, return the index into the tms_seqs[] array within tap_get_tms_path() */
3086
3087         int ndx;
3088
3089         switch( astate )
3090         {
3091         case TAP_RESET:         ndx = 0;                        break;
3092         case TAP_DRSHIFT:       ndx = 2;                        break;
3093         case TAP_DRPAUSE:       ndx = 3;                        break;
3094         case TAP_IDLE:          ndx = 1;                        break;
3095         case TAP_IRSHIFT:       ndx = 4;                        break;
3096         case TAP_IRPAUSE:       ndx = 5;                        break;
3097         default:
3098                 LOG_ERROR( "fatal: unstable state \"%s\" used in tap_move_ndx()", tap_state_name(astate) );
3099                 exit(1);
3100         }
3101
3102         return ndx;
3103 }
3104
3105
3106 /* tap_move[i][j]: tap movement command to go from state i to state j
3107  * 0: Test-Logic-Reset
3108  * 1: Run-Test/Idle
3109  * 2: Shift-DR
3110  * 3: Pause-DR
3111  * 4: Shift-IR
3112  * 5: Pause-IR
3113  *
3114  * DRSHIFT->DRSHIFT and IRSHIFT->IRSHIFT have to be caught in interface specific code
3115  */
3116 static struct
3117 {
3118         u8      bits;
3119         u8      bit_count;
3120
3121 } tms_seqs[6][6] =              /*  [from_state_ndx][to_state_ndx] */
3122 {
3123         /* value clocked to TMS to move from one of six stable states to another.
3124          * N.B. OOCD clocks TMS from LSB first, so read these right-to-left.
3125          * N.B. These values are tightly bound to the table in tap_get_tms_path_len().
3126          * N.B. Reset only needs to be 0b11111, but in JLink an even byte of 1's is more stable.
3127          *              These extra ones cause no TAP state problem, because we go into reset and stay in reset.
3128          */
3129
3130 /*
3131  * These macros allow us to specify TMS state transitions by bits rather than hex bytes.
3132  * Read the bits from LSBit first to MSBit last (right-to-left).
3133  */
3134 #define HEX__(n) 0x##n##LU
3135
3136 #define B8__(x) \
3137          (((x) & 0x0000000FLU)?(1<<0):0) \
3138         +(((x) & 0x000000F0LU)?(1<<1):0) \
3139         +(((x) & 0x00000F00LU)?(1<<2):0) \
3140         +(((x) & 0x0000F000LU)?(1<<3):0) \
3141         +(((x) & 0x000F0000LU)?(1<<4):0) \
3142         +(((x) & 0x00F00000LU)?(1<<5):0) \
3143         +(((x) & 0x0F000000LU)?(1<<6):0) \
3144         +(((x) & 0xF0000000LU)?(1<<7):0)
3145
3146 #define B8(bits,count)          { ((u8)B8__(HEX__(bits))), (count) }
3147
3148 #if 0 && ((BUILD_FT2232_FTD2XX==1) || (BUILD_FT2232_LIBFTDI==1) || (BUILD_JLINK==1))
3149         /*      this is the table submitted by Jeff Williams on 3/30/2009 with this comment:
3150
3151                 OK, I added Peter's version of the state table, and it works OK for
3152                 me on MC1322x. I've recreated the jlink portion of patch with this
3153                 new state table. His changes to my state table are pretty minor in
3154                 terms of total transitions, but Peter feels that his version fixes
3155                 some long-standing problems.
3156                 Jeff
3157
3158                 I added the bit count into the table, reduced RESET column to 7 bits from 8.
3159                 Dick
3160
3161                 state specific comments:
3162                 ------------------------
3163                 *->RESET                   tried the 5 bit reset and it gave me problems, 7 bits seems to
3164                                            work better on ARM9 with ft2232 driver.  (Dick)
3165
3166                 RESET->DRSHIFT add 1 extra clock cycles in the RESET state before advancing.
3167                                                 needed on ARM9 with ft2232 driver.  (Dick)
3168
3169                 RESET->IRSHIFT add 1 extra clock cycles in the RESET state before advancing.
3170                                                 needed on ARM9 with ft2232 driver.  (Dick)
3171         */
3172
3173         /* to state: */
3174         /*      RESET                   IDLE                            DRSHIFT                 DRPAUSE                 IRSHIFT                 IRPAUSE */                      /* from state: */
3175         {       B8(1111111,7),  B8(0,1),                        B8(00101,5),    B8(01010,5),            B8(001101,6),   B8(010110,6) },         /* RESET */
3176         {       B8(1111111,7),  B8(0,1),                        B8(001,3),              B8(0101,4),             B8(0011,4),     B8(01011,5) },          /* IDLE */
3177         {       B8(1111111,7),  B8(011,3),              B8(00111,5),            B8(01,2),               B8(001111,6),   B8(0101111,7) },                /* DRSHIFT */
3178         {       B8(1111111,7),  B8(011,3),              B8(01,2),               B8(0,1),                        B8(001111,6),   B8(0101111,7) },                /* DRPAUSE */
3179         {       B8(1111111,7),  B8(011,3),              B8(00111,5),            B8(010111,6),   B8(001111,6),   B8(01,2) },                     /* IRSHIFT */
3180         {       B8(1111111,7),  B8(011,3),              B8(00111,5),            B8(010111,6),   B8(01,2),               B8(0,1) }                       /* IRPAUSE */
3181
3182 #else   /* this is the old table, converted from hex and with the bit_count set to 7 for each combo, like before */
3183
3184         /* to state: */
3185         /*      RESET                   IDLE                            DRSHIFT                 DRPAUSE                 IRSHIFT                 IRPAUSE */                      /* from state: */
3186         {       B8(1111111,7),  B8(0000000,7),  B8(0010111,7),  B8(0001010,7),  B8(0011011,7),  B8(0010110,7) },                /* RESET */
3187         {       B8(1111111,7),  B8(0000000,7),  B8(0100101,7),  B8(0000101,7),  B8(0101011,7),  B8(0001011,7) },                /* IDLE */
3188         {       B8(1111111,7),  B8(0110001,7),  B8(0000000,7),  B8(0000001,7),  B8(0001111,7),  B8(0101111,7) },                /* DRSHIFT */
3189         {       B8(1111111,7),  B8(0110000,7),  B8(0100000,7),  B8(0010111,7),  B8(0011110,7),  B8(0101111,7) },                /* DRPAUSE */
3190         {       B8(1111111,7),  B8(0110001,7),  B8(0000111,7),  B8(0010111,7),  B8(0000000,7),  B8(0000001,7) },                /* IRSHIFT */
3191         {       B8(1111111,7),  B8(0110000,7),  B8(0011100,7),  B8(0010111,7),  B8(0100000,7),  B8(0101111,7) }                 /* IRPAUSE */
3192
3193 #endif
3194
3195 #if 0 /* keeping old hex stuff for awhile, for reference */
3196         /* RESET                        IDLE                    DRSHIFT                 DRPAUSE                 IRSHIFT                 IRPAUSE */
3197         {  0x7f,                        0x00,                   0x17,                   0x0a,                   0x1b,                   0x16 }, /* RESET */
3198         {  0x7f,                        0x00,                   0x25,                   0x05,                   0x2b,                   0x0b }, /* IDLE */
3199         {  0x7f,                        0x31,                   0x00,                   0x01,                   0x0f,                   0x2f }, /* DRSHIFT  */
3200         {  0x7f,                        0x30,                   0x20,                   0x17,                   0x1e,                   0x2f }, /* DRPAUSE  */
3201         {  0x7f,                        0x31,                   0x07,                   0x17,                   0x00,                   0x01 }, /* IRSHIFT  */
3202         {  0x7f,                        0x30,                   0x1c,                   0x17,                   0x20,                   0x2f }  /* IRPAUSE  */
3203 #endif
3204 };
3205
3206
3207 int tap_get_tms_path( tap_state_t from, tap_state_t to )
3208 {
3209         return tms_seqs[tap_move_ndx(from)][tap_move_ndx(to)].bits;
3210 }
3211
3212
3213 int tap_get_tms_path_len( tap_state_t from, tap_state_t to )
3214 {
3215         return tms_seqs[tap_move_ndx(from)][tap_move_ndx(to)].bit_count;
3216 }
3217
3218
3219 bool tap_is_state_stable(tap_state_t astate)
3220 {
3221         bool is_stable;
3222
3223         /*      A switch() is used because it is symbol dependent
3224                 (not value dependent like an array), and can also check bounds.
3225         */
3226         switch( astate )
3227         {
3228         case TAP_RESET:
3229         case TAP_IDLE:
3230         case TAP_DRSHIFT:
3231         case TAP_DRPAUSE:
3232         case TAP_IRSHIFT:
3233         case TAP_IRPAUSE:
3234                 is_stable = true;
3235                 break;
3236         default:
3237                 is_stable = false;
3238         }
3239
3240         return is_stable;
3241 }
3242
3243 tap_state_t tap_state_transition(tap_state_t cur_state, bool tms)
3244 {
3245         tap_state_t new_state;
3246
3247         /*      A switch is used because it is symbol dependent and not value dependent
3248                 like an array.  Also it can check for out of range conditions.
3249         */
3250
3251         if (tms)
3252         {
3253                 switch (cur_state)
3254                 {
3255                 case TAP_RESET:
3256                         new_state = cur_state;
3257                         break;
3258                 case TAP_IDLE:
3259                 case TAP_DRUPDATE:
3260                 case TAP_IRUPDATE:
3261                         new_state = TAP_DRSELECT;
3262                         break;
3263                 case TAP_DRSELECT:
3264                         new_state = TAP_IRSELECT;
3265                         break;
3266                 case TAP_DRCAPTURE:
3267                 case TAP_DRSHIFT:
3268                         new_state = TAP_DREXIT1;
3269                         break;
3270                 case TAP_DREXIT1:
3271                 case TAP_DREXIT2:
3272                         new_state = TAP_DRUPDATE;
3273                         break;
3274                 case TAP_DRPAUSE:
3275                         new_state = TAP_DREXIT2;
3276                         break;
3277                 case TAP_IRSELECT:
3278                         new_state = TAP_RESET;
3279                         break;
3280                 case TAP_IRCAPTURE:
3281                 case TAP_IRSHIFT:
3282                         new_state = TAP_IREXIT1;
3283                         break;
3284                 case TAP_IREXIT1:
3285                 case TAP_IREXIT2:
3286                         new_state = TAP_IRUPDATE;
3287                         break;
3288                 case TAP_IRPAUSE:
3289                         new_state = TAP_IREXIT2;
3290                         break;
3291                 default:
3292                         LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state );
3293                         exit(1);
3294                         break;
3295                 }
3296         }
3297         else
3298         {
3299                 switch (cur_state)
3300                 {
3301                 case TAP_RESET:
3302                 case TAP_IDLE:
3303                 case TAP_DRUPDATE:
3304                 case TAP_IRUPDATE:
3305                         new_state = TAP_IDLE;
3306                         break;
3307                 case TAP_DRSELECT:
3308                         new_state = TAP_DRCAPTURE;
3309                         break;
3310                 case TAP_DRCAPTURE:
3311                 case TAP_DRSHIFT:
3312                 case TAP_DREXIT2:
3313                         new_state = TAP_DRSHIFT;
3314                         break;
3315                 case TAP_DREXIT1:
3316                 case TAP_DRPAUSE:
3317                         new_state = TAP_DRPAUSE;
3318                         break;
3319                 case TAP_IRSELECT:
3320                         new_state = TAP_IRCAPTURE;
3321                         break;
3322                 case TAP_IRCAPTURE:
3323                 case TAP_IRSHIFT:
3324                 case TAP_IREXIT2:
3325                         new_state = TAP_IRSHIFT;
3326                         break;
3327                 case TAP_IREXIT1:
3328                 case TAP_IRPAUSE:
3329                         new_state = TAP_IRPAUSE;
3330                         break;
3331                 default:
3332                         LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state );
3333                         exit(1);
3334                         break;
3335                 }
3336         }
3337
3338         return new_state;
3339 }
3340
3341 const char* tap_state_name(tap_state_t state)
3342 {
3343         const char* ret;
3344
3345         switch( state )
3346         {
3347         case TAP_RESET:         ret = "RESET";                  break;
3348         case TAP_IDLE:          ret = "RUN/IDLE";               break;
3349         case TAP_DRSELECT:      ret = "DRSELECT";               break;
3350         case TAP_DRCAPTURE: ret = "DRCAPTURE";          break;
3351         case TAP_DRSHIFT:       ret = "DRSHIFT";                        break;
3352         case TAP_DREXIT1:       ret = "DREXIT1";                        break;
3353         case TAP_DRPAUSE:       ret = "DRPAUSE";                        break;
3354         case TAP_DREXIT2:       ret = "DREXIT2";                        break;
3355         case TAP_DRUPDATE:      ret = "DRUPDATE";               break;
3356         case TAP_IRSELECT:      ret = "IRSELECT";               break;
3357         case TAP_IRCAPTURE: ret = "IRCAPTURE";          break;
3358         case TAP_IRSHIFT:       ret = "IRSHIFT";                        break;
3359         case TAP_IREXIT1:       ret = "IREXIT1";                        break;
3360         case TAP_IRPAUSE:       ret = "IRPAUSE";                        break;
3361         case TAP_IREXIT2:       ret = "IREXIT2";                        break;
3362         case TAP_IRUPDATE:      ret = "IRUPDATE";               break;
3363         default:                                ret = "???";
3364         }
3365
3366         return ret;
3367 }
3368
3369 static tap_state_t tap_state_by_name( const char *name )
3370 {
3371         tap_state_t x;
3372
3373         for( x = 0 ; x < TAP_NUM_STATES ; x++ ){
3374                 /* be nice to the human */
3375                 if( 0 == strcasecmp( name, tap_state_name(x) ) ){
3376                         return x;
3377                 }
3378         }
3379         /* not found */
3380         return TAP_INVALID;
3381 }
3382
3383 #ifdef _DEBUG_JTAG_IO_
3384
3385 #define JTAG_DEBUG_STATE_APPEND(buf, len, bit) \
3386                 do { buf[len] = bit ? '1' : '0'; } while(0)
3387 #define JTAG_DEBUG_STATE_PRINT(a, b, astr, bstr) \
3388                 DEBUG_JTAG_IO("TAP/SM: %9s -> %5s\tTMS: %s\tTDI: %s", \
3389                         tap_state_name(a), tap_state_name(b), astr, bstr)
3390
3391 tap_state_t jtag_debug_state_machine(const void *tms_buf, const void *tdi_buf,
3392                 unsigned tap_bits, tap_state_t next_state)
3393 {
3394         const u8 *tms_buffer;
3395         const u8 *tdi_buffer;
3396         unsigned tap_bytes;
3397         unsigned cur_byte;
3398         unsigned cur_bit;
3399
3400         unsigned tap_out_bits;
3401         char tms_str[33];
3402         char tdi_str[33];
3403
3404         tap_state_t last_state;
3405
3406         // set startstate (and possibly last, if tap_bits == 0)
3407         last_state = next_state;
3408         DEBUG_JTAG_IO("TAP/SM: START state: %s", tap_state_name(next_state));
3409
3410         tms_buffer = (const u8 *)tms_buf;
3411         tdi_buffer = (const u8 *)tdi_buf;
3412
3413         tap_bytes = TAP_SCAN_BYTES(tap_bits);
3414         DEBUG_JTAG_IO("TAP/SM: TMS bits: %u (bytes: %u)", tap_bits, tap_bytes);
3415
3416         tap_out_bits = 0;
3417         for(cur_byte = 0; cur_byte < tap_bytes; cur_byte++)
3418         {
3419                 for(cur_bit = 0; cur_bit < 8; cur_bit++)
3420                 {
3421                         // make sure we do not run off the end of the buffers
3422                         unsigned tap_bit = cur_byte * 8 + cur_bit;
3423                         if (tap_bit == tap_bits)
3424                                 break;
3425
3426                         // check and save TMS bit
3427                         tap_bit = !!(tms_buffer[cur_byte] & (1 << cur_bit));
3428                         JTAG_DEBUG_STATE_APPEND(tms_str, tap_out_bits, tap_bit);
3429
3430                         // use TMS bit to find the next TAP state
3431                         next_state = tap_state_transition(last_state, tap_bit);
3432
3433                         // check and store TDI bit
3434                         tap_bit = !!(tdi_buffer[cur_byte] & (1 << cur_bit));
3435                         JTAG_DEBUG_STATE_APPEND(tdi_str, tap_out_bits, tap_bit);
3436
3437                         // increment TAP bits
3438                         tap_out_bits++;
3439
3440                         // Only show TDO bits on state transitions, or
3441                         // after some number of bits in the same state.
3442                         if ((next_state == last_state) && (tap_out_bits < 32))
3443                                 continue;
3444
3445                         // terminate strings and display state transition
3446                         tms_str[tap_out_bits] = tdi_str[tap_out_bits] = 0;
3447                         JTAG_DEBUG_STATE_PRINT(last_state, next_state, tms_str, tdi_str);
3448
3449                         // reset state
3450                         last_state = next_state;
3451                         tap_out_bits = 0;
3452                 }
3453         }
3454
3455         if (tap_out_bits)
3456         {
3457                 // terminate strings and display state transition
3458                 tms_str[tap_out_bits] = tdi_str[tap_out_bits] = 0;
3459                 JTAG_DEBUG_STATE_PRINT(last_state, next_state, tms_str, tdi_str);
3460         }
3461
3462         DEBUG_JTAG_IO("TAP/SM: FINAL state: %s", tap_state_name(next_state));
3463
3464         return next_state;
3465 }
3466 #endif // _DEBUG_JTAG_IO_
3467
3468 /*-----</Cable Helper API>--------------------------------------*/