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
;
363 jteap
= tap
->event_action
;
367 if (jteap
->event
== e
) {
369 LOG_DEBUG("JTAG tap: %s event: %d (%s) action: %s\n",
372 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
,
373 Jim_GetString(jteap
->body
, NULL
));
374 if (Jim_EvalObj(interp
, jteap
->body
) != JIM_OK
) {
375 Jim_PrintErrorMessage(interp
);
377 /* NOTE: we currently assume the handlers
378 * can't fail. That presumes later code
379 * will be verifying the scan chains ...
381 if (e
== JTAG_TAP_EVENT_ENABLE
)
390 LOG_DEBUG("event %d %s - no action",
392 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
);
397 static int jim_jtag_command(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
403 struct command_context_s
*context
;
411 JTAG_CMD_TAPISENABLED
,
417 const Jim_Nvp jtag_cmds
[] = {
418 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
419 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
420 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
421 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
422 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
423 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
424 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
425 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
426 { .name
= "names" , .value
= JTAG_CMD_NAMES
},
428 { .name
= NULL
, .value
= -1 },
431 context
= Jim_GetAssocData(interp
, "context");
432 /* go past the command */
433 Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+ 1);
435 e
= Jim_GetOpt_Nvp(&goi
, jtag_cmds
, &n
);
437 Jim_GetOpt_NvpUnknown(&goi
, jtag_cmds
, 0);
440 Jim_SetEmptyResult(goi
.interp
);
442 case JTAG_CMD_INTERFACE
:
443 /* return the name of the interface */
444 /* TCL code might need to know the exact type... */
445 /* FUTURE: we allow this as a means to "set" the interface. */
447 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
450 Jim_SetResultString(goi
.interp
, jtag_interface
->name
, -1);
452 case JTAG_CMD_INIT_RESET
:
454 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
457 e
= jtag_init_reset(context
);
459 Jim_SetResult_sprintf(goi
.interp
, "error: %d", e
);
463 case JTAG_CMD_NEWTAP
:
464 return jim_newtap_cmd(&goi
);
466 case JTAG_CMD_TAPISENABLED
:
467 case JTAG_CMD_TAPENABLE
:
468 case JTAG_CMD_TAPDISABLE
:
470 Jim_SetResultString(goi
.interp
, "Too many parameters",-1);
477 t
= jtag_tap_by_jim_obj(goi
.interp
, goi
.argv
[0]);
482 case JTAG_CMD_TAPISENABLED
:
484 case JTAG_CMD_TAPENABLE
:
487 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_ENABLE
);
491 /* FIXME add JTAG sanity checks, w/o TLR
492 * - scan chain length grew by one (this)
493 * - IDs and IR lengths are as expected
496 jtag_call_event_callbacks(JTAG_TAP_EVENT_ENABLE
);
498 case JTAG_CMD_TAPDISABLE
:
501 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_DISABLE
);
505 /* FIXME add JTAG sanity checks, w/o TLR
506 * - scan chain length shrank by one (this)
507 * - IDs and IR lengths are as expected
510 jtag_call_event_callbacks(JTAG_TAP_EVENT_DISABLE
);
514 Jim_SetResult(goi
.interp
, Jim_NewIntObj(goi
.interp
, e
));
521 Jim_WrongNumArgs(goi
.interp
, 0, NULL
,
522 "cget tap_name queryparm");
529 Jim_GetOpt_Obj(&goi
, &o
);
530 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
536 return jtag_tap_configure_cmd(&goi
, t
);
540 case JTAG_CMD_CONFIGURE
:
542 Jim_WrongNumArgs(goi
.interp
, 0, NULL
,
543 "configure tap_name attribute value ...");
550 Jim_GetOpt_Obj(&goi
, &o
);
551 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
557 return jtag_tap_configure_cmd(&goi
, t
);
563 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
, "Too many parameters");
566 Jim_SetResult(goi
.interp
, Jim_NewListObj(goi
.interp
, NULL
, 0));
570 for (tap
= jtag_all_taps(); tap
; tap
= tap
->next_tap
) {
571 Jim_ListAppendElement(goi
.interp
,
572 Jim_GetResult(goi
.interp
),
573 Jim_NewStringObj(goi
.interp
,
574 tap
->dotted_name
, -1));
586 void jtag_notify_reset(void)
589 for (tap
= jtag_all_taps(); tap
; tap
= tap
->next_tap
)
591 jtag_tap_handle_event(tap
, JTAG_TAP_EVENT_POST_RESET
);
596 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
598 register_jim(cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
600 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
601 COMMAND_CONFIG
, "try to configure interface");
602 register_command(cmd_ctx
, NULL
,
603 "interface_list", &handle_interface_list_command
,
604 COMMAND_ANY
, "list all built-in interfaces");
605 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
606 COMMAND_ANY
, "(DEPRECATED) set jtag speed (if supported)");
607 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
608 COMMAND_ANY
, "set maximum jtag speed (if supported); "
609 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
610 register_command(cmd_ctx
, NULL
, "jtag_rclk", handle_jtag_rclk_command
,
611 COMMAND_ANY
, "fallback_speed_khz - set JTAG speed to RCLK or use fallback speed");
612 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
613 COMMAND_CONFIG
, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
614 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
616 "[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]");
617 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
618 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
619 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
620 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
622 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
623 COMMAND_EXEC
, "print current scan chain configuration");
625 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
626 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
627 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
628 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
629 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
630 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
631 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
632 register_jim(cmd_ctx
, "flush_count", Jim_Command_flush_count
, "returns number of times the JTAG queue has been flushed");
633 register_jim(cmd_ctx
, "pathmove", Jim_Command_pathmove
, "move JTAG to state1 then to state2, state3, etc. <state1>,<state2>,<stat3>...");
635 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
636 COMMAND_ANY
, "verify value captured during Capture-IR <enable | disable>");
637 register_command(cmd_ctx
, NULL
, "verify_jtag", handle_verify_jtag_command
,
638 COMMAND_ANY
, "verify value capture <enable | disable>");
639 register_command(cmd_ctx
, NULL
, "tms_sequence", handle_tms_sequence_command
,
640 COMMAND_ANY
, "choose short(default) or long tms_sequence <short | long>");
644 static int default_khz(int khz
, int *jtag_speed
)
646 LOG_ERROR("Translation from khz to jtag_speed not implemented");
650 static int default_speed_div(int speed
, int *khz
)
652 LOG_ERROR("Translation from jtag_speed to khz not implemented");
656 static int default_power_dropout(int *dropout
)
658 *dropout
= 0; /* by default we can't detect power dropout */
662 static int default_srst_asserted(int *srst_asserted
)
664 *srst_asserted
= 0; /* by default we can't detect srst asserted */
668 static int handle_interface_command(struct command_context_s
*cmd_ctx
,
669 char *cmd
, char **args
, int argc
)
671 /* check whether the interface is already configured */
674 LOG_WARNING("Interface already configured, ignoring");
678 /* interface name is a mandatory argument */
679 if (argc
!= 1 || args
[0][0] == '\0')
680 return ERROR_COMMAND_SYNTAX_ERROR
;
682 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
684 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) != 0)
687 int retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
);
688 if (ERROR_OK
!= retval
)
691 jtag_interface
= jtag_interfaces
[i
];
693 if (jtag_interface
->khz
== NULL
)
694 jtag_interface
->khz
= default_khz
;
695 if (jtag_interface
->speed_div
== NULL
)
696 jtag_interface
->speed_div
= default_speed_div
;
697 if (jtag_interface
->power_dropout
== NULL
)
698 jtag_interface
->power_dropout
= default_power_dropout
;
699 if (jtag_interface
->srst_asserted
== NULL
)
700 jtag_interface
->srst_asserted
= default_srst_asserted
;
705 /* no valid interface was found (i.e. the configuration option,
706 * didn't match one of the compiled-in interfaces
708 LOG_ERROR("The specified JTAG interface was not found (%s)", args
[0]);
709 handle_interface_list_command(cmd_ctx
, cmd
, args
, argc
);
710 return ERROR_JTAG_INVALID_INTERFACE
;
713 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
714 char *cmd
, char **args
, int argc
)
716 if (strcmp(cmd
, "interface_list") == 0 && argc
> 0)
717 return ERROR_COMMAND_SYNTAX_ERROR
;
719 command_print(cmd_ctx
, "The following JTAG interfaces are available:");
720 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
722 const char *name
= jtag_interfaces
[i
]->name
;
723 command_print(cmd_ctx
, "%u: %s", i
+ 1, name
);
729 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
733 Jim_Obj
*newargs
[ 10 ];
737 * argv[ 0] = ir length
738 * argv[ 1] = ir capture
740 * argv[ 3] = not actually used by anything but in the docs
744 command_print(cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
747 command_print(cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
748 command_print(cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
752 command_print(cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
753 command_print(cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
754 command_print(cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
755 command_print(cmd_ctx
, "And then refer to the taps by the dotted name.");
757 newargs
[0] = Jim_NewStringObj(interp
, "jtag", -1);
758 newargs
[1] = Jim_NewStringObj(interp
, "newtap", -1);
759 sprintf(buf
, "chip%d", jtag_tap_count());
760 newargs
[2] = Jim_NewStringObj(interp
, buf
, -1);
761 sprintf(buf
, "tap%d", jtag_tap_count());
762 newargs
[3] = Jim_NewStringObj(interp
, buf
, -1);
763 newargs
[4] = Jim_NewStringObj(interp
, "-irlen", -1);
764 newargs
[5] = Jim_NewStringObj(interp
, args
[0], -1);
765 newargs
[6] = Jim_NewStringObj(interp
, "-ircapture", -1);
766 newargs
[7] = Jim_NewStringObj(interp
, args
[1], -1);
767 newargs
[8] = Jim_NewStringObj(interp
, "-irmask", -1);
768 newargs
[9] = Jim_NewStringObj(interp
, args
[2], -1);
770 command_print(cmd_ctx
, "NEW COMMAND:");
771 sprintf(buf
, "%s %s %s %s %s %s %s %s %s %s",
772 Jim_GetString(newargs
[0], NULL
),
773 Jim_GetString(newargs
[1], NULL
),
774 Jim_GetString(newargs
[2], NULL
),
775 Jim_GetString(newargs
[3], NULL
),
776 Jim_GetString(newargs
[4], NULL
),
777 Jim_GetString(newargs
[5], NULL
),
778 Jim_GetString(newargs
[6], NULL
),
779 Jim_GetString(newargs
[7], NULL
),
780 Jim_GetString(newargs
[8], NULL
),
781 Jim_GetString(newargs
[9], NULL
));
783 e
= jim_jtag_command(interp
, 10, newargs
);
785 command_print(cmd_ctx
, "%s", Jim_GetString(Jim_GetResult(interp
), NULL
));
790 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
794 tap
= jtag_all_taps();
795 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
796 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
799 uint32_t expected
, expected_mask
, cur_instr
, ii
;
800 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
801 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
802 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
804 command_print(cmd_ctx
,
805 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
806 tap
->abs_chain_position
,
808 tap
->enabled
? 'Y' : 'n',
809 (unsigned int)(tap
->idcode
),
810 (unsigned int)(tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
811 (unsigned int)(tap
->ir_length
),
812 (unsigned int)(expected
),
813 (unsigned int)(expected_mask
),
814 (unsigned int)(cur_instr
));
816 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
817 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
818 (unsigned int)(tap
->expected_ids
[ii
]));
827 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
833 return ERROR_COMMAND_SYNTAX_ERROR
;
835 /* Original versions cared about the order of these tokens:
836 * reset_config signals [combination [trst_type [srst_type]]]
837 * They also clobbered the previous configuration even on error.
839 * Here we don't care about the order, and only change values
840 * which have been explicitly specified.
842 for (; argc
; argc
--, args
++) {
846 m
= RESET_SRST_GATES_JTAG
;
848 if (strcmp(*args
, "srst_gates_jtag") == 0)
850 tmp
= RESET_SRST_GATES_JTAG
;
855 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
856 if (strcmp(*args
, "none") == 0)
858 else if (strcmp(*args
, "trst_only") == 0)
859 tmp
= RESET_HAS_TRST
;
860 else if (strcmp(*args
, "srst_only") == 0)
861 tmp
= RESET_HAS_SRST
;
862 else if (strcmp(*args
, "trst_and_srst") == 0)
863 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
867 LOG_ERROR("extra reset_config %s spec (%s)",
869 return ERROR_INVALID_ARGUMENTS
;
874 /* combination (options for broken wiring) */
875 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
876 if (strcmp(*args
, "separate") == 0)
877 /* separate reset lines - default */;
878 else if (strcmp(*args
, "srst_pulls_trst") == 0)
879 tmp
|= RESET_SRST_PULLS_TRST
;
880 else if (strcmp(*args
, "trst_pulls_srst") == 0)
881 tmp
|= RESET_TRST_PULLS_SRST
;
882 else if (strcmp(*args
, "combined") == 0)
883 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
887 LOG_ERROR("extra reset_config %s spec (%s)",
888 "combination", *args
);
889 return ERROR_INVALID_ARGUMENTS
;
894 /* trst_type (NOP without HAS_TRST) */
895 m
= RESET_TRST_OPEN_DRAIN
;
896 if (strcmp(*args
, "trst_open_drain") == 0)
897 tmp
|= RESET_TRST_OPEN_DRAIN
;
898 else if (strcmp(*args
, "trst_push_pull") == 0)
899 /* push/pull from adapter - default */;
903 LOG_ERROR("extra reset_config %s spec (%s)",
905 return ERROR_INVALID_ARGUMENTS
;
910 /* srst_type (NOP without HAS_SRST) */
911 m
|= RESET_SRST_PUSH_PULL
;
912 if (strcmp(*args
, "srst_push_pull") == 0)
913 tmp
|= RESET_SRST_PUSH_PULL
;
914 else if (strcmp(*args
, "srst_open_drain") == 0)
915 /* open drain from adapter - default */;
919 LOG_ERROR("extra reset_config %s spec (%s)",
921 return ERROR_INVALID_ARGUMENTS
;
926 /* caller provided nonsense; fail */
927 LOG_ERROR("unknown reset_config flag (%s)", *args
);
928 return ERROR_INVALID_ARGUMENTS
;
931 /* Remember the bits which were specified (mask)
932 * and their new values (new_cfg).
938 /* clear previous values of those bits, save new values */
939 enum reset_types old_cfg
= jtag_get_reset_config();
942 jtag_set_reset_config(new_cfg
);
947 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
,
948 char *cmd
, char **args
, int argc
)
951 return ERROR_COMMAND_SYNTAX_ERROR
;
955 int retval
= parse_uint(args
[0], &delay
);
956 if (ERROR_OK
!= retval
)
958 jtag_set_nsrst_delay(delay
);
960 command_print(cmd_ctx
, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
964 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
,
965 char *cmd
, char **args
, int argc
)
968 return ERROR_COMMAND_SYNTAX_ERROR
;
972 int retval
= parse_uint(args
[0], &delay
);
973 if (ERROR_OK
!= retval
)
975 jtag_set_ntrst_delay(delay
);
977 command_print(cmd_ctx
, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
981 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
983 int retval
= ERROR_OK
;
985 command_print(cmd_ctx
, "OLD SYNTAX: DEPRECATED - "
986 "use jtag_khz, not jtag_speed");
989 return ERROR_COMMAND_SYNTAX_ERROR
;
992 LOG_DEBUG("handle jtag speed");
994 unsigned cur_speed
= 0;
995 int retval
= parse_uint(args
[0], &cur_speed
);
996 if (ERROR_OK
!= retval
)
998 retval
= jtag_config_speed(cur_speed
);
1001 command_print(cmd_ctx
, "jtag_speed: %d", jtag_get_speed());
1006 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1009 return ERROR_COMMAND_SYNTAX_ERROR
;
1011 int retval
= ERROR_OK
;
1015 int retval
= parse_uint(args
[0], &khz
);
1016 if (ERROR_OK
!= retval
)
1018 retval
= jtag_config_khz(khz
);
1019 if (ERROR_OK
!= retval
)
1023 int cur_speed
= jtag_get_speed_khz();
1024 retval
= jtag_get_speed_readable(&cur_speed
);
1025 if (ERROR_OK
!= retval
)
1029 command_print(cmd_ctx
, "%d kHz", cur_speed
);
1031 command_print(cmd_ctx
, "RCLK - adaptive");
1036 static int handle_jtag_rclk_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1039 return ERROR_COMMAND_SYNTAX_ERROR
;
1041 int retval
= ERROR_OK
;
1045 int retval
= parse_uint(args
[0], &khz
);
1046 if (ERROR_OK
!= retval
)
1048 retval
= jtag_config_rclk(khz
);
1049 if (ERROR_OK
!= retval
)
1053 int cur_khz
= jtag_get_speed_khz();
1054 retval
= jtag_get_speed_readable(&cur_khz
);
1055 if (ERROR_OK
!= retval
)
1059 command_print(cmd_ctx
, "RCLK not supported - fallback to %d kHz", cur_khz
);
1061 command_print(cmd_ctx
, "RCLK - adaptive");
1066 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
,
1067 char *cmd
, char **args
, int argc
)
1070 return ERROR_COMMAND_SYNTAX_ERROR
;
1073 if (args
[0][0] == '1')
1075 else if (args
[0][0] == '0')
1078 return ERROR_COMMAND_SYNTAX_ERROR
;
1081 if (args
[1][0] == '1')
1083 else if (args
[1][0] == '0')
1086 return ERROR_COMMAND_SYNTAX_ERROR
;
1088 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
1089 return ERROR_JTAG_INIT_FAILED
;
1091 jtag_add_reset(trst
, srst
);
1092 return jtag_execute_queue();
1095 static int handle_runtest_command(struct command_context_s
*cmd_ctx
,
1096 char *cmd
, char **args
, int argc
)
1099 return ERROR_COMMAND_SYNTAX_ERROR
;
1101 unsigned num_clocks
;
1102 int retval
= parse_uint(args
[0], &num_clocks
);
1103 if (ERROR_OK
!= retval
)
1106 jtag_add_runtest(num_clocks
, TAP_IDLE
);
1107 return jtag_execute_queue();
1111 * For "irscan" or "drscan" commands, the "end" (really, "next") state
1112 * should be stable ... and *NOT* a shift state, otherwise free-running
1113 * jtag clocks could change the values latched by the update state.
1115 static bool scan_is_safe(tap_state_t state
)
1130 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1133 scan_field_t
*fields
;
1135 tap_state_t endstate
;
1137 if ((argc
< 2) || (argc
% 2))
1139 return ERROR_COMMAND_SYNTAX_ERROR
;
1142 /* optional "-endstate" "statename" at the end of the arguments,
1143 * so that e.g. IRPAUSE can let us load the data register before
1144 * entering RUN/IDLE to execute the instruction we load here.
1146 endstate
= TAP_IDLE
;
1149 /* have at least one pair of numbers. */
1150 /* is last pair the magic text? */
1151 if (0 == strcmp("-endstate", args
[ argc
- 2 ])) {
1154 cpA
= args
[ argc
-1 ];
1155 for (endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++) {
1156 cpS
= tap_state_name(endstate
);
1157 if (0 == strcmp(cpA
, cpS
)) {
1161 if (endstate
>= TAP_NUM_STATES
) {
1162 return ERROR_COMMAND_SYNTAX_ERROR
;
1164 if (!scan_is_safe(endstate
))
1165 LOG_WARNING("irscan with unsafe "
1166 "endstate \"%s\"", cpA
);
1167 /* found - remove the last 2 args */
1173 int num_fields
= argc
/ 2;
1174 size_t fields_len
= sizeof(scan_field_t
) * num_fields
;
1175 fields
= malloc(fields_len
);
1176 memset(fields
, 0, fields_len
);
1179 for (i
= 0; i
< num_fields
; i
++)
1181 tap
= jtag_tap_by_string(args
[i
*2]);
1185 for (j
= 0; j
< i
; j
++)
1186 free(fields
[j
].out_value
);
1188 command_print(cmd_ctx
, "Tap: %s unknown", args
[i
*2]);
1192 int field_size
= tap
->ir_length
;
1193 fields
[i
].tap
= tap
;
1194 fields
[i
].num_bits
= field_size
;
1195 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
1198 retval
= parse_u32(args
[i
* 2 + 1], &value
);
1199 if (ERROR_OK
!= retval
)
1201 buf_set_u32(fields
[i
].out_value
, 0, field_size
, value
);
1202 fields
[i
].in_value
= NULL
;
1205 /* did we have an endstate? */
1206 jtag_add_ir_scan(num_fields
, fields
, endstate
);
1208 retval
= jtag_execute_queue();
1211 for (i
= 0; i
< num_fields
; i
++)
1213 if (NULL
!= fields
[i
].out_value
)
1214 free(fields
[i
].out_value
);
1222 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1225 scan_field_t
*fields
;
1227 int field_count
= 0;
1230 tap_state_t endstate
;
1233 * args[2] = num_bits
1234 * args[3] = hex string
1235 * ... repeat num bits and hex string ...
1238 * args[N-2] = "-endstate"
1239 * args[N-1] = statename
1241 if ((argc
< 4) || ((argc
% 2) != 0))
1243 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1247 endstate
= TAP_IDLE
;
1249 script_debug(interp
, "drscan", argc
, args
);
1251 /* validate arguments as numbers */
1253 for (i
= 2; i
< argc
; i
+= 2)
1258 e
= Jim_GetLong(interp
, args
[i
], &bits
);
1259 /* If valid - try next arg */
1264 /* Not valid.. are we at the end? */
1265 if (((i
+ 2) != argc
)) {
1266 /* nope, then error */
1270 /* it could be: "-endstate FOO"
1271 * e.g. DRPAUSE so we can issue more instructions
1272 * before entering RUN/IDLE and executing them.
1275 /* get arg as a string. */
1276 cp
= Jim_GetString(args
[i
], NULL
);
1277 /* is it the magic? */
1278 if (0 == strcmp("-endstate", cp
)) {
1279 /* is the statename valid? */
1280 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1282 /* see if it is a valid state name */
1283 endstate
= tap_state_by_name(cp
);
1285 /* update the error message */
1286 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1288 if (!scan_is_safe(endstate
))
1289 LOG_WARNING("drscan with unsafe "
1290 "endstate \"%s\"", cp
);
1292 /* valid - so clear the error */
1294 /* and remove the last 2 args */
1299 /* Still an error? */
1301 return e
; /* too bad */
1303 } /* validate args */
1305 tap
= jtag_tap_by_jim_obj(interp
, args
[1]);
1310 num_fields
= (argc
-2)/2;
1311 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
1312 for (i
= 2; i
< argc
; i
+= 2)
1318 Jim_GetLong(interp
, args
[i
], &bits
);
1319 str
= Jim_GetString(args
[i
+ 1], &len
);
1321 fields
[field_count
].tap
= tap
;
1322 fields
[field_count
].num_bits
= bits
;
1323 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
1324 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
1325 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
1329 jtag_add_dr_scan(num_fields
, fields
, endstate
);
1331 retval
= jtag_execute_queue();
1332 if (retval
!= ERROR_OK
)
1334 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
1339 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
1340 for (i
= 2; i
< argc
; i
+= 2)
1345 Jim_GetLong(interp
, args
[i
], &bits
);
1346 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
1347 free(fields
[field_count
].out_value
);
1349 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
1354 Jim_SetResult(interp
, list
);
1362 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1364 tap_state_t states
[8];
1366 if ((argc
< 2) || ((size_t)argc
> (sizeof(states
)/sizeof(*states
) + 1)))
1368 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1372 script_debug(interp
, "pathmove", argc
, args
);
1375 for (i
= 0; i
< argc
-1; i
++)
1378 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1379 states
[i
] = tap_state_by_name(cp
);
1382 /* update the error message */
1383 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1388 if ((jtag_add_statemove(states
[0]) != ERROR_OK
) || (jtag_execute_queue()!= ERROR_OK
))
1390 Jim_SetResultString(interp
, "pathmove: jtag execute failed",-1);
1394 jtag_add_pathmove(argc
-2, states
+ 1);
1396 if (jtag_execute_queue()!= ERROR_OK
)
1398 Jim_SetResultString(interp
, "pathmove: failed",-1);
1406 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1408 script_debug(interp
, "flush_count", argc
, args
);
1410 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_get_flush_queue_count()));
1416 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1419 return ERROR_COMMAND_SYNTAX_ERROR
;
1423 if (strcmp(args
[0], "enable") == 0)
1424 jtag_set_verify_capture_ir(true);
1425 else if (strcmp(args
[0], "disable") == 0)
1426 jtag_set_verify_capture_ir(false);
1428 return ERROR_COMMAND_SYNTAX_ERROR
;
1431 const char *status
= jtag_will_verify_capture_ir() ? "enabled": "disabled";
1432 command_print(cmd_ctx
, "verify Capture-IR is %s", status
);
1437 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1440 return ERROR_COMMAND_SYNTAX_ERROR
;
1444 if (strcmp(args
[0], "enable") == 0)
1445 jtag_set_verify(true);
1446 else if (strcmp(args
[0], "disable") == 0)
1447 jtag_set_verify(false);
1449 return ERROR_COMMAND_SYNTAX_ERROR
;
1452 const char *status
= jtag_will_verify() ? "enabled": "disabled";
1453 command_print(cmd_ctx
, "verify jtag capture is %s", status
);
1458 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1461 return ERROR_COMMAND_SYNTAX_ERROR
;
1466 if (strcmp(args
[0], "short") == 0)
1467 use_new_table
= true;
1468 else if (strcmp(args
[0], "long") == 0)
1469 use_new_table
= false;
1471 return ERROR_COMMAND_SYNTAX_ERROR
;
1473 tap_use_new_tms_table(use_new_table
);
1476 command_print(cmd_ctx
, "tms sequence is %s",
1477 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)