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
++) {
848 m
= RESET_SRST_GATES_JTAG
;
850 if (strcmp(*args
, "srst_gates_jtag") == 0)
852 tmp
= RESET_SRST_GATES_JTAG
;
857 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
858 if (strcmp(*args
, "none") == 0)
860 else if (strcmp(*args
, "trst_only") == 0)
861 tmp
= RESET_HAS_TRST
;
862 else if (strcmp(*args
, "srst_only") == 0)
863 tmp
= RESET_HAS_SRST
;
864 else if (strcmp(*args
, "trst_and_srst") == 0)
865 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
869 LOG_ERROR("extra reset_config %s spec (%s)",
871 return ERROR_INVALID_ARGUMENTS
;
876 /* combination (options for broken wiring) */
877 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
878 if (strcmp(*args
, "separate") == 0)
879 /* separate reset lines - default */;
880 else if (strcmp(*args
, "srst_pulls_trst") == 0)
881 tmp
|= RESET_SRST_PULLS_TRST
;
882 else if (strcmp(*args
, "trst_pulls_srst") == 0)
883 tmp
|= RESET_TRST_PULLS_SRST
;
884 else if (strcmp(*args
, "combined") == 0)
885 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
889 LOG_ERROR("extra reset_config %s spec (%s)",
890 "combination", *args
);
891 return ERROR_INVALID_ARGUMENTS
;
896 /* trst_type (NOP without HAS_TRST) */
897 m
= RESET_TRST_OPEN_DRAIN
;
898 if (strcmp(*args
, "trst_open_drain") == 0)
899 tmp
|= RESET_TRST_OPEN_DRAIN
;
900 else if (strcmp(*args
, "trst_push_pull") == 0)
901 /* push/pull from adapter - default */;
905 LOG_ERROR("extra reset_config %s spec (%s)",
907 return ERROR_INVALID_ARGUMENTS
;
912 /* srst_type (NOP without HAS_SRST) */
913 m
|= RESET_SRST_PUSH_PULL
;
914 if (strcmp(*args
, "srst_push_pull") == 0)
915 tmp
|= RESET_SRST_PUSH_PULL
;
916 else if (strcmp(*args
, "srst_open_drain") == 0)
917 /* open drain from adapter - default */;
921 LOG_ERROR("extra reset_config %s spec (%s)",
923 return ERROR_INVALID_ARGUMENTS
;
928 /* caller provided nonsense; fail */
929 LOG_ERROR("unknown reset_config flag (%s)", *args
);
930 return ERROR_INVALID_ARGUMENTS
;
933 /* Remember the bits which were specified (mask)
934 * and their new values (new_cfg).
940 /* clear previous values of those bits, save new values */
941 enum reset_types old_cfg
= jtag_get_reset_config();
944 jtag_set_reset_config(new_cfg
);
949 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
,
950 char *cmd
, char **args
, int argc
)
953 return ERROR_COMMAND_SYNTAX_ERROR
;
957 int retval
= parse_uint(args
[0], &delay
);
958 if (ERROR_OK
!= retval
)
960 jtag_set_nsrst_delay(delay
);
962 command_print(cmd_ctx
, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
966 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
,
967 char *cmd
, char **args
, int argc
)
970 return ERROR_COMMAND_SYNTAX_ERROR
;
974 int retval
= parse_uint(args
[0], &delay
);
975 if (ERROR_OK
!= retval
)
977 jtag_set_ntrst_delay(delay
);
979 command_print(cmd_ctx
, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
983 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
985 int retval
= ERROR_OK
;
987 command_print(cmd_ctx
, "OLD SYNTAX: DEPRECATED - "
988 "use jtag_khz, not jtag_speed");
991 return ERROR_COMMAND_SYNTAX_ERROR
;
994 LOG_DEBUG("handle jtag speed");
996 unsigned cur_speed
= 0;
997 int retval
= parse_uint(args
[0], &cur_speed
);
998 if (ERROR_OK
!= retval
)
1000 retval
= jtag_config_speed(cur_speed
);
1003 command_print(cmd_ctx
, "jtag_speed: %d", jtag_get_speed());
1008 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1011 return ERROR_COMMAND_SYNTAX_ERROR
;
1013 int retval
= ERROR_OK
;
1017 int retval
= parse_uint(args
[0], &khz
);
1018 if (ERROR_OK
!= retval
)
1020 retval
= jtag_config_khz(khz
);
1021 if (ERROR_OK
!= retval
)
1025 int cur_speed
= jtag_get_speed_khz();
1026 retval
= jtag_get_speed_readable(&cur_speed
);
1027 if (ERROR_OK
!= retval
)
1031 command_print(cmd_ctx
, "%d kHz", cur_speed
);
1033 command_print(cmd_ctx
, "RCLK - adaptive");
1038 static int handle_jtag_rclk_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1041 return ERROR_COMMAND_SYNTAX_ERROR
;
1043 int retval
= ERROR_OK
;
1047 int retval
= parse_uint(args
[0], &khz
);
1048 if (ERROR_OK
!= retval
)
1050 retval
= jtag_config_rclk(khz
);
1051 if (ERROR_OK
!= retval
)
1055 int cur_khz
= jtag_get_speed_khz();
1056 retval
= jtag_get_speed_readable(&cur_khz
);
1057 if (ERROR_OK
!= retval
)
1061 command_print(cmd_ctx
, "RCLK not supported - fallback to %d kHz", cur_khz
);
1063 command_print(cmd_ctx
, "RCLK - adaptive");
1068 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
,
1069 char *cmd
, char **args
, int argc
)
1072 return ERROR_COMMAND_SYNTAX_ERROR
;
1075 if (args
[0][0] == '1')
1077 else if (args
[0][0] == '0')
1080 return ERROR_COMMAND_SYNTAX_ERROR
;
1083 if (args
[1][0] == '1')
1085 else if (args
[1][0] == '0')
1088 return ERROR_COMMAND_SYNTAX_ERROR
;
1090 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
1091 return ERROR_JTAG_INIT_FAILED
;
1093 jtag_add_reset(trst
, srst
);
1094 return jtag_execute_queue();
1097 static int handle_runtest_command(struct command_context_s
*cmd_ctx
,
1098 char *cmd
, char **args
, int argc
)
1101 return ERROR_COMMAND_SYNTAX_ERROR
;
1103 unsigned num_clocks
;
1104 int retval
= parse_uint(args
[0], &num_clocks
);
1105 if (ERROR_OK
!= retval
)
1108 jtag_add_runtest(num_clocks
, TAP_IDLE
);
1109 return jtag_execute_queue();
1113 * For "irscan" or "drscan" commands, the "end" (really, "next") state
1114 * should be stable ... and *NOT* a shift state, otherwise free-running
1115 * jtag clocks could change the values latched by the update state.
1117 static bool scan_is_safe(tap_state_t state
)
1132 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1135 scan_field_t
*fields
;
1137 tap_state_t endstate
;
1139 if ((argc
< 2) || (argc
% 2))
1141 return ERROR_COMMAND_SYNTAX_ERROR
;
1144 /* optional "-endstate" "statename" at the end of the arguments,
1145 * so that e.g. IRPAUSE can let us load the data register before
1146 * entering RUN/IDLE to execute the instruction we load here.
1148 endstate
= TAP_IDLE
;
1151 /* have at least one pair of numbers. */
1152 /* is last pair the magic text? */
1153 if (0 == strcmp("-endstate", args
[ argc
- 2 ])) {
1156 cpA
= args
[ argc
-1 ];
1157 for (endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++) {
1158 cpS
= tap_state_name(endstate
);
1159 if (0 == strcmp(cpA
, cpS
)) {
1163 if (endstate
>= TAP_NUM_STATES
) {
1164 return ERROR_COMMAND_SYNTAX_ERROR
;
1166 if (!scan_is_safe(endstate
))
1167 LOG_WARNING("irscan with unsafe "
1168 "endstate \"%s\"", cpA
);
1169 /* found - remove the last 2 args */
1175 int num_fields
= argc
/ 2;
1176 size_t fields_len
= sizeof(scan_field_t
) * num_fields
;
1177 fields
= malloc(fields_len
);
1178 memset(fields
, 0, fields_len
);
1181 for (i
= 0; i
< num_fields
; i
++)
1183 tap
= jtag_tap_by_string(args
[i
*2]);
1187 for (j
= 0; j
< i
; j
++)
1188 free(fields
[j
].out_value
);
1190 command_print(cmd_ctx
, "Tap: %s unknown", args
[i
*2]);
1194 int field_size
= tap
->ir_length
;
1195 fields
[i
].tap
= tap
;
1196 fields
[i
].num_bits
= field_size
;
1197 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
1200 retval
= parse_u32(args
[i
* 2 + 1], &value
);
1201 if (ERROR_OK
!= retval
)
1203 buf_set_u32(fields
[i
].out_value
, 0, field_size
, value
);
1204 fields
[i
].in_value
= NULL
;
1207 /* did we have an endstate? */
1208 jtag_add_ir_scan(num_fields
, fields
, endstate
);
1210 retval
= jtag_execute_queue();
1213 for (i
= 0; i
< num_fields
; i
++)
1215 if (NULL
!= fields
[i
].out_value
)
1216 free(fields
[i
].out_value
);
1224 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1227 scan_field_t
*fields
;
1229 int field_count
= 0;
1232 tap_state_t endstate
;
1235 * args[2] = num_bits
1236 * args[3] = hex string
1237 * ... repeat num bits and hex string ...
1240 * args[N-2] = "-endstate"
1241 * args[N-1] = statename
1243 if ((argc
< 4) || ((argc
% 2) != 0))
1245 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1249 endstate
= TAP_IDLE
;
1251 script_debug(interp
, "drscan", argc
, args
);
1253 /* validate arguments as numbers */
1255 for (i
= 2; i
< argc
; i
+= 2)
1260 e
= Jim_GetLong(interp
, args
[i
], &bits
);
1261 /* If valid - try next arg */
1266 /* Not valid.. are we at the end? */
1267 if (((i
+ 2) != argc
)) {
1268 /* nope, then error */
1272 /* it could be: "-endstate FOO"
1273 * e.g. DRPAUSE so we can issue more instructions
1274 * before entering RUN/IDLE and executing them.
1277 /* get arg as a string. */
1278 cp
= Jim_GetString(args
[i
], NULL
);
1279 /* is it the magic? */
1280 if (0 == strcmp("-endstate", cp
)) {
1281 /* is the statename valid? */
1282 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1284 /* see if it is a valid state name */
1285 endstate
= tap_state_by_name(cp
);
1287 /* update the error message */
1288 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1290 if (!scan_is_safe(endstate
))
1291 LOG_WARNING("drscan with unsafe "
1292 "endstate \"%s\"", cp
);
1294 /* valid - so clear the error */
1296 /* and remove the last 2 args */
1301 /* Still an error? */
1303 return e
; /* too bad */
1305 } /* validate args */
1307 tap
= jtag_tap_by_jim_obj(interp
, args
[1]);
1312 num_fields
= (argc
-2)/2;
1313 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
1314 for (i
= 2; i
< argc
; i
+= 2)
1320 Jim_GetLong(interp
, args
[i
], &bits
);
1321 str
= Jim_GetString(args
[i
+ 1], &len
);
1323 fields
[field_count
].tap
= tap
;
1324 fields
[field_count
].num_bits
= bits
;
1325 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
1326 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
1327 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
1331 jtag_add_dr_scan(num_fields
, fields
, endstate
);
1333 retval
= jtag_execute_queue();
1334 if (retval
!= ERROR_OK
)
1336 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
1341 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
1342 for (i
= 2; i
< argc
; i
+= 2)
1347 Jim_GetLong(interp
, args
[i
], &bits
);
1348 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
1349 free(fields
[field_count
].out_value
);
1351 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
1356 Jim_SetResult(interp
, list
);
1364 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1366 tap_state_t states
[8];
1368 if ((argc
< 2) || ((size_t)argc
> (sizeof(states
)/sizeof(*states
) + 1)))
1370 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1374 script_debug(interp
, "pathmove", argc
, args
);
1377 for (i
= 0; i
< argc
-1; i
++)
1380 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1381 states
[i
] = tap_state_by_name(cp
);
1384 /* update the error message */
1385 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1390 if ((jtag_add_statemove(states
[0]) != ERROR_OK
) || (jtag_execute_queue()!= ERROR_OK
))
1392 Jim_SetResultString(interp
, "pathmove: jtag execute failed",-1);
1396 jtag_add_pathmove(argc
-2, states
+ 1);
1398 if (jtag_execute_queue()!= ERROR_OK
)
1400 Jim_SetResultString(interp
, "pathmove: failed",-1);
1408 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1410 script_debug(interp
, "flush_count", argc
, args
);
1412 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_get_flush_queue_count()));
1418 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1421 return ERROR_COMMAND_SYNTAX_ERROR
;
1425 if (strcmp(args
[0], "enable") == 0)
1426 jtag_set_verify_capture_ir(true);
1427 else if (strcmp(args
[0], "disable") == 0)
1428 jtag_set_verify_capture_ir(false);
1430 return ERROR_COMMAND_SYNTAX_ERROR
;
1433 const char *status
= jtag_will_verify_capture_ir() ? "enabled": "disabled";
1434 command_print(cmd_ctx
, "verify Capture-IR is %s", status
);
1439 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1442 return ERROR_COMMAND_SYNTAX_ERROR
;
1446 if (strcmp(args
[0], "enable") == 0)
1447 jtag_set_verify(true);
1448 else if (strcmp(args
[0], "disable") == 0)
1449 jtag_set_verify(false);
1451 return ERROR_COMMAND_SYNTAX_ERROR
;
1454 const char *status
= jtag_will_verify() ? "enabled": "disabled";
1455 command_print(cmd_ctx
, "verify jtag capture is %s", status
);
1460 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1463 return ERROR_COMMAND_SYNTAX_ERROR
;
1468 if (strcmp(args
[0], "short") == 0)
1469 use_new_table
= true;
1470 else if (strcmp(args
[0], "long") == 0)
1471 use_new_table
= false;
1473 return ERROR_COMMAND_SYNTAX_ERROR
;
1475 tap_use_new_tms_table(use_new_table
);
1478 command_print(cmd_ctx
, "tms sequence is %s",
1479 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)