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_ENABLE
, .name
= "tap-enable" },
45 { .value
= JTAG_TAP_EVENT_DISABLE
, .name
= "tap-disable" },
47 { .name
= NULL
, .value
= -1 }
50 extern jtag_interface_t
*jtag_interface
;
53 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
54 char *cmd
, char **args
, int argc
);
55 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
56 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 static int handle_jtag_rclk_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
60 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
64 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
66 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
69 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
70 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
71 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
);
73 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
74 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
75 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
77 extern int jtag_examine_chain(void);
78 extern int jtag_validate_chain(void);
80 enum jtag_tap_cfg_param
{
84 static Jim_Nvp nvp_config_opts
[] = {
85 { .name
= "-event", .value
= JCFG_EVENT
},
87 { .name
= NULL
, .value
= -1 }
90 static int jtag_tap_configure_cmd(Jim_GetOptInfo
*goi
, jtag_tap_t
* tap
)
96 /* parse config or cget options */
97 while (goi
->argc
> 0) {
98 Jim_SetEmptyResult (goi
->interp
);
100 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
102 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
108 if (goi
->argc
== 0) {
109 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ...");
113 e
= Jim_GetOpt_Nvp(goi
, nvp_jtag_tap_event
, &n
);
115 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
119 if (goi
->isconfigure
) {
120 if (goi
->argc
!= 1) {
121 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
125 if (goi
->argc
!= 0) {
126 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
132 jtag_tap_event_action_t
*jteap
;
134 jteap
= tap
->event_action
;
135 /* replace existing? */
137 if (jteap
->event
== (enum jtag_event
)n
->value
) {
143 if (goi
->isconfigure
) {
146 jteap
= calloc(1, sizeof (*jteap
));
148 jteap
->event
= n
->value
;
149 Jim_GetOpt_Obj(goi
, &o
);
151 Jim_DecrRefCount(interp
, jteap
->body
);
153 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
154 Jim_IncrRefCount(jteap
->body
);
156 /* add to head of event list */
157 jteap
->next
= tap
->event_action
;
158 tap
->event_action
= jteap
;
159 Jim_SetEmptyResult(goi
->interp
);
163 Jim_SetEmptyResult(goi
->interp
);
165 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
172 } /* while (goi->argc) */
177 static int is_bad_irval(int ir_length
, jim_wide w
)
187 static int jim_newtap_cmd(Jim_GetOptInfo
*goi
)
196 const Jim_Nvp opts
[] = {
197 #define NTAP_OPT_IRLEN 0
198 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
199 #define NTAP_OPT_IRMASK 1
200 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
201 #define NTAP_OPT_IRCAPTURE 2
202 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
203 #define NTAP_OPT_ENABLED 3
204 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
205 #define NTAP_OPT_DISABLED 4
206 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
207 #define NTAP_OPT_EXPECTED_ID 5
208 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
209 { .name
= NULL
, .value
= -1 },
212 pTap
= calloc(1, sizeof(jtag_tap_t
));
214 Jim_SetResult_sprintf(goi
->interp
, "no memory");
219 * we expect CHIP + TAP + OPTIONS
222 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
225 Jim_GetOpt_String(goi
, &cp
, NULL
);
226 pTap
->chip
= strdup(cp
);
228 Jim_GetOpt_String(goi
, &cp
, NULL
);
229 pTap
->tapname
= strdup(cp
);
231 /* name + dot + name + null */
232 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
234 sprintf(cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
235 pTap
->dotted_name
= cp
;
237 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
238 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
240 /* deal with options */
241 #define NTREQ_IRLEN 1
242 #define NTREQ_IRCAPTURE 2
243 #define NTREQ_IRMASK 4
245 /* clear them as we find them */
246 reqbits
= (NTREQ_IRLEN
| NTREQ_IRCAPTURE
| NTREQ_IRMASK
);
249 e
= Jim_GetOpt_Nvp(goi
, opts
, &n
);
251 Jim_GetOpt_NvpUnknown(goi
, opts
, 0);
254 LOG_DEBUG("Processing option: %s", n
->name
);
256 case NTAP_OPT_ENABLED
:
257 pTap
->disabled_after_reset
= false;
259 case NTAP_OPT_DISABLED
:
260 pTap
->disabled_after_reset
= true;
262 case NTAP_OPT_EXPECTED_ID
:
264 uint32_t *new_expected_ids
;
266 e
= Jim_GetOpt_Wide(goi
, &w
);
268 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
272 new_expected_ids
= malloc(sizeof(uint32_t) * (pTap
->expected_ids_cnt
+ 1));
273 if (new_expected_ids
== NULL
) {
274 Jim_SetResult_sprintf(goi
->interp
, "no memory");
278 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(uint32_t) * pTap
->expected_ids_cnt
);
280 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
282 free(pTap
->expected_ids
);
283 pTap
->expected_ids
= new_expected_ids
;
284 pTap
->expected_ids_cnt
++;
288 case NTAP_OPT_IRMASK
:
289 case NTAP_OPT_IRCAPTURE
:
290 e
= Jim_GetOpt_Wide(goi
, &w
);
292 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
297 if (w
> (jim_wide
) (8 * sizeof(pTap
->ir_capture_value
)))
298 LOG_WARNING("huge IR length %d", (int) w
);
300 reqbits
&= (~(NTREQ_IRLEN
));
302 case NTAP_OPT_IRMASK
:
303 if (is_bad_irval(pTap
->ir_length
, w
)) {
304 LOG_ERROR("IR mask %x too big",
308 pTap
->ir_capture_mask
= w
;
309 reqbits
&= (~(NTREQ_IRMASK
));
311 case NTAP_OPT_IRCAPTURE
:
312 if (is_bad_irval(pTap
->ir_length
, w
)) {
313 LOG_ERROR("IR capture %x too big",
317 pTap
->ir_capture_value
= w
;
318 reqbits
&= (~(NTREQ_IRCAPTURE
));
321 } /* switch (n->value) */
322 } /* while (goi->argc) */
324 /* default is enabled-after-reset */
325 pTap
->enabled
= !pTap
->disabled_after_reset
;
327 /* Did all the required option bits get cleared? */
334 Jim_SetResult_sprintf(goi
->interp
,
335 "newtap: %s missing required parameters",
341 static void jtag_tap_handle_event(jtag_tap_t
*tap
, enum jtag_event e
)
343 jtag_tap_event_action_t
* jteap
;
346 jteap
= tap
->event_action
;
350 if (jteap
->event
== e
) {
352 LOG_DEBUG("JTAG tap: %s event: %d (%s) action: %s\n",
355 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
,
356 Jim_GetString(jteap
->body
, NULL
));
357 if (Jim_EvalObj(interp
, jteap
->body
) != JIM_OK
) {
358 Jim_PrintErrorMessage(interp
);
360 /* NOTE: we currently assume the handlers
361 * can't fail. That presumes later code
362 * will be verifying the scan chains ...
364 tap
->enabled
= (e
== JTAG_TAP_EVENT_ENABLE
);
372 LOG_DEBUG("event %d %s - no action",
374 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
);
379 static int jim_jtag_command(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
385 struct command_context_s
*context
;
393 JTAG_CMD_TAPISENABLED
,
399 const Jim_Nvp jtag_cmds
[] = {
400 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
401 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
402 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
403 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
404 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
405 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
406 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
407 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
408 { .name
= "names" , .value
= JTAG_CMD_NAMES
},
410 { .name
= NULL
, .value
= -1 },
413 context
= Jim_GetAssocData(interp
, "context");
414 /* go past the command */
415 Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+ 1);
417 e
= Jim_GetOpt_Nvp(&goi
, jtag_cmds
, &n
);
419 Jim_GetOpt_NvpUnknown(&goi
, jtag_cmds
, 0);
422 Jim_SetEmptyResult(goi
.interp
);
424 case JTAG_CMD_INTERFACE
:
425 /* return the name of the interface */
426 /* TCL code might need to know the exact type... */
427 /* FUTURE: we allow this as a means to "set" the interface. */
429 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
432 Jim_SetResultString(goi
.interp
, jtag_interface
->name
, -1);
434 case JTAG_CMD_INIT_RESET
:
436 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
439 e
= jtag_init_reset(context
);
441 Jim_SetResult_sprintf(goi
.interp
, "error: %d", e
);
445 case JTAG_CMD_NEWTAP
:
446 return jim_newtap_cmd(&goi
);
448 case JTAG_CMD_TAPISENABLED
:
449 case JTAG_CMD_TAPENABLE
:
450 case JTAG_CMD_TAPDISABLE
:
452 Jim_SetResultString(goi
.interp
, "Too many parameters",-1);
459 t
= jtag_tap_by_jim_obj(goi
.interp
, goi
.argv
[0]);
464 case JTAG_CMD_TAPISENABLED
:
466 case JTAG_CMD_TAPENABLE
:
469 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_ENABLE
);
473 /* FIXME add JTAG sanity checks, w/o TLR
474 * - scan chain length grew by one (this)
475 * - IDs and IR lengths are as expected
478 jtag_call_event_callbacks(JTAG_TAP_EVENT_ENABLE
);
480 case JTAG_CMD_TAPDISABLE
:
483 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_DISABLE
);
487 /* FIXME add JTAG sanity checks, w/o TLR
488 * - scan chain length shrank by one (this)
489 * - IDs and IR lengths are as expected
492 jtag_call_event_callbacks(JTAG_TAP_EVENT_DISABLE
);
496 Jim_SetResult(goi
.interp
, Jim_NewIntObj(goi
.interp
, e
));
503 Jim_WrongNumArgs(goi
.interp
, 0, NULL
,
504 "cget tap_name queryparm");
511 Jim_GetOpt_Obj(&goi
, &o
);
512 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
518 return jtag_tap_configure_cmd(&goi
, t
);
522 case JTAG_CMD_CONFIGURE
:
524 Jim_WrongNumArgs(goi
.interp
, 0, NULL
,
525 "configure tap_name attribute value ...");
532 Jim_GetOpt_Obj(&goi
, &o
);
533 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
539 return jtag_tap_configure_cmd(&goi
, t
);
545 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
, "Too many parameters");
548 Jim_SetResult(goi
.interp
, Jim_NewListObj(goi
.interp
, NULL
, 0));
552 for (tap
= jtag_all_taps(); tap
; tap
= tap
->next_tap
) {
553 Jim_ListAppendElement(goi
.interp
,
554 Jim_GetResult(goi
.interp
),
555 Jim_NewStringObj(goi
.interp
,
556 tap
->dotted_name
, -1));
567 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
569 register_jim(cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
571 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
572 COMMAND_CONFIG
, "try to configure interface");
573 register_command(cmd_ctx
, NULL
,
574 "interface_list", &handle_interface_list_command
,
575 COMMAND_ANY
, "list all built-in interfaces");
576 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
577 COMMAND_ANY
, "(DEPRECATED) set jtag speed (if supported)");
578 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
579 COMMAND_ANY
, "set maximum jtag speed (if supported); "
580 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
581 register_command(cmd_ctx
, NULL
, "jtag_rclk", handle_jtag_rclk_command
,
582 COMMAND_ANY
, "fallback_speed_khz - set JTAG speed to RCLK or use fallback speed");
583 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
584 COMMAND_CONFIG
, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
585 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
587 "[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]");
588 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
589 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
590 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
591 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
593 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
594 COMMAND_EXEC
, "print current scan chain configuration");
596 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
597 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
598 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
599 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
600 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
601 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
602 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
603 register_jim(cmd_ctx
, "flush_count", Jim_Command_flush_count
, "returns number of times the JTAG queue has been flushed");
604 register_jim(cmd_ctx
, "pathmove", Jim_Command_pathmove
, "move JTAG to state1 then to state2, state3, etc. <state1>,<state2>,<stat3>...");
606 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
607 COMMAND_ANY
, "verify value captured during Capture-IR <enable | disable>");
608 register_command(cmd_ctx
, NULL
, "verify_jtag", handle_verify_jtag_command
,
609 COMMAND_ANY
, "verify value capture <enable | disable>");
610 register_command(cmd_ctx
, NULL
, "tms_sequence", handle_tms_sequence_command
,
611 COMMAND_ANY
, "choose short(default) or long tms_sequence <short | long>");
615 static int default_khz(int khz
, int *jtag_speed
)
617 LOG_ERROR("Translation from khz to jtag_speed not implemented");
621 static int default_speed_div(int speed
, int *khz
)
623 LOG_ERROR("Translation from jtag_speed to khz not implemented");
627 static int default_power_dropout(int *dropout
)
629 *dropout
= 0; /* by default we can't detect power dropout */
633 static int default_srst_asserted(int *srst_asserted
)
635 *srst_asserted
= 0; /* by default we can't detect srst asserted */
639 static int handle_interface_command(struct command_context_s
*cmd_ctx
,
640 char *cmd
, char **args
, int argc
)
642 /* check whether the interface is already configured */
645 LOG_WARNING("Interface already configured, ignoring");
649 /* interface name is a mandatory argument */
650 if (argc
!= 1 || args
[0][0] == '\0')
651 return ERROR_COMMAND_SYNTAX_ERROR
;
653 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
655 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) != 0)
658 int retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
);
659 if (ERROR_OK
!= retval
)
662 jtag_interface
= jtag_interfaces
[i
];
664 if (jtag_interface
->khz
== NULL
)
665 jtag_interface
->khz
= default_khz
;
666 if (jtag_interface
->speed_div
== NULL
)
667 jtag_interface
->speed_div
= default_speed_div
;
668 if (jtag_interface
->power_dropout
== NULL
)
669 jtag_interface
->power_dropout
= default_power_dropout
;
670 if (jtag_interface
->srst_asserted
== NULL
)
671 jtag_interface
->srst_asserted
= default_srst_asserted
;
676 /* no valid interface was found (i.e. the configuration option,
677 * didn't match one of the compiled-in interfaces
679 LOG_ERROR("The specified JTAG interface was not found (%s)", args
[0]);
680 handle_interface_list_command(cmd_ctx
, cmd
, args
, argc
);
681 return ERROR_JTAG_INVALID_INTERFACE
;
684 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
685 char *cmd
, char **args
, int argc
)
687 if (strcmp(cmd
, "interface_list") == 0 && argc
> 0)
688 return ERROR_COMMAND_SYNTAX_ERROR
;
690 command_print(cmd_ctx
, "The following JTAG interfaces are available:");
691 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
693 const char *name
= jtag_interfaces
[i
]->name
;
694 command_print(cmd_ctx
, "%u: %s", i
+ 1, name
);
700 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
704 Jim_Obj
*newargs
[ 10 ];
708 * argv[ 0] = ir length
709 * argv[ 1] = ir capture
711 * argv[ 3] = not actually used by anything but in the docs
715 command_print(cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
718 command_print(cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
719 command_print(cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
723 command_print(cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
724 command_print(cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
725 command_print(cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
726 command_print(cmd_ctx
, "And then refer to the taps by the dotted name.");
728 newargs
[0] = Jim_NewStringObj(interp
, "jtag", -1);
729 newargs
[1] = Jim_NewStringObj(interp
, "newtap", -1);
730 sprintf(buf
, "chip%d", jtag_tap_count());
731 newargs
[2] = Jim_NewStringObj(interp
, buf
, -1);
732 sprintf(buf
, "tap%d", jtag_tap_count());
733 newargs
[3] = Jim_NewStringObj(interp
, buf
, -1);
734 newargs
[4] = Jim_NewStringObj(interp
, "-irlen", -1);
735 newargs
[5] = Jim_NewStringObj(interp
, args
[0], -1);
736 newargs
[6] = Jim_NewStringObj(interp
, "-ircapture", -1);
737 newargs
[7] = Jim_NewStringObj(interp
, args
[1], -1);
738 newargs
[8] = Jim_NewStringObj(interp
, "-irmask", -1);
739 newargs
[9] = Jim_NewStringObj(interp
, args
[2], -1);
741 command_print(cmd_ctx
, "NEW COMMAND:");
742 sprintf(buf
, "%s %s %s %s %s %s %s %s %s %s",
743 Jim_GetString(newargs
[0], NULL
),
744 Jim_GetString(newargs
[1], NULL
),
745 Jim_GetString(newargs
[2], NULL
),
746 Jim_GetString(newargs
[3], NULL
),
747 Jim_GetString(newargs
[4], NULL
),
748 Jim_GetString(newargs
[5], NULL
),
749 Jim_GetString(newargs
[6], NULL
),
750 Jim_GetString(newargs
[7], NULL
),
751 Jim_GetString(newargs
[8], NULL
),
752 Jim_GetString(newargs
[9], NULL
));
754 e
= jim_jtag_command(interp
, 10, newargs
);
756 command_print(cmd_ctx
, "%s", Jim_GetString(Jim_GetResult(interp
), NULL
));
761 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
765 tap
= jtag_all_taps();
766 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
767 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
770 uint32_t expected
, expected_mask
, cur_instr
, ii
;
771 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
772 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
773 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
775 command_print(cmd_ctx
,
776 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
777 tap
->abs_chain_position
,
779 tap
->enabled
? 'Y' : 'n',
780 (unsigned int)(tap
->idcode
),
781 (unsigned int)(tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
782 (unsigned int)(tap
->ir_length
),
783 (unsigned int)(expected
),
784 (unsigned int)(expected_mask
),
785 (unsigned int)(cur_instr
));
787 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
788 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
789 (unsigned int)(tap
->expected_ids
[ii
]));
798 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
804 return ERROR_COMMAND_SYNTAX_ERROR
;
806 /* Original versions cared about the order of these tokens:
807 * reset_config signals [combination [trst_type [srst_type]]]
808 * They also clobbered the previous configuration even on error.
810 * Here we don't care about the order, and only change values
811 * which have been explicitly specified.
813 for (; argc
; argc
--, args
++) {
818 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
819 if (strcmp(*args
, "none") == 0)
821 else if (strcmp(*args
, "trst_only") == 0)
822 tmp
= RESET_HAS_TRST
;
823 else if (strcmp(*args
, "srst_only") == 0)
824 tmp
= RESET_HAS_SRST
;
825 else if (strcmp(*args
, "trst_and_srst") == 0)
826 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
830 LOG_ERROR("extra reset_config %s spec (%s)",
832 return ERROR_INVALID_ARGUMENTS
;
837 /* combination (options for broken wiring) */
838 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
839 if (strcmp(*args
, "separate") == 0)
840 /* separate reset lines - default */;
841 else if (strcmp(*args
, "srst_pulls_trst") == 0)
842 tmp
|= RESET_SRST_PULLS_TRST
;
843 else if (strcmp(*args
, "trst_pulls_srst") == 0)
844 tmp
|= RESET_TRST_PULLS_SRST
;
845 else if (strcmp(*args
, "combined") == 0)
846 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
850 LOG_ERROR("extra reset_config %s spec (%s)",
851 "combination", *args
);
852 return ERROR_INVALID_ARGUMENTS
;
857 /* trst_type (NOP without HAS_TRST) */
858 m
= RESET_TRST_OPEN_DRAIN
;
859 if (strcmp(*args
, "trst_open_drain") == 0)
860 tmp
|= RESET_TRST_OPEN_DRAIN
;
861 else if (strcmp(*args
, "trst_push_pull") == 0)
862 /* push/pull from adapter - default */;
866 LOG_ERROR("extra reset_config %s spec (%s)",
868 return ERROR_INVALID_ARGUMENTS
;
873 /* srst_type (NOP without HAS_SRST) */
874 m
|= RESET_SRST_PUSH_PULL
;
875 if (strcmp(*args
, "srst_push_pull") == 0)
876 tmp
|= RESET_SRST_PUSH_PULL
;
877 else if (strcmp(*args
, "srst_open_drain") == 0)
878 /* open drain from adapter - default */;
882 LOG_ERROR("extra reset_config %s spec (%s)",
884 return ERROR_INVALID_ARGUMENTS
;
889 /* caller provided nonsense; fail */
890 LOG_ERROR("unknown reset_config flag (%s)", *args
);
891 return ERROR_INVALID_ARGUMENTS
;
894 /* Remember the bits which were specified (mask)
895 * and their new values (new_cfg).
901 /* clear previous values of those bits, save new values */
902 enum reset_types old_cfg
= jtag_get_reset_config();
905 jtag_set_reset_config(new_cfg
);
910 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
,
911 char *cmd
, char **args
, int argc
)
914 return ERROR_COMMAND_SYNTAX_ERROR
;
918 int retval
= parse_uint(args
[0], &delay
);
919 if (ERROR_OK
!= retval
)
921 jtag_set_nsrst_delay(delay
);
923 command_print(cmd_ctx
, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
927 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
,
928 char *cmd
, char **args
, int argc
)
931 return ERROR_COMMAND_SYNTAX_ERROR
;
935 int retval
= parse_uint(args
[0], &delay
);
936 if (ERROR_OK
!= retval
)
938 jtag_set_ntrst_delay(delay
);
940 command_print(cmd_ctx
, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
944 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
946 int retval
= ERROR_OK
;
948 command_print(cmd_ctx
, "OLD SYNTAX: DEPRECATED - "
949 "use jtag_khz, not jtag_speed");
952 return ERROR_COMMAND_SYNTAX_ERROR
;
955 LOG_DEBUG("handle jtag speed");
957 unsigned cur_speed
= 0;
958 int retval
= parse_uint(args
[0], &cur_speed
);
959 if (ERROR_OK
!= retval
)
961 retval
= jtag_config_speed(cur_speed
);
964 command_print(cmd_ctx
, "jtag_speed: %d", jtag_get_speed());
969 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
972 return ERROR_COMMAND_SYNTAX_ERROR
;
974 int retval
= ERROR_OK
;
978 int retval
= parse_uint(args
[0], &khz
);
979 if (ERROR_OK
!= retval
)
981 retval
= jtag_config_khz(khz
);
982 if (ERROR_OK
!= retval
)
986 int cur_speed
= jtag_get_speed_khz();
987 retval
= jtag_get_speed_readable(&cur_speed
);
988 if (ERROR_OK
!= retval
)
992 command_print(cmd_ctx
, "%d kHz", cur_speed
);
994 command_print(cmd_ctx
, "RCLK - adaptive");
999 static int handle_jtag_rclk_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1002 return ERROR_COMMAND_SYNTAX_ERROR
;
1004 int retval
= ERROR_OK
;
1008 int retval
= parse_uint(args
[0], &khz
);
1009 if (ERROR_OK
!= retval
)
1011 retval
= jtag_config_rclk(khz
);
1012 if (ERROR_OK
!= retval
)
1016 int cur_khz
= jtag_get_speed_khz();
1017 retval
= jtag_get_speed_readable(&cur_khz
);
1018 if (ERROR_OK
!= retval
)
1022 command_print(cmd_ctx
, "RCLK not supported - fallback to %d kHz", cur_khz
);
1024 command_print(cmd_ctx
, "RCLK - adaptive");
1029 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
,
1030 char *cmd
, char **args
, int argc
)
1033 return ERROR_COMMAND_SYNTAX_ERROR
;
1036 if (args
[0][0] == '1')
1038 else if (args
[0][0] == '0')
1041 return ERROR_COMMAND_SYNTAX_ERROR
;
1044 if (args
[1][0] == '1')
1046 else if (args
[1][0] == '0')
1049 return ERROR_COMMAND_SYNTAX_ERROR
;
1051 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
1052 return ERROR_JTAG_INIT_FAILED
;
1054 jtag_add_reset(trst
, srst
);
1055 return jtag_execute_queue();
1058 static int handle_runtest_command(struct command_context_s
*cmd_ctx
,
1059 char *cmd
, char **args
, int argc
)
1062 return ERROR_COMMAND_SYNTAX_ERROR
;
1064 unsigned num_clocks
;
1065 int retval
= parse_uint(args
[0], &num_clocks
);
1066 if (ERROR_OK
!= retval
)
1069 jtag_add_runtest(num_clocks
, TAP_IDLE
);
1070 return jtag_execute_queue();
1074 * For "irscan" or "drscan" commands, the "end" (really, "next") state
1075 * should be stable ... and *NOT* a shift state, otherwise free-running
1076 * jtag clocks could change the values latched by the update state.
1078 static bool scan_is_safe(tap_state_t state
)
1093 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1096 scan_field_t
*fields
;
1098 tap_state_t endstate
;
1100 if ((argc
< 2) || (argc
% 2))
1102 return ERROR_COMMAND_SYNTAX_ERROR
;
1105 /* optional "-endstate" "statename" at the end of the arguments,
1106 * so that e.g. IRPAUSE can let us load the data register before
1107 * entering RUN/IDLE to execute the instruction we load here.
1109 endstate
= TAP_IDLE
;
1112 /* have at least one pair of numbers. */
1113 /* is last pair the magic text? */
1114 if (0 == strcmp("-endstate", args
[ argc
- 2 ])) {
1117 cpA
= args
[ argc
-1 ];
1118 for (endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++) {
1119 cpS
= tap_state_name(endstate
);
1120 if (0 == strcmp(cpA
, cpS
)) {
1124 if (endstate
>= TAP_NUM_STATES
) {
1125 return ERROR_COMMAND_SYNTAX_ERROR
;
1127 if (!scan_is_safe(endstate
))
1128 LOG_WARNING("irscan with unsafe "
1129 "endstate \"%s\"", cpA
);
1130 /* found - remove the last 2 args */
1136 int num_fields
= argc
/ 2;
1137 size_t fields_len
= sizeof(scan_field_t
) * num_fields
;
1138 fields
= malloc(fields_len
);
1139 memset(fields
, 0, fields_len
);
1142 for (i
= 0; i
< num_fields
; i
++)
1144 tap
= jtag_tap_by_string(args
[i
*2]);
1147 command_print(cmd_ctx
, "Tap: %s unknown", args
[i
*2]);
1150 int field_size
= tap
->ir_length
;
1151 fields
[i
].tap
= tap
;
1152 fields
[i
].num_bits
= field_size
;
1153 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
1156 retval
= parse_u32(args
[i
* 2 + 1], &value
);
1157 if (ERROR_OK
!= retval
)
1159 buf_set_u32(fields
[i
].out_value
, 0, field_size
, value
);
1160 fields
[i
].in_value
= NULL
;
1163 /* did we have an endstate? */
1164 jtag_add_ir_scan(num_fields
, fields
, endstate
);
1166 retval
= jtag_execute_queue();
1169 for (i
= 0; i
< num_fields
; i
++)
1171 if (NULL
!= fields
[i
].out_value
)
1172 free(fields
[i
].out_value
);
1180 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1183 scan_field_t
*fields
;
1185 int field_count
= 0;
1188 tap_state_t endstate
;
1191 * args[2] = num_bits
1192 * args[3] = hex string
1193 * ... repeat num bits and hex string ...
1196 * args[N-2] = "-endstate"
1197 * args[N-1] = statename
1199 if ((argc
< 4) || ((argc
% 2) != 0))
1201 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1205 endstate
= TAP_IDLE
;
1207 script_debug(interp
, "drscan", argc
, args
);
1209 /* validate arguments as numbers */
1211 for (i
= 2; i
< argc
; i
+= 2)
1216 e
= Jim_GetLong(interp
, args
[i
], &bits
);
1217 /* If valid - try next arg */
1222 /* Not valid.. are we at the end? */
1223 if (((i
+ 2) != argc
)) {
1224 /* nope, then error */
1228 /* it could be: "-endstate FOO"
1229 * e.g. DRPAUSE so we can issue more instructions
1230 * before entering RUN/IDLE and executing them.
1233 /* get arg as a string. */
1234 cp
= Jim_GetString(args
[i
], NULL
);
1235 /* is it the magic? */
1236 if (0 == strcmp("-endstate", cp
)) {
1237 /* is the statename valid? */
1238 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1240 /* see if it is a valid state name */
1241 endstate
= tap_state_by_name(cp
);
1243 /* update the error message */
1244 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1246 if (!scan_is_safe(endstate
))
1247 LOG_WARNING("drscan with unsafe "
1248 "endstate \"%s\"", cp
);
1250 /* valid - so clear the error */
1252 /* and remove the last 2 args */
1257 /* Still an error? */
1259 return e
; /* too bad */
1261 } /* validate args */
1263 tap
= jtag_tap_by_jim_obj(interp
, args
[1]);
1268 num_fields
= (argc
-2)/2;
1269 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
1270 for (i
= 2; i
< argc
; i
+= 2)
1276 Jim_GetLong(interp
, args
[i
], &bits
);
1277 str
= Jim_GetString(args
[i
+ 1], &len
);
1279 fields
[field_count
].tap
= tap
;
1280 fields
[field_count
].num_bits
= bits
;
1281 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
1282 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
1283 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
1287 jtag_add_dr_scan(num_fields
, fields
, endstate
);
1289 retval
= jtag_execute_queue();
1290 if (retval
!= ERROR_OK
)
1292 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
1297 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
1298 for (i
= 2; i
< argc
; i
+= 2)
1303 Jim_GetLong(interp
, args
[i
], &bits
);
1304 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
1305 free(fields
[field_count
].out_value
);
1307 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
1312 Jim_SetResult(interp
, list
);
1320 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1322 tap_state_t states
[8];
1324 if ((argc
< 2) || ((size_t)argc
> (sizeof(states
)/sizeof(*states
) + 1)))
1326 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1330 script_debug(interp
, "pathmove", argc
, args
);
1333 for (i
= 0; i
< argc
-1; i
++)
1336 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1337 states
[i
] = tap_state_by_name(cp
);
1340 /* update the error message */
1341 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1346 if ((jtag_add_statemove(states
[0]) != ERROR_OK
) || (jtag_execute_queue()!= ERROR_OK
))
1348 Jim_SetResultString(interp
, "pathmove: jtag execute failed",-1);
1352 jtag_add_pathmove(argc
-2, states
+ 1);
1354 if (jtag_execute_queue()!= ERROR_OK
)
1356 Jim_SetResultString(interp
, "pathmove: failed",-1);
1364 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1366 script_debug(interp
, "flush_count", argc
, args
);
1368 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_get_flush_queue_count()));
1374 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1377 return ERROR_COMMAND_SYNTAX_ERROR
;
1381 if (strcmp(args
[0], "enable") == 0)
1382 jtag_set_verify_capture_ir(true);
1383 else if (strcmp(args
[0], "disable") == 0)
1384 jtag_set_verify_capture_ir(false);
1386 return ERROR_COMMAND_SYNTAX_ERROR
;
1389 const char *status
= jtag_will_verify_capture_ir() ? "enabled": "disabled";
1390 command_print(cmd_ctx
, "verify Capture-IR is %s", status
);
1395 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1398 return ERROR_COMMAND_SYNTAX_ERROR
;
1402 if (strcmp(args
[0], "enable") == 0)
1403 jtag_set_verify(true);
1404 else if (strcmp(args
[0], "disable") == 0)
1405 jtag_set_verify(false);
1407 return ERROR_COMMAND_SYNTAX_ERROR
;
1410 const char *status
= jtag_will_verify() ? "enabled": "disabled";
1411 command_print(cmd_ctx
, "verify jtag capture is %s", status
);
1416 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1419 return ERROR_COMMAND_SYNTAX_ERROR
;
1424 if (strcmp(args
[0], "short") == 0)
1425 use_new_table
= true;
1426 else if (strcmp(args
[0], "long") == 0)
1427 use_new_table
= false;
1429 return ERROR_COMMAND_SYNTAX_ERROR
;
1431 tap_use_new_tms_table(use_new_table
);
1434 command_print(cmd_ctx
, "tms sequence is %s",
1435 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)