1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
8 * Copyright (C) 2009 SoftPLC Corporation *
12 * Copyright (C) 2009 Zachary T Welch *
13 * zw@superlucidity.net *
15 * This program is free software; you can redistribute it and/or modify *
16 * it under the terms of the GNU General Public License as published by *
17 * the Free Software Foundation; either version 2 of the License, or *
18 * (at your option) any later version. *
20 * This program is distributed in the hope that it will be useful, *
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
23 * GNU General Public License for more details. *
25 * You should have received a copy of the GNU General Public License *
26 * along with this program; if not, write to the *
27 * Free Software Foundation, Inc., *
28 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
29 ***************************************************************************/
35 #include "minidriver.h"
36 #include "interface.h"
37 #include "interfaces.h"
43 static const Jim_Nvp nvp_jtag_tap_event
[] = {
44 { .value
= JTAG_TRST_ASSERTED
, .name
= "post-reset" },
45 { .value
= JTAG_TAP_EVENT_SETUP
, .name
= "setup" },
46 { .value
= JTAG_TAP_EVENT_ENABLE
, .name
= "tap-enable" },
47 { .value
= JTAG_TAP_EVENT_DISABLE
, .name
= "tap-disable" },
49 { .name
= NULL
, .value
= -1 }
52 extern struct jtag_interface
*jtag_interface
;
54 struct jtag_tap
*jtag_tap_by_jim_obj(Jim_Interp
*interp
, Jim_Obj
*o
)
56 const char *cp
= Jim_GetString(o
, NULL
);
57 struct jtag_tap
*t
= cp
? jtag_tap_by_string(cp
) : NULL
;
61 Jim_SetResult_sprintf(interp
, "Tap '%s' could not be found", cp
);
65 static bool scan_is_safe(tap_state_t state
)
79 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
82 struct scan_field
*fields
;
91 * args[3] = hex string
92 * ... repeat num bits and hex string ...
95 * args[N-2] = "-endstate"
96 * args[N-1] = statename
98 if ((argc
< 4) || ((argc
% 2) != 0))
100 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
106 script_debug(interp
, "drscan", argc
, args
);
108 /* validate arguments as numbers */
110 for (i
= 2; i
< argc
; i
+= 2)
115 e
= Jim_GetLong(interp
, args
[i
], &bits
);
116 /* If valid - try next arg */
121 /* Not valid.. are we at the end? */
122 if (((i
+ 2) != argc
)) {
123 /* nope, then error */
127 /* it could be: "-endstate FOO"
128 * e.g. DRPAUSE so we can issue more instructions
129 * before entering RUN/IDLE and executing them.
132 /* get arg as a string. */
133 cp
= Jim_GetString(args
[i
], NULL
);
134 /* is it the magic? */
135 if (0 == strcmp("-endstate", cp
)) {
136 /* is the statename valid? */
137 cp
= Jim_GetString(args
[i
+ 1], NULL
);
139 /* see if it is a valid state name */
140 endstate
= tap_state_by_name(cp
);
142 /* update the error message */
143 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
145 if (!scan_is_safe(endstate
))
146 LOG_WARNING("drscan with unsafe "
147 "endstate \"%s\"", cp
);
149 /* valid - so clear the error */
151 /* and remove the last 2 args */
156 /* Still an error? */
158 return e
; /* too bad */
160 } /* validate args */
162 tap
= jtag_tap_by_jim_obj(interp
, args
[1]);
167 num_fields
= (argc
-2)/2;
168 fields
= malloc(sizeof(struct scan_field
) * num_fields
);
169 for (i
= 2; i
< argc
; i
+= 2)
175 Jim_GetLong(interp
, args
[i
], &bits
);
176 str
= Jim_GetString(args
[i
+ 1], &len
);
178 fields
[field_count
].tap
= tap
;
179 fields
[field_count
].num_bits
= bits
;
180 fields
[field_count
].out_value
= malloc(DIV_ROUND_UP(bits
, 8));
181 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
182 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
186 jtag_add_dr_scan(num_fields
, fields
, endstate
);
188 retval
= jtag_execute_queue();
189 if (retval
!= ERROR_OK
)
191 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
196 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
197 for (i
= 2; i
< argc
; i
+= 2)
202 Jim_GetLong(interp
, args
[i
], &bits
);
203 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
204 free(fields
[field_count
].out_value
);
206 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
211 Jim_SetResult(interp
, list
);
219 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
221 tap_state_t states
[8];
223 if ((argc
< 2) || ((size_t)argc
> (ARRAY_SIZE(states
) + 1)))
225 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
229 script_debug(interp
, "pathmove", argc
, args
);
232 for (i
= 0; i
< argc
-1; i
++)
235 cp
= Jim_GetString(args
[i
+ 1], NULL
);
236 states
[i
] = tap_state_by_name(cp
);
239 /* update the error message */
240 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
245 if ((jtag_add_statemove(states
[0]) != ERROR_OK
) || (jtag_execute_queue()!= ERROR_OK
))
247 Jim_SetResultString(interp
, "pathmove: jtag execute failed",-1);
251 jtag_add_pathmove(argc
-2, states
+ 1);
253 if (jtag_execute_queue()!= ERROR_OK
)
255 Jim_SetResultString(interp
, "pathmove: failed",-1);
263 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
265 script_debug(interp
, "flush_count", argc
, args
);
267 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_get_flush_queue_count()));
272 /* REVISIT Just what about these should "move" ... ?
273 * These registrations, into the main JTAG table?
275 * There's a minor compatibility issue, these all show up twice;
276 * that's not desirable:
277 * - jtag drscan ... NOT DOCUMENTED!
280 * The "irscan" command (for example) doesn't show twice.
282 static const struct command_registration jtag_command_handlers_to_move
[] = {
285 .mode
= COMMAND_EXEC
,
286 .jim_handler
= Jim_Command_drscan
,
287 .help
= "Execute Data Register (DR) scan for one TAP. "
288 "Other TAPs must be in BYPASS mode.",
289 .usage
= "tap_name [num_bits value]* ['-endstate' state_name]",
292 .name
= "flush_count",
293 .mode
= COMMAND_EXEC
,
294 .jim_handler
= Jim_Command_flush_count
,
295 .help
= "Returns the number of times the JTAG queue "
300 .mode
= COMMAND_EXEC
,
301 .jim_handler
= Jim_Command_pathmove
,
302 .usage
= "start_state state1 [state2 [state3 ...]]",
303 .help
= "Move JTAG state machine from current state "
304 "(start_state) to state1, then state2, state3, etc.",
306 COMMAND_REGISTRATION_DONE
310 enum jtag_tap_cfg_param
{
314 static Jim_Nvp nvp_config_opts
[] = {
315 { .name
= "-event", .value
= JCFG_EVENT
},
317 { .name
= NULL
, .value
= -1 }
320 static int jtag_tap_configure_event(Jim_GetOptInfo
*goi
, struct jtag_tap
* tap
)
324 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event <event-name> ...");
329 int e
= Jim_GetOpt_Nvp(goi
, nvp_jtag_tap_event
, &n
);
332 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
336 if (goi
->isconfigure
) {
337 if (goi
->argc
!= 1) {
338 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event <event-name> <event-body>");
342 if (goi
->argc
!= 0) {
343 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event <event-name>");
348 struct jtag_tap_event_action
*jteap
= tap
->event_action
;
349 /* replace existing event body */
353 if (jteap
->event
== (enum jtag_event
)n
->value
)
361 Jim_SetEmptyResult(goi
->interp
);
363 if (goi
->isconfigure
)
366 jteap
= calloc(1, sizeof(*jteap
));
367 else if (NULL
!= jteap
->body
)
368 Jim_DecrRefCount(goi
->interp
, jteap
->body
);
370 jteap
->interp
= goi
->interp
;
371 jteap
->event
= n
->value
;
374 Jim_GetOpt_Obj(goi
, &o
);
375 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
376 Jim_IncrRefCount(jteap
->body
);
380 /* add to head of event list */
381 jteap
->next
= tap
->event_action
;
382 tap
->event_action
= jteap
;
387 jteap
->interp
= goi
->interp
;
388 Jim_SetResult(goi
->interp
,
389 Jim_DuplicateObj(goi
->interp
, jteap
->body
));
394 static int jtag_tap_configure_cmd(Jim_GetOptInfo
*goi
, struct jtag_tap
* tap
)
396 /* parse config or cget options */
397 while (goi
->argc
> 0)
399 Jim_SetEmptyResult (goi
->interp
);
402 int e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
405 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
412 e
= jtag_tap_configure_event(goi
, tap
);
417 Jim_SetResult_sprintf(goi
->interp
, "unknown event: %s", n
->name
);
425 static int is_bad_irval(int ir_length
, jim_wide w
)
435 static int jim_newtap_expected_id(Jim_Nvp
*n
, Jim_GetOptInfo
*goi
,
436 struct jtag_tap
*pTap
)
439 int e
= Jim_GetOpt_Wide(goi
, &w
);
441 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
445 unsigned expected_len
= sizeof(uint32_t) * pTap
->expected_ids_cnt
;
446 uint32_t *new_expected_ids
= malloc(expected_len
+ sizeof(uint32_t));
447 if (new_expected_ids
== NULL
)
449 Jim_SetResult_sprintf(goi
->interp
, "no memory");
453 memcpy(new_expected_ids
, pTap
->expected_ids
, expected_len
);
455 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
457 free(pTap
->expected_ids
);
458 pTap
->expected_ids
= new_expected_ids
;
459 pTap
->expected_ids_cnt
++;
464 #define NTAP_OPT_IRLEN 0
465 #define NTAP_OPT_IRMASK 1
466 #define NTAP_OPT_IRCAPTURE 2
467 #define NTAP_OPT_ENABLED 3
468 #define NTAP_OPT_DISABLED 4
469 #define NTAP_OPT_EXPECTED_ID 5
470 #define NTAP_OPT_VERSION 6
472 static int jim_newtap_ir_param(Jim_Nvp
*n
, Jim_GetOptInfo
*goi
,
473 struct jtag_tap
*pTap
)
476 int e
= Jim_GetOpt_Wide(goi
, &w
);
479 Jim_SetResult_sprintf(goi
->interp
,
480 "option: %s bad parameter", n
->name
);
481 free((void *)pTap
->dotted_name
);
486 if (w
> (jim_wide
) (8 * sizeof(pTap
->ir_capture_value
)))
488 LOG_WARNING("%s: huge IR length %d",
489 pTap
->dotted_name
, (int) w
);
493 case NTAP_OPT_IRMASK
:
494 if (is_bad_irval(pTap
->ir_length
, w
))
496 LOG_ERROR("%s: IR mask %x too big",
502 LOG_WARNING("%s: nonstandard IR mask", pTap
->dotted_name
);
503 pTap
->ir_capture_mask
= w
;
505 case NTAP_OPT_IRCAPTURE
:
506 if (is_bad_irval(pTap
->ir_length
, w
))
508 LOG_ERROR("%s: IR capture %x too big",
509 pTap
->dotted_name
, (int) w
);
513 LOG_WARNING("%s: nonstandard IR value",
515 pTap
->ir_capture_value
= w
;
523 static int jim_newtap_cmd(Jim_GetOptInfo
*goi
)
525 struct jtag_tap
*pTap
;
530 const Jim_Nvp opts
[] = {
531 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
532 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
533 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
534 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
535 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
536 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
537 { .name
= "-ignore-version" , .value
= NTAP_OPT_VERSION
},
538 { .name
= NULL
, .value
= -1 },
541 pTap
= calloc(1, sizeof(struct jtag_tap
));
543 Jim_SetResult_sprintf(goi
->interp
, "no memory");
548 * we expect CHIP + TAP + OPTIONS
551 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
555 Jim_GetOpt_String(goi
, &cp
, NULL
);
556 pTap
->chip
= strdup(cp
);
558 Jim_GetOpt_String(goi
, &cp
, NULL
);
559 pTap
->tapname
= strdup(cp
);
561 /* name + dot + name + null */
562 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
564 sprintf(cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
565 pTap
->dotted_name
= cp
;
567 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
568 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
570 /* IEEE specifies that the two LSBs of an IR scan are 01, so make
571 * that the default. The "-irlen" and "-irmask" options are only
572 * needed to cope with nonstandard TAPs, or to specify more bits.
574 pTap
->ir_capture_mask
= 0x03;
575 pTap
->ir_capture_value
= 0x01;
578 e
= Jim_GetOpt_Nvp(goi
, opts
, &n
);
580 Jim_GetOpt_NvpUnknown(goi
, opts
, 0);
581 free((void *)pTap
->dotted_name
);
585 LOG_DEBUG("Processing option: %s", n
->name
);
587 case NTAP_OPT_ENABLED
:
588 pTap
->disabled_after_reset
= false;
590 case NTAP_OPT_DISABLED
:
591 pTap
->disabled_after_reset
= true;
593 case NTAP_OPT_EXPECTED_ID
:
594 e
= jim_newtap_expected_id(n
, goi
, pTap
);
597 free((void *)pTap
->dotted_name
);
603 case NTAP_OPT_IRMASK
:
604 case NTAP_OPT_IRCAPTURE
:
605 e
= jim_newtap_ir_param(n
, goi
, pTap
);
608 free((void *)pTap
->dotted_name
);
613 case NTAP_OPT_VERSION
:
614 pTap
->ignore_version
= true;
616 } /* switch (n->value) */
617 } /* while (goi->argc) */
619 /* default is enabled-after-reset */
620 pTap
->enabled
= !pTap
->disabled_after_reset
;
622 /* Did all the required option bits get cleared? */
623 if (pTap
->ir_length
!= 0)
629 Jim_SetResult_sprintf(goi
->interp
,
630 "newtap: %s missing IR length",
636 static void jtag_tap_handle_event(struct jtag_tap
*tap
, enum jtag_event e
)
638 struct jtag_tap_event_action
* jteap
;
640 for (jteap
= tap
->event_action
; jteap
!= NULL
; jteap
= jteap
->next
)
642 if (jteap
->event
!= e
)
645 Jim_Nvp
*nvp
= Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
);
646 LOG_DEBUG("JTAG tap: %s event: %d (%s)\n\taction: %s",
647 tap
->dotted_name
, e
, nvp
->name
,
648 Jim_GetString(jteap
->body
, NULL
));
650 if (Jim_EvalObj(jteap
->interp
, jteap
->body
) != JIM_OK
)
652 Jim_PrintErrorMessage(jteap
->interp
);
658 case JTAG_TAP_EVENT_ENABLE
:
659 case JTAG_TAP_EVENT_DISABLE
:
660 /* NOTE: we currently assume the handlers
661 * can't fail. Right here is where we should
662 * really be verifying the scan chains ...
664 tap
->enabled
= (e
== JTAG_TAP_EVENT_ENABLE
);
665 LOG_INFO("JTAG tap: %s %s", tap
->dotted_name
,
666 tap
->enabled
? "enabled" : "disabled");
675 jim_jtag_interface(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
678 Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+ 1);
680 /* return the name of the interface */
681 /* TCL code might need to know the exact type... */
682 /* FUTURE: we allow this as a means to "set" the interface. */
684 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
687 const char *name
= jtag_interface
? jtag_interface
->name
: NULL
;
688 Jim_SetResultString(goi
.interp
, name
? : "undefined", -1);
692 static int jim_jtag_arp_init(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
695 Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+ 1);
697 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
700 struct command_context
*context
= Jim_GetAssocData(interp
, "context");
701 int e
= jtag_init_inner(context
);
703 Jim_SetResult_sprintf(goi
.interp
, "error: %d", e
);
709 static int jim_jtag_arp_init_reset(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
712 Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+ 1);
714 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
717 struct command_context
*context
= Jim_GetAssocData(interp
, "context");
718 int e
= jtag_init_reset(context
);
720 Jim_SetResult_sprintf(goi
.interp
, "error: %d", e
);
726 static int jim_jtag_newtap(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
729 Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+ 1);
730 return jim_newtap_cmd(&goi
);
733 static bool jtag_tap_enable(struct jtag_tap
*t
)
737 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_ENABLE
);
741 /* FIXME add JTAG sanity checks, w/o TLR
742 * - scan chain length grew by one (this)
743 * - IDs and IR lengths are as expected
745 jtag_call_event_callbacks(JTAG_TAP_EVENT_ENABLE
);
748 static bool jtag_tap_disable(struct jtag_tap
*t
)
752 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_DISABLE
);
756 /* FIXME add JTAG sanity checks, w/o TLR
757 * - scan chain length shrank by one (this)
758 * - IDs and IR lengths are as expected
760 jtag_call_event_callbacks(JTAG_TAP_EVENT_DISABLE
);
764 static int jim_jtag_tap_enabler(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
766 const char *cmd_name
= Jim_GetString(argv
[0], NULL
);
768 Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+ 1);
770 Jim_SetResult_sprintf(goi
.interp
, "usage: %s <name>", cmd_name
);
776 t
= jtag_tap_by_jim_obj(goi
.interp
, goi
.argv
[0]);
780 if (strcasecmp(cmd_name
, "tapisenabled") == 0) {
781 // do nothing, just return the value
782 } else if (strcasecmp(cmd_name
, "tapenable") == 0) {
783 if (!jtag_tap_enable(t
))
784 LOG_WARNING("failed to disable tap");
785 } else if (strcasecmp(cmd_name
, "tapdisable") == 0) {
786 if (!jtag_tap_disable(t
))
787 LOG_WARNING("failed to disable tap");
789 LOG_ERROR("command '%s' unknown", cmd_name
);
793 Jim_SetResult(goi
.interp
, Jim_NewIntObj(goi
.interp
, e
));
797 static int jim_jtag_configure(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
799 const char *cmd_name
= Jim_GetString(argv
[0], NULL
);
801 Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+ 1);
802 goi
.isconfigure
= !strcmp(cmd_name
, "configure");
803 if (goi
.argc
< 2 + goi
.isconfigure
) {
804 Jim_WrongNumArgs(goi
.interp
, 0, NULL
,
805 "<tap_name> <attribute> ...");
812 Jim_GetOpt_Obj(&goi
, &o
);
813 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
818 return jtag_tap_configure_cmd(&goi
, t
);
821 static int jim_jtag_names(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
824 Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+ 1);
826 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
, "Too many parameters");
829 Jim_SetResult(goi
.interp
, Jim_NewListObj(goi
.interp
, NULL
, 0));
830 struct jtag_tap
*tap
;
832 for (tap
= jtag_all_taps(); tap
; tap
= tap
->next_tap
) {
833 Jim_ListAppendElement(goi
.interp
,
834 Jim_GetResult(goi
.interp
),
835 Jim_NewStringObj(goi
.interp
,
836 tap
->dotted_name
, -1));
841 COMMAND_HANDLER(handle_jtag_init_command
)
844 return ERROR_COMMAND_SYNTAX_ERROR
;
846 static bool jtag_initialized
= false;
847 if (jtag_initialized
)
849 LOG_INFO("'jtag init' has already been called");
852 jtag_initialized
= true;
854 LOG_DEBUG("Initializing jtag devices...");
855 return jtag_init(CMD_CTX
);
858 static const struct command_registration jtag_subcommand_handlers
[] = {
862 .handler
= handle_jtag_init_command
,
863 .help
= "initialize jtag scan chain",
868 .jim_handler
= jim_jtag_interface
,
869 .help
= "Returns the name of the currently selected interface.",
874 .jim_handler
= jim_jtag_arp_init
,
875 .help
= "Validates JTAG scan chain against the list of "
876 "declared TAPs using just the four standard JTAG "
880 .name
= "arp_init-reset",
882 .jim_handler
= jim_jtag_arp_init_reset
,
883 .help
= "Uses TRST and SRST to try resetting everything on "
884 "the JTAG scan chain, then performs 'jtag arp_init'."
888 .mode
= COMMAND_CONFIG
,
889 .jim_handler
= jim_jtag_newtap
,
890 .help
= "Create a new TAP instance named basename.tap_type, "
891 "and appends it to the scan chain.",
892 .usage
= "basename tap_type '-irlen' count "
893 "['-enable'|'-disable'] "
894 "['-expected_id' number] "
895 "['-ignore-version'] "
896 "['-ircapture' number] "
900 .name
= "tapisenabled",
901 .mode
= COMMAND_EXEC
,
902 .jim_handler
= jim_jtag_tap_enabler
,
903 .help
= "Returns a Tcl boolean (0/1) indicating whether "
904 "the TAP is enabled (1) or not (0).",
909 .mode
= COMMAND_EXEC
,
910 .jim_handler
= jim_jtag_tap_enabler
,
911 .help
= "Try to enable the specified TAP using the "
912 "'tap-enable' TAP event.",
916 .name
= "tapdisable",
917 .mode
= COMMAND_EXEC
,
918 .jim_handler
= jim_jtag_tap_enabler
,
919 .help
= "Try to disable the specified TAP using the "
920 "'tap-disable' TAP event.",
925 .mode
= COMMAND_EXEC
,
926 .jim_handler
= jim_jtag_configure
,
927 .help
= "Provide a Tcl handler for the specified "
929 .usage
= "tap_name '-event' event_name handler",
933 .mode
= COMMAND_EXEC
,
934 .jim_handler
= jim_jtag_configure
,
935 .help
= "Return any Tcl handler for the specified "
937 .usage
= "tap_name '-event' event_name",
942 .jim_handler
= jim_jtag_names
,
943 .help
= "Returns list of all JTAG tap names.",
946 .chain
= jtag_command_handlers_to_move
,
948 COMMAND_REGISTRATION_DONE
951 void jtag_notify_event(enum jtag_event event
)
953 struct jtag_tap
*tap
;
955 for (tap
= jtag_all_taps(); tap
; tap
= tap
->next_tap
)
956 jtag_tap_handle_event(tap
, event
);
960 static int default_khz(int khz
, int *jtag_speed
)
962 LOG_ERROR("Translation from khz to jtag_speed not implemented");
966 static int default_speed_div(int speed
, int *khz
)
968 LOG_ERROR("Translation from jtag_speed to khz not implemented");
972 static int default_power_dropout(int *dropout
)
974 *dropout
= 0; /* by default we can't detect power dropout */
978 static int default_srst_asserted(int *srst_asserted
)
980 *srst_asserted
= 0; /* by default we can't detect srst asserted */
984 COMMAND_HANDLER(handle_interface_list_command
)
986 if (strcmp(CMD_NAME
, "interface_list") == 0 && CMD_ARGC
> 0)
987 return ERROR_COMMAND_SYNTAX_ERROR
;
989 command_print(CMD_CTX
, "The following JTAG interfaces are available:");
990 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
992 const char *name
= jtag_interfaces
[i
]->name
;
993 command_print(CMD_CTX
, "%u: %s", i
+ 1, name
);
999 COMMAND_HANDLER(handle_interface_command
)
1001 /* check whether the interface is already configured */
1004 LOG_WARNING("Interface already configured, ignoring");
1008 /* interface name is a mandatory argument */
1009 if (CMD_ARGC
!= 1 || CMD_ARGV
[0][0] == '\0')
1010 return ERROR_COMMAND_SYNTAX_ERROR
;
1012 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
1014 if (strcmp(CMD_ARGV
[0], jtag_interfaces
[i
]->name
) != 0)
1017 if (NULL
!= jtag_interfaces
[i
]->commands
)
1019 int retval
= register_commands(CMD_CTX
, NULL
,
1020 jtag_interfaces
[i
]->commands
);
1021 if (ERROR_OK
!= retval
)
1025 jtag_interface
= jtag_interfaces
[i
];
1027 if (jtag_interface
->khz
== NULL
)
1028 jtag_interface
->khz
= default_khz
;
1029 if (jtag_interface
->speed_div
== NULL
)
1030 jtag_interface
->speed_div
= default_speed_div
;
1031 if (jtag_interface
->power_dropout
== NULL
)
1032 jtag_interface
->power_dropout
= default_power_dropout
;
1033 if (jtag_interface
->srst_asserted
== NULL
)
1034 jtag_interface
->srst_asserted
= default_srst_asserted
;
1039 /* no valid interface was found (i.e. the configuration option,
1040 * didn't match one of the compiled-in interfaces
1042 LOG_ERROR("The specified JTAG interface was not found (%s)", CMD_ARGV
[0]);
1043 CALL_COMMAND_HANDLER(handle_interface_list_command
);
1044 return ERROR_JTAG_INVALID_INTERFACE
;
1047 COMMAND_HANDLER(handle_scan_chain_command
)
1049 struct jtag_tap
*tap
;
1050 char expected_id
[12];
1052 tap
= jtag_all_taps();
1053 command_print(CMD_CTX
,
1054 " TapName Enabled IdCode Expected IrLen IrCap IrMask");
1055 command_print(CMD_CTX
,
1056 "-- ------------------- -------- ---------- ---------- ----- ----- ------");
1059 uint32_t expected
, expected_mask
, ii
;
1061 snprintf(expected_id
, sizeof expected_id
, "0x%08x",
1062 (unsigned)((tap
->expected_ids_cnt
> 0)
1063 ? tap
->expected_ids
[0]
1065 if (tap
->ignore_version
)
1066 expected_id
[2] = '*';
1068 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
1069 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
1071 command_print(CMD_CTX
,
1072 "%2d %-18s %c 0x%08x %s %5d 0x%02x 0x%02x",
1073 tap
->abs_chain_position
,
1075 tap
->enabled
? 'Y' : 'n',
1076 (unsigned int)(tap
->idcode
),
1078 (unsigned int)(tap
->ir_length
),
1079 (unsigned int)(expected
),
1080 (unsigned int)(expected_mask
));
1082 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
1083 snprintf(expected_id
, sizeof expected_id
, "0x%08x",
1084 (unsigned) tap
->expected_ids
[1]);
1085 if (tap
->ignore_version
)
1086 expected_id
[2] = '*';
1088 command_print(CMD_CTX
,
1093 tap
= tap
->next_tap
;
1099 COMMAND_HANDLER(handle_reset_config_command
)
1104 /* Original versions cared about the order of these tokens:
1105 * reset_config signals [combination [trst_type [srst_type]]]
1106 * They also clobbered the previous configuration even on error.
1108 * Here we don't care about the order, and only change values
1109 * which have been explicitly specified.
1111 for (; CMD_ARGC
; CMD_ARGC
--, CMD_ARGV
++) {
1116 m
= RESET_SRST_NO_GATING
;
1117 if (strcmp(*CMD_ARGV
, "srst_gates_jtag") == 0)
1118 /* default: don't use JTAG while SRST asserted */;
1119 else if (strcmp(*CMD_ARGV
, "srst_nogate") == 0)
1120 tmp
= RESET_SRST_NO_GATING
;
1124 LOG_ERROR("extra reset_config %s spec (%s)",
1125 "gating", *CMD_ARGV
);
1126 return ERROR_INVALID_ARGUMENTS
;
1132 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
1133 if (strcmp(*CMD_ARGV
, "none") == 0)
1135 else if (strcmp(*CMD_ARGV
, "trst_only") == 0)
1136 tmp
= RESET_HAS_TRST
;
1137 else if (strcmp(*CMD_ARGV
, "srst_only") == 0)
1138 tmp
= RESET_HAS_SRST
;
1139 else if (strcmp(*CMD_ARGV
, "trst_and_srst") == 0)
1140 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
1144 LOG_ERROR("extra reset_config %s spec (%s)",
1145 "signal", *CMD_ARGV
);
1146 return ERROR_INVALID_ARGUMENTS
;
1151 /* combination (options for broken wiring) */
1152 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
1153 if (strcmp(*CMD_ARGV
, "separate") == 0)
1154 /* separate reset lines - default */;
1155 else if (strcmp(*CMD_ARGV
, "srst_pulls_trst") == 0)
1156 tmp
|= RESET_SRST_PULLS_TRST
;
1157 else if (strcmp(*CMD_ARGV
, "trst_pulls_srst") == 0)
1158 tmp
|= RESET_TRST_PULLS_SRST
;
1159 else if (strcmp(*CMD_ARGV
, "combined") == 0)
1160 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
1164 LOG_ERROR("extra reset_config %s spec (%s)",
1165 "combination", *CMD_ARGV
);
1166 return ERROR_INVALID_ARGUMENTS
;
1171 /* trst_type (NOP without HAS_TRST) */
1172 m
= RESET_TRST_OPEN_DRAIN
;
1173 if (strcmp(*CMD_ARGV
, "trst_open_drain") == 0)
1174 tmp
|= RESET_TRST_OPEN_DRAIN
;
1175 else if (strcmp(*CMD_ARGV
, "trst_push_pull") == 0)
1176 /* push/pull from adapter - default */;
1180 LOG_ERROR("extra reset_config %s spec (%s)",
1181 "trst_type", *CMD_ARGV
);
1182 return ERROR_INVALID_ARGUMENTS
;
1187 /* srst_type (NOP without HAS_SRST) */
1188 m
|= RESET_SRST_PUSH_PULL
;
1189 if (strcmp(*CMD_ARGV
, "srst_push_pull") == 0)
1190 tmp
|= RESET_SRST_PUSH_PULL
;
1191 else if (strcmp(*CMD_ARGV
, "srst_open_drain") == 0)
1192 /* open drain from adapter - default */;
1196 LOG_ERROR("extra reset_config %s spec (%s)",
1197 "srst_type", *CMD_ARGV
);
1198 return ERROR_INVALID_ARGUMENTS
;
1203 /* caller provided nonsense; fail */
1204 LOG_ERROR("unknown reset_config flag (%s)", *CMD_ARGV
);
1205 return ERROR_INVALID_ARGUMENTS
;
1208 /* Remember the bits which were specified (mask)
1209 * and their new values (new_cfg).
1215 /* clear previous values of those bits, save new values */
1217 int old_cfg
= jtag_get_reset_config();
1221 jtag_set_reset_config(new_cfg
);
1223 new_cfg
= jtag_get_reset_config();
1227 * Display the (now-)current reset mode
1231 /* minimal JTAG has neither SRST nor TRST (so that's the default) */
1232 switch (new_cfg
& (RESET_HAS_TRST
| RESET_HAS_SRST
)) {
1233 case RESET_HAS_SRST
:
1234 modes
[0] = "srst_only";
1236 case RESET_HAS_TRST
:
1237 modes
[0] = "trst_only";
1239 case RESET_TRST_AND_SRST
:
1240 modes
[0] = "trst_and_srst";
1247 /* normally SRST and TRST are decoupled; but bugs happen ... */
1248 switch (new_cfg
& (RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
)) {
1249 case RESET_SRST_PULLS_TRST
:
1250 modes
[1] = "srst_pulls_trst";
1252 case RESET_TRST_PULLS_SRST
:
1253 modes
[1] = "trst_pulls_srst";
1255 case RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
:
1256 modes
[1] = "combined";
1259 modes
[1] = "separate";
1263 /* TRST-less connectors include Altera, Xilinx, and minimal JTAG */
1264 if (new_cfg
& RESET_HAS_TRST
) {
1265 if (new_cfg
& RESET_TRST_OPEN_DRAIN
)
1266 modes
[3] = " trst_open_drain";
1268 modes
[3] = " trst_push_pull";
1272 /* SRST-less connectors include TI-14, Xilinx, and minimal JTAG */
1273 if (new_cfg
& RESET_HAS_SRST
) {
1274 if (new_cfg
& RESET_SRST_NO_GATING
)
1275 modes
[2] = " srst_nogate";
1277 modes
[2] = " srst_gates_jtag";
1279 if (new_cfg
& RESET_SRST_PUSH_PULL
)
1280 modes
[4] = " srst_push_pull";
1282 modes
[4] = " srst_open_drain";
1288 command_print(CMD_CTX
, "%s %s%s%s%s",
1290 modes
[2], modes
[3], modes
[4]);
1295 COMMAND_HANDLER(handle_jtag_nsrst_delay_command
)
1298 return ERROR_COMMAND_SYNTAX_ERROR
;
1302 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], delay
);
1304 jtag_set_nsrst_delay(delay
);
1306 command_print(CMD_CTX
, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
1310 COMMAND_HANDLER(handle_jtag_ntrst_delay_command
)
1313 return ERROR_COMMAND_SYNTAX_ERROR
;
1317 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], delay
);
1319 jtag_set_ntrst_delay(delay
);
1321 command_print(CMD_CTX
, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
1325 COMMAND_HANDLER(handle_jtag_nsrst_assert_width_command
)
1328 return ERROR_COMMAND_SYNTAX_ERROR
;
1332 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], delay
);
1334 jtag_set_nsrst_assert_width(delay
);
1336 command_print(CMD_CTX
, "jtag_nsrst_assert_width: %u", jtag_get_nsrst_assert_width());
1340 COMMAND_HANDLER(handle_jtag_ntrst_assert_width_command
)
1343 return ERROR_COMMAND_SYNTAX_ERROR
;
1347 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], delay
);
1349 jtag_set_ntrst_assert_width(delay
);
1351 command_print(CMD_CTX
, "jtag_ntrst_assert_width: %u", jtag_get_ntrst_assert_width());
1355 COMMAND_HANDLER(handle_jtag_khz_command
)
1358 return ERROR_COMMAND_SYNTAX_ERROR
;
1360 int retval
= ERROR_OK
;
1364 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], khz
);
1366 retval
= jtag_config_khz(khz
);
1367 if (ERROR_OK
!= retval
)
1371 int cur_speed
= jtag_get_speed_khz();
1372 retval
= jtag_get_speed_readable(&cur_speed
);
1373 if (ERROR_OK
!= retval
)
1377 command_print(CMD_CTX
, "%d kHz", cur_speed
);
1379 command_print(CMD_CTX
, "RCLK - adaptive");
1384 COMMAND_HANDLER(handle_jtag_rclk_command
)
1387 return ERROR_COMMAND_SYNTAX_ERROR
;
1389 int retval
= ERROR_OK
;
1393 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], khz
);
1395 retval
= jtag_config_rclk(khz
);
1396 if (ERROR_OK
!= retval
)
1400 int cur_khz
= jtag_get_speed_khz();
1401 retval
= jtag_get_speed_readable(&cur_khz
);
1402 if (ERROR_OK
!= retval
)
1406 command_print(CMD_CTX
, "RCLK not supported - fallback to %d kHz", cur_khz
);
1408 command_print(CMD_CTX
, "RCLK - adaptive");
1413 COMMAND_HANDLER(handle_jtag_reset_command
)
1416 return ERROR_COMMAND_SYNTAX_ERROR
;
1419 if (CMD_ARGV
[0][0] == '1')
1421 else if (CMD_ARGV
[0][0] == '0')
1424 return ERROR_COMMAND_SYNTAX_ERROR
;
1427 if (CMD_ARGV
[1][0] == '1')
1429 else if (CMD_ARGV
[1][0] == '0')
1432 return ERROR_COMMAND_SYNTAX_ERROR
;
1434 if (jtag_interface_init(CMD_CTX
) != ERROR_OK
)
1435 return ERROR_JTAG_INIT_FAILED
;
1437 jtag_add_reset(trst
, srst
);
1438 return jtag_execute_queue();
1441 COMMAND_HANDLER(handle_runtest_command
)
1444 return ERROR_COMMAND_SYNTAX_ERROR
;
1446 unsigned num_clocks
;
1447 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], num_clocks
);
1449 jtag_add_runtest(num_clocks
, TAP_IDLE
);
1450 return jtag_execute_queue();
1454 * For "irscan" or "drscan" commands, the "end" (really, "next") state
1455 * should be stable ... and *NOT* a shift state, otherwise free-running
1456 * jtag clocks could change the values latched by the update state.
1457 * Not surprisingly, this is the same constraint as SVF; the "irscan"
1458 * and "drscan" commands are a write-only subset of what SVF provides.
1461 COMMAND_HANDLER(handle_irscan_command
)
1464 struct scan_field
*fields
;
1465 struct jtag_tap
*tap
;
1466 tap_state_t endstate
;
1468 if ((CMD_ARGC
< 2) || (CMD_ARGC
% 2))
1470 return ERROR_COMMAND_SYNTAX_ERROR
;
1473 /* optional "-endstate" "statename" at the end of the arguments,
1474 * so that e.g. IRPAUSE can let us load the data register before
1475 * entering RUN/IDLE to execute the instruction we load here.
1477 endstate
= TAP_IDLE
;
1479 if (CMD_ARGC
>= 4) {
1480 /* have at least one pair of numbers. */
1481 /* is last pair the magic text? */
1482 if (strcmp("-endstate", CMD_ARGV
[CMD_ARGC
- 2]) == 0) {
1483 endstate
= tap_state_by_name(CMD_ARGV
[CMD_ARGC
- 1]);
1484 if (endstate
== TAP_INVALID
)
1485 return ERROR_COMMAND_SYNTAX_ERROR
;
1486 if (!scan_is_safe(endstate
))
1487 LOG_WARNING("unstable irscan endstate \"%s\"",
1488 CMD_ARGV
[CMD_ARGC
- 1]);
1493 int num_fields
= CMD_ARGC
/ 2;
1494 size_t fields_len
= sizeof(struct scan_field
) * num_fields
;
1495 fields
= malloc(fields_len
);
1496 memset(fields
, 0, fields_len
);
1499 for (i
= 0; i
< num_fields
; i
++)
1501 tap
= jtag_tap_by_string(CMD_ARGV
[i
*2]);
1505 for (j
= 0; j
< i
; j
++)
1506 free(fields
[j
].out_value
);
1508 command_print(CMD_CTX
, "Tap: %s unknown", CMD_ARGV
[i
*2]);
1512 int field_size
= tap
->ir_length
;
1513 fields
[i
].tap
= tap
;
1514 fields
[i
].num_bits
= field_size
;
1515 fields
[i
].out_value
= malloc(DIV_ROUND_UP(field_size
, 8));
1518 retval
= parse_u32(CMD_ARGV
[i
* 2 + 1], &value
);
1519 if (ERROR_OK
!= retval
)
1521 buf_set_u32(fields
[i
].out_value
, 0, field_size
, value
);
1522 fields
[i
].in_value
= NULL
;
1525 /* did we have an endstate? */
1526 jtag_add_ir_scan(num_fields
, fields
, endstate
);
1528 retval
= jtag_execute_queue();
1531 for (i
= 0; i
< num_fields
; i
++)
1533 if (NULL
!= fields
[i
].out_value
)
1534 free(fields
[i
].out_value
);
1543 COMMAND_HANDLER(handle_verify_ircapture_command
)
1546 return ERROR_COMMAND_SYNTAX_ERROR
;
1551 COMMAND_PARSE_ENABLE(CMD_ARGV
[0], enable
);
1552 jtag_set_verify_capture_ir(enable
);
1555 const char *status
= jtag_will_verify_capture_ir() ? "enabled": "disabled";
1556 command_print(CMD_CTX
, "verify Capture-IR is %s", status
);
1561 COMMAND_HANDLER(handle_verify_jtag_command
)
1564 return ERROR_COMMAND_SYNTAX_ERROR
;
1569 COMMAND_PARSE_ENABLE(CMD_ARGV
[0], enable
);
1570 jtag_set_verify(enable
);
1573 const char *status
= jtag_will_verify() ? "enabled": "disabled";
1574 command_print(CMD_CTX
, "verify jtag capture is %s", status
);
1579 COMMAND_HANDLER(handle_tms_sequence_command
)
1582 return ERROR_COMMAND_SYNTAX_ERROR
;
1587 if (strcmp(CMD_ARGV
[0], "short") == 0)
1588 use_new_table
= true;
1589 else if (strcmp(CMD_ARGV
[0], "long") == 0)
1590 use_new_table
= false;
1592 return ERROR_COMMAND_SYNTAX_ERROR
;
1594 tap_use_new_tms_table(use_new_table
);
1597 command_print(CMD_CTX
, "tms sequence is %s",
1598 tap_uses_new_tms_table() ? "short": "long");
1603 static const struct command_registration jtag_command_handlers
[] = {
1605 .name
= "interface",
1606 .handler
= handle_interface_command
,
1607 .mode
= COMMAND_CONFIG
,
1608 .help
= "Select a JTAG interface",
1609 .usage
= "driver_name",
1612 .name
= "interface_list",
1613 .handler
= handle_interface_list_command
,
1614 .mode
= COMMAND_ANY
,
1615 .help
= "List all built-in interfaces",
1619 .handler
= handle_jtag_khz_command
,
1620 .mode
= COMMAND_ANY
,
1621 .help
= "With an argument, change to the specified maximum "
1622 "jtag speed. Pass 0 to require adaptive clocking. "
1623 "With or without argument, display current setting.",
1627 .name
= "jtag_rclk",
1628 .handler
= handle_jtag_rclk_command
,
1629 .mode
= COMMAND_ANY
,
1630 .help
= "With an argument, change to to use adaptive clocking "
1631 "if possible; else to use the fallback speed. "
1632 "With or without argument, display current setting.",
1633 .usage
= "[fallback_speed_khz]",
1636 .name
= "reset_config",
1637 .handler
= handle_reset_config_command
,
1638 .mode
= COMMAND_ANY
,
1639 .help
= "configure JTAG reset behavior",
1640 .usage
= "[none|trst_only|srst_only|trst_and_srst] "
1641 "[srst_pulls_trst|trst_pulls_srst|combined|separate] "
1642 "[srst_gates_jtag|srst_nogate] "
1643 "[trst_push_pull|trst_open_drain] "
1644 "[srst_push_pull|srst_open_drain]",
1647 .name
= "jtag_nsrst_delay",
1648 .handler
= handle_jtag_nsrst_delay_command
,
1649 .mode
= COMMAND_ANY
,
1650 .help
= "delay after deasserting srst in ms",
1651 .usage
= "[milliseconds]",
1654 .name
= "jtag_ntrst_delay",
1655 .handler
= handle_jtag_ntrst_delay_command
,
1656 .mode
= COMMAND_ANY
,
1657 .help
= "delay after deasserting trst in ms",
1658 .usage
= "[milliseconds]",
1661 .name
= "jtag_nsrst_assert_width",
1662 .handler
= handle_jtag_nsrst_assert_width_command
,
1663 .mode
= COMMAND_ANY
,
1664 .help
= "delay after asserting srst in ms",
1665 .usage
= "[milliseconds]",
1668 .name
= "jtag_ntrst_assert_width",
1669 .handler
= handle_jtag_ntrst_assert_width_command
,
1670 .mode
= COMMAND_ANY
,
1671 .help
= "delay after asserting trst in ms",
1672 .usage
= "[milliseconds]",
1675 .name
= "scan_chain",
1676 .handler
= handle_scan_chain_command
,
1677 .mode
= COMMAND_EXEC
,
1678 .help
= "print current scan chain configuration",
1681 .name
= "jtag_reset",
1682 .handler
= handle_jtag_reset_command
,
1683 .mode
= COMMAND_EXEC
,
1684 .help
= "Set reset line values. Value '1' is active, "
1685 "value '0' is inactive.",
1686 .usage
= "trst_active srst_active",
1690 .handler
= handle_runtest_command
,
1691 .mode
= COMMAND_EXEC
,
1692 .help
= "Move to Run-Test/Idle, and issue TCK for num_cycles.",
1693 .usage
= "num_cycles"
1697 .handler
= handle_irscan_command
,
1698 .mode
= COMMAND_EXEC
,
1699 .help
= "Execute Instruction Register (DR) scan. The "
1700 "specified opcodes are put into each TAP's IR, "
1701 "and other TAPs are put in BYPASS.",
1702 .usage
= "[tap_name instruction]* ['-endstate' state_name]",
1705 .name
= "verify_ircapture",
1706 .handler
= handle_verify_ircapture_command
,
1707 .mode
= COMMAND_ANY
,
1708 .help
= "Display or assign flag controlling whether to "
1709 "verify values captured during Capture-IR.",
1710 .usage
= "['enable'|'disable']",
1713 .name
= "verify_jtag",
1714 .handler
= handle_verify_jtag_command
,
1715 .mode
= COMMAND_ANY
,
1716 .help
= "Display or assign flag controlling whether to "
1717 "verify values captured during IR and DR scans.",
1718 .usage
= "['enable'|'disable']",
1721 .name
= "tms_sequence",
1722 .handler
= handle_tms_sequence_command
,
1723 .mode
= COMMAND_ANY
,
1724 .help
= "Display or change what style TMS sequences to use "
1725 "for JTAG state transitions: short (default) or "
1726 "long. Only for working around JTAG bugs.",
1727 /* Specifically for working around DRIVER bugs... */
1728 .usage
= "['short'|'long']",
1732 .mode
= COMMAND_ANY
,
1733 .help
= "perform jtag tap actions",
1735 .chain
= jtag_subcommand_handlers
,
1738 .chain
= jtag_command_handlers_to_move
,
1740 COMMAND_REGISTRATION_DONE
1742 int jtag_register_commands(struct command_context
*cmd_ctx
)
1744 return register_commands(cmd_ctx
, NULL
, jtag_command_handlers
);
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)