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_TAP_EVENT_POST_RESET
, .name
= "post-reset" },
45 { .value
= JTAG_TAP_EVENT_ENABLE
, .name
= "tap-enable" },
46 { .value
= JTAG_TAP_EVENT_DISABLE
, .name
= "tap-disable" },
48 { .name
= NULL
, .value
= -1 }
51 extern jtag_interface_t
*jtag_interface
;
54 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
55 char *cmd
, char **args
, int argc
);
56 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 static int handle_jtag_rclk_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
60 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
63 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
65 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
69 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
70 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
71 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
72 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
);
74 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
75 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
76 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
79 enum jtag_tap_cfg_param
{
83 static Jim_Nvp nvp_config_opts
[] = {
84 { .name
= "-event", .value
= JCFG_EVENT
},
86 { .name
= NULL
, .value
= -1 }
89 static int jtag_tap_configure_cmd(Jim_GetOptInfo
*goi
, jtag_tap_t
* tap
)
95 /* parse config or cget options */
96 while (goi
->argc
> 0) {
97 Jim_SetEmptyResult (goi
->interp
);
99 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
101 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
107 if (goi
->argc
== 0) {
108 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ...");
112 e
= Jim_GetOpt_Nvp(goi
, nvp_jtag_tap_event
, &n
);
114 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
118 if (goi
->isconfigure
) {
119 if (goi
->argc
!= 1) {
120 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
124 if (goi
->argc
!= 0) {
125 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
131 jtag_tap_event_action_t
*jteap
;
133 jteap
= tap
->event_action
;
134 /* replace existing? */
136 if (jteap
->event
== (enum jtag_event
)n
->value
) {
142 if (goi
->isconfigure
) {
146 jteap
= calloc(1, sizeof (*jteap
));
149 jteap
->event
= n
->value
;
150 Jim_GetOpt_Obj(goi
, &o
);
152 Jim_DecrRefCount(interp
, jteap
->body
);
154 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
155 Jim_IncrRefCount(jteap
->body
);
159 /* add to head of event list */
160 jteap
->next
= tap
->event_action
;
161 tap
->event_action
= jteap
;
163 Jim_SetEmptyResult(goi
->interp
);
167 Jim_SetEmptyResult(goi
->interp
);
169 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
176 } /* while (goi->argc) */
181 static int is_bad_irval(int ir_length
, jim_wide w
)
191 static int jim_newtap_cmd(Jim_GetOptInfo
*goi
)
200 const Jim_Nvp opts
[] = {
201 #define NTAP_OPT_IRLEN 0
202 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
203 #define NTAP_OPT_IRMASK 1
204 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
205 #define NTAP_OPT_IRCAPTURE 2
206 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
207 #define NTAP_OPT_ENABLED 3
208 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
209 #define NTAP_OPT_DISABLED 4
210 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
211 #define NTAP_OPT_EXPECTED_ID 5
212 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
213 { .name
= NULL
, .value
= -1 },
216 pTap
= calloc(1, sizeof(jtag_tap_t
));
218 Jim_SetResult_sprintf(goi
->interp
, "no memory");
223 * we expect CHIP + TAP + OPTIONS
226 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
230 Jim_GetOpt_String(goi
, &cp
, NULL
);
231 pTap
->chip
= strdup(cp
);
233 Jim_GetOpt_String(goi
, &cp
, NULL
);
234 pTap
->tapname
= strdup(cp
);
236 /* name + dot + name + null */
237 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
239 sprintf(cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
240 pTap
->dotted_name
= cp
;
242 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
243 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
245 /* IEEE specifies that the two LSBs of an IR scan are 01, so make
246 * that the default. The "-irlen" and "-irmask" options are only
247 * needed to cope with nonstandard TAPs, or to specify more bits.
249 pTap
->ir_capture_mask
= 0x03;
250 pTap
->ir_capture_value
= 0x01;
252 /* clear flags for "required options" them as we find them */
256 e
= Jim_GetOpt_Nvp(goi
, opts
, &n
);
258 Jim_GetOpt_NvpUnknown(goi
, opts
, 0);
259 free((void *)pTap
->dotted_name
);
263 LOG_DEBUG("Processing option: %s", n
->name
);
265 case NTAP_OPT_ENABLED
:
266 pTap
->disabled_after_reset
= false;
268 case NTAP_OPT_DISABLED
:
269 pTap
->disabled_after_reset
= true;
271 case NTAP_OPT_EXPECTED_ID
:
273 uint32_t *new_expected_ids
;
275 e
= Jim_GetOpt_Wide(goi
, &w
);
277 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
278 free((void *)pTap
->dotted_name
);
283 new_expected_ids
= malloc(sizeof(uint32_t) * (pTap
->expected_ids_cnt
+ 1));
284 if (new_expected_ids
== NULL
) {
285 Jim_SetResult_sprintf(goi
->interp
, "no memory");
286 free((void *)pTap
->dotted_name
);
291 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(uint32_t) * pTap
->expected_ids_cnt
);
293 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
295 free(pTap
->expected_ids
);
296 pTap
->expected_ids
= new_expected_ids
;
297 pTap
->expected_ids_cnt
++;
301 case NTAP_OPT_IRMASK
:
302 case NTAP_OPT_IRCAPTURE
:
303 e
= Jim_GetOpt_Wide(goi
, &w
);
305 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
306 free((void *)pTap
->dotted_name
);
312 if (w
> (jim_wide
) (8 * sizeof(pTap
->ir_capture_value
)))
313 LOG_WARNING("%s: huge IR length %d",
319 case NTAP_OPT_IRMASK
:
320 if (is_bad_irval(pTap
->ir_length
, w
)) {
321 LOG_ERROR("%s: IR mask %x too big",
324 free((void *)pTap
->dotted_name
);
329 LOG_WARNING("%s: nonstandard IR mask",
331 pTap
->ir_capture_mask
= w
;
333 case NTAP_OPT_IRCAPTURE
:
334 if (is_bad_irval(pTap
->ir_length
, w
)) {
335 LOG_ERROR("%s: IR capture %x too big",
338 free((void *)pTap
->dotted_name
);
343 LOG_WARNING("%s: nonstandard IR value",
345 pTap
->ir_capture_value
= w
;
348 } /* switch (n->value) */
349 } /* while (goi->argc) */
351 /* default is enabled-after-reset */
352 pTap
->enabled
= !pTap
->disabled_after_reset
;
354 /* Did all the required option bits get cleared? */
361 Jim_SetResult_sprintf(goi
->interp
,
362 "newtap: %s missing required parameters",
368 static void jtag_tap_handle_event(jtag_tap_t
*tap
, enum jtag_event e
)
370 jtag_tap_event_action_t
* jteap
;
372 for (jteap
= tap
->event_action
; jteap
!= NULL
; jteap
= jteap
->next
) {
373 if (jteap
->event
== e
) {
374 LOG_DEBUG("JTAG tap: %s event: %d (%s) action: %s\n",
377 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
,
378 Jim_GetString(jteap
->body
, NULL
));
379 if (Jim_EvalObj(interp
, jteap
->body
) != JIM_OK
) {
380 Jim_PrintErrorMessage(interp
);
382 case JTAG_TAP_EVENT_ENABLE
:
383 case JTAG_TAP_EVENT_DISABLE
:
384 /* NOTE: we currently assume the handlers
385 * can't fail. That presumes later code
386 * will be verifying the scan chains ...
388 tap
->enabled
= (e
== JTAG_TAP_EVENT_ENABLE
);
398 static int jim_jtag_command(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
404 struct command_context_s
*context
;
412 JTAG_CMD_TAPISENABLED
,
418 const Jim_Nvp jtag_cmds
[] = {
419 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
420 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
421 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
422 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
423 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
424 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
425 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
426 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
427 { .name
= "names" , .value
= JTAG_CMD_NAMES
},
429 { .name
= NULL
, .value
= -1 },
432 context
= Jim_GetAssocData(interp
, "context");
433 /* go past the command */
434 Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+ 1);
436 e
= Jim_GetOpt_Nvp(&goi
, jtag_cmds
, &n
);
438 Jim_GetOpt_NvpUnknown(&goi
, jtag_cmds
, 0);
441 Jim_SetEmptyResult(goi
.interp
);
443 case JTAG_CMD_INTERFACE
:
444 /* return the name of the interface */
445 /* TCL code might need to know the exact type... */
446 /* FUTURE: we allow this as a means to "set" the interface. */
448 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
451 Jim_SetResultString(goi
.interp
, jtag_interface
->name
, -1);
453 case JTAG_CMD_INIT_RESET
:
455 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
458 e
= jtag_init_reset(context
);
460 Jim_SetResult_sprintf(goi
.interp
, "error: %d", e
);
464 case JTAG_CMD_NEWTAP
:
465 return jim_newtap_cmd(&goi
);
467 case JTAG_CMD_TAPISENABLED
:
468 case JTAG_CMD_TAPENABLE
:
469 case JTAG_CMD_TAPDISABLE
:
471 Jim_SetResultString(goi
.interp
, "Too many parameters",-1);
478 t
= jtag_tap_by_jim_obj(goi
.interp
, goi
.argv
[0]);
483 case JTAG_CMD_TAPISENABLED
:
485 case JTAG_CMD_TAPENABLE
:
488 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_ENABLE
);
492 /* FIXME add JTAG sanity checks, w/o TLR
493 * - scan chain length grew by one (this)
494 * - IDs and IR lengths are as expected
497 jtag_call_event_callbacks(JTAG_TAP_EVENT_ENABLE
);
499 case JTAG_CMD_TAPDISABLE
:
502 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_DISABLE
);
506 /* FIXME add JTAG sanity checks, w/o TLR
507 * - scan chain length shrank by one (this)
508 * - IDs and IR lengths are as expected
511 jtag_call_event_callbacks(JTAG_TAP_EVENT_DISABLE
);
515 Jim_SetResult(goi
.interp
, Jim_NewIntObj(goi
.interp
, e
));
522 Jim_WrongNumArgs(goi
.interp
, 0, NULL
,
523 "cget tap_name queryparm");
530 Jim_GetOpt_Obj(&goi
, &o
);
531 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
537 return jtag_tap_configure_cmd(&goi
, t
);
541 case JTAG_CMD_CONFIGURE
:
543 Jim_WrongNumArgs(goi
.interp
, 0, NULL
,
544 "configure tap_name attribute value ...");
551 Jim_GetOpt_Obj(&goi
, &o
);
552 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
558 return jtag_tap_configure_cmd(&goi
, t
);
564 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
, "Too many parameters");
567 Jim_SetResult(goi
.interp
, Jim_NewListObj(goi
.interp
, NULL
, 0));
571 for (tap
= jtag_all_taps(); tap
; tap
= tap
->next_tap
) {
572 Jim_ListAppendElement(goi
.interp
,
573 Jim_GetResult(goi
.interp
),
574 Jim_NewStringObj(goi
.interp
,
575 tap
->dotted_name
, -1));
587 void jtag_notify_reset(void)
590 for (tap
= jtag_all_taps(); tap
; tap
= tap
->next_tap
)
592 jtag_tap_handle_event(tap
, JTAG_TAP_EVENT_POST_RESET
);
597 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
599 register_jim(cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
601 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
602 COMMAND_CONFIG
, "try to configure interface");
603 register_command(cmd_ctx
, NULL
,
604 "interface_list", &handle_interface_list_command
,
605 COMMAND_ANY
, "list all built-in interfaces");
606 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
607 COMMAND_ANY
, "(DEPRECATED) set jtag speed (if supported)");
608 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
609 COMMAND_ANY
, "set maximum jtag speed (if supported); "
610 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
611 register_command(cmd_ctx
, NULL
, "jtag_rclk", handle_jtag_rclk_command
,
612 COMMAND_ANY
, "fallback_speed_khz - set JTAG speed to RCLK or use fallback speed");
613 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
614 COMMAND_CONFIG
, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
615 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
617 "[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]");
618 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
619 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
620 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
621 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
623 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
624 COMMAND_EXEC
, "print current scan chain configuration");
626 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
627 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
628 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
629 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
630 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
631 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
632 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
633 register_jim(cmd_ctx
, "flush_count", Jim_Command_flush_count
, "returns number of times the JTAG queue has been flushed");
634 register_jim(cmd_ctx
, "pathmove", Jim_Command_pathmove
, "move JTAG to state1 then to state2, state3, etc. <state1>,<state2>,<stat3>...");
636 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
637 COMMAND_ANY
, "verify value captured during Capture-IR <enable | disable>");
638 register_command(cmd_ctx
, NULL
, "verify_jtag", handle_verify_jtag_command
,
639 COMMAND_ANY
, "verify value capture <enable | disable>");
640 register_command(cmd_ctx
, NULL
, "tms_sequence", handle_tms_sequence_command
,
641 COMMAND_ANY
, "choose short(default) or long tms_sequence <short | long>");
645 static int default_khz(int khz
, int *jtag_speed
)
647 LOG_ERROR("Translation from khz to jtag_speed not implemented");
651 static int default_speed_div(int speed
, int *khz
)
653 LOG_ERROR("Translation from jtag_speed to khz not implemented");
657 static int default_power_dropout(int *dropout
)
659 *dropout
= 0; /* by default we can't detect power dropout */
663 static int default_srst_asserted(int *srst_asserted
)
665 *srst_asserted
= 0; /* by default we can't detect srst asserted */
669 static int handle_interface_command(struct command_context_s
*cmd_ctx
,
670 char *cmd
, char **args
, int argc
)
672 /* check whether the interface is already configured */
675 LOG_WARNING("Interface already configured, ignoring");
679 /* interface name is a mandatory argument */
680 if (argc
!= 1 || args
[0][0] == '\0')
681 return ERROR_COMMAND_SYNTAX_ERROR
;
683 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
685 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) != 0)
688 int retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
);
689 if (ERROR_OK
!= retval
)
692 jtag_interface
= jtag_interfaces
[i
];
694 if (jtag_interface
->khz
== NULL
)
695 jtag_interface
->khz
= default_khz
;
696 if (jtag_interface
->speed_div
== NULL
)
697 jtag_interface
->speed_div
= default_speed_div
;
698 if (jtag_interface
->power_dropout
== NULL
)
699 jtag_interface
->power_dropout
= default_power_dropout
;
700 if (jtag_interface
->srst_asserted
== NULL
)
701 jtag_interface
->srst_asserted
= default_srst_asserted
;
706 /* no valid interface was found (i.e. the configuration option,
707 * didn't match one of the compiled-in interfaces
709 LOG_ERROR("The specified JTAG interface was not found (%s)", args
[0]);
710 handle_interface_list_command(cmd_ctx
, cmd
, args
, argc
);
711 return ERROR_JTAG_INVALID_INTERFACE
;
714 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
715 char *cmd
, char **args
, int argc
)
717 if (strcmp(cmd
, "interface_list") == 0 && argc
> 0)
718 return ERROR_COMMAND_SYNTAX_ERROR
;
720 command_print(cmd_ctx
, "The following JTAG interfaces are available:");
721 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
723 const char *name
= jtag_interfaces
[i
]->name
;
724 command_print(cmd_ctx
, "%u: %s", i
+ 1, name
);
730 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
734 Jim_Obj
*newargs
[ 10 ];
738 * argv[ 0] = ir length
739 * argv[ 1] = ir capture
741 * argv[ 3] = not actually used by anything but in the docs
745 command_print(cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
748 command_print(cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
749 command_print(cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
753 command_print(cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
754 command_print(cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
755 command_print(cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
756 command_print(cmd_ctx
, "And then refer to the taps by the dotted name.");
758 newargs
[0] = Jim_NewStringObj(interp
, "jtag", -1);
759 newargs
[1] = Jim_NewStringObj(interp
, "newtap", -1);
760 sprintf(buf
, "chip%d", jtag_tap_count());
761 newargs
[2] = Jim_NewStringObj(interp
, buf
, -1);
762 sprintf(buf
, "tap%d", jtag_tap_count());
763 newargs
[3] = Jim_NewStringObj(interp
, buf
, -1);
764 newargs
[4] = Jim_NewStringObj(interp
, "-irlen", -1);
765 newargs
[5] = Jim_NewStringObj(interp
, args
[0], -1);
766 newargs
[6] = Jim_NewStringObj(interp
, "-ircapture", -1);
767 newargs
[7] = Jim_NewStringObj(interp
, args
[1], -1);
768 newargs
[8] = Jim_NewStringObj(interp
, "-irmask", -1);
769 newargs
[9] = Jim_NewStringObj(interp
, args
[2], -1);
771 command_print(cmd_ctx
, "NEW COMMAND:");
772 sprintf(buf
, "%s %s %s %s %s %s %s %s %s %s",
773 Jim_GetString(newargs
[0], NULL
),
774 Jim_GetString(newargs
[1], NULL
),
775 Jim_GetString(newargs
[2], NULL
),
776 Jim_GetString(newargs
[3], NULL
),
777 Jim_GetString(newargs
[4], NULL
),
778 Jim_GetString(newargs
[5], NULL
),
779 Jim_GetString(newargs
[6], NULL
),
780 Jim_GetString(newargs
[7], NULL
),
781 Jim_GetString(newargs
[8], NULL
),
782 Jim_GetString(newargs
[9], NULL
));
784 e
= jim_jtag_command(interp
, 10, newargs
);
786 command_print(cmd_ctx
, "%s", Jim_GetString(Jim_GetResult(interp
), NULL
));
791 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
795 tap
= jtag_all_taps();
796 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
797 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
800 uint32_t expected
, expected_mask
, cur_instr
, ii
;
801 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
802 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
803 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
805 command_print(cmd_ctx
,
806 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
807 tap
->abs_chain_position
,
809 tap
->enabled
? 'Y' : 'n',
810 (unsigned int)(tap
->idcode
),
811 (unsigned int)(tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
812 (unsigned int)(tap
->ir_length
),
813 (unsigned int)(expected
),
814 (unsigned int)(expected_mask
),
815 (unsigned int)(cur_instr
));
817 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
818 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
819 (unsigned int)(tap
->expected_ids
[ii
]));
828 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
834 return ERROR_COMMAND_SYNTAX_ERROR
;
836 /* Original versions cared about the order of these tokens:
837 * reset_config signals [combination [trst_type [srst_type]]]
838 * They also clobbered the previous configuration even on error.
840 * Here we don't care about the order, and only change values
841 * which have been explicitly specified.
843 for (; argc
; argc
--, args
++) {
847 m
= RESET_SRST_GATES_JTAG
;
849 if (strcmp(*args
, "srst_gates_jtag") == 0)
851 tmp
= RESET_SRST_GATES_JTAG
;
856 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
857 if (strcmp(*args
, "none") == 0)
859 else if (strcmp(*args
, "trst_only") == 0)
860 tmp
= RESET_HAS_TRST
;
861 else if (strcmp(*args
, "srst_only") == 0)
862 tmp
= RESET_HAS_SRST
;
863 else if (strcmp(*args
, "trst_and_srst") == 0)
864 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
868 LOG_ERROR("extra reset_config %s spec (%s)",
870 return ERROR_INVALID_ARGUMENTS
;
875 /* combination (options for broken wiring) */
876 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
877 if (strcmp(*args
, "separate") == 0)
878 /* separate reset lines - default */;
879 else if (strcmp(*args
, "srst_pulls_trst") == 0)
880 tmp
|= RESET_SRST_PULLS_TRST
;
881 else if (strcmp(*args
, "trst_pulls_srst") == 0)
882 tmp
|= RESET_TRST_PULLS_SRST
;
883 else if (strcmp(*args
, "combined") == 0)
884 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
888 LOG_ERROR("extra reset_config %s spec (%s)",
889 "combination", *args
);
890 return ERROR_INVALID_ARGUMENTS
;
895 /* trst_type (NOP without HAS_TRST) */
896 m
= RESET_TRST_OPEN_DRAIN
;
897 if (strcmp(*args
, "trst_open_drain") == 0)
898 tmp
|= RESET_TRST_OPEN_DRAIN
;
899 else if (strcmp(*args
, "trst_push_pull") == 0)
900 /* push/pull from adapter - default */;
904 LOG_ERROR("extra reset_config %s spec (%s)",
906 return ERROR_INVALID_ARGUMENTS
;
911 /* srst_type (NOP without HAS_SRST) */
912 m
|= RESET_SRST_PUSH_PULL
;
913 if (strcmp(*args
, "srst_push_pull") == 0)
914 tmp
|= RESET_SRST_PUSH_PULL
;
915 else if (strcmp(*args
, "srst_open_drain") == 0)
916 /* open drain from adapter - default */;
920 LOG_ERROR("extra reset_config %s spec (%s)",
922 return ERROR_INVALID_ARGUMENTS
;
927 /* caller provided nonsense; fail */
928 LOG_ERROR("unknown reset_config flag (%s)", *args
);
929 return ERROR_INVALID_ARGUMENTS
;
932 /* Remember the bits which were specified (mask)
933 * and their new values (new_cfg).
939 /* clear previous values of those bits, save new values */
940 enum reset_types old_cfg
= jtag_get_reset_config();
943 jtag_set_reset_config(new_cfg
);
948 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
,
949 char *cmd
, char **args
, int argc
)
952 return ERROR_COMMAND_SYNTAX_ERROR
;
956 int retval
= parse_uint(args
[0], &delay
);
957 if (ERROR_OK
!= retval
)
959 jtag_set_nsrst_delay(delay
);
961 command_print(cmd_ctx
, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
965 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
,
966 char *cmd
, char **args
, int argc
)
969 return ERROR_COMMAND_SYNTAX_ERROR
;
973 int retval
= parse_uint(args
[0], &delay
);
974 if (ERROR_OK
!= retval
)
976 jtag_set_ntrst_delay(delay
);
978 command_print(cmd_ctx
, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
982 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
984 int retval
= ERROR_OK
;
986 command_print(cmd_ctx
, "OLD SYNTAX: DEPRECATED - "
987 "use jtag_khz, not jtag_speed");
990 return ERROR_COMMAND_SYNTAX_ERROR
;
993 LOG_DEBUG("handle jtag speed");
995 unsigned cur_speed
= 0;
996 int retval
= parse_uint(args
[0], &cur_speed
);
997 if (ERROR_OK
!= retval
)
999 retval
= jtag_config_speed(cur_speed
);
1002 command_print(cmd_ctx
, "jtag_speed: %d", jtag_get_speed());
1007 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1010 return ERROR_COMMAND_SYNTAX_ERROR
;
1012 int retval
= ERROR_OK
;
1016 int retval
= parse_uint(args
[0], &khz
);
1017 if (ERROR_OK
!= retval
)
1019 retval
= jtag_config_khz(khz
);
1020 if (ERROR_OK
!= retval
)
1024 int cur_speed
= jtag_get_speed_khz();
1025 retval
= jtag_get_speed_readable(&cur_speed
);
1026 if (ERROR_OK
!= retval
)
1030 command_print(cmd_ctx
, "%d kHz", cur_speed
);
1032 command_print(cmd_ctx
, "RCLK - adaptive");
1037 static int handle_jtag_rclk_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1040 return ERROR_COMMAND_SYNTAX_ERROR
;
1042 int retval
= ERROR_OK
;
1046 int retval
= parse_uint(args
[0], &khz
);
1047 if (ERROR_OK
!= retval
)
1049 retval
= jtag_config_rclk(khz
);
1050 if (ERROR_OK
!= retval
)
1054 int cur_khz
= jtag_get_speed_khz();
1055 retval
= jtag_get_speed_readable(&cur_khz
);
1056 if (ERROR_OK
!= retval
)
1060 command_print(cmd_ctx
, "RCLK not supported - fallback to %d kHz", cur_khz
);
1062 command_print(cmd_ctx
, "RCLK - adaptive");
1067 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
,
1068 char *cmd
, char **args
, int argc
)
1071 return ERROR_COMMAND_SYNTAX_ERROR
;
1074 if (args
[0][0] == '1')
1076 else if (args
[0][0] == '0')
1079 return ERROR_COMMAND_SYNTAX_ERROR
;
1082 if (args
[1][0] == '1')
1084 else if (args
[1][0] == '0')
1087 return ERROR_COMMAND_SYNTAX_ERROR
;
1089 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
1090 return ERROR_JTAG_INIT_FAILED
;
1092 jtag_add_reset(trst
, srst
);
1093 return jtag_execute_queue();
1096 static int handle_runtest_command(struct command_context_s
*cmd_ctx
,
1097 char *cmd
, char **args
, int argc
)
1100 return ERROR_COMMAND_SYNTAX_ERROR
;
1102 unsigned num_clocks
;
1103 int retval
= parse_uint(args
[0], &num_clocks
);
1104 if (ERROR_OK
!= retval
)
1107 jtag_add_runtest(num_clocks
, TAP_IDLE
);
1108 return jtag_execute_queue();
1112 * For "irscan" or "drscan" commands, the "end" (really, "next") state
1113 * should be stable ... and *NOT* a shift state, otherwise free-running
1114 * jtag clocks could change the values latched by the update state.
1116 static bool scan_is_safe(tap_state_t state
)
1131 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1134 scan_field_t
*fields
;
1136 tap_state_t endstate
;
1138 if ((argc
< 2) || (argc
% 2))
1140 return ERROR_COMMAND_SYNTAX_ERROR
;
1143 /* optional "-endstate" "statename" at the end of the arguments,
1144 * so that e.g. IRPAUSE can let us load the data register before
1145 * entering RUN/IDLE to execute the instruction we load here.
1147 endstate
= TAP_IDLE
;
1150 /* have at least one pair of numbers. */
1151 /* is last pair the magic text? */
1152 if (0 == strcmp("-endstate", args
[ argc
- 2 ])) {
1155 cpA
= args
[ argc
-1 ];
1156 for (endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++) {
1157 cpS
= tap_state_name(endstate
);
1158 if (0 == strcmp(cpA
, cpS
)) {
1162 if (endstate
>= TAP_NUM_STATES
) {
1163 return ERROR_COMMAND_SYNTAX_ERROR
;
1165 if (!scan_is_safe(endstate
))
1166 LOG_WARNING("irscan with unsafe "
1167 "endstate \"%s\"", cpA
);
1168 /* found - remove the last 2 args */
1174 int num_fields
= argc
/ 2;
1175 size_t fields_len
= sizeof(scan_field_t
) * num_fields
;
1176 fields
= malloc(fields_len
);
1177 memset(fields
, 0, fields_len
);
1180 for (i
= 0; i
< num_fields
; i
++)
1182 tap
= jtag_tap_by_string(args
[i
*2]);
1186 for (j
= 0; j
< i
; j
++)
1187 free(fields
[j
].out_value
);
1189 command_print(cmd_ctx
, "Tap: %s unknown", args
[i
*2]);
1193 int field_size
= tap
->ir_length
;
1194 fields
[i
].tap
= tap
;
1195 fields
[i
].num_bits
= field_size
;
1196 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
1199 retval
= parse_u32(args
[i
* 2 + 1], &value
);
1200 if (ERROR_OK
!= retval
)
1202 buf_set_u32(fields
[i
].out_value
, 0, field_size
, value
);
1203 fields
[i
].in_value
= NULL
;
1206 /* did we have an endstate? */
1207 jtag_add_ir_scan(num_fields
, fields
, endstate
);
1209 retval
= jtag_execute_queue();
1212 for (i
= 0; i
< num_fields
; i
++)
1214 if (NULL
!= fields
[i
].out_value
)
1215 free(fields
[i
].out_value
);
1223 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1226 scan_field_t
*fields
;
1228 int field_count
= 0;
1231 tap_state_t endstate
;
1234 * args[2] = num_bits
1235 * args[3] = hex string
1236 * ... repeat num bits and hex string ...
1239 * args[N-2] = "-endstate"
1240 * args[N-1] = statename
1242 if ((argc
< 4) || ((argc
% 2) != 0))
1244 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1248 endstate
= TAP_IDLE
;
1250 script_debug(interp
, "drscan", argc
, args
);
1252 /* validate arguments as numbers */
1254 for (i
= 2; i
< argc
; i
+= 2)
1259 e
= Jim_GetLong(interp
, args
[i
], &bits
);
1260 /* If valid - try next arg */
1265 /* Not valid.. are we at the end? */
1266 if (((i
+ 2) != argc
)) {
1267 /* nope, then error */
1271 /* it could be: "-endstate FOO"
1272 * e.g. DRPAUSE so we can issue more instructions
1273 * before entering RUN/IDLE and executing them.
1276 /* get arg as a string. */
1277 cp
= Jim_GetString(args
[i
], NULL
);
1278 /* is it the magic? */
1279 if (0 == strcmp("-endstate", cp
)) {
1280 /* is the statename valid? */
1281 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1283 /* see if it is a valid state name */
1284 endstate
= tap_state_by_name(cp
);
1286 /* update the error message */
1287 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1289 if (!scan_is_safe(endstate
))
1290 LOG_WARNING("drscan with unsafe "
1291 "endstate \"%s\"", cp
);
1293 /* valid - so clear the error */
1295 /* and remove the last 2 args */
1300 /* Still an error? */
1302 return e
; /* too bad */
1304 } /* validate args */
1306 tap
= jtag_tap_by_jim_obj(interp
, args
[1]);
1311 num_fields
= (argc
-2)/2;
1312 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
1313 for (i
= 2; i
< argc
; i
+= 2)
1319 Jim_GetLong(interp
, args
[i
], &bits
);
1320 str
= Jim_GetString(args
[i
+ 1], &len
);
1322 fields
[field_count
].tap
= tap
;
1323 fields
[field_count
].num_bits
= bits
;
1324 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
1325 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
1326 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
1330 jtag_add_dr_scan(num_fields
, fields
, endstate
);
1332 retval
= jtag_execute_queue();
1333 if (retval
!= ERROR_OK
)
1335 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
1340 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
1341 for (i
= 2; i
< argc
; i
+= 2)
1346 Jim_GetLong(interp
, args
[i
], &bits
);
1347 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
1348 free(fields
[field_count
].out_value
);
1350 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
1355 Jim_SetResult(interp
, list
);
1363 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1365 tap_state_t states
[8];
1367 if ((argc
< 2) || ((size_t)argc
> (sizeof(states
)/sizeof(*states
) + 1)))
1369 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1373 script_debug(interp
, "pathmove", argc
, args
);
1376 for (i
= 0; i
< argc
-1; i
++)
1379 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1380 states
[i
] = tap_state_by_name(cp
);
1383 /* update the error message */
1384 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1389 if ((jtag_add_statemove(states
[0]) != ERROR_OK
) || (jtag_execute_queue()!= ERROR_OK
))
1391 Jim_SetResultString(interp
, "pathmove: jtag execute failed",-1);
1395 jtag_add_pathmove(argc
-2, states
+ 1);
1397 if (jtag_execute_queue()!= ERROR_OK
)
1399 Jim_SetResultString(interp
, "pathmove: failed",-1);
1407 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1409 script_debug(interp
, "flush_count", argc
, args
);
1411 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_get_flush_queue_count()));
1417 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1420 return ERROR_COMMAND_SYNTAX_ERROR
;
1424 if (strcmp(args
[0], "enable") == 0)
1425 jtag_set_verify_capture_ir(true);
1426 else if (strcmp(args
[0], "disable") == 0)
1427 jtag_set_verify_capture_ir(false);
1429 return ERROR_COMMAND_SYNTAX_ERROR
;
1432 const char *status
= jtag_will_verify_capture_ir() ? "enabled": "disabled";
1433 command_print(cmd_ctx
, "verify Capture-IR is %s", status
);
1438 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1441 return ERROR_COMMAND_SYNTAX_ERROR
;
1445 if (strcmp(args
[0], "enable") == 0)
1446 jtag_set_verify(true);
1447 else if (strcmp(args
[0], "disable") == 0)
1448 jtag_set_verify(false);
1450 return ERROR_COMMAND_SYNTAX_ERROR
;
1453 const char *status
= jtag_will_verify() ? "enabled": "disabled";
1454 command_print(cmd_ctx
, "verify jtag capture is %s", status
);
1459 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1462 return ERROR_COMMAND_SYNTAX_ERROR
;
1467 if (strcmp(args
[0], "short") == 0)
1468 use_new_table
= true;
1469 else if (strcmp(args
[0], "long") == 0)
1470 use_new_table
= false;
1472 return ERROR_COMMAND_SYNTAX_ERROR
;
1474 tap_use_new_tms_table(use_new_table
);
1477 command_print(cmd_ctx
, "tms sequence is %s",
1478 tap_uses_new_tms_table() ? "short": "long");
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)