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
);
78 extern int jtag_examine_chain(void);
79 extern int jtag_validate_chain(void);
81 enum jtag_tap_cfg_param
{
85 static Jim_Nvp nvp_config_opts
[] = {
86 { .name
= "-event", .value
= JCFG_EVENT
},
88 { .name
= NULL
, .value
= -1 }
91 static int jtag_tap_configure_cmd(Jim_GetOptInfo
*goi
, jtag_tap_t
* tap
)
97 /* parse config or cget options */
98 while (goi
->argc
> 0) {
99 Jim_SetEmptyResult (goi
->interp
);
101 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
103 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
109 if (goi
->argc
== 0) {
110 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ...");
114 e
= Jim_GetOpt_Nvp(goi
, nvp_jtag_tap_event
, &n
);
116 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
120 if (goi
->isconfigure
) {
121 if (goi
->argc
!= 1) {
122 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
126 if (goi
->argc
!= 0) {
127 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
133 jtag_tap_event_action_t
*jteap
;
135 jteap
= tap
->event_action
;
136 /* replace existing? */
138 if (jteap
->event
== (enum jtag_event
)n
->value
) {
144 if (goi
->isconfigure
) {
148 jteap
= calloc(1, sizeof (*jteap
));
151 jteap
->event
= n
->value
;
152 Jim_GetOpt_Obj(goi
, &o
);
154 Jim_DecrRefCount(interp
, jteap
->body
);
156 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
157 Jim_IncrRefCount(jteap
->body
);
161 /* add to head of event list */
162 jteap
->next
= tap
->event_action
;
163 tap
->event_action
= jteap
;
165 Jim_SetEmptyResult(goi
->interp
);
169 Jim_SetEmptyResult(goi
->interp
);
171 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
178 } /* while (goi->argc) */
183 static int is_bad_irval(int ir_length
, jim_wide w
)
193 static int jim_newtap_cmd(Jim_GetOptInfo
*goi
)
202 const Jim_Nvp opts
[] = {
203 #define NTAP_OPT_IRLEN 0
204 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
205 #define NTAP_OPT_IRMASK 1
206 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
207 #define NTAP_OPT_IRCAPTURE 2
208 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
209 #define NTAP_OPT_ENABLED 3
210 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
211 #define NTAP_OPT_DISABLED 4
212 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
213 #define NTAP_OPT_EXPECTED_ID 5
214 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
215 { .name
= NULL
, .value
= -1 },
218 pTap
= calloc(1, sizeof(jtag_tap_t
));
220 Jim_SetResult_sprintf(goi
->interp
, "no memory");
225 * we expect CHIP + TAP + OPTIONS
228 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
232 Jim_GetOpt_String(goi
, &cp
, NULL
);
233 pTap
->chip
= strdup(cp
);
235 Jim_GetOpt_String(goi
, &cp
, NULL
);
236 pTap
->tapname
= strdup(cp
);
238 /* name + dot + name + null */
239 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
241 sprintf(cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
242 pTap
->dotted_name
= cp
;
244 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
245 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
247 /* deal with options */
248 #define NTREQ_IRLEN 1
249 #define NTREQ_IRCAPTURE 2
250 #define NTREQ_IRMASK 4
252 /* clear them as we find them */
253 reqbits
= (NTREQ_IRLEN
| NTREQ_IRCAPTURE
| NTREQ_IRMASK
);
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("huge IR length %d", (int) w
);
315 reqbits
&= (~(NTREQ_IRLEN
));
317 case NTAP_OPT_IRMASK
:
318 if (is_bad_irval(pTap
->ir_length
, w
)) {
319 LOG_ERROR("IR mask %x too big",
321 free((void *)pTap
->dotted_name
);
325 pTap
->ir_capture_mask
= w
;
326 reqbits
&= (~(NTREQ_IRMASK
));
328 case NTAP_OPT_IRCAPTURE
:
329 if (is_bad_irval(pTap
->ir_length
, w
)) {
330 LOG_ERROR("IR capture %x too big",
332 free((void *)pTap
->dotted_name
);
336 pTap
->ir_capture_value
= w
;
337 reqbits
&= (~(NTREQ_IRCAPTURE
));
340 } /* switch (n->value) */
341 } /* while (goi->argc) */
343 /* default is enabled-after-reset */
344 pTap
->enabled
= !pTap
->disabled_after_reset
;
346 /* Did all the required option bits get cleared? */
353 Jim_SetResult_sprintf(goi
->interp
,
354 "newtap: %s missing required parameters",
360 static void jtag_tap_handle_event(jtag_tap_t
*tap
, enum jtag_event e
)
362 jtag_tap_event_action_t
* jteap
;
365 jteap
= tap
->event_action
;
369 if (jteap
->event
== e
) {
371 LOG_DEBUG("JTAG tap: %s event: %d (%s) action: %s\n",
374 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
,
375 Jim_GetString(jteap
->body
, NULL
));
376 if (Jim_EvalObj(interp
, jteap
->body
) != JIM_OK
) {
377 Jim_PrintErrorMessage(interp
);
379 /* NOTE: we currently assume the handlers
380 * can't fail. That presumes later code
381 * will be verifying the scan chains ...
383 if (e
== JTAG_TAP_EVENT_ENABLE
)
392 LOG_DEBUG("event %d %s - no action",
394 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
);
399 static int jim_jtag_command(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
405 struct command_context_s
*context
;
413 JTAG_CMD_TAPISENABLED
,
419 const Jim_Nvp jtag_cmds
[] = {
420 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
421 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
422 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
423 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
424 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
425 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
426 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
427 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
428 { .name
= "names" , .value
= JTAG_CMD_NAMES
},
430 { .name
= NULL
, .value
= -1 },
433 context
= Jim_GetAssocData(interp
, "context");
434 /* go past the command */
435 Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+ 1);
437 e
= Jim_GetOpt_Nvp(&goi
, jtag_cmds
, &n
);
439 Jim_GetOpt_NvpUnknown(&goi
, jtag_cmds
, 0);
442 Jim_SetEmptyResult(goi
.interp
);
444 case JTAG_CMD_INTERFACE
:
445 /* return the name of the interface */
446 /* TCL code might need to know the exact type... */
447 /* FUTURE: we allow this as a means to "set" the interface. */
449 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
452 Jim_SetResultString(goi
.interp
, jtag_interface
->name
, -1);
454 case JTAG_CMD_INIT_RESET
:
456 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
459 e
= jtag_init_reset(context
);
461 Jim_SetResult_sprintf(goi
.interp
, "error: %d", e
);
465 case JTAG_CMD_NEWTAP
:
466 return jim_newtap_cmd(&goi
);
468 case JTAG_CMD_TAPISENABLED
:
469 case JTAG_CMD_TAPENABLE
:
470 case JTAG_CMD_TAPDISABLE
:
472 Jim_SetResultString(goi
.interp
, "Too many parameters",-1);
479 t
= jtag_tap_by_jim_obj(goi
.interp
, goi
.argv
[0]);
484 case JTAG_CMD_TAPISENABLED
:
486 case JTAG_CMD_TAPENABLE
:
489 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_ENABLE
);
493 /* FIXME add JTAG sanity checks, w/o TLR
494 * - scan chain length grew by one (this)
495 * - IDs and IR lengths are as expected
498 jtag_call_event_callbacks(JTAG_TAP_EVENT_ENABLE
);
500 case JTAG_CMD_TAPDISABLE
:
503 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_DISABLE
);
507 /* FIXME add JTAG sanity checks, w/o TLR
508 * - scan chain length shrank by one (this)
509 * - IDs and IR lengths are as expected
512 jtag_call_event_callbacks(JTAG_TAP_EVENT_DISABLE
);
516 Jim_SetResult(goi
.interp
, Jim_NewIntObj(goi
.interp
, e
));
523 Jim_WrongNumArgs(goi
.interp
, 0, NULL
,
524 "cget tap_name queryparm");
531 Jim_GetOpt_Obj(&goi
, &o
);
532 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
538 return jtag_tap_configure_cmd(&goi
, t
);
542 case JTAG_CMD_CONFIGURE
:
544 Jim_WrongNumArgs(goi
.interp
, 0, NULL
,
545 "configure tap_name attribute value ...");
552 Jim_GetOpt_Obj(&goi
, &o
);
553 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
559 return jtag_tap_configure_cmd(&goi
, t
);
565 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
, "Too many parameters");
568 Jim_SetResult(goi
.interp
, Jim_NewListObj(goi
.interp
, NULL
, 0));
572 for (tap
= jtag_all_taps(); tap
; tap
= tap
->next_tap
) {
573 Jim_ListAppendElement(goi
.interp
,
574 Jim_GetResult(goi
.interp
),
575 Jim_NewStringObj(goi
.interp
,
576 tap
->dotted_name
, -1));
588 void jtag_notify_reset(void)
591 for (tap
= jtag_all_taps(); tap
; tap
= tap
->next_tap
)
593 jtag_tap_handle_event(tap
, JTAG_TAP_EVENT_POST_RESET
);
598 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
600 register_jim(cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
602 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
603 COMMAND_CONFIG
, "try to configure interface");
604 register_command(cmd_ctx
, NULL
,
605 "interface_list", &handle_interface_list_command
,
606 COMMAND_ANY
, "list all built-in interfaces");
607 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
608 COMMAND_ANY
, "(DEPRECATED) set jtag speed (if supported)");
609 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
610 COMMAND_ANY
, "set maximum jtag speed (if supported); "
611 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
612 register_command(cmd_ctx
, NULL
, "jtag_rclk", handle_jtag_rclk_command
,
613 COMMAND_ANY
, "fallback_speed_khz - set JTAG speed to RCLK or use fallback speed");
614 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
615 COMMAND_CONFIG
, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
616 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
618 "[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]");
619 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
620 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
621 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
622 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
624 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
625 COMMAND_EXEC
, "print current scan chain configuration");
627 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
628 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
629 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
630 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
631 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
632 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
633 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
634 register_jim(cmd_ctx
, "flush_count", Jim_Command_flush_count
, "returns number of times the JTAG queue has been flushed");
635 register_jim(cmd_ctx
, "pathmove", Jim_Command_pathmove
, "move JTAG to state1 then to state2, state3, etc. <state1>,<state2>,<stat3>...");
637 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
638 COMMAND_ANY
, "verify value captured during Capture-IR <enable | disable>");
639 register_command(cmd_ctx
, NULL
, "verify_jtag", handle_verify_jtag_command
,
640 COMMAND_ANY
, "verify value capture <enable | disable>");
641 register_command(cmd_ctx
, NULL
, "tms_sequence", handle_tms_sequence_command
,
642 COMMAND_ANY
, "choose short(default) or long tms_sequence <short | long>");
646 static int default_khz(int khz
, int *jtag_speed
)
648 LOG_ERROR("Translation from khz to jtag_speed not implemented");
652 static int default_speed_div(int speed
, int *khz
)
654 LOG_ERROR("Translation from jtag_speed to khz not implemented");
658 static int default_power_dropout(int *dropout
)
660 *dropout
= 0; /* by default we can't detect power dropout */
664 static int default_srst_asserted(int *srst_asserted
)
666 *srst_asserted
= 0; /* by default we can't detect srst asserted */
670 static int handle_interface_command(struct command_context_s
*cmd_ctx
,
671 char *cmd
, char **args
, int argc
)
673 /* check whether the interface is already configured */
676 LOG_WARNING("Interface already configured, ignoring");
680 /* interface name is a mandatory argument */
681 if (argc
!= 1 || args
[0][0] == '\0')
682 return ERROR_COMMAND_SYNTAX_ERROR
;
684 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
686 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) != 0)
689 int retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
);
690 if (ERROR_OK
!= retval
)
693 jtag_interface
= jtag_interfaces
[i
];
695 if (jtag_interface
->khz
== NULL
)
696 jtag_interface
->khz
= default_khz
;
697 if (jtag_interface
->speed_div
== NULL
)
698 jtag_interface
->speed_div
= default_speed_div
;
699 if (jtag_interface
->power_dropout
== NULL
)
700 jtag_interface
->power_dropout
= default_power_dropout
;
701 if (jtag_interface
->srst_asserted
== NULL
)
702 jtag_interface
->srst_asserted
= default_srst_asserted
;
707 /* no valid interface was found (i.e. the configuration option,
708 * didn't match one of the compiled-in interfaces
710 LOG_ERROR("The specified JTAG interface was not found (%s)", args
[0]);
711 handle_interface_list_command(cmd_ctx
, cmd
, args
, argc
);
712 return ERROR_JTAG_INVALID_INTERFACE
;
715 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
716 char *cmd
, char **args
, int argc
)
718 if (strcmp(cmd
, "interface_list") == 0 && argc
> 0)
719 return ERROR_COMMAND_SYNTAX_ERROR
;
721 command_print(cmd_ctx
, "The following JTAG interfaces are available:");
722 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
724 const char *name
= jtag_interfaces
[i
]->name
;
725 command_print(cmd_ctx
, "%u: %s", i
+ 1, name
);
731 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
735 Jim_Obj
*newargs
[ 10 ];
739 * argv[ 0] = ir length
740 * argv[ 1] = ir capture
742 * argv[ 3] = not actually used by anything but in the docs
746 command_print(cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
749 command_print(cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
750 command_print(cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
754 command_print(cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
755 command_print(cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
756 command_print(cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
757 command_print(cmd_ctx
, "And then refer to the taps by the dotted name.");
759 newargs
[0] = Jim_NewStringObj(interp
, "jtag", -1);
760 newargs
[1] = Jim_NewStringObj(interp
, "newtap", -1);
761 sprintf(buf
, "chip%d", jtag_tap_count());
762 newargs
[2] = Jim_NewStringObj(interp
, buf
, -1);
763 sprintf(buf
, "tap%d", jtag_tap_count());
764 newargs
[3] = Jim_NewStringObj(interp
, buf
, -1);
765 newargs
[4] = Jim_NewStringObj(interp
, "-irlen", -1);
766 newargs
[5] = Jim_NewStringObj(interp
, args
[0], -1);
767 newargs
[6] = Jim_NewStringObj(interp
, "-ircapture", -1);
768 newargs
[7] = Jim_NewStringObj(interp
, args
[1], -1);
769 newargs
[8] = Jim_NewStringObj(interp
, "-irmask", -1);
770 newargs
[9] = Jim_NewStringObj(interp
, args
[2], -1);
772 command_print(cmd_ctx
, "NEW COMMAND:");
773 sprintf(buf
, "%s %s %s %s %s %s %s %s %s %s",
774 Jim_GetString(newargs
[0], NULL
),
775 Jim_GetString(newargs
[1], NULL
),
776 Jim_GetString(newargs
[2], NULL
),
777 Jim_GetString(newargs
[3], NULL
),
778 Jim_GetString(newargs
[4], NULL
),
779 Jim_GetString(newargs
[5], NULL
),
780 Jim_GetString(newargs
[6], NULL
),
781 Jim_GetString(newargs
[7], NULL
),
782 Jim_GetString(newargs
[8], NULL
),
783 Jim_GetString(newargs
[9], NULL
));
785 e
= jim_jtag_command(interp
, 10, newargs
);
787 command_print(cmd_ctx
, "%s", Jim_GetString(Jim_GetResult(interp
), NULL
));
792 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
796 tap
= jtag_all_taps();
797 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
798 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
801 uint32_t expected
, expected_mask
, cur_instr
, ii
;
802 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
803 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
804 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
806 command_print(cmd_ctx
,
807 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
808 tap
->abs_chain_position
,
810 tap
->enabled
? 'Y' : 'n',
811 (unsigned int)(tap
->idcode
),
812 (unsigned int)(tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
813 (unsigned int)(tap
->ir_length
),
814 (unsigned int)(expected
),
815 (unsigned int)(expected_mask
),
816 (unsigned int)(cur_instr
));
818 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
819 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
820 (unsigned int)(tap
->expected_ids
[ii
]));
829 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
835 return ERROR_COMMAND_SYNTAX_ERROR
;
837 /* Original versions cared about the order of these tokens:
838 * reset_config signals [combination [trst_type [srst_type]]]
839 * They also clobbered the previous configuration even on error.
841 * Here we don't care about the order, and only change values
842 * which have been explicitly specified.
844 for (; argc
; argc
--, args
++) {
849 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
850 if (strcmp(*args
, "none") == 0)
852 else if (strcmp(*args
, "trst_only") == 0)
853 tmp
= RESET_HAS_TRST
;
854 else if (strcmp(*args
, "srst_only") == 0)
855 tmp
= RESET_HAS_SRST
;
856 else if (strcmp(*args
, "trst_and_srst") == 0)
857 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
861 LOG_ERROR("extra reset_config %s spec (%s)",
863 return ERROR_INVALID_ARGUMENTS
;
868 /* combination (options for broken wiring) */
869 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
870 if (strcmp(*args
, "separate") == 0)
871 /* separate reset lines - default */;
872 else if (strcmp(*args
, "srst_pulls_trst") == 0)
873 tmp
|= RESET_SRST_PULLS_TRST
;
874 else if (strcmp(*args
, "trst_pulls_srst") == 0)
875 tmp
|= RESET_TRST_PULLS_SRST
;
876 else if (strcmp(*args
, "combined") == 0)
877 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
881 LOG_ERROR("extra reset_config %s spec (%s)",
882 "combination", *args
);
883 return ERROR_INVALID_ARGUMENTS
;
888 /* trst_type (NOP without HAS_TRST) */
889 m
= RESET_TRST_OPEN_DRAIN
;
890 if (strcmp(*args
, "trst_open_drain") == 0)
891 tmp
|= RESET_TRST_OPEN_DRAIN
;
892 else if (strcmp(*args
, "trst_push_pull") == 0)
893 /* push/pull from adapter - default */;
897 LOG_ERROR("extra reset_config %s spec (%s)",
899 return ERROR_INVALID_ARGUMENTS
;
904 /* srst_type (NOP without HAS_SRST) */
905 m
|= RESET_SRST_PUSH_PULL
;
906 if (strcmp(*args
, "srst_push_pull") == 0)
907 tmp
|= RESET_SRST_PUSH_PULL
;
908 else if (strcmp(*args
, "srst_open_drain") == 0)
909 /* open drain from adapter - default */;
913 LOG_ERROR("extra reset_config %s spec (%s)",
915 return ERROR_INVALID_ARGUMENTS
;
920 /* caller provided nonsense; fail */
921 LOG_ERROR("unknown reset_config flag (%s)", *args
);
922 return ERROR_INVALID_ARGUMENTS
;
925 /* Remember the bits which were specified (mask)
926 * and their new values (new_cfg).
932 /* clear previous values of those bits, save new values */
933 enum reset_types old_cfg
= jtag_get_reset_config();
936 jtag_set_reset_config(new_cfg
);
941 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
,
942 char *cmd
, char **args
, int argc
)
945 return ERROR_COMMAND_SYNTAX_ERROR
;
949 int retval
= parse_uint(args
[0], &delay
);
950 if (ERROR_OK
!= retval
)
952 jtag_set_nsrst_delay(delay
);
954 command_print(cmd_ctx
, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
958 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
,
959 char *cmd
, char **args
, int argc
)
962 return ERROR_COMMAND_SYNTAX_ERROR
;
966 int retval
= parse_uint(args
[0], &delay
);
967 if (ERROR_OK
!= retval
)
969 jtag_set_ntrst_delay(delay
);
971 command_print(cmd_ctx
, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
975 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
977 int retval
= ERROR_OK
;
979 command_print(cmd_ctx
, "OLD SYNTAX: DEPRECATED - "
980 "use jtag_khz, not jtag_speed");
983 return ERROR_COMMAND_SYNTAX_ERROR
;
986 LOG_DEBUG("handle jtag speed");
988 unsigned cur_speed
= 0;
989 int retval
= parse_uint(args
[0], &cur_speed
);
990 if (ERROR_OK
!= retval
)
992 retval
= jtag_config_speed(cur_speed
);
995 command_print(cmd_ctx
, "jtag_speed: %d", jtag_get_speed());
1000 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1003 return ERROR_COMMAND_SYNTAX_ERROR
;
1005 int retval
= ERROR_OK
;
1009 int retval
= parse_uint(args
[0], &khz
);
1010 if (ERROR_OK
!= retval
)
1012 retval
= jtag_config_khz(khz
);
1013 if (ERROR_OK
!= retval
)
1017 int cur_speed
= jtag_get_speed_khz();
1018 retval
= jtag_get_speed_readable(&cur_speed
);
1019 if (ERROR_OK
!= retval
)
1023 command_print(cmd_ctx
, "%d kHz", cur_speed
);
1025 command_print(cmd_ctx
, "RCLK - adaptive");
1030 static int handle_jtag_rclk_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1033 return ERROR_COMMAND_SYNTAX_ERROR
;
1035 int retval
= ERROR_OK
;
1039 int retval
= parse_uint(args
[0], &khz
);
1040 if (ERROR_OK
!= retval
)
1042 retval
= jtag_config_rclk(khz
);
1043 if (ERROR_OK
!= retval
)
1047 int cur_khz
= jtag_get_speed_khz();
1048 retval
= jtag_get_speed_readable(&cur_khz
);
1049 if (ERROR_OK
!= retval
)
1053 command_print(cmd_ctx
, "RCLK not supported - fallback to %d kHz", cur_khz
);
1055 command_print(cmd_ctx
, "RCLK - adaptive");
1060 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
,
1061 char *cmd
, char **args
, int argc
)
1064 return ERROR_COMMAND_SYNTAX_ERROR
;
1067 if (args
[0][0] == '1')
1069 else if (args
[0][0] == '0')
1072 return ERROR_COMMAND_SYNTAX_ERROR
;
1075 if (args
[1][0] == '1')
1077 else if (args
[1][0] == '0')
1080 return ERROR_COMMAND_SYNTAX_ERROR
;
1082 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
1083 return ERROR_JTAG_INIT_FAILED
;
1085 jtag_add_reset(trst
, srst
);
1086 return jtag_execute_queue();
1089 static int handle_runtest_command(struct command_context_s
*cmd_ctx
,
1090 char *cmd
, char **args
, int argc
)
1093 return ERROR_COMMAND_SYNTAX_ERROR
;
1095 unsigned num_clocks
;
1096 int retval
= parse_uint(args
[0], &num_clocks
);
1097 if (ERROR_OK
!= retval
)
1100 jtag_add_runtest(num_clocks
, TAP_IDLE
);
1101 return jtag_execute_queue();
1105 * For "irscan" or "drscan" commands, the "end" (really, "next") state
1106 * should be stable ... and *NOT* a shift state, otherwise free-running
1107 * jtag clocks could change the values latched by the update state.
1109 static bool scan_is_safe(tap_state_t state
)
1124 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1127 scan_field_t
*fields
;
1129 tap_state_t endstate
;
1131 if ((argc
< 2) || (argc
% 2))
1133 return ERROR_COMMAND_SYNTAX_ERROR
;
1136 /* optional "-endstate" "statename" at the end of the arguments,
1137 * so that e.g. IRPAUSE can let us load the data register before
1138 * entering RUN/IDLE to execute the instruction we load here.
1140 endstate
= TAP_IDLE
;
1143 /* have at least one pair of numbers. */
1144 /* is last pair the magic text? */
1145 if (0 == strcmp("-endstate", args
[ argc
- 2 ])) {
1148 cpA
= args
[ argc
-1 ];
1149 for (endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++) {
1150 cpS
= tap_state_name(endstate
);
1151 if (0 == strcmp(cpA
, cpS
)) {
1155 if (endstate
>= TAP_NUM_STATES
) {
1156 return ERROR_COMMAND_SYNTAX_ERROR
;
1158 if (!scan_is_safe(endstate
))
1159 LOG_WARNING("irscan with unsafe "
1160 "endstate \"%s\"", cpA
);
1161 /* found - remove the last 2 args */
1167 int num_fields
= argc
/ 2;
1168 size_t fields_len
= sizeof(scan_field_t
) * num_fields
;
1169 fields
= malloc(fields_len
);
1170 memset(fields
, 0, fields_len
);
1173 for (i
= 0; i
< num_fields
; i
++)
1175 tap
= jtag_tap_by_string(args
[i
*2]);
1179 for (j
= 0; j
< i
; j
++)
1180 free(fields
[j
].out_value
);
1182 command_print(cmd_ctx
, "Tap: %s unknown", args
[i
*2]);
1186 int field_size
= tap
->ir_length
;
1187 fields
[i
].tap
= tap
;
1188 fields
[i
].num_bits
= field_size
;
1189 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
1192 retval
= parse_u32(args
[i
* 2 + 1], &value
);
1193 if (ERROR_OK
!= retval
)
1195 buf_set_u32(fields
[i
].out_value
, 0, field_size
, value
);
1196 fields
[i
].in_value
= NULL
;
1199 /* did we have an endstate? */
1200 jtag_add_ir_scan(num_fields
, fields
, endstate
);
1202 retval
= jtag_execute_queue();
1205 for (i
= 0; i
< num_fields
; i
++)
1207 if (NULL
!= fields
[i
].out_value
)
1208 free(fields
[i
].out_value
);
1216 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1219 scan_field_t
*fields
;
1221 int field_count
= 0;
1224 tap_state_t endstate
;
1227 * args[2] = num_bits
1228 * args[3] = hex string
1229 * ... repeat num bits and hex string ...
1232 * args[N-2] = "-endstate"
1233 * args[N-1] = statename
1235 if ((argc
< 4) || ((argc
% 2) != 0))
1237 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1241 endstate
= TAP_IDLE
;
1243 script_debug(interp
, "drscan", argc
, args
);
1245 /* validate arguments as numbers */
1247 for (i
= 2; i
< argc
; i
+= 2)
1252 e
= Jim_GetLong(interp
, args
[i
], &bits
);
1253 /* If valid - try next arg */
1258 /* Not valid.. are we at the end? */
1259 if (((i
+ 2) != argc
)) {
1260 /* nope, then error */
1264 /* it could be: "-endstate FOO"
1265 * e.g. DRPAUSE so we can issue more instructions
1266 * before entering RUN/IDLE and executing them.
1269 /* get arg as a string. */
1270 cp
= Jim_GetString(args
[i
], NULL
);
1271 /* is it the magic? */
1272 if (0 == strcmp("-endstate", cp
)) {
1273 /* is the statename valid? */
1274 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1276 /* see if it is a valid state name */
1277 endstate
= tap_state_by_name(cp
);
1279 /* update the error message */
1280 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1282 if (!scan_is_safe(endstate
))
1283 LOG_WARNING("drscan with unsafe "
1284 "endstate \"%s\"", cp
);
1286 /* valid - so clear the error */
1288 /* and remove the last 2 args */
1293 /* Still an error? */
1295 return e
; /* too bad */
1297 } /* validate args */
1299 tap
= jtag_tap_by_jim_obj(interp
, args
[1]);
1304 num_fields
= (argc
-2)/2;
1305 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
1306 for (i
= 2; i
< argc
; i
+= 2)
1312 Jim_GetLong(interp
, args
[i
], &bits
);
1313 str
= Jim_GetString(args
[i
+ 1], &len
);
1315 fields
[field_count
].tap
= tap
;
1316 fields
[field_count
].num_bits
= bits
;
1317 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
1318 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
1319 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
1323 jtag_add_dr_scan(num_fields
, fields
, endstate
);
1325 retval
= jtag_execute_queue();
1326 if (retval
!= ERROR_OK
)
1328 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
1333 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
1334 for (i
= 2; i
< argc
; i
+= 2)
1339 Jim_GetLong(interp
, args
[i
], &bits
);
1340 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
1341 free(fields
[field_count
].out_value
);
1343 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
1348 Jim_SetResult(interp
, list
);
1356 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1358 tap_state_t states
[8];
1360 if ((argc
< 2) || ((size_t)argc
> (sizeof(states
)/sizeof(*states
) + 1)))
1362 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1366 script_debug(interp
, "pathmove", argc
, args
);
1369 for (i
= 0; i
< argc
-1; i
++)
1372 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1373 states
[i
] = tap_state_by_name(cp
);
1376 /* update the error message */
1377 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1382 if ((jtag_add_statemove(states
[0]) != ERROR_OK
) || (jtag_execute_queue()!= ERROR_OK
))
1384 Jim_SetResultString(interp
, "pathmove: jtag execute failed",-1);
1388 jtag_add_pathmove(argc
-2, states
+ 1);
1390 if (jtag_execute_queue()!= ERROR_OK
)
1392 Jim_SetResultString(interp
, "pathmove: failed",-1);
1400 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1402 script_debug(interp
, "flush_count", argc
, args
);
1404 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_get_flush_queue_count()));
1410 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1413 return ERROR_COMMAND_SYNTAX_ERROR
;
1417 if (strcmp(args
[0], "enable") == 0)
1418 jtag_set_verify_capture_ir(true);
1419 else if (strcmp(args
[0], "disable") == 0)
1420 jtag_set_verify_capture_ir(false);
1422 return ERROR_COMMAND_SYNTAX_ERROR
;
1425 const char *status
= jtag_will_verify_capture_ir() ? "enabled": "disabled";
1426 command_print(cmd_ctx
, "verify Capture-IR is %s", status
);
1431 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1434 return ERROR_COMMAND_SYNTAX_ERROR
;
1438 if (strcmp(args
[0], "enable") == 0)
1439 jtag_set_verify(true);
1440 else if (strcmp(args
[0], "disable") == 0)
1441 jtag_set_verify(false);
1443 return ERROR_COMMAND_SYNTAX_ERROR
;
1446 const char *status
= jtag_will_verify() ? "enabled": "disabled";
1447 command_print(cmd_ctx
, "verify jtag capture is %s", status
);
1452 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1455 return ERROR_COMMAND_SYNTAX_ERROR
;
1460 if (strcmp(args
[0], "short") == 0)
1461 use_new_table
= true;
1462 else if (strcmp(args
[0], "long") == 0)
1463 use_new_table
= false;
1465 return ERROR_COMMAND_SYNTAX_ERROR
;
1467 tap_use_new_tms_table(use_new_table
);
1470 command_print(cmd_ctx
, "tms sequence is %s",
1471 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)