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_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
60 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
63 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
65 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
66 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
69 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
70 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
);
72 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
73 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
74 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
76 extern int jtag_examine_chain(void);
77 extern int jtag_validate_chain(void);
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
) {
145 jteap
= calloc(1, sizeof (*jteap
));
147 jteap
->event
= n
->value
;
148 Jim_GetOpt_Obj(goi
, &o
);
150 Jim_DecrRefCount(interp
, jteap
->body
);
152 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
153 Jim_IncrRefCount(jteap
->body
);
155 /* add to head of event list */
156 jteap
->next
= tap
->event_action
;
157 tap
->event_action
= jteap
;
158 Jim_SetEmptyResult(goi
->interp
);
162 Jim_SetEmptyResult(goi
->interp
);
164 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
171 } /* while (goi->argc) */
176 static int is_bad_irval(int ir_length
, jim_wide w
)
186 static int jim_newtap_cmd(Jim_GetOptInfo
*goi
)
195 const Jim_Nvp opts
[] = {
196 #define NTAP_OPT_IRLEN 0
197 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
198 #define NTAP_OPT_IRMASK 1
199 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
200 #define NTAP_OPT_IRCAPTURE 2
201 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
202 #define NTAP_OPT_ENABLED 3
203 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
204 #define NTAP_OPT_DISABLED 4
205 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
206 #define NTAP_OPT_EXPECTED_ID 5
207 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
208 { .name
= NULL
, .value
= -1 },
211 pTap
= calloc(1, sizeof(jtag_tap_t
));
213 Jim_SetResult_sprintf(goi
->interp
, "no memory");
218 * we expect CHIP + TAP + OPTIONS
221 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
224 Jim_GetOpt_String(goi
, &cp
, NULL
);
225 pTap
->chip
= strdup(cp
);
227 Jim_GetOpt_String(goi
, &cp
, NULL
);
228 pTap
->tapname
= strdup(cp
);
230 /* name + dot + name + null */
231 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
233 sprintf(cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
234 pTap
->dotted_name
= cp
;
236 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
237 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
239 /* deal with options */
240 #define NTREQ_IRLEN 1
241 #define NTREQ_IRCAPTURE 2
242 #define NTREQ_IRMASK 4
244 /* clear them as we find them */
245 reqbits
= (NTREQ_IRLEN
| NTREQ_IRCAPTURE
| NTREQ_IRMASK
);
248 e
= Jim_GetOpt_Nvp(goi
, opts
, &n
);
250 Jim_GetOpt_NvpUnknown(goi
, opts
, 0);
253 LOG_DEBUG("Processing option: %s", n
->name
);
255 case NTAP_OPT_ENABLED
:
256 pTap
->disabled_after_reset
= false;
258 case NTAP_OPT_DISABLED
:
259 pTap
->disabled_after_reset
= true;
261 case NTAP_OPT_EXPECTED_ID
:
263 uint32_t *new_expected_ids
;
265 e
= Jim_GetOpt_Wide(goi
, &w
);
267 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
271 new_expected_ids
= malloc(sizeof(uint32_t) * (pTap
->expected_ids_cnt
+ 1));
272 if (new_expected_ids
== NULL
) {
273 Jim_SetResult_sprintf(goi
->interp
, "no memory");
277 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(uint32_t) * pTap
->expected_ids_cnt
);
279 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
281 free(pTap
->expected_ids
);
282 pTap
->expected_ids
= new_expected_ids
;
283 pTap
->expected_ids_cnt
++;
287 case NTAP_OPT_IRMASK
:
288 case NTAP_OPT_IRCAPTURE
:
289 e
= Jim_GetOpt_Wide(goi
, &w
);
291 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
296 if (w
> (jim_wide
) (8 * sizeof(pTap
->ir_capture_value
)))
297 LOG_WARNING("huge IR length %d", (int) w
);
299 reqbits
&= (~(NTREQ_IRLEN
));
301 case NTAP_OPT_IRMASK
:
302 if (is_bad_irval(pTap
->ir_length
, w
)) {
303 LOG_ERROR("IR mask %x too big",
307 pTap
->ir_capture_mask
= w
;
308 reqbits
&= (~(NTREQ_IRMASK
));
310 case NTAP_OPT_IRCAPTURE
:
311 if (is_bad_irval(pTap
->ir_length
, w
)) {
312 LOG_ERROR("IR capture %x too big",
316 pTap
->ir_capture_value
= w
;
317 reqbits
&= (~(NTREQ_IRCAPTURE
));
320 } /* switch (n->value) */
321 } /* while (goi->argc) */
323 /* default is enabled-after-reset */
324 pTap
->enabled
= !pTap
->disabled_after_reset
;
326 /* Did all the required option bits get cleared? */
333 Jim_SetResult_sprintf(goi
->interp
,
334 "newtap: %s missing required parameters",
340 static void jtag_tap_handle_event(jtag_tap_t
*tap
, enum jtag_event e
)
342 jtag_tap_event_action_t
* jteap
;
345 jteap
= tap
->event_action
;
349 if (jteap
->event
== e
) {
351 LOG_DEBUG("JTAG tap: %s event: %d (%s) action: %s\n",
354 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
,
355 Jim_GetString(jteap
->body
, NULL
));
356 if (Jim_EvalObj(interp
, jteap
->body
) != JIM_OK
) {
357 Jim_PrintErrorMessage(interp
);
359 /* NOTE: we currently assume the handlers
360 * can't fail. That presumes later code
361 * will be verifying the scan chains ...
363 tap
->enabled
= (e
== JTAG_TAP_EVENT_ENABLE
);
371 LOG_DEBUG("event %d %s - no action",
373 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
);
378 static int jim_jtag_command(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
384 struct command_context_s
*context
;
392 JTAG_CMD_TAPISENABLED
,
397 const Jim_Nvp jtag_cmds
[] = {
398 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
399 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
400 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
401 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
402 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
403 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
404 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
405 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
407 { .name
= NULL
, .value
= -1 },
410 context
= Jim_GetAssocData(interp
, "context");
411 /* go past the command */
412 Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+ 1);
414 e
= Jim_GetOpt_Nvp(&goi
, jtag_cmds
, &n
);
416 Jim_GetOpt_NvpUnknown(&goi
, jtag_cmds
, 0);
419 Jim_SetEmptyResult(goi
.interp
);
421 case JTAG_CMD_INTERFACE
:
422 /* return the name of the interface */
423 /* TCL code might need to know the exact type... */
424 /* FUTURE: we allow this as a means to "set" the interface. */
426 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
429 Jim_SetResultString(goi
.interp
, jtag_interface
->name
, -1);
431 case JTAG_CMD_INIT_RESET
:
433 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
436 e
= jtag_init_reset(context
);
438 Jim_SetResult_sprintf(goi
.interp
, "error: %d", e
);
442 case JTAG_CMD_NEWTAP
:
443 return jim_newtap_cmd(&goi
);
445 case JTAG_CMD_TAPISENABLED
:
446 case JTAG_CMD_TAPENABLE
:
447 case JTAG_CMD_TAPDISABLE
:
449 Jim_SetResultString(goi
.interp
, "Too many parameters",-1);
456 t
= jtag_tap_by_jim_obj(goi
.interp
, goi
.argv
[0]);
461 case JTAG_CMD_TAPISENABLED
:
463 case JTAG_CMD_TAPENABLE
:
466 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_ENABLE
);
470 /* FIXME add JTAG sanity checks, w/o TLR
471 * - scan chain length grew by one (this)
472 * - IDs and IR lengths are as expected
475 jtag_call_event_callbacks(JTAG_TAP_EVENT_ENABLE
);
477 case JTAG_CMD_TAPDISABLE
:
480 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_DISABLE
);
484 /* FIXME add JTAG sanity checks, w/o TLR
485 * - scan chain length shrank by one (this)
486 * - IDs and IR lengths are as expected
489 jtag_call_event_callbacks(JTAG_TAP_EVENT_DISABLE
);
493 Jim_SetResult(goi
.interp
, Jim_NewIntObj(goi
.interp
, e
));
500 Jim_WrongNumArgs(goi
.interp
, 0, NULL
, "?tap-name? -option ...");
507 Jim_GetOpt_Obj(&goi
, &o
);
508 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
514 return jtag_tap_configure_cmd(&goi
, t
);
518 case JTAG_CMD_CONFIGURE
:
520 Jim_WrongNumArgs(goi
.interp
, 0, NULL
, "?tap-name? -option ?VALUE? ...");
527 Jim_GetOpt_Obj(&goi
, &o
);
528 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
534 return jtag_tap_configure_cmd(&goi
, t
);
541 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
543 register_jim(cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
545 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
546 COMMAND_CONFIG
, "try to configure interface");
547 register_command(cmd_ctx
, NULL
,
548 "interface_list", &handle_interface_list_command
,
549 COMMAND_ANY
, "list all built-in interfaces");
550 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
551 COMMAND_ANY
, "(DEPRECATED) set jtag speed (if supported)");
552 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
553 COMMAND_ANY
, "set maximum jtag speed (if supported); "
554 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
555 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
556 COMMAND_CONFIG
, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
557 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
559 "[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]");
560 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
561 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
562 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
563 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
565 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
566 COMMAND_EXEC
, "print current scan chain configuration");
568 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
569 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
570 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
571 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
572 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
573 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
574 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
575 register_jim(cmd_ctx
, "flush_count", Jim_Command_flush_count
, "returns number of times the JTAG queue has been flushed");
576 register_jim(cmd_ctx
, "pathmove", Jim_Command_pathmove
, "move JTAG to state1 then to state2, state3, etc. <state1>,<state2>,<stat3>...");
578 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
579 COMMAND_ANY
, "verify value captured during Capture-IR <enable | disable>");
580 register_command(cmd_ctx
, NULL
, "verify_jtag", handle_verify_jtag_command
,
581 COMMAND_ANY
, "verify value capture <enable | disable>");
582 register_command(cmd_ctx
, NULL
, "tms_sequence", handle_tms_sequence_command
,
583 COMMAND_ANY
, "choose short(default) or long tms_sequence <short | long>");
587 static int default_khz(int khz
, int *jtag_speed
)
589 LOG_ERROR("Translation from khz to jtag_speed not implemented");
593 static int default_speed_div(int speed
, int *khz
)
595 LOG_ERROR("Translation from jtag_speed to khz not implemented");
599 static int default_power_dropout(int *dropout
)
601 *dropout
= 0; /* by default we can't detect power dropout */
605 static int default_srst_asserted(int *srst_asserted
)
607 *srst_asserted
= 0; /* by default we can't detect srst asserted */
611 static int handle_interface_command(struct command_context_s
*cmd_ctx
,
612 char *cmd
, char **args
, int argc
)
614 /* check whether the interface is already configured */
617 LOG_WARNING("Interface already configured, ignoring");
621 /* interface name is a mandatory argument */
622 if (argc
!= 1 || args
[0][0] == '\0')
623 return ERROR_COMMAND_SYNTAX_ERROR
;
625 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
627 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) != 0)
630 int retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
);
631 if (ERROR_OK
!= retval
)
634 jtag_interface
= jtag_interfaces
[i
];
636 if (jtag_interface
->khz
== NULL
)
637 jtag_interface
->khz
= default_khz
;
638 if (jtag_interface
->speed_div
== NULL
)
639 jtag_interface
->speed_div
= default_speed_div
;
640 if (jtag_interface
->power_dropout
== NULL
)
641 jtag_interface
->power_dropout
= default_power_dropout
;
642 if (jtag_interface
->srst_asserted
== NULL
)
643 jtag_interface
->srst_asserted
= default_srst_asserted
;
648 /* no valid interface was found (i.e. the configuration option,
649 * didn't match one of the compiled-in interfaces
651 LOG_ERROR("The specified JTAG interface was not found (%s)", args
[0]);
652 handle_interface_list_command(cmd_ctx
, cmd
, args
, argc
);
653 return ERROR_JTAG_INVALID_INTERFACE
;
656 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
657 char *cmd
, char **args
, int argc
)
659 if (strcmp(cmd
, "interface_list") == 0 && argc
> 0)
660 return ERROR_COMMAND_SYNTAX_ERROR
;
662 command_print(cmd_ctx
, "The following JTAG interfaces are available:");
663 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
665 const char *name
= jtag_interfaces
[i
]->name
;
666 command_print(cmd_ctx
, "%u: %s", i
+ 1, name
);
672 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
676 Jim_Obj
*newargs
[ 10 ];
680 * argv[ 0] = ir length
681 * argv[ 1] = ir capture
683 * argv[ 3] = not actually used by anything but in the docs
687 command_print(cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
690 command_print(cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
691 command_print(cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
695 command_print(cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
696 command_print(cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
697 command_print(cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
698 command_print(cmd_ctx
, "And then refer to the taps by the dotted name.");
700 newargs
[0] = Jim_NewStringObj(interp
, "jtag", -1);
701 newargs
[1] = Jim_NewStringObj(interp
, "newtap", -1);
702 sprintf(buf
, "chip%d", jtag_tap_count());
703 newargs
[2] = Jim_NewStringObj(interp
, buf
, -1);
704 sprintf(buf
, "tap%d", jtag_tap_count());
705 newargs
[3] = Jim_NewStringObj(interp
, buf
, -1);
706 newargs
[4] = Jim_NewStringObj(interp
, "-irlen", -1);
707 newargs
[5] = Jim_NewStringObj(interp
, args
[0], -1);
708 newargs
[6] = Jim_NewStringObj(interp
, "-ircapture", -1);
709 newargs
[7] = Jim_NewStringObj(interp
, args
[1], -1);
710 newargs
[8] = Jim_NewStringObj(interp
, "-irmask", -1);
711 newargs
[9] = Jim_NewStringObj(interp
, args
[2], -1);
713 command_print(cmd_ctx
, "NEW COMMAND:");
714 sprintf(buf
, "%s %s %s %s %s %s %s %s %s %s",
715 Jim_GetString(newargs
[0], NULL
),
716 Jim_GetString(newargs
[1], NULL
),
717 Jim_GetString(newargs
[2], NULL
),
718 Jim_GetString(newargs
[3], NULL
),
719 Jim_GetString(newargs
[4], NULL
),
720 Jim_GetString(newargs
[5], NULL
),
721 Jim_GetString(newargs
[6], NULL
),
722 Jim_GetString(newargs
[7], NULL
),
723 Jim_GetString(newargs
[8], NULL
),
724 Jim_GetString(newargs
[9], NULL
));
726 e
= jim_jtag_command(interp
, 10, newargs
);
728 command_print(cmd_ctx
, "%s", Jim_GetString(Jim_GetResult(interp
), NULL
));
733 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
737 tap
= jtag_all_taps();
738 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
739 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
742 uint32_t expected
, expected_mask
, cur_instr
, ii
;
743 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
744 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
745 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
747 command_print(cmd_ctx
,
748 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
749 tap
->abs_chain_position
,
751 tap
->enabled
? 'Y' : 'n',
752 (unsigned int)(tap
->idcode
),
753 (unsigned int)(tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
754 (unsigned int)(tap
->ir_length
),
755 (unsigned int)(expected
),
756 (unsigned int)(expected_mask
),
757 (unsigned int)(cur_instr
));
759 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
760 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
761 (unsigned int)(tap
->expected_ids
[ii
]));
770 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
776 return ERROR_COMMAND_SYNTAX_ERROR
;
778 /* Original versions cared about the order of these tokens:
779 * reset_config signals [combination [trst_type [srst_type]]]
780 * They also clobbered the previous configuration even on error.
782 * Here we don't care about the order, and only change values
783 * which have been explicitly specified.
785 for (; argc
; argc
--, args
++) {
790 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
791 if (strcmp(*args
, "none") == 0)
793 else if (strcmp(*args
, "trst_only") == 0)
794 tmp
= RESET_HAS_TRST
;
795 else if (strcmp(*args
, "srst_only") == 0)
796 tmp
= RESET_HAS_SRST
;
797 else if (strcmp(*args
, "trst_and_srst") == 0)
798 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
802 LOG_ERROR("extra reset_config %s spec (%s)",
804 return ERROR_INVALID_ARGUMENTS
;
809 /* combination (options for broken wiring) */
810 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
811 if (strcmp(*args
, "separate") == 0)
812 /* separate reset lines - default */;
813 else if (strcmp(*args
, "srst_pulls_trst") == 0)
814 tmp
|= RESET_SRST_PULLS_TRST
;
815 else if (strcmp(*args
, "trst_pulls_srst") == 0)
816 tmp
|= RESET_TRST_PULLS_SRST
;
817 else if (strcmp(*args
, "combined") == 0)
818 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
822 LOG_ERROR("extra reset_config %s spec (%s)",
823 "combination", *args
);
824 return ERROR_INVALID_ARGUMENTS
;
829 /* trst_type (NOP without HAS_TRST) */
830 m
= RESET_TRST_OPEN_DRAIN
;
831 if (strcmp(*args
, "trst_open_drain") == 0)
832 tmp
|= RESET_TRST_OPEN_DRAIN
;
833 else if (strcmp(*args
, "trst_push_pull") == 0)
834 /* push/pull from adapter - default */;
838 LOG_ERROR("extra reset_config %s spec (%s)",
840 return ERROR_INVALID_ARGUMENTS
;
845 /* srst_type (NOP without HAS_SRST) */
846 m
|= RESET_SRST_PUSH_PULL
;
847 if (strcmp(*args
, "srst_push_pull") == 0)
848 tmp
|= RESET_SRST_PUSH_PULL
;
849 else if (strcmp(*args
, "srst_open_drain") == 0)
850 /* open drain from adapter - default */;
854 LOG_ERROR("extra reset_config %s spec (%s)",
856 return ERROR_INVALID_ARGUMENTS
;
861 /* caller provided nonsense; fail */
862 LOG_ERROR("unknown reset_config flag (%s)", *args
);
863 return ERROR_INVALID_ARGUMENTS
;
866 /* Remember the bits which were specified (mask)
867 * and their new values (new_cfg).
873 /* clear previous values of those bits, save new values */
874 enum reset_types old_cfg
= jtag_get_reset_config();
877 jtag_set_reset_config(new_cfg
);
882 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
,
883 char *cmd
, char **args
, int argc
)
886 return ERROR_COMMAND_SYNTAX_ERROR
;
890 int retval
= parse_uint(args
[0], &delay
);
891 if (ERROR_OK
!= retval
)
893 jtag_set_nsrst_delay(delay
);
895 command_print(cmd_ctx
, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
899 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
,
900 char *cmd
, char **args
, int argc
)
903 return ERROR_COMMAND_SYNTAX_ERROR
;
907 int retval
= parse_uint(args
[0], &delay
);
908 if (ERROR_OK
!= retval
)
910 jtag_set_ntrst_delay(delay
);
912 command_print(cmd_ctx
, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
916 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
918 int retval
= ERROR_OK
;
921 return ERROR_COMMAND_SYNTAX_ERROR
;
924 LOG_DEBUG("handle jtag speed");
926 unsigned cur_speed
= 0;
927 int retval
= parse_uint(args
[0], &cur_speed
);
928 if (ERROR_OK
!= retval
)
930 retval
= jtag_set_speed(cur_speed
);
933 command_print(cmd_ctx
, "jtag_speed: %d", jtag_get_speed());
938 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
941 return ERROR_COMMAND_SYNTAX_ERROR
;
943 int retval
= ERROR_OK
;
947 int retval
= parse_uint(args
[0], &khz
);
948 if (ERROR_OK
!= retval
)
950 retval
= jtag_config_khz(khz
);
951 if (ERROR_OK
!= retval
)
955 int cur_speed
= jtag_get_speed_khz();
956 retval
= jtag_get_speed_readable(&cur_speed
);
957 if (ERROR_OK
!= retval
)
961 command_print(cmd_ctx
, "%d kHz", cur_speed
);
963 command_print(cmd_ctx
, "RCLK - adaptive");
968 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
,
969 char *cmd
, char **args
, int argc
)
972 return ERROR_COMMAND_SYNTAX_ERROR
;
975 if (args
[0][0] == '1')
977 else if (args
[0][0] == '0')
980 return ERROR_COMMAND_SYNTAX_ERROR
;
983 if (args
[1][0] == '1')
985 else if (args
[1][0] == '0')
988 return ERROR_COMMAND_SYNTAX_ERROR
;
990 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
991 return ERROR_JTAG_INIT_FAILED
;
993 jtag_add_reset(trst
, srst
);
994 jtag_execute_queue();
999 static int handle_runtest_command(struct command_context_s
*cmd_ctx
,
1000 char *cmd
, char **args
, int argc
)
1003 return ERROR_COMMAND_SYNTAX_ERROR
;
1005 unsigned num_clocks
;
1006 int retval
= parse_uint(args
[0], &num_clocks
);
1007 if (ERROR_OK
!= retval
)
1010 jtag_add_runtest(num_clocks
, TAP_IDLE
);
1011 jtag_execute_queue();
1017 * For "irscan" or "drscan" commands, the "end" (really, "next") state
1018 * should be stable ... and *NOT* a shift state, otherwise free-running
1019 * jtag clocks could change the values latched by the update state.
1021 static bool scan_is_safe(tap_state_t state
)
1036 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1039 scan_field_t
*fields
;
1041 tap_state_t endstate
;
1043 if ((argc
< 2) || (argc
% 2))
1045 return ERROR_COMMAND_SYNTAX_ERROR
;
1048 /* optional "-endstate" "statename" at the end of the arguments,
1049 * so that e.g. IRPAUSE can let us load the data register before
1050 * entering RUN/IDLE to execute the instruction we load here.
1052 endstate
= TAP_IDLE
;
1055 /* have at least one pair of numbers. */
1056 /* is last pair the magic text? */
1057 if (0 == strcmp("-endstate", args
[ argc
- 2 ])) {
1060 cpA
= args
[ argc
-1 ];
1061 for (endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++) {
1062 cpS
= tap_state_name(endstate
);
1063 if (0 == strcmp(cpA
, cpS
)) {
1067 if (endstate
>= TAP_NUM_STATES
) {
1068 return ERROR_COMMAND_SYNTAX_ERROR
;
1070 if (!scan_is_safe(endstate
))
1071 LOG_WARNING("irscan with unsafe "
1072 "endstate \"%s\"", cpA
);
1073 /* found - remove the last 2 args */
1079 int num_fields
= argc
/ 2;
1080 size_t fields_len
= sizeof(scan_field_t
) * num_fields
;
1081 fields
= malloc(fields_len
);
1082 memset(fields
, 0, fields_len
);
1085 for (i
= 0; i
< num_fields
; i
++)
1087 tap
= jtag_tap_by_string(args
[i
*2]);
1090 command_print(cmd_ctx
, "Tap: %s unknown", args
[i
*2]);
1093 int field_size
= tap
->ir_length
;
1094 fields
[i
].tap
= tap
;
1095 fields
[i
].num_bits
= field_size
;
1096 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
1099 retval
= parse_u32(args
[i
* 2 + 1], &value
);
1100 if (ERROR_OK
!= retval
)
1102 buf_set_u32(fields
[i
].out_value
, 0, field_size
, value
);
1103 fields
[i
].in_value
= NULL
;
1106 /* did we have an endstate? */
1107 jtag_add_ir_scan(num_fields
, fields
, endstate
);
1109 retval
= jtag_execute_queue();
1112 for (i
= 0; i
< num_fields
; i
++)
1114 if (NULL
!= fields
[i
].out_value
)
1115 free(fields
[i
].out_value
);
1123 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1126 scan_field_t
*fields
;
1128 int field_count
= 0;
1131 tap_state_t endstate
;
1134 * args[2] = num_bits
1135 * args[3] = hex string
1136 * ... repeat num bits and hex string ...
1139 * args[N-2] = "-endstate"
1140 * args[N-1] = statename
1142 if ((argc
< 4) || ((argc
% 2) != 0))
1144 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1148 endstate
= TAP_IDLE
;
1150 script_debug(interp
, "drscan", argc
, args
);
1152 /* validate arguments as numbers */
1154 for (i
= 2; i
< argc
; i
+= 2)
1159 e
= Jim_GetLong(interp
, args
[i
], &bits
);
1160 /* If valid - try next arg */
1165 /* Not valid.. are we at the end? */
1166 if (((i
+ 2) != argc
)) {
1167 /* nope, then error */
1171 /* it could be: "-endstate FOO"
1172 * e.g. DRPAUSE so we can issue more instructions
1173 * before entering RUN/IDLE and executing them.
1176 /* get arg as a string. */
1177 cp
= Jim_GetString(args
[i
], NULL
);
1178 /* is it the magic? */
1179 if (0 == strcmp("-endstate", cp
)) {
1180 /* is the statename valid? */
1181 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1183 /* see if it is a valid state name */
1184 endstate
= tap_state_by_name(cp
);
1186 /* update the error message */
1187 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1189 if (!scan_is_safe(endstate
))
1190 LOG_WARNING("drscan with unsafe "
1191 "endstate \"%s\"", cp
);
1193 /* valid - so clear the error */
1195 /* and remove the last 2 args */
1200 /* Still an error? */
1202 return e
; /* too bad */
1204 } /* validate args */
1206 tap
= jtag_tap_by_jim_obj(interp
, args
[1]);
1211 num_fields
= (argc
-2)/2;
1212 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
1213 for (i
= 2; i
< argc
; i
+= 2)
1219 Jim_GetLong(interp
, args
[i
], &bits
);
1220 str
= Jim_GetString(args
[i
+ 1], &len
);
1222 fields
[field_count
].tap
= tap
;
1223 fields
[field_count
].num_bits
= bits
;
1224 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
1225 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
1226 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
1230 jtag_add_dr_scan(num_fields
, fields
, endstate
);
1232 retval
= jtag_execute_queue();
1233 if (retval
!= ERROR_OK
)
1235 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
1240 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
1241 for (i
= 2; i
< argc
; i
+= 2)
1246 Jim_GetLong(interp
, args
[i
], &bits
);
1247 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
1248 free(fields
[field_count
].out_value
);
1250 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
1255 Jim_SetResult(interp
, list
);
1263 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1265 tap_state_t states
[8];
1267 if ((argc
< 2) || ((size_t)argc
> (sizeof(states
)/sizeof(*states
) + 1)))
1269 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1273 script_debug(interp
, "pathmove", argc
, args
);
1276 for (i
= 0; i
< argc
-1; i
++)
1279 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1280 states
[i
] = tap_state_by_name(cp
);
1283 /* update the error message */
1284 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1289 if ((jtag_add_statemove(states
[0]) != ERROR_OK
) || (jtag_execute_queue()!= ERROR_OK
))
1291 Jim_SetResultString(interp
, "pathmove: jtag execute failed",-1);
1295 jtag_add_pathmove(argc
-2, states
+ 1);
1297 if (jtag_execute_queue()!= ERROR_OK
)
1299 Jim_SetResultString(interp
, "pathmove: failed",-1);
1307 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1309 script_debug(interp
, "flush_count", argc
, args
);
1311 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_get_flush_queue_count()));
1317 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1320 return ERROR_COMMAND_SYNTAX_ERROR
;
1324 if (strcmp(args
[0], "enable") == 0)
1325 jtag_set_verify_capture_ir(true);
1326 else if (strcmp(args
[0], "disable") == 0)
1327 jtag_set_verify_capture_ir(false);
1329 return ERROR_COMMAND_SYNTAX_ERROR
;
1332 const char *status
= jtag_will_verify_capture_ir() ? "enabled": "disabled";
1333 command_print(cmd_ctx
, "verify Capture-IR is %s", status
);
1338 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1341 return ERROR_COMMAND_SYNTAX_ERROR
;
1345 if (strcmp(args
[0], "enable") == 0)
1346 jtag_set_verify(true);
1347 else if (strcmp(args
[0], "disable") == 0)
1348 jtag_set_verify(false);
1350 return ERROR_COMMAND_SYNTAX_ERROR
;
1353 const char *status
= jtag_will_verify() ? "enabled": "disabled";
1354 command_print(cmd_ctx
, "verify jtag capture is %s", status
);
1359 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1362 return ERROR_COMMAND_SYNTAX_ERROR
;
1367 if (strcmp(args
[0], "short") == 0)
1368 use_new_table
= true;
1369 else if (strcmp(args
[0], "long") == 0)
1370 use_new_table
= false;
1372 return ERROR_COMMAND_SYNTAX_ERROR
;
1374 tap_use_new_tms_table(use_new_table
);
1377 command_print(cmd_ctx
, "tms sequence is %s",
1378 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)