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

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)