1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
8 * Copyright (C) 2009 SoftPLC Corporation *
12 * Copyright (C) 2009 Zachary T Welch *
13 * zw@superlucidity.net *
15 * This program is free software; you can redistribute it and/or modify *
16 * it under the terms of the GNU General Public License as published by *
17 * the Free Software Foundation; either version 2 of the License, or *
18 * (at your option) any later version. *
20 * This program is distributed in the hope that it will be useful, *
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
23 * GNU General Public License for more details. *
25 * You should have received a copy of the GNU General Public License *
26 * along with this program; if not, write to the *
27 * Free Software Foundation, Inc., *
28 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
29 ***************************************************************************/
35 #include "minidriver.h"
36 #include "interface.h"
37 #include "interfaces.h"
43 static const Jim_Nvp nvp_jtag_tap_event
[] = {
44 { .value
= JTAG_TAP_EVENT_POST_RESET
, .name
= "post-reset" },
45 { .value
= JTAG_TAP_EVENT_ENABLE
, .name
= "tap-enable" },
46 { .value
= JTAG_TAP_EVENT_DISABLE
, .name
= "tap-disable" },
48 { .name
= NULL
, .value
= -1 }
51 extern jtag_interface_t
*jtag_interface
;
54 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
55 char *cmd
, char **args
, int argc
);
56 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 static int handle_jtag_rclk_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
60 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
63 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
65 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
69 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
70 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
71 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
72 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
);
74 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
75 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
76 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
79 enum jtag_tap_cfg_param
{
83 static Jim_Nvp nvp_config_opts
[] = {
84 { .name
= "-event", .value
= JCFG_EVENT
},
86 { .name
= NULL
, .value
= -1 }
89 static int jtag_tap_configure_cmd(Jim_GetOptInfo
*goi
, jtag_tap_t
* tap
)
95 /* parse config or cget options */
96 while (goi
->argc
> 0) {
97 Jim_SetEmptyResult (goi
->interp
);
99 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
101 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
107 if (goi
->argc
== 0) {
108 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ...");
112 e
= Jim_GetOpt_Nvp(goi
, nvp_jtag_tap_event
, &n
);
114 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
118 if (goi
->isconfigure
) {
119 if (goi
->argc
!= 1) {
120 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
124 if (goi
->argc
!= 0) {
125 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
131 jtag_tap_event_action_t
*jteap
;
133 jteap
= tap
->event_action
;
134 /* replace existing? */
136 if (jteap
->event
== (enum jtag_event
)n
->value
) {
142 if (goi
->isconfigure
) {
146 jteap
= calloc(1, sizeof (*jteap
));
149 jteap
->event
= n
->value
;
150 Jim_GetOpt_Obj(goi
, &o
);
152 Jim_DecrRefCount(interp
, jteap
->body
);
154 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
155 Jim_IncrRefCount(jteap
->body
);
159 /* add to head of event list */
160 jteap
->next
= tap
->event_action
;
161 tap
->event_action
= jteap
;
163 Jim_SetEmptyResult(goi
->interp
);
167 Jim_SetEmptyResult(goi
->interp
);
169 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
176 } /* while (goi->argc) */
181 static int is_bad_irval(int ir_length
, jim_wide w
)
191 static int jim_newtap_cmd(Jim_GetOptInfo
*goi
)
200 const Jim_Nvp opts
[] = {
201 #define NTAP_OPT_IRLEN 0
202 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
203 #define NTAP_OPT_IRMASK 1
204 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
205 #define NTAP_OPT_IRCAPTURE 2
206 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
207 #define NTAP_OPT_ENABLED 3
208 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
209 #define NTAP_OPT_DISABLED 4
210 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
211 #define NTAP_OPT_EXPECTED_ID 5
212 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
213 { .name
= NULL
, .value
= -1 },
216 pTap
= calloc(1, sizeof(jtag_tap_t
));
218 Jim_SetResult_sprintf(goi
->interp
, "no memory");
223 * we expect CHIP + TAP + OPTIONS
226 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
230 Jim_GetOpt_String(goi
, &cp
, NULL
);
231 pTap
->chip
= strdup(cp
);
233 Jim_GetOpt_String(goi
, &cp
, NULL
);
234 pTap
->tapname
= strdup(cp
);
236 /* name + dot + name + null */
237 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
239 sprintf(cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
240 pTap
->dotted_name
= cp
;
242 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
243 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
245 /* deal with options */
246 #define NTREQ_IRLEN 1
247 #define NTREQ_IRCAPTURE 2
248 #define NTREQ_IRMASK 4
250 /* clear them as we find them */
251 reqbits
= (NTREQ_IRLEN
| NTREQ_IRCAPTURE
| NTREQ_IRMASK
);
254 e
= Jim_GetOpt_Nvp(goi
, opts
, &n
);
256 Jim_GetOpt_NvpUnknown(goi
, opts
, 0);
257 free((void *)pTap
->dotted_name
);
261 LOG_DEBUG("Processing option: %s", n
->name
);
263 case NTAP_OPT_ENABLED
:
264 pTap
->disabled_after_reset
= false;
266 case NTAP_OPT_DISABLED
:
267 pTap
->disabled_after_reset
= true;
269 case NTAP_OPT_EXPECTED_ID
:
271 uint32_t *new_expected_ids
;
273 e
= Jim_GetOpt_Wide(goi
, &w
);
275 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
276 free((void *)pTap
->dotted_name
);
281 new_expected_ids
= malloc(sizeof(uint32_t) * (pTap
->expected_ids_cnt
+ 1));
282 if (new_expected_ids
== NULL
) {
283 Jim_SetResult_sprintf(goi
->interp
, "no memory");
284 free((void *)pTap
->dotted_name
);
289 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(uint32_t) * pTap
->expected_ids_cnt
);
291 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
293 free(pTap
->expected_ids
);
294 pTap
->expected_ids
= new_expected_ids
;
295 pTap
->expected_ids_cnt
++;
299 case NTAP_OPT_IRMASK
:
300 case NTAP_OPT_IRCAPTURE
:
301 e
= Jim_GetOpt_Wide(goi
, &w
);
303 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
304 free((void *)pTap
->dotted_name
);
310 if (w
> (jim_wide
) (8 * sizeof(pTap
->ir_capture_value
)))
311 LOG_WARNING("huge IR length %d", (int) w
);
313 reqbits
&= (~(NTREQ_IRLEN
));
315 case NTAP_OPT_IRMASK
:
316 if (is_bad_irval(pTap
->ir_length
, w
)) {
317 LOG_ERROR("IR mask %x too big",
319 free((void *)pTap
->dotted_name
);
323 pTap
->ir_capture_mask
= w
;
324 reqbits
&= (~(NTREQ_IRMASK
));
326 case NTAP_OPT_IRCAPTURE
:
327 if (is_bad_irval(pTap
->ir_length
, w
)) {
328 LOG_ERROR("IR capture %x too big",
330 free((void *)pTap
->dotted_name
);
334 pTap
->ir_capture_value
= w
;
335 reqbits
&= (~(NTREQ_IRCAPTURE
));
338 } /* switch (n->value) */
339 } /* while (goi->argc) */
341 /* default is enabled-after-reset */
342 pTap
->enabled
= !pTap
->disabled_after_reset
;
344 /* Did all the required option bits get cleared? */
351 Jim_SetResult_sprintf(goi
->interp
,
352 "newtap: %s missing required parameters",
358 static void jtag_tap_handle_event(jtag_tap_t
*tap
, enum jtag_event e
)
360 jtag_tap_event_action_t
* jteap
;
362 for (jteap
= tap
->event_action
; jteap
!= NULL
; jteap
= jteap
->next
) {
363 if (jteap
->event
== e
) {
364 LOG_DEBUG("JTAG tap: %s event: %d (%s) action: %s\n",
367 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
,
368 Jim_GetString(jteap
->body
, NULL
));
369 if (Jim_EvalObj(interp
, jteap
->body
) != JIM_OK
) {
370 Jim_PrintErrorMessage(interp
);
372 case JTAG_TAP_EVENT_ENABLE
:
373 case JTAG_TAP_EVENT_DISABLE
:
374 /* NOTE: we currently assume the handlers
375 * can't fail. That presumes later code
376 * will be verifying the scan chains ...
378 tap
->enabled
= (e
== JTAG_TAP_EVENT_ENABLE
);
388 static int jim_jtag_command(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
394 struct command_context_s
*context
;
402 JTAG_CMD_TAPISENABLED
,
408 const Jim_Nvp jtag_cmds
[] = {
409 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
410 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
411 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
412 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
413 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
414 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
415 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
416 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
417 { .name
= "names" , .value
= JTAG_CMD_NAMES
},
419 { .name
= NULL
, .value
= -1 },
422 context
= Jim_GetAssocData(interp
, "context");
423 /* go past the command */
424 Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+ 1);
426 e
= Jim_GetOpt_Nvp(&goi
, jtag_cmds
, &n
);
428 Jim_GetOpt_NvpUnknown(&goi
, jtag_cmds
, 0);
431 Jim_SetEmptyResult(goi
.interp
);
433 case JTAG_CMD_INTERFACE
:
434 /* return the name of the interface */
435 /* TCL code might need to know the exact type... */
436 /* FUTURE: we allow this as a means to "set" the interface. */
438 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
441 Jim_SetResultString(goi
.interp
, jtag_interface
->name
, -1);
443 case JTAG_CMD_INIT_RESET
:
445 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
448 e
= jtag_init_reset(context
);
450 Jim_SetResult_sprintf(goi
.interp
, "error: %d", e
);
454 case JTAG_CMD_NEWTAP
:
455 return jim_newtap_cmd(&goi
);
457 case JTAG_CMD_TAPISENABLED
:
458 case JTAG_CMD_TAPENABLE
:
459 case JTAG_CMD_TAPDISABLE
:
461 Jim_SetResultString(goi
.interp
, "Too many parameters",-1);
468 t
= jtag_tap_by_jim_obj(goi
.interp
, goi
.argv
[0]);
473 case JTAG_CMD_TAPISENABLED
:
475 case JTAG_CMD_TAPENABLE
:
478 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_ENABLE
);
482 /* FIXME add JTAG sanity checks, w/o TLR
483 * - scan chain length grew by one (this)
484 * - IDs and IR lengths are as expected
487 jtag_call_event_callbacks(JTAG_TAP_EVENT_ENABLE
);
489 case JTAG_CMD_TAPDISABLE
:
492 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_DISABLE
);
496 /* FIXME add JTAG sanity checks, w/o TLR
497 * - scan chain length shrank by one (this)
498 * - IDs and IR lengths are as expected
501 jtag_call_event_callbacks(JTAG_TAP_EVENT_DISABLE
);
505 Jim_SetResult(goi
.interp
, Jim_NewIntObj(goi
.interp
, e
));
512 Jim_WrongNumArgs(goi
.interp
, 0, NULL
,
513 "cget tap_name queryparm");
520 Jim_GetOpt_Obj(&goi
, &o
);
521 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
527 return jtag_tap_configure_cmd(&goi
, t
);
531 case JTAG_CMD_CONFIGURE
:
533 Jim_WrongNumArgs(goi
.interp
, 0, NULL
,
534 "configure tap_name attribute value ...");
541 Jim_GetOpt_Obj(&goi
, &o
);
542 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
548 return jtag_tap_configure_cmd(&goi
, t
);
554 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
, "Too many parameters");
557 Jim_SetResult(goi
.interp
, Jim_NewListObj(goi
.interp
, NULL
, 0));
561 for (tap
= jtag_all_taps(); tap
; tap
= tap
->next_tap
) {
562 Jim_ListAppendElement(goi
.interp
,
563 Jim_GetResult(goi
.interp
),
564 Jim_NewStringObj(goi
.interp
,
565 tap
->dotted_name
, -1));
577 void jtag_notify_reset(void)
580 for (tap
= jtag_all_taps(); tap
; tap
= tap
->next_tap
)
582 jtag_tap_handle_event(tap
, JTAG_TAP_EVENT_POST_RESET
);
587 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
589 register_jim(cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
591 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
592 COMMAND_CONFIG
, "try to configure interface");
593 register_command(cmd_ctx
, NULL
,
594 "interface_list", &handle_interface_list_command
,
595 COMMAND_ANY
, "list all built-in interfaces");
596 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
597 COMMAND_ANY
, "(DEPRECATED) set jtag speed (if supported)");
598 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
599 COMMAND_ANY
, "set maximum jtag speed (if supported); "
600 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
601 register_command(cmd_ctx
, NULL
, "jtag_rclk", handle_jtag_rclk_command
,
602 COMMAND_ANY
, "fallback_speed_khz - set JTAG speed to RCLK or use fallback speed");
603 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
604 COMMAND_CONFIG
, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
605 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
607 "[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]");
608 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
609 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
610 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
611 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
613 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
614 COMMAND_EXEC
, "print current scan chain configuration");
616 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
617 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
618 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
619 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
620 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
621 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
622 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
623 register_jim(cmd_ctx
, "flush_count", Jim_Command_flush_count
, "returns number of times the JTAG queue has been flushed");
624 register_jim(cmd_ctx
, "pathmove", Jim_Command_pathmove
, "move JTAG to state1 then to state2, state3, etc. <state1>,<state2>,<stat3>...");
626 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
627 COMMAND_ANY
, "verify value captured during Capture-IR <enable | disable>");
628 register_command(cmd_ctx
, NULL
, "verify_jtag", handle_verify_jtag_command
,
629 COMMAND_ANY
, "verify value capture <enable | disable>");
630 register_command(cmd_ctx
, NULL
, "tms_sequence", handle_tms_sequence_command
,
631 COMMAND_ANY
, "choose short(default) or long tms_sequence <short | long>");
635 static int default_khz(int khz
, int *jtag_speed
)
637 LOG_ERROR("Translation from khz to jtag_speed not implemented");
641 static int default_speed_div(int speed
, int *khz
)
643 LOG_ERROR("Translation from jtag_speed to khz not implemented");
647 static int default_power_dropout(int *dropout
)
649 *dropout
= 0; /* by default we can't detect power dropout */
653 static int default_srst_asserted(int *srst_asserted
)
655 *srst_asserted
= 0; /* by default we can't detect srst asserted */
659 static int handle_interface_command(struct command_context_s
*cmd_ctx
,
660 char *cmd
, char **args
, int argc
)
662 /* check whether the interface is already configured */
665 LOG_WARNING("Interface already configured, ignoring");
669 /* interface name is a mandatory argument */
670 if (argc
!= 1 || args
[0][0] == '\0')
671 return ERROR_COMMAND_SYNTAX_ERROR
;
673 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
675 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) != 0)
678 int retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
);
679 if (ERROR_OK
!= retval
)
682 jtag_interface
= jtag_interfaces
[i
];
684 if (jtag_interface
->khz
== NULL
)
685 jtag_interface
->khz
= default_khz
;
686 if (jtag_interface
->speed_div
== NULL
)
687 jtag_interface
->speed_div
= default_speed_div
;
688 if (jtag_interface
->power_dropout
== NULL
)
689 jtag_interface
->power_dropout
= default_power_dropout
;
690 if (jtag_interface
->srst_asserted
== NULL
)
691 jtag_interface
->srst_asserted
= default_srst_asserted
;
696 /* no valid interface was found (i.e. the configuration option,
697 * didn't match one of the compiled-in interfaces
699 LOG_ERROR("The specified JTAG interface was not found (%s)", args
[0]);
700 handle_interface_list_command(cmd_ctx
, cmd
, args
, argc
);
701 return ERROR_JTAG_INVALID_INTERFACE
;
704 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
705 char *cmd
, char **args
, int argc
)
707 if (strcmp(cmd
, "interface_list") == 0 && argc
> 0)
708 return ERROR_COMMAND_SYNTAX_ERROR
;
710 command_print(cmd_ctx
, "The following JTAG interfaces are available:");
711 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
713 const char *name
= jtag_interfaces
[i
]->name
;
714 command_print(cmd_ctx
, "%u: %s", i
+ 1, name
);
720 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
724 Jim_Obj
*newargs
[ 10 ];
728 * argv[ 0] = ir length
729 * argv[ 1] = ir capture
731 * argv[ 3] = not actually used by anything but in the docs
735 command_print(cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
738 command_print(cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
739 command_print(cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
743 command_print(cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
744 command_print(cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
745 command_print(cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
746 command_print(cmd_ctx
, "And then refer to the taps by the dotted name.");
748 newargs
[0] = Jim_NewStringObj(interp
, "jtag", -1);
749 newargs
[1] = Jim_NewStringObj(interp
, "newtap", -1);
750 sprintf(buf
, "chip%d", jtag_tap_count());
751 newargs
[2] = Jim_NewStringObj(interp
, buf
, -1);
752 sprintf(buf
, "tap%d", jtag_tap_count());
753 newargs
[3] = Jim_NewStringObj(interp
, buf
, -1);
754 newargs
[4] = Jim_NewStringObj(interp
, "-irlen", -1);
755 newargs
[5] = Jim_NewStringObj(interp
, args
[0], -1);
756 newargs
[6] = Jim_NewStringObj(interp
, "-ircapture", -1);
757 newargs
[7] = Jim_NewStringObj(interp
, args
[1], -1);
758 newargs
[8] = Jim_NewStringObj(interp
, "-irmask", -1);
759 newargs
[9] = Jim_NewStringObj(interp
, args
[2], -1);
761 command_print(cmd_ctx
, "NEW COMMAND:");
762 sprintf(buf
, "%s %s %s %s %s %s %s %s %s %s",
763 Jim_GetString(newargs
[0], NULL
),
764 Jim_GetString(newargs
[1], NULL
),
765 Jim_GetString(newargs
[2], NULL
),
766 Jim_GetString(newargs
[3], NULL
),
767 Jim_GetString(newargs
[4], NULL
),
768 Jim_GetString(newargs
[5], NULL
),
769 Jim_GetString(newargs
[6], NULL
),
770 Jim_GetString(newargs
[7], NULL
),
771 Jim_GetString(newargs
[8], NULL
),
772 Jim_GetString(newargs
[9], NULL
));
774 e
= jim_jtag_command(interp
, 10, newargs
);
776 command_print(cmd_ctx
, "%s", Jim_GetString(Jim_GetResult(interp
), NULL
));
781 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
785 tap
= jtag_all_taps();
786 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
787 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
790 uint32_t expected
, expected_mask
, cur_instr
, ii
;
791 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
792 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
793 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
795 command_print(cmd_ctx
,
796 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
797 tap
->abs_chain_position
,
799 tap
->enabled
? 'Y' : 'n',
800 (unsigned int)(tap
->idcode
),
801 (unsigned int)(tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
802 (unsigned int)(tap
->ir_length
),
803 (unsigned int)(expected
),
804 (unsigned int)(expected_mask
),
805 (unsigned int)(cur_instr
));
807 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
808 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
809 (unsigned int)(tap
->expected_ids
[ii
]));
818 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
824 return ERROR_COMMAND_SYNTAX_ERROR
;
826 /* Original versions cared about the order of these tokens:
827 * reset_config signals [combination [trst_type [srst_type]]]
828 * They also clobbered the previous configuration even on error.
830 * Here we don't care about the order, and only change values
831 * which have been explicitly specified.
833 for (; argc
; argc
--, args
++) {
837 m
= RESET_SRST_GATES_JTAG
;
839 if (strcmp(*args
, "srst_gates_jtag") == 0)
841 tmp
= RESET_SRST_GATES_JTAG
;
846 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
847 if (strcmp(*args
, "none") == 0)
849 else if (strcmp(*args
, "trst_only") == 0)
850 tmp
= RESET_HAS_TRST
;
851 else if (strcmp(*args
, "srst_only") == 0)
852 tmp
= RESET_HAS_SRST
;
853 else if (strcmp(*args
, "trst_and_srst") == 0)
854 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
858 LOG_ERROR("extra reset_config %s spec (%s)",
860 return ERROR_INVALID_ARGUMENTS
;
865 /* combination (options for broken wiring) */
866 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
867 if (strcmp(*args
, "separate") == 0)
868 /* separate reset lines - default */;
869 else if (strcmp(*args
, "srst_pulls_trst") == 0)
870 tmp
|= RESET_SRST_PULLS_TRST
;
871 else if (strcmp(*args
, "trst_pulls_srst") == 0)
872 tmp
|= RESET_TRST_PULLS_SRST
;
873 else if (strcmp(*args
, "combined") == 0)
874 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
878 LOG_ERROR("extra reset_config %s spec (%s)",
879 "combination", *args
);
880 return ERROR_INVALID_ARGUMENTS
;
885 /* trst_type (NOP without HAS_TRST) */
886 m
= RESET_TRST_OPEN_DRAIN
;
887 if (strcmp(*args
, "trst_open_drain") == 0)
888 tmp
|= RESET_TRST_OPEN_DRAIN
;
889 else if (strcmp(*args
, "trst_push_pull") == 0)
890 /* push/pull from adapter - default */;
894 LOG_ERROR("extra reset_config %s spec (%s)",
896 return ERROR_INVALID_ARGUMENTS
;
901 /* srst_type (NOP without HAS_SRST) */
902 m
|= RESET_SRST_PUSH_PULL
;
903 if (strcmp(*args
, "srst_push_pull") == 0)
904 tmp
|= RESET_SRST_PUSH_PULL
;
905 else if (strcmp(*args
, "srst_open_drain") == 0)
906 /* open drain from adapter - default */;
910 LOG_ERROR("extra reset_config %s spec (%s)",
912 return ERROR_INVALID_ARGUMENTS
;
917 /* caller provided nonsense; fail */
918 LOG_ERROR("unknown reset_config flag (%s)", *args
);
919 return ERROR_INVALID_ARGUMENTS
;
922 /* Remember the bits which were specified (mask)
923 * and their new values (new_cfg).
929 /* clear previous values of those bits, save new values */
930 enum reset_types old_cfg
= jtag_get_reset_config();
933 jtag_set_reset_config(new_cfg
);
938 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
,
939 char *cmd
, char **args
, int argc
)
942 return ERROR_COMMAND_SYNTAX_ERROR
;
946 int retval
= parse_uint(args
[0], &delay
);
947 if (ERROR_OK
!= retval
)
949 jtag_set_nsrst_delay(delay
);
951 command_print(cmd_ctx
, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
955 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
,
956 char *cmd
, char **args
, int argc
)
959 return ERROR_COMMAND_SYNTAX_ERROR
;
963 int retval
= parse_uint(args
[0], &delay
);
964 if (ERROR_OK
!= retval
)
966 jtag_set_ntrst_delay(delay
);
968 command_print(cmd_ctx
, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
972 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
974 int retval
= ERROR_OK
;
976 command_print(cmd_ctx
, "OLD SYNTAX: DEPRECATED - "
977 "use jtag_khz, not jtag_speed");
980 return ERROR_COMMAND_SYNTAX_ERROR
;
983 LOG_DEBUG("handle jtag speed");
985 unsigned cur_speed
= 0;
986 int retval
= parse_uint(args
[0], &cur_speed
);
987 if (ERROR_OK
!= retval
)
989 retval
= jtag_config_speed(cur_speed
);
992 command_print(cmd_ctx
, "jtag_speed: %d", jtag_get_speed());
997 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1000 return ERROR_COMMAND_SYNTAX_ERROR
;
1002 int retval
= ERROR_OK
;
1006 int retval
= parse_uint(args
[0], &khz
);
1007 if (ERROR_OK
!= retval
)
1009 retval
= jtag_config_khz(khz
);
1010 if (ERROR_OK
!= retval
)
1014 int cur_speed
= jtag_get_speed_khz();
1015 retval
= jtag_get_speed_readable(&cur_speed
);
1016 if (ERROR_OK
!= retval
)
1020 command_print(cmd_ctx
, "%d kHz", cur_speed
);
1022 command_print(cmd_ctx
, "RCLK - adaptive");
1027 static int handle_jtag_rclk_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1030 return ERROR_COMMAND_SYNTAX_ERROR
;
1032 int retval
= ERROR_OK
;
1036 int retval
= parse_uint(args
[0], &khz
);
1037 if (ERROR_OK
!= retval
)
1039 retval
= jtag_config_rclk(khz
);
1040 if (ERROR_OK
!= retval
)
1044 int cur_khz
= jtag_get_speed_khz();
1045 retval
= jtag_get_speed_readable(&cur_khz
);
1046 if (ERROR_OK
!= retval
)
1050 command_print(cmd_ctx
, "RCLK not supported - fallback to %d kHz", cur_khz
);
1052 command_print(cmd_ctx
, "RCLK - adaptive");
1057 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
,
1058 char *cmd
, char **args
, int argc
)
1061 return ERROR_COMMAND_SYNTAX_ERROR
;
1064 if (args
[0][0] == '1')
1066 else if (args
[0][0] == '0')
1069 return ERROR_COMMAND_SYNTAX_ERROR
;
1072 if (args
[1][0] == '1')
1074 else if (args
[1][0] == '0')
1077 return ERROR_COMMAND_SYNTAX_ERROR
;
1079 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
1080 return ERROR_JTAG_INIT_FAILED
;
1082 jtag_add_reset(trst
, srst
);
1083 return jtag_execute_queue();
1086 static int handle_runtest_command(struct command_context_s
*cmd_ctx
,
1087 char *cmd
, char **args
, int argc
)
1090 return ERROR_COMMAND_SYNTAX_ERROR
;
1092 unsigned num_clocks
;
1093 int retval
= parse_uint(args
[0], &num_clocks
);
1094 if (ERROR_OK
!= retval
)
1097 jtag_add_runtest(num_clocks
, TAP_IDLE
);
1098 return jtag_execute_queue();
1102 * For "irscan" or "drscan" commands, the "end" (really, "next") state
1103 * should be stable ... and *NOT* a shift state, otherwise free-running
1104 * jtag clocks could change the values latched by the update state.
1106 static bool scan_is_safe(tap_state_t state
)
1121 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1124 scan_field_t
*fields
;
1126 tap_state_t endstate
;
1128 if ((argc
< 2) || (argc
% 2))
1130 return ERROR_COMMAND_SYNTAX_ERROR
;
1133 /* optional "-endstate" "statename" at the end of the arguments,
1134 * so that e.g. IRPAUSE can let us load the data register before
1135 * entering RUN/IDLE to execute the instruction we load here.
1137 endstate
= TAP_IDLE
;
1140 /* have at least one pair of numbers. */
1141 /* is last pair the magic text? */
1142 if (0 == strcmp("-endstate", args
[ argc
- 2 ])) {
1145 cpA
= args
[ argc
-1 ];
1146 for (endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++) {
1147 cpS
= tap_state_name(endstate
);
1148 if (0 == strcmp(cpA
, cpS
)) {
1152 if (endstate
>= TAP_NUM_STATES
) {
1153 return ERROR_COMMAND_SYNTAX_ERROR
;
1155 if (!scan_is_safe(endstate
))
1156 LOG_WARNING("irscan with unsafe "
1157 "endstate \"%s\"", cpA
);
1158 /* found - remove the last 2 args */
1164 int num_fields
= argc
/ 2;
1165 size_t fields_len
= sizeof(scan_field_t
) * num_fields
;
1166 fields
= malloc(fields_len
);
1167 memset(fields
, 0, fields_len
);
1170 for (i
= 0; i
< num_fields
; i
++)
1172 tap
= jtag_tap_by_string(args
[i
*2]);
1176 for (j
= 0; j
< i
; j
++)
1177 free(fields
[j
].out_value
);
1179 command_print(cmd_ctx
, "Tap: %s unknown", args
[i
*2]);
1183 int field_size
= tap
->ir_length
;
1184 fields
[i
].tap
= tap
;
1185 fields
[i
].num_bits
= field_size
;
1186 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
1189 retval
= parse_u32(args
[i
* 2 + 1], &value
);
1190 if (ERROR_OK
!= retval
)
1192 buf_set_u32(fields
[i
].out_value
, 0, field_size
, value
);
1193 fields
[i
].in_value
= NULL
;
1196 /* did we have an endstate? */
1197 jtag_add_ir_scan(num_fields
, fields
, endstate
);
1199 retval
= jtag_execute_queue();
1202 for (i
= 0; i
< num_fields
; i
++)
1204 if (NULL
!= fields
[i
].out_value
)
1205 free(fields
[i
].out_value
);
1213 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1216 scan_field_t
*fields
;
1218 int field_count
= 0;
1221 tap_state_t endstate
;
1224 * args[2] = num_bits
1225 * args[3] = hex string
1226 * ... repeat num bits and hex string ...
1229 * args[N-2] = "-endstate"
1230 * args[N-1] = statename
1232 if ((argc
< 4) || ((argc
% 2) != 0))
1234 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1238 endstate
= TAP_IDLE
;
1240 script_debug(interp
, "drscan", argc
, args
);
1242 /* validate arguments as numbers */
1244 for (i
= 2; i
< argc
; i
+= 2)
1249 e
= Jim_GetLong(interp
, args
[i
], &bits
);
1250 /* If valid - try next arg */
1255 /* Not valid.. are we at the end? */
1256 if (((i
+ 2) != argc
)) {
1257 /* nope, then error */
1261 /* it could be: "-endstate FOO"
1262 * e.g. DRPAUSE so we can issue more instructions
1263 * before entering RUN/IDLE and executing them.
1266 /* get arg as a string. */
1267 cp
= Jim_GetString(args
[i
], NULL
);
1268 /* is it the magic? */
1269 if (0 == strcmp("-endstate", cp
)) {
1270 /* is the statename valid? */
1271 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1273 /* see if it is a valid state name */
1274 endstate
= tap_state_by_name(cp
);
1276 /* update the error message */
1277 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1279 if (!scan_is_safe(endstate
))
1280 LOG_WARNING("drscan with unsafe "
1281 "endstate \"%s\"", cp
);
1283 /* valid - so clear the error */
1285 /* and remove the last 2 args */
1290 /* Still an error? */
1292 return e
; /* too bad */
1294 } /* validate args */
1296 tap
= jtag_tap_by_jim_obj(interp
, args
[1]);
1301 num_fields
= (argc
-2)/2;
1302 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
1303 for (i
= 2; i
< argc
; i
+= 2)
1309 Jim_GetLong(interp
, args
[i
], &bits
);
1310 str
= Jim_GetString(args
[i
+ 1], &len
);
1312 fields
[field_count
].tap
= tap
;
1313 fields
[field_count
].num_bits
= bits
;
1314 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
1315 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
1316 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
1320 jtag_add_dr_scan(num_fields
, fields
, endstate
);
1322 retval
= jtag_execute_queue();
1323 if (retval
!= ERROR_OK
)
1325 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
1330 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
1331 for (i
= 2; i
< argc
; i
+= 2)
1336 Jim_GetLong(interp
, args
[i
], &bits
);
1337 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
1338 free(fields
[field_count
].out_value
);
1340 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
1345 Jim_SetResult(interp
, list
);
1353 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1355 tap_state_t states
[8];
1357 if ((argc
< 2) || ((size_t)argc
> (sizeof(states
)/sizeof(*states
) + 1)))
1359 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1363 script_debug(interp
, "pathmove", argc
, args
);
1366 for (i
= 0; i
< argc
-1; i
++)
1369 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1370 states
[i
] = tap_state_by_name(cp
);
1373 /* update the error message */
1374 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1379 if ((jtag_add_statemove(states
[0]) != ERROR_OK
) || (jtag_execute_queue()!= ERROR_OK
))
1381 Jim_SetResultString(interp
, "pathmove: jtag execute failed",-1);
1385 jtag_add_pathmove(argc
-2, states
+ 1);
1387 if (jtag_execute_queue()!= ERROR_OK
)
1389 Jim_SetResultString(interp
, "pathmove: failed",-1);
1397 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1399 script_debug(interp
, "flush_count", argc
, args
);
1401 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_get_flush_queue_count()));
1407 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1410 return ERROR_COMMAND_SYNTAX_ERROR
;
1414 if (strcmp(args
[0], "enable") == 0)
1415 jtag_set_verify_capture_ir(true);
1416 else if (strcmp(args
[0], "disable") == 0)
1417 jtag_set_verify_capture_ir(false);
1419 return ERROR_COMMAND_SYNTAX_ERROR
;
1422 const char *status
= jtag_will_verify_capture_ir() ? "enabled": "disabled";
1423 command_print(cmd_ctx
, "verify Capture-IR is %s", status
);
1428 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1431 return ERROR_COMMAND_SYNTAX_ERROR
;
1435 if (strcmp(args
[0], "enable") == 0)
1436 jtag_set_verify(true);
1437 else if (strcmp(args
[0], "disable") == 0)
1438 jtag_set_verify(false);
1440 return ERROR_COMMAND_SYNTAX_ERROR
;
1443 const char *status
= jtag_will_verify() ? "enabled": "disabled";
1444 command_print(cmd_ctx
, "verify jtag capture is %s", status
);
1449 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1452 return ERROR_COMMAND_SYNTAX_ERROR
;
1457 if (strcmp(args
[0], "short") == 0)
1458 use_new_table
= true;
1459 else if (strcmp(args
[0], "long") == 0)
1460 use_new_table
= false;
1462 return ERROR_COMMAND_SYNTAX_ERROR
;
1464 tap_use_new_tms_table(use_new_table
);
1467 command_print(cmd_ctx
, "tms sequence is %s",
1468 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)