1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
8 * Copyright (C) 2009 SoftPLC Corporation *
12 * Copyright (C) 2009 Zachary T Welch *
13 * zw@superlucidity.net *
15 * This program is free software; you can redistribute it and/or modify *
16 * it under the terms of the GNU General Public License as published by *
17 * the Free Software Foundation; either version 2 of the License, or *
18 * (at your option) any later version. *
20 * This program is distributed in the hope that it will be useful, *
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
23 * GNU General Public License for more details. *
25 * You should have received a copy of the GNU General Public License *
26 * along with this program; if not, write to the *
27 * Free Software Foundation, Inc., *
28 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
29 ***************************************************************************/
35 #include "minidriver.h"
36 #include "interface.h"
37 #include "interfaces.h"
43 static const Jim_Nvp nvp_jtag_tap_event
[] = {
44 { .value
= JTAG_TAP_EVENT_ENABLE
, .name
= "tap-enable" },
45 { .value
= JTAG_TAP_EVENT_DISABLE
, .name
= "tap-disable" },
47 { .name
= NULL
, .value
= -1 }
50 extern jtag_interface_t
*jtag_interface
;
53 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
54 char *cmd
, char **args
, int argc
);
55 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
56 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 static int handle_jtag_rclk_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
60 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
64 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
66 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
69 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
70 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
71 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
);
73 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
74 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
75 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
77 extern int jtag_examine_chain(void);
78 extern int jtag_validate_chain(void);
80 enum jtag_tap_cfg_param
{
84 static Jim_Nvp nvp_config_opts
[] = {
85 { .name
= "-event", .value
= JCFG_EVENT
},
87 { .name
= NULL
, .value
= -1 }
90 static int jtag_tap_configure_cmd(Jim_GetOptInfo
*goi
, jtag_tap_t
* tap
)
96 /* parse config or cget options */
97 while (goi
->argc
> 0) {
98 Jim_SetEmptyResult (goi
->interp
);
100 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
102 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
108 if (goi
->argc
== 0) {
109 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ...");
113 e
= Jim_GetOpt_Nvp(goi
, nvp_jtag_tap_event
, &n
);
115 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
119 if (goi
->isconfigure
) {
120 if (goi
->argc
!= 1) {
121 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
125 if (goi
->argc
!= 0) {
126 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
132 jtag_tap_event_action_t
*jteap
;
134 jteap
= tap
->event_action
;
135 /* replace existing? */
137 if (jteap
->event
== (enum jtag_event
)n
->value
) {
143 if (goi
->isconfigure
) {
146 jteap
= calloc(1, sizeof (*jteap
));
148 jteap
->event
= n
->value
;
149 Jim_GetOpt_Obj(goi
, &o
);
151 Jim_DecrRefCount(interp
, jteap
->body
);
153 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
154 Jim_IncrRefCount(jteap
->body
);
156 /* add to head of event list */
157 jteap
->next
= tap
->event_action
;
158 tap
->event_action
= jteap
;
159 Jim_SetEmptyResult(goi
->interp
);
163 Jim_SetEmptyResult(goi
->interp
);
165 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
172 } /* while (goi->argc) */
177 static int is_bad_irval(int ir_length
, jim_wide w
)
187 static int jim_newtap_cmd(Jim_GetOptInfo
*goi
)
196 const Jim_Nvp opts
[] = {
197 #define NTAP_OPT_IRLEN 0
198 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
199 #define NTAP_OPT_IRMASK 1
200 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
201 #define NTAP_OPT_IRCAPTURE 2
202 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
203 #define NTAP_OPT_ENABLED 3
204 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
205 #define NTAP_OPT_DISABLED 4
206 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
207 #define NTAP_OPT_EXPECTED_ID 5
208 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
209 { .name
= NULL
, .value
= -1 },
212 pTap
= calloc(1, sizeof(jtag_tap_t
));
214 Jim_SetResult_sprintf(goi
->interp
, "no memory");
219 * we expect CHIP + TAP + OPTIONS
222 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
226 Jim_GetOpt_String(goi
, &cp
, NULL
);
227 pTap
->chip
= strdup(cp
);
229 Jim_GetOpt_String(goi
, &cp
, NULL
);
230 pTap
->tapname
= strdup(cp
);
232 /* name + dot + name + null */
233 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
235 sprintf(cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
236 pTap
->dotted_name
= cp
;
238 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
239 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
241 /* deal with options */
242 #define NTREQ_IRLEN 1
243 #define NTREQ_IRCAPTURE 2
244 #define NTREQ_IRMASK 4
246 /* clear them as we find them */
247 reqbits
= (NTREQ_IRLEN
| NTREQ_IRCAPTURE
| NTREQ_IRMASK
);
250 e
= Jim_GetOpt_Nvp(goi
, opts
, &n
);
252 Jim_GetOpt_NvpUnknown(goi
, opts
, 0);
253 free((void *)pTap
->dotted_name
);
257 LOG_DEBUG("Processing option: %s", n
->name
);
259 case NTAP_OPT_ENABLED
:
260 pTap
->disabled_after_reset
= false;
262 case NTAP_OPT_DISABLED
:
263 pTap
->disabled_after_reset
= true;
265 case NTAP_OPT_EXPECTED_ID
:
267 uint32_t *new_expected_ids
;
269 e
= Jim_GetOpt_Wide(goi
, &w
);
271 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
272 free((void *)pTap
->dotted_name
);
277 new_expected_ids
= malloc(sizeof(uint32_t) * (pTap
->expected_ids_cnt
+ 1));
278 if (new_expected_ids
== NULL
) {
279 Jim_SetResult_sprintf(goi
->interp
, "no memory");
280 free((void *)pTap
->dotted_name
);
285 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(uint32_t) * pTap
->expected_ids_cnt
);
287 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
289 free(pTap
->expected_ids
);
290 pTap
->expected_ids
= new_expected_ids
;
291 pTap
->expected_ids_cnt
++;
295 case NTAP_OPT_IRMASK
:
296 case NTAP_OPT_IRCAPTURE
:
297 e
= Jim_GetOpt_Wide(goi
, &w
);
299 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
300 free((void *)pTap
->dotted_name
);
306 if (w
> (jim_wide
) (8 * sizeof(pTap
->ir_capture_value
)))
307 LOG_WARNING("huge IR length %d", (int) w
);
309 reqbits
&= (~(NTREQ_IRLEN
));
311 case NTAP_OPT_IRMASK
:
312 if (is_bad_irval(pTap
->ir_length
, w
)) {
313 LOG_ERROR("IR mask %x too big",
315 free((void *)pTap
->dotted_name
);
319 pTap
->ir_capture_mask
= w
;
320 reqbits
&= (~(NTREQ_IRMASK
));
322 case NTAP_OPT_IRCAPTURE
:
323 if (is_bad_irval(pTap
->ir_length
, w
)) {
324 LOG_ERROR("IR capture %x too big",
326 free((void *)pTap
->dotted_name
);
330 pTap
->ir_capture_value
= w
;
331 reqbits
&= (~(NTREQ_IRCAPTURE
));
334 } /* switch (n->value) */
335 } /* while (goi->argc) */
337 /* default is enabled-after-reset */
338 pTap
->enabled
= !pTap
->disabled_after_reset
;
340 /* Did all the required option bits get cleared? */
347 Jim_SetResult_sprintf(goi
->interp
,
348 "newtap: %s missing required parameters",
354 static void jtag_tap_handle_event(jtag_tap_t
*tap
, enum jtag_event e
)
356 jtag_tap_event_action_t
* jteap
;
359 jteap
= tap
->event_action
;
363 if (jteap
->event
== e
) {
365 LOG_DEBUG("JTAG tap: %s event: %d (%s) action: %s\n",
368 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
,
369 Jim_GetString(jteap
->body
, NULL
));
370 if (Jim_EvalObj(interp
, jteap
->body
) != JIM_OK
) {
371 Jim_PrintErrorMessage(interp
);
373 /* NOTE: we currently assume the handlers
374 * can't fail. That presumes later code
375 * will be verifying the scan chains ...
377 tap
->enabled
= (e
== JTAG_TAP_EVENT_ENABLE
);
385 LOG_DEBUG("event %d %s - no action",
387 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
);
392 static int jim_jtag_command(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
398 struct command_context_s
*context
;
406 JTAG_CMD_TAPISENABLED
,
412 const Jim_Nvp jtag_cmds
[] = {
413 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
414 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
415 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
416 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
417 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
418 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
419 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
420 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
421 { .name
= "names" , .value
= JTAG_CMD_NAMES
},
423 { .name
= NULL
, .value
= -1 },
426 context
= Jim_GetAssocData(interp
, "context");
427 /* go past the command */
428 Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+ 1);
430 e
= Jim_GetOpt_Nvp(&goi
, jtag_cmds
, &n
);
432 Jim_GetOpt_NvpUnknown(&goi
, jtag_cmds
, 0);
435 Jim_SetEmptyResult(goi
.interp
);
437 case JTAG_CMD_INTERFACE
:
438 /* return the name of the interface */
439 /* TCL code might need to know the exact type... */
440 /* FUTURE: we allow this as a means to "set" the interface. */
442 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
445 Jim_SetResultString(goi
.interp
, jtag_interface
->name
, -1);
447 case JTAG_CMD_INIT_RESET
:
449 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
452 e
= jtag_init_reset(context
);
454 Jim_SetResult_sprintf(goi
.interp
, "error: %d", e
);
458 case JTAG_CMD_NEWTAP
:
459 return jim_newtap_cmd(&goi
);
461 case JTAG_CMD_TAPISENABLED
:
462 case JTAG_CMD_TAPENABLE
:
463 case JTAG_CMD_TAPDISABLE
:
465 Jim_SetResultString(goi
.interp
, "Too many parameters",-1);
472 t
= jtag_tap_by_jim_obj(goi
.interp
, goi
.argv
[0]);
477 case JTAG_CMD_TAPISENABLED
:
479 case JTAG_CMD_TAPENABLE
:
482 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_ENABLE
);
486 /* FIXME add JTAG sanity checks, w/o TLR
487 * - scan chain length grew by one (this)
488 * - IDs and IR lengths are as expected
491 jtag_call_event_callbacks(JTAG_TAP_EVENT_ENABLE
);
493 case JTAG_CMD_TAPDISABLE
:
496 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_DISABLE
);
500 /* FIXME add JTAG sanity checks, w/o TLR
501 * - scan chain length shrank by one (this)
502 * - IDs and IR lengths are as expected
505 jtag_call_event_callbacks(JTAG_TAP_EVENT_DISABLE
);
509 Jim_SetResult(goi
.interp
, Jim_NewIntObj(goi
.interp
, e
));
516 Jim_WrongNumArgs(goi
.interp
, 0, NULL
,
517 "cget tap_name queryparm");
524 Jim_GetOpt_Obj(&goi
, &o
);
525 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
531 return jtag_tap_configure_cmd(&goi
, t
);
535 case JTAG_CMD_CONFIGURE
:
537 Jim_WrongNumArgs(goi
.interp
, 0, NULL
,
538 "configure tap_name attribute value ...");
545 Jim_GetOpt_Obj(&goi
, &o
);
546 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
552 return jtag_tap_configure_cmd(&goi
, t
);
558 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
, "Too many parameters");
561 Jim_SetResult(goi
.interp
, Jim_NewListObj(goi
.interp
, NULL
, 0));
565 for (tap
= jtag_all_taps(); tap
; tap
= tap
->next_tap
) {
566 Jim_ListAppendElement(goi
.interp
,
567 Jim_GetResult(goi
.interp
),
568 Jim_NewStringObj(goi
.interp
,
569 tap
->dotted_name
, -1));
580 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
582 register_jim(cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
584 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
585 COMMAND_CONFIG
, "try to configure interface");
586 register_command(cmd_ctx
, NULL
,
587 "interface_list", &handle_interface_list_command
,
588 COMMAND_ANY
, "list all built-in interfaces");
589 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
590 COMMAND_ANY
, "(DEPRECATED) set jtag speed (if supported)");
591 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
592 COMMAND_ANY
, "set maximum jtag speed (if supported); "
593 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
594 register_command(cmd_ctx
, NULL
, "jtag_rclk", handle_jtag_rclk_command
,
595 COMMAND_ANY
, "fallback_speed_khz - set JTAG speed to RCLK or use fallback speed");
596 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
597 COMMAND_CONFIG
, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
598 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
600 "[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]");
601 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
602 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
603 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
604 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
606 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
607 COMMAND_EXEC
, "print current scan chain configuration");
609 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
610 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
611 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
612 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
613 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
614 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
615 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
616 register_jim(cmd_ctx
, "flush_count", Jim_Command_flush_count
, "returns number of times the JTAG queue has been flushed");
617 register_jim(cmd_ctx
, "pathmove", Jim_Command_pathmove
, "move JTAG to state1 then to state2, state3, etc. <state1>,<state2>,<stat3>...");
619 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
620 COMMAND_ANY
, "verify value captured during Capture-IR <enable | disable>");
621 register_command(cmd_ctx
, NULL
, "verify_jtag", handle_verify_jtag_command
,
622 COMMAND_ANY
, "verify value capture <enable | disable>");
623 register_command(cmd_ctx
, NULL
, "tms_sequence", handle_tms_sequence_command
,
624 COMMAND_ANY
, "choose short(default) or long tms_sequence <short | long>");
628 static int default_khz(int khz
, int *jtag_speed
)
630 LOG_ERROR("Translation from khz to jtag_speed not implemented");
634 static int default_speed_div(int speed
, int *khz
)
636 LOG_ERROR("Translation from jtag_speed to khz not implemented");
640 static int default_power_dropout(int *dropout
)
642 *dropout
= 0; /* by default we can't detect power dropout */
646 static int default_srst_asserted(int *srst_asserted
)
648 *srst_asserted
= 0; /* by default we can't detect srst asserted */
652 static int handle_interface_command(struct command_context_s
*cmd_ctx
,
653 char *cmd
, char **args
, int argc
)
655 /* check whether the interface is already configured */
658 LOG_WARNING("Interface already configured, ignoring");
662 /* interface name is a mandatory argument */
663 if (argc
!= 1 || args
[0][0] == '\0')
664 return ERROR_COMMAND_SYNTAX_ERROR
;
666 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
668 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) != 0)
671 int retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
);
672 if (ERROR_OK
!= retval
)
675 jtag_interface
= jtag_interfaces
[i
];
677 if (jtag_interface
->khz
== NULL
)
678 jtag_interface
->khz
= default_khz
;
679 if (jtag_interface
->speed_div
== NULL
)
680 jtag_interface
->speed_div
= default_speed_div
;
681 if (jtag_interface
->power_dropout
== NULL
)
682 jtag_interface
->power_dropout
= default_power_dropout
;
683 if (jtag_interface
->srst_asserted
== NULL
)
684 jtag_interface
->srst_asserted
= default_srst_asserted
;
689 /* no valid interface was found (i.e. the configuration option,
690 * didn't match one of the compiled-in interfaces
692 LOG_ERROR("The specified JTAG interface was not found (%s)", args
[0]);
693 handle_interface_list_command(cmd_ctx
, cmd
, args
, argc
);
694 return ERROR_JTAG_INVALID_INTERFACE
;
697 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
698 char *cmd
, char **args
, int argc
)
700 if (strcmp(cmd
, "interface_list") == 0 && argc
> 0)
701 return ERROR_COMMAND_SYNTAX_ERROR
;
703 command_print(cmd_ctx
, "The following JTAG interfaces are available:");
704 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
706 const char *name
= jtag_interfaces
[i
]->name
;
707 command_print(cmd_ctx
, "%u: %s", i
+ 1, name
);
713 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
717 Jim_Obj
*newargs
[ 10 ];
721 * argv[ 0] = ir length
722 * argv[ 1] = ir capture
724 * argv[ 3] = not actually used by anything but in the docs
728 command_print(cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
731 command_print(cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
732 command_print(cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
736 command_print(cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
737 command_print(cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
738 command_print(cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
739 command_print(cmd_ctx
, "And then refer to the taps by the dotted name.");
741 newargs
[0] = Jim_NewStringObj(interp
, "jtag", -1);
742 newargs
[1] = Jim_NewStringObj(interp
, "newtap", -1);
743 sprintf(buf
, "chip%d", jtag_tap_count());
744 newargs
[2] = Jim_NewStringObj(interp
, buf
, -1);
745 sprintf(buf
, "tap%d", jtag_tap_count());
746 newargs
[3] = Jim_NewStringObj(interp
, buf
, -1);
747 newargs
[4] = Jim_NewStringObj(interp
, "-irlen", -1);
748 newargs
[5] = Jim_NewStringObj(interp
, args
[0], -1);
749 newargs
[6] = Jim_NewStringObj(interp
, "-ircapture", -1);
750 newargs
[7] = Jim_NewStringObj(interp
, args
[1], -1);
751 newargs
[8] = Jim_NewStringObj(interp
, "-irmask", -1);
752 newargs
[9] = Jim_NewStringObj(interp
, args
[2], -1);
754 command_print(cmd_ctx
, "NEW COMMAND:");
755 sprintf(buf
, "%s %s %s %s %s %s %s %s %s %s",
756 Jim_GetString(newargs
[0], NULL
),
757 Jim_GetString(newargs
[1], NULL
),
758 Jim_GetString(newargs
[2], NULL
),
759 Jim_GetString(newargs
[3], NULL
),
760 Jim_GetString(newargs
[4], NULL
),
761 Jim_GetString(newargs
[5], NULL
),
762 Jim_GetString(newargs
[6], NULL
),
763 Jim_GetString(newargs
[7], NULL
),
764 Jim_GetString(newargs
[8], NULL
),
765 Jim_GetString(newargs
[9], NULL
));
767 e
= jim_jtag_command(interp
, 10, newargs
);
769 command_print(cmd_ctx
, "%s", Jim_GetString(Jim_GetResult(interp
), NULL
));
774 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
778 tap
= jtag_all_taps();
779 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
780 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
783 uint32_t expected
, expected_mask
, cur_instr
, ii
;
784 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
785 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
786 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
788 command_print(cmd_ctx
,
789 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
790 tap
->abs_chain_position
,
792 tap
->enabled
? 'Y' : 'n',
793 (unsigned int)(tap
->idcode
),
794 (unsigned int)(tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
795 (unsigned int)(tap
->ir_length
),
796 (unsigned int)(expected
),
797 (unsigned int)(expected_mask
),
798 (unsigned int)(cur_instr
));
800 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
801 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
802 (unsigned int)(tap
->expected_ids
[ii
]));
811 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
817 return ERROR_COMMAND_SYNTAX_ERROR
;
819 /* Original versions cared about the order of these tokens:
820 * reset_config signals [combination [trst_type [srst_type]]]
821 * They also clobbered the previous configuration even on error.
823 * Here we don't care about the order, and only change values
824 * which have been explicitly specified.
826 for (; argc
; argc
--, args
++) {
831 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
832 if (strcmp(*args
, "none") == 0)
834 else if (strcmp(*args
, "trst_only") == 0)
835 tmp
= RESET_HAS_TRST
;
836 else if (strcmp(*args
, "srst_only") == 0)
837 tmp
= RESET_HAS_SRST
;
838 else if (strcmp(*args
, "trst_and_srst") == 0)
839 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
843 LOG_ERROR("extra reset_config %s spec (%s)",
845 return ERROR_INVALID_ARGUMENTS
;
850 /* combination (options for broken wiring) */
851 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
852 if (strcmp(*args
, "separate") == 0)
853 /* separate reset lines - default */;
854 else if (strcmp(*args
, "srst_pulls_trst") == 0)
855 tmp
|= RESET_SRST_PULLS_TRST
;
856 else if (strcmp(*args
, "trst_pulls_srst") == 0)
857 tmp
|= RESET_TRST_PULLS_SRST
;
858 else if (strcmp(*args
, "combined") == 0)
859 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
863 LOG_ERROR("extra reset_config %s spec (%s)",
864 "combination", *args
);
865 return ERROR_INVALID_ARGUMENTS
;
870 /* trst_type (NOP without HAS_TRST) */
871 m
= RESET_TRST_OPEN_DRAIN
;
872 if (strcmp(*args
, "trst_open_drain") == 0)
873 tmp
|= RESET_TRST_OPEN_DRAIN
;
874 else if (strcmp(*args
, "trst_push_pull") == 0)
875 /* push/pull from adapter - default */;
879 LOG_ERROR("extra reset_config %s spec (%s)",
881 return ERROR_INVALID_ARGUMENTS
;
886 /* srst_type (NOP without HAS_SRST) */
887 m
|= RESET_SRST_PUSH_PULL
;
888 if (strcmp(*args
, "srst_push_pull") == 0)
889 tmp
|= RESET_SRST_PUSH_PULL
;
890 else if (strcmp(*args
, "srst_open_drain") == 0)
891 /* open drain from adapter - default */;
895 LOG_ERROR("extra reset_config %s spec (%s)",
897 return ERROR_INVALID_ARGUMENTS
;
902 /* caller provided nonsense; fail */
903 LOG_ERROR("unknown reset_config flag (%s)", *args
);
904 return ERROR_INVALID_ARGUMENTS
;
907 /* Remember the bits which were specified (mask)
908 * and their new values (new_cfg).
914 /* clear previous values of those bits, save new values */
915 enum reset_types old_cfg
= jtag_get_reset_config();
918 jtag_set_reset_config(new_cfg
);
923 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
,
924 char *cmd
, char **args
, int argc
)
927 return ERROR_COMMAND_SYNTAX_ERROR
;
931 int retval
= parse_uint(args
[0], &delay
);
932 if (ERROR_OK
!= retval
)
934 jtag_set_nsrst_delay(delay
);
936 command_print(cmd_ctx
, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
940 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
,
941 char *cmd
, char **args
, int argc
)
944 return ERROR_COMMAND_SYNTAX_ERROR
;
948 int retval
= parse_uint(args
[0], &delay
);
949 if (ERROR_OK
!= retval
)
951 jtag_set_ntrst_delay(delay
);
953 command_print(cmd_ctx
, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
957 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
959 int retval
= ERROR_OK
;
961 command_print(cmd_ctx
, "OLD SYNTAX: DEPRECATED - "
962 "use jtag_khz, not jtag_speed");
965 return ERROR_COMMAND_SYNTAX_ERROR
;
968 LOG_DEBUG("handle jtag speed");
970 unsigned cur_speed
= 0;
971 int retval
= parse_uint(args
[0], &cur_speed
);
972 if (ERROR_OK
!= retval
)
974 retval
= jtag_config_speed(cur_speed
);
977 command_print(cmd_ctx
, "jtag_speed: %d", jtag_get_speed());
982 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
985 return ERROR_COMMAND_SYNTAX_ERROR
;
987 int retval
= ERROR_OK
;
991 int retval
= parse_uint(args
[0], &khz
);
992 if (ERROR_OK
!= retval
)
994 retval
= jtag_config_khz(khz
);
995 if (ERROR_OK
!= retval
)
999 int cur_speed
= jtag_get_speed_khz();
1000 retval
= jtag_get_speed_readable(&cur_speed
);
1001 if (ERROR_OK
!= retval
)
1005 command_print(cmd_ctx
, "%d kHz", cur_speed
);
1007 command_print(cmd_ctx
, "RCLK - adaptive");
1012 static int handle_jtag_rclk_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1015 return ERROR_COMMAND_SYNTAX_ERROR
;
1017 int retval
= ERROR_OK
;
1021 int retval
= parse_uint(args
[0], &khz
);
1022 if (ERROR_OK
!= retval
)
1024 retval
= jtag_config_rclk(khz
);
1025 if (ERROR_OK
!= retval
)
1029 int cur_khz
= jtag_get_speed_khz();
1030 retval
= jtag_get_speed_readable(&cur_khz
);
1031 if (ERROR_OK
!= retval
)
1035 command_print(cmd_ctx
, "RCLK not supported - fallback to %d kHz", cur_khz
);
1037 command_print(cmd_ctx
, "RCLK - adaptive");
1042 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
,
1043 char *cmd
, char **args
, int argc
)
1046 return ERROR_COMMAND_SYNTAX_ERROR
;
1049 if (args
[0][0] == '1')
1051 else if (args
[0][0] == '0')
1054 return ERROR_COMMAND_SYNTAX_ERROR
;
1057 if (args
[1][0] == '1')
1059 else if (args
[1][0] == '0')
1062 return ERROR_COMMAND_SYNTAX_ERROR
;
1064 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
1065 return ERROR_JTAG_INIT_FAILED
;
1067 jtag_add_reset(trst
, srst
);
1068 return jtag_execute_queue();
1071 static int handle_runtest_command(struct command_context_s
*cmd_ctx
,
1072 char *cmd
, char **args
, int argc
)
1075 return ERROR_COMMAND_SYNTAX_ERROR
;
1077 unsigned num_clocks
;
1078 int retval
= parse_uint(args
[0], &num_clocks
);
1079 if (ERROR_OK
!= retval
)
1082 jtag_add_runtest(num_clocks
, TAP_IDLE
);
1083 return jtag_execute_queue();
1087 * For "irscan" or "drscan" commands, the "end" (really, "next") state
1088 * should be stable ... and *NOT* a shift state, otherwise free-running
1089 * jtag clocks could change the values latched by the update state.
1091 static bool scan_is_safe(tap_state_t state
)
1106 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1109 scan_field_t
*fields
;
1111 tap_state_t endstate
;
1113 if ((argc
< 2) || (argc
% 2))
1115 return ERROR_COMMAND_SYNTAX_ERROR
;
1118 /* optional "-endstate" "statename" at the end of the arguments,
1119 * so that e.g. IRPAUSE can let us load the data register before
1120 * entering RUN/IDLE to execute the instruction we load here.
1122 endstate
= TAP_IDLE
;
1125 /* have at least one pair of numbers. */
1126 /* is last pair the magic text? */
1127 if (0 == strcmp("-endstate", args
[ argc
- 2 ])) {
1130 cpA
= args
[ argc
-1 ];
1131 for (endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++) {
1132 cpS
= tap_state_name(endstate
);
1133 if (0 == strcmp(cpA
, cpS
)) {
1137 if (endstate
>= TAP_NUM_STATES
) {
1138 return ERROR_COMMAND_SYNTAX_ERROR
;
1140 if (!scan_is_safe(endstate
))
1141 LOG_WARNING("irscan with unsafe "
1142 "endstate \"%s\"", cpA
);
1143 /* found - remove the last 2 args */
1149 int num_fields
= argc
/ 2;
1150 size_t fields_len
= sizeof(scan_field_t
) * num_fields
;
1151 fields
= malloc(fields_len
);
1152 memset(fields
, 0, fields_len
);
1155 for (i
= 0; i
< num_fields
; i
++)
1157 tap
= jtag_tap_by_string(args
[i
*2]);
1161 for (j
= 0; j
< i
; j
++)
1162 free(fields
[j
].out_value
);
1164 command_print(cmd_ctx
, "Tap: %s unknown", args
[i
*2]);
1168 int field_size
= tap
->ir_length
;
1169 fields
[i
].tap
= tap
;
1170 fields
[i
].num_bits
= field_size
;
1171 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
1174 retval
= parse_u32(args
[i
* 2 + 1], &value
);
1175 if (ERROR_OK
!= retval
)
1177 buf_set_u32(fields
[i
].out_value
, 0, field_size
, value
);
1178 fields
[i
].in_value
= NULL
;
1181 /* did we have an endstate? */
1182 jtag_add_ir_scan(num_fields
, fields
, endstate
);
1184 retval
= jtag_execute_queue();
1187 for (i
= 0; i
< num_fields
; i
++)
1189 if (NULL
!= fields
[i
].out_value
)
1190 free(fields
[i
].out_value
);
1198 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1201 scan_field_t
*fields
;
1203 int field_count
= 0;
1206 tap_state_t endstate
;
1209 * args[2] = num_bits
1210 * args[3] = hex string
1211 * ... repeat num bits and hex string ...
1214 * args[N-2] = "-endstate"
1215 * args[N-1] = statename
1217 if ((argc
< 4) || ((argc
% 2) != 0))
1219 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1223 endstate
= TAP_IDLE
;
1225 script_debug(interp
, "drscan", argc
, args
);
1227 /* validate arguments as numbers */
1229 for (i
= 2; i
< argc
; i
+= 2)
1234 e
= Jim_GetLong(interp
, args
[i
], &bits
);
1235 /* If valid - try next arg */
1240 /* Not valid.. are we at the end? */
1241 if (((i
+ 2) != argc
)) {
1242 /* nope, then error */
1246 /* it could be: "-endstate FOO"
1247 * e.g. DRPAUSE so we can issue more instructions
1248 * before entering RUN/IDLE and executing them.
1251 /* get arg as a string. */
1252 cp
= Jim_GetString(args
[i
], NULL
);
1253 /* is it the magic? */
1254 if (0 == strcmp("-endstate", cp
)) {
1255 /* is the statename valid? */
1256 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1258 /* see if it is a valid state name */
1259 endstate
= tap_state_by_name(cp
);
1261 /* update the error message */
1262 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1264 if (!scan_is_safe(endstate
))
1265 LOG_WARNING("drscan with unsafe "
1266 "endstate \"%s\"", cp
);
1268 /* valid - so clear the error */
1270 /* and remove the last 2 args */
1275 /* Still an error? */
1277 return e
; /* too bad */
1279 } /* validate args */
1281 tap
= jtag_tap_by_jim_obj(interp
, args
[1]);
1286 num_fields
= (argc
-2)/2;
1287 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
1288 for (i
= 2; i
< argc
; i
+= 2)
1294 Jim_GetLong(interp
, args
[i
], &bits
);
1295 str
= Jim_GetString(args
[i
+ 1], &len
);
1297 fields
[field_count
].tap
= tap
;
1298 fields
[field_count
].num_bits
= bits
;
1299 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
1300 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
1301 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
1305 jtag_add_dr_scan(num_fields
, fields
, endstate
);
1307 retval
= jtag_execute_queue();
1308 if (retval
!= ERROR_OK
)
1310 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
1315 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
1316 for (i
= 2; i
< argc
; i
+= 2)
1321 Jim_GetLong(interp
, args
[i
], &bits
);
1322 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
1323 free(fields
[field_count
].out_value
);
1325 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
1330 Jim_SetResult(interp
, list
);
1338 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1340 tap_state_t states
[8];
1342 if ((argc
< 2) || ((size_t)argc
> (sizeof(states
)/sizeof(*states
) + 1)))
1344 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1348 script_debug(interp
, "pathmove", argc
, args
);
1351 for (i
= 0; i
< argc
-1; i
++)
1354 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1355 states
[i
] = tap_state_by_name(cp
);
1358 /* update the error message */
1359 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1364 if ((jtag_add_statemove(states
[0]) != ERROR_OK
) || (jtag_execute_queue()!= ERROR_OK
))
1366 Jim_SetResultString(interp
, "pathmove: jtag execute failed",-1);
1370 jtag_add_pathmove(argc
-2, states
+ 1);
1372 if (jtag_execute_queue()!= ERROR_OK
)
1374 Jim_SetResultString(interp
, "pathmove: failed",-1);
1382 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1384 script_debug(interp
, "flush_count", argc
, args
);
1386 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_get_flush_queue_count()));
1392 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1395 return ERROR_COMMAND_SYNTAX_ERROR
;
1399 if (strcmp(args
[0], "enable") == 0)
1400 jtag_set_verify_capture_ir(true);
1401 else if (strcmp(args
[0], "disable") == 0)
1402 jtag_set_verify_capture_ir(false);
1404 return ERROR_COMMAND_SYNTAX_ERROR
;
1407 const char *status
= jtag_will_verify_capture_ir() ? "enabled": "disabled";
1408 command_print(cmd_ctx
, "verify Capture-IR is %s", status
);
1413 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1416 return ERROR_COMMAND_SYNTAX_ERROR
;
1420 if (strcmp(args
[0], "enable") == 0)
1421 jtag_set_verify(true);
1422 else if (strcmp(args
[0], "disable") == 0)
1423 jtag_set_verify(false);
1425 return ERROR_COMMAND_SYNTAX_ERROR
;
1428 const char *status
= jtag_will_verify() ? "enabled": "disabled";
1429 command_print(cmd_ctx
, "verify jtag capture is %s", status
);
1434 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1437 return ERROR_COMMAND_SYNTAX_ERROR
;
1442 if (strcmp(args
[0], "short") == 0)
1443 use_new_table
= true;
1444 else if (strcmp(args
[0], "long") == 0)
1445 use_new_table
= false;
1447 return ERROR_COMMAND_SYNTAX_ERROR
;
1449 tap_use_new_tms_table(use_new_table
);
1452 command_print(cmd_ctx
, "tms sequence is %s",
1453 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)