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