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