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