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