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"
42 static const Jim_Nvp nvp_jtag_tap_event
[] = {
43 { .value
= JTAG_TAP_EVENT_ENABLE
, .name
= "tap-enable" },
44 { .value
= JTAG_TAP_EVENT_DISABLE
, .name
= "tap-disable" },
46 { .name
= NULL
, .value
= -1 }
49 /* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
52 #if BUILD_ECOSBOARD == 1
53 extern jtag_interface_t zy1000_interface
;
54 #elif defined(BUILD_MINIDRIVER_DUMMY)
55 extern jtag_interface_t minidummy_interface
;
56 #else // standard drivers
57 #if BUILD_PARPORT == 1
58 extern jtag_interface_t parport_interface
;
62 extern jtag_interface_t dummy_interface
;
65 #if BUILD_FT2232_FTD2XX == 1
66 extern jtag_interface_t ft2232_interface
;
69 #if BUILD_FT2232_LIBFTDI == 1
70 extern jtag_interface_t ft2232_interface
;
73 #if BUILD_AMTJTAGACCEL == 1
74 extern jtag_interface_t amt_jtagaccel_interface
;
78 extern jtag_interface_t ep93xx_interface
;
81 #if BUILD_AT91RM9200 == 1
82 extern jtag_interface_t at91rm9200_interface
;
85 #if BUILD_GW16012 == 1
86 extern jtag_interface_t gw16012_interface
;
89 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
90 extern jtag_interface_t presto_interface
;
93 #if BUILD_USBPROG == 1
94 extern jtag_interface_t usbprog_interface
;
98 extern jtag_interface_t jlink_interface
;
101 #if BUILD_VSLLINK == 1
102 extern jtag_interface_t vsllink_interface
;
106 extern jtag_interface_t rlink_interface
;
109 #if BUILD_ARMJTAGEW == 1
110 extern jtag_interface_t armjtagew_interface
;
112 #endif // standard drivers
115 * The list of built-in JTAG interfaces, containing entries for those
116 * drivers that were enabled by the @c configure script.
118 * The list should be defined to contain either one minidriver interface
119 * or some number of standard driver interfaces, never both.
121 jtag_interface_t
*jtag_interfaces
[] = {
122 #if BUILD_ECOSBOARD == 1
124 #elif defined(BUILD_MINIDRIVER_DUMMY)
125 &minidummy_interface
,
126 #else // standard drivers
127 #if BUILD_PARPORT == 1
133 #if BUILD_FT2232_FTD2XX == 1
136 #if BUILD_FT2232_LIBFTDI == 1
139 #if BUILD_AMTJTAGACCEL == 1
140 &amt_jtagaccel_interface
,
142 #if BUILD_EP93XX == 1
145 #if BUILD_AT91RM9200 == 1
146 &at91rm9200_interface
,
148 #if BUILD_GW16012 == 1
151 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
154 #if BUILD_USBPROG == 1
160 #if BUILD_VSLLINK == 1
166 #if BUILD_ARMJTAGEW == 1
167 &armjtagew_interface
,
169 #endif // standard drivers
173 extern jtag_interface_t
*jtag_interface
;
176 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
177 char *cmd
, char **args
, int argc
);
178 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
179 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
180 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
181 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
182 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
183 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
184 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
186 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
188 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
189 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
190 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
191 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
192 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
193 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
);
195 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
196 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
197 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
199 extern int jtag_examine_chain(void);
200 extern int jtag_validate_chain(void);
202 enum jtag_tap_cfg_param
{
206 static Jim_Nvp nvp_config_opts
[] = {
207 { .name
= "-event", .value
= JCFG_EVENT
},
209 { .name
= NULL
, .value
= -1 }
212 static int jtag_tap_configure_cmd( Jim_GetOptInfo
*goi
, jtag_tap_t
* tap
)
218 /* parse config or cget options */
219 while (goi
->argc
> 0) {
220 Jim_SetEmptyResult (goi
->interp
);
222 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
224 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
230 if (goi
->argc
== 0) {
231 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ..." );
235 e
= Jim_GetOpt_Nvp( goi
, nvp_jtag_tap_event
, &n
);
237 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
241 if (goi
->isconfigure
) {
242 if (goi
->argc
!= 1) {
243 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
247 if (goi
->argc
!= 0) {
248 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
254 jtag_tap_event_action_t
*jteap
;
256 jteap
= tap
->event_action
;
257 /* replace existing? */
259 if (jteap
->event
== (enum jtag_tap_event
)n
->value
) {
265 if (goi
->isconfigure
) {
268 jteap
= calloc(1, sizeof (*jteap
));
270 jteap
->event
= n
->value
;
271 Jim_GetOpt_Obj( goi
, &o
);
273 Jim_DecrRefCount(interp
, jteap
->body
);
275 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
276 Jim_IncrRefCount(jteap
->body
);
278 /* add to head of event list */
279 jteap
->next
= tap
->event_action
;
280 tap
->event_action
= jteap
;
281 Jim_SetEmptyResult(goi
->interp
);
285 Jim_SetEmptyResult(goi
->interp
);
287 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
294 } /* while (goi->argc) */
299 static int is_bad_irval(int ir_length
, jim_wide w
)
309 extern void jtag_tap_init(jtag_tap_t
*tap
);
310 extern void jtag_tap_free(jtag_tap_t
*tap
);
312 static int jim_newtap_cmd( Jim_GetOptInfo
*goi
)
321 const Jim_Nvp opts
[] = {
322 #define NTAP_OPT_IRLEN 0
323 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
324 #define NTAP_OPT_IRMASK 1
325 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
326 #define NTAP_OPT_IRCAPTURE 2
327 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
328 #define NTAP_OPT_ENABLED 3
329 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
330 #define NTAP_OPT_DISABLED 4
331 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
332 #define NTAP_OPT_EXPECTED_ID 5
333 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
334 { .name
= NULL
, .value
= -1 },
337 pTap
= malloc( sizeof(jtag_tap_t
) );
338 memset( pTap
, 0, sizeof(*pTap
) );
340 Jim_SetResult_sprintf( goi
->interp
, "no memory");
344 * we expect CHIP + TAP + OPTIONS
347 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
350 Jim_GetOpt_String( goi
, &cp
, NULL
);
351 pTap
->chip
= strdup(cp
);
353 Jim_GetOpt_String( goi
, &cp
, NULL
);
354 pTap
->tapname
= strdup(cp
);
356 /* name + dot + name + null */
357 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
359 sprintf( cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
360 pTap
->dotted_name
= cp
;
362 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
363 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
365 /* default is enabled */
368 /* deal with options */
369 #define NTREQ_IRLEN 1
370 #define NTREQ_IRCAPTURE 2
371 #define NTREQ_IRMASK 4
373 /* clear them as we find them */
374 reqbits
= (NTREQ_IRLEN
| NTREQ_IRCAPTURE
| NTREQ_IRMASK
);
377 e
= Jim_GetOpt_Nvp( goi
, opts
, &n
);
379 Jim_GetOpt_NvpUnknown( goi
, opts
, 0 );
382 LOG_DEBUG("Processing option: %s", n
->name
);
384 case NTAP_OPT_ENABLED
:
387 case NTAP_OPT_DISABLED
:
390 case NTAP_OPT_EXPECTED_ID
:
392 u32
*new_expected_ids
;
394 e
= Jim_GetOpt_Wide( goi
, &w
);
396 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
400 new_expected_ids
= malloc(sizeof(u32
) * (pTap
->expected_ids_cnt
+ 1));
401 if (new_expected_ids
== NULL
) {
402 Jim_SetResult_sprintf( goi
->interp
, "no memory");
406 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(u32
) * pTap
->expected_ids_cnt
);
408 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
410 free(pTap
->expected_ids
);
411 pTap
->expected_ids
= new_expected_ids
;
412 pTap
->expected_ids_cnt
++;
416 case NTAP_OPT_IRMASK
:
417 case NTAP_OPT_IRCAPTURE
:
418 e
= Jim_GetOpt_Wide( goi
, &w
);
420 Jim_SetResult_sprintf( goi
->interp
, "option: %s bad parameter", n
->name
);
425 if (w
< (jim_wide
) sizeof(pTap
->ir_capture_value
))
426 LOG_WARNING("huge IR length %d", (int) w
);
428 reqbits
&= (~(NTREQ_IRLEN
));
430 case NTAP_OPT_IRMASK
:
431 if (is_bad_irval(pTap
->ir_length
, w
)) {
432 LOG_ERROR("IR mask %x too big",
436 pTap
->ir_capture_mask
= w
;
437 reqbits
&= (~(NTREQ_IRMASK
));
439 case NTAP_OPT_IRCAPTURE
:
440 if (is_bad_irval(pTap
->ir_length
, w
)) {
441 LOG_ERROR("IR capture %x too big",
445 pTap
->ir_capture_value
= w
;
446 reqbits
&= (~(NTREQ_IRCAPTURE
));
449 } /* switch(n->value) */
450 } /* while( goi->argc ) */
452 /* Did all the required option bits get cleared? */
459 Jim_SetResult_sprintf(goi
->interp
,
460 "newtap: %s missing required parameters",
466 static void jtag_tap_handle_event( jtag_tap_t
* tap
, enum jtag_tap_event e
)
468 jtag_tap_event_action_t
* jteap
;
471 jteap
= tap
->event_action
;
475 if (jteap
->event
== e
) {
477 LOG_DEBUG( "JTAG tap: %s event: %d (%s) action: %s\n",
480 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
,
481 Jim_GetString(jteap
->body
, NULL
) );
482 if (Jim_EvalObj(interp
, jteap
->body
) != JIM_OK
) {
483 Jim_PrintErrorMessage(interp
);
491 LOG_DEBUG( "event %d %s - no action",
493 Jim_Nvp_value2name_simple( nvp_jtag_tap_event
, e
)->name
);
498 static int jim_jtag_command( Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
504 struct command_context_s
*context
;
512 JTAG_CMD_TAPISENABLED
,
517 const Jim_Nvp jtag_cmds
[] = {
518 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
519 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
520 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
521 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
522 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
523 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
524 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
525 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
527 { .name
= NULL
, .value
= -1 },
530 context
= Jim_GetAssocData(interp
, "context");
531 /* go past the command */
532 Jim_GetOpt_Setup( &goi
, interp
, argc
-1, argv
+1 );
534 e
= Jim_GetOpt_Nvp( &goi
, jtag_cmds
, &n
);
536 Jim_GetOpt_NvpUnknown( &goi
, jtag_cmds
, 0 );
539 Jim_SetEmptyResult( goi
.interp
);
541 case JTAG_CMD_INTERFACE
:
542 /* return the name of the interface */
543 /* TCL code might need to know the exact type... */
544 /* FUTURE: we allow this as a means to "set" the interface. */
546 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
549 Jim_SetResultString( goi
.interp
, jtag_interface
->name
, -1 );
551 case JTAG_CMD_INIT_RESET
:
553 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
556 e
= jtag_init_reset(context
);
558 Jim_SetResult_sprintf( goi
.interp
, "error: %d", e
);
562 case JTAG_CMD_NEWTAP
:
563 return jim_newtap_cmd( &goi
);
565 case JTAG_CMD_TAPISENABLED
:
566 case JTAG_CMD_TAPENABLE
:
567 case JTAG_CMD_TAPDISABLE
:
569 Jim_SetResultString( goi
.interp
, "Too many parameters",-1 );
575 t
= jtag_tap_by_jim_obj( goi
.interp
, goi
.argv
[0] );
580 case JTAG_CMD_TAPISENABLED
:
583 case JTAG_CMD_TAPENABLE
:
584 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_ENABLE
);
588 case JTAG_CMD_TAPDISABLE
:
589 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_DISABLE
);
594 Jim_SetResult( goi
.interp
, Jim_NewIntObj( goi
.interp
, e
) );
601 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ...");
608 Jim_GetOpt_Obj(&goi
, &o
);
609 t
= jtag_tap_by_jim_obj( goi
.interp
, o
);
615 return jtag_tap_configure_cmd( &goi
, t
);
619 case JTAG_CMD_CONFIGURE
:
621 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ?VALUE? ...");
628 Jim_GetOpt_Obj(&goi
, &o
);
629 t
= jtag_tap_by_jim_obj( goi
.interp
, o
);
635 return jtag_tap_configure_cmd( &goi
, t
);
642 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
644 register_jim( cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
646 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
647 COMMAND_CONFIG
, "try to configure interface");
648 register_command(cmd_ctx
, NULL
,
649 "interface_list", &handle_interface_list_command
,
650 COMMAND_ANY
, "list all built-in interfaces");
651 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
652 COMMAND_ANY
, "(DEPRECATED) set jtag speed (if supported)");
653 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
654 COMMAND_ANY
, "set maximum jtag speed (if supported); "
655 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
656 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
657 COMMAND_CONFIG
, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
658 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
660 "[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]");
661 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
662 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
663 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
664 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
666 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
667 COMMAND_EXEC
, "print current scan chain configuration");
669 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
670 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
671 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
672 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
673 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
674 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
675 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
676 register_jim(cmd_ctx
, "flush_count", Jim_Command_flush_count
, "returns number of times the JTAG queue has been flushed");
677 register_jim(cmd_ctx
, "pathmove", Jim_Command_pathmove
, "move JTAG to state1 then to state2, state3, etc. <state1>,<state2>,<stat3>...");
679 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
680 COMMAND_ANY
, "verify value captured during Capture-IR <enable|disable>");
681 register_command(cmd_ctx
, NULL
, "verify_jtag", handle_verify_jtag_command
,
682 COMMAND_ANY
, "verify value capture <enable|disable>");
683 register_command(cmd_ctx
, NULL
, "tms_sequence", handle_tms_sequence_command
,
684 COMMAND_ANY
, "choose short(default) or long tms_sequence <short|long>");
688 static int default_khz(int khz
, int *jtag_speed
)
690 LOG_ERROR("Translation from khz to jtag_speed not implemented");
694 static int default_speed_div(int speed
, int *khz
)
696 LOG_ERROR("Translation from jtag_speed to khz not implemented");
700 static int default_power_dropout(int *dropout
)
702 *dropout
=0; /* by default we can't detect power dropout */
706 static int default_srst_asserted(int *srst_asserted
)
708 *srst_asserted
=0; /* by default we can't detect srst asserted */
712 static int handle_interface_command(struct command_context_s
*cmd_ctx
,
713 char *cmd
, char **args
, int argc
)
715 /* check whether the interface is already configured */
718 LOG_WARNING("Interface already configured, ignoring");
722 /* interface name is a mandatory argument */
723 if (argc
!= 1 || args
[0][0] == '\0')
724 return ERROR_COMMAND_SYNTAX_ERROR
;
726 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
728 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) != 0)
731 int retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
);
732 if (ERROR_OK
!= retval
)
735 jtag_interface
= jtag_interfaces
[i
];
737 if (jtag_interface
->khz
== NULL
)
738 jtag_interface
->khz
= default_khz
;
739 if (jtag_interface
->speed_div
== NULL
)
740 jtag_interface
->speed_div
= default_speed_div
;
741 if (jtag_interface
->power_dropout
== NULL
)
742 jtag_interface
->power_dropout
= default_power_dropout
;
743 if (jtag_interface
->srst_asserted
== NULL
)
744 jtag_interface
->srst_asserted
= default_srst_asserted
;
749 /* no valid interface was found (i.e. the configuration option,
750 * didn't match one of the compiled-in interfaces
752 LOG_ERROR("The specified JTAG interface was not found (%s)", args
[0]);
753 handle_interface_list_command(cmd_ctx
, cmd
, args
, argc
);
754 return ERROR_JTAG_INVALID_INTERFACE
;
757 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
758 char *cmd
, char **args
, int argc
)
760 if (strcmp(cmd
, "interface_list") == 0 && argc
> 0)
761 return ERROR_COMMAND_SYNTAX_ERROR
;
763 command_print(cmd_ctx
, "The following JTAG interfaces are available:");
764 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
766 const char *name
= jtag_interfaces
[i
]->name
;
767 command_print(cmd_ctx
, "%u: %s", i
+ 1, name
);
773 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
777 Jim_Obj
*newargs
[ 10 ];
781 * argv[ 0] = ir length
782 * argv[ 1] = ir capture
784 * argv[ 3] = not actually used by anything but in the docs
788 command_print( cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
791 command_print( cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
792 command_print( cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
796 command_print( cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
797 command_print( cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
798 command_print( cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
799 command_print( cmd_ctx
, "And then refer to the taps by the dotted name.");
801 newargs
[0] = Jim_NewStringObj( interp
, "jtag", -1 );
802 newargs
[1] = Jim_NewStringObj( interp
, "newtap", -1 );
803 sprintf( buf
, "chip%d", jtag_tap_count() );
804 newargs
[2] = Jim_NewStringObj( interp
, buf
, -1 );
805 sprintf( buf
, "tap%d", jtag_tap_count() );
806 newargs
[3] = Jim_NewStringObj( interp
, buf
, -1 );
807 newargs
[4] = Jim_NewStringObj( interp
, "-irlen", -1 );
808 newargs
[5] = Jim_NewStringObj( interp
, args
[0], -1 );
809 newargs
[6] = Jim_NewStringObj( interp
, "-ircapture", -1 );
810 newargs
[7] = Jim_NewStringObj( interp
, args
[1], -1 );
811 newargs
[8] = Jim_NewStringObj( interp
, "-irmask", -1 );
812 newargs
[9] = Jim_NewStringObj( interp
, args
[2], -1 );
814 command_print( cmd_ctx
, "NEW COMMAND:");
815 sprintf( buf
, "%s %s %s %s %s %s %s %s %s %s",
816 Jim_GetString( newargs
[0], NULL
),
817 Jim_GetString( newargs
[1], NULL
),
818 Jim_GetString( newargs
[2], NULL
),
819 Jim_GetString( newargs
[3], NULL
),
820 Jim_GetString( newargs
[4], NULL
),
821 Jim_GetString( newargs
[5], NULL
),
822 Jim_GetString( newargs
[6], NULL
),
823 Jim_GetString( newargs
[7], NULL
),
824 Jim_GetString( newargs
[8], NULL
),
825 Jim_GetString( newargs
[9], NULL
) );
827 e
= jim_jtag_command( interp
, 10, newargs
);
829 command_print( cmd_ctx
, "%s", Jim_GetString( Jim_GetResult(interp
), NULL
) );
834 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
838 tap
= jtag_all_taps();
839 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
840 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
843 u32 expected
, expected_mask
, cur_instr
, ii
;
844 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
845 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
846 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
848 command_print(cmd_ctx
,
849 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
850 tap
->abs_chain_position
,
852 tap
->enabled
? 'Y' : 'n',
854 (tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
860 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
861 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
862 tap
->expected_ids
[ii
]);
871 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
877 return ERROR_COMMAND_SYNTAX_ERROR
;
879 /* Original versions cared about the order of these tokens:
880 * reset_config signals [combination [trst_type [srst_type]]]
881 * They also clobbered the previous configuration even on error.
883 * Here we don't care about the order, and only change values
884 * which have been explicitly specified.
886 for (; argc
; argc
--, args
++) {
891 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
892 if (strcmp(*args
, "none") == 0)
894 else if (strcmp(*args
, "trst_only") == 0)
895 tmp
= RESET_HAS_TRST
;
896 else if (strcmp(*args
, "srst_only") == 0)
897 tmp
= RESET_HAS_SRST
;
898 else if (strcmp(*args
, "trst_and_srst") == 0)
899 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
903 LOG_ERROR("extra reset_config %s spec (%s)",
905 return ERROR_INVALID_ARGUMENTS
;
910 /* combination (options for broken wiring) */
911 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
912 if (strcmp(*args
, "separate") == 0)
913 /* separate reset lines - default */;
914 else if (strcmp(*args
, "srst_pulls_trst") == 0)
915 tmp
|= RESET_SRST_PULLS_TRST
;
916 else if (strcmp(*args
, "trst_pulls_srst") == 0)
917 tmp
|= RESET_TRST_PULLS_SRST
;
918 else if (strcmp(*args
, "combined") == 0)
919 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
923 LOG_ERROR("extra reset_config %s spec (%s)",
924 "combination", *args
);
925 return ERROR_INVALID_ARGUMENTS
;
930 /* trst_type (NOP without HAS_TRST) */
931 m
= RESET_TRST_OPEN_DRAIN
;
932 if (strcmp(*args
, "trst_open_drain") == 0)
933 tmp
|= RESET_TRST_OPEN_DRAIN
;
934 else if (strcmp(*args
, "trst_push_pull") == 0)
935 /* push/pull from adapter - default */;
939 LOG_ERROR("extra reset_config %s spec (%s)",
941 return ERROR_INVALID_ARGUMENTS
;
946 /* srst_type (NOP without HAS_SRST) */
947 m
|= RESET_SRST_PUSH_PULL
;
948 if (strcmp(*args
, "srst_push_pull") == 0)
949 tmp
|= RESET_SRST_PUSH_PULL
;
950 else if (strcmp(*args
, "srst_open_drain") == 0)
951 /* open drain from adapter - default */;
955 LOG_ERROR("extra reset_config %s spec (%s)",
957 return ERROR_INVALID_ARGUMENTS
;
962 /* caller provided nonsense; fail */
963 LOG_ERROR("unknown reset_config flag (%s)", *args
);
964 return ERROR_INVALID_ARGUMENTS
;
967 /* Remember the bits which were specified (mask)
968 * and their new values (new_cfg).
974 /* clear previous values of those bits, save new values */
975 enum reset_types old_cfg
= jtag_get_reset_config();
978 jtag_set_reset_config(new_cfg
);
983 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
,
984 char *cmd
, char **args
, int argc
)
987 return ERROR_COMMAND_SYNTAX_ERROR
;
991 int retval
= parse_uint(args
[0], &delay
);
992 if (ERROR_OK
!= retval
)
994 jtag_set_nsrst_delay(delay
);
996 command_print(cmd_ctx
, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
1000 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
,
1001 char *cmd
, char **args
, int argc
)
1004 return ERROR_COMMAND_SYNTAX_ERROR
;
1008 int retval
= parse_uint(args
[0], &delay
);
1009 if (ERROR_OK
!= retval
)
1011 jtag_set_ntrst_delay(delay
);
1013 command_print(cmd_ctx
, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
1017 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1019 int retval
= ERROR_OK
;
1022 return ERROR_COMMAND_SYNTAX_ERROR
;
1025 LOG_DEBUG("handle jtag speed");
1027 unsigned cur_speed
= 0;
1028 int retval
= parse_uint(args
[0], &cur_speed
);
1029 if (ERROR_OK
!= retval
)
1031 retval
= jtag_set_speed(cur_speed
);
1034 command_print(cmd_ctx
, "jtag_speed: %d", jtag_get_speed());
1039 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1042 return ERROR_COMMAND_SYNTAX_ERROR
;
1044 int retval
= ERROR_OK
;
1048 int retval
= parse_uint(args
[0], &khz
);
1049 if (ERROR_OK
!= retval
)
1051 retval
= jtag_config_khz(khz
);
1052 if (ERROR_OK
!= retval
)
1056 int cur_speed
= jtag_get_speed_khz();
1057 retval
= jtag_get_speed_readable(&cur_speed
);
1058 if (ERROR_OK
!= retval
)
1062 command_print(cmd_ctx
, "%d kHz", cur_speed
);
1064 command_print(cmd_ctx
, "RCLK - adaptive");
1069 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
,
1070 char *cmd
, char **args
, int argc
)
1073 return ERROR_COMMAND_SYNTAX_ERROR
;
1076 if (args
[0][0] == '1')
1078 else if (args
[0][0] == '0')
1081 return ERROR_COMMAND_SYNTAX_ERROR
;
1084 if (args
[1][0] == '1')
1086 else if (args
[1][0] == '0')
1089 return ERROR_COMMAND_SYNTAX_ERROR
;
1091 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
1092 return ERROR_JTAG_INIT_FAILED
;
1094 jtag_add_reset(trst
, srst
);
1095 jtag_execute_queue();
1100 static int handle_runtest_command(struct command_context_s
*cmd_ctx
,
1101 char *cmd
, char **args
, int argc
)
1104 return ERROR_COMMAND_SYNTAX_ERROR
;
1106 unsigned num_clocks
;
1107 int retval
= parse_uint(args
[0], &num_clocks
);
1108 if (ERROR_OK
!= retval
)
1111 jtag_add_runtest(num_clocks
, jtag_get_end_state());
1112 jtag_execute_queue();
1118 * For "irscan" or "drscan" commands, the "end" (really, "next") state
1119 * should be stable ... and *NOT* a shift state, otherwise free-running
1120 * jtag clocks could change the values latched by the update state.
1122 static bool scan_is_safe(tap_state_t state
)
1137 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1140 scan_field_t
*fields
;
1142 tap_state_t endstate
;
1144 if ((argc
< 2) || (argc
% 2))
1146 return ERROR_COMMAND_SYNTAX_ERROR
;
1149 /* optional "-endstate" "statename" at the end of the arguments,
1150 * so that e.g. IRPAUSE can let us load the data register before
1151 * entering RUN/IDLE to execute the instruction we load here.
1153 endstate
= TAP_IDLE
;
1156 /* have at least one pair of numbers. */
1157 /* is last pair the magic text? */
1158 if( 0 == strcmp( "-endstate", args
[ argc
- 2 ] ) ){
1161 cpA
= args
[ argc
-1 ];
1162 for( endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++ ){
1163 cpS
= tap_state_name( endstate
);
1164 if( 0 == strcmp( cpA
, cpS
) ){
1168 if( endstate
>= TAP_NUM_STATES
){
1169 return ERROR_COMMAND_SYNTAX_ERROR
;
1171 if (!scan_is_safe(endstate
))
1172 LOG_WARNING("irscan with unsafe "
1173 "endstate \"%s\"", cpA
);
1174 /* found - remove the last 2 args */
1180 int num_fields
= argc
/ 2;
1181 size_t fields_len
= sizeof(scan_field_t
) * num_fields
;
1182 fields
= malloc(fields_len
);
1183 memset(fields
, 0, fields_len
);
1186 for (i
= 0; i
< num_fields
; i
++)
1188 tap
= jtag_tap_by_string( args
[i
*2] );
1191 command_print( cmd_ctx
, "Tap: %s unknown", args
[i
*2] );
1194 int field_size
= tap
->ir_length
;
1195 fields
[i
].tap
= tap
;
1196 fields
[i
].num_bits
= field_size
;
1197 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
1200 retval
= parse_u32(args
[i
* 2 + 1], &value
);
1201 if (ERROR_OK
!= retval
)
1203 buf_set_u32(fields
[i
].out_value
, 0, field_size
, value
);
1204 fields
[i
].in_value
= NULL
;
1207 /* did we have an endstate? */
1208 jtag_add_ir_scan(num_fields
, fields
, endstate
);
1210 retval
= jtag_execute_queue();
1213 for (i
= 0; i
< num_fields
; i
++)
1215 if (NULL
!= fields
[i
].out_value
)
1216 free(fields
[i
].out_value
);
1224 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1227 scan_field_t
*fields
;
1229 int field_count
= 0;
1232 tap_state_t endstate
;
1235 * args[2] = num_bits
1236 * args[3] = hex string
1237 * ... repeat num bits and hex string ...
1240 * args[N-2] = "-endstate"
1241 * args[N-1] = statename
1243 if ((argc
< 4) || ((argc
% 2)!=0))
1245 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1249 endstate
= TAP_IDLE
;
1251 script_debug(interp
, "drscan", argc
, args
);
1253 /* validate arguments as numbers */
1255 for (i
= 2; i
< argc
; i
+=2)
1260 e
= Jim_GetLong(interp
, args
[i
], &bits
);
1261 /* If valid - try next arg */
1266 /* Not valid.. are we at the end? */
1267 if ( ((i
+2) != argc
) ){
1268 /* nope, then error */
1272 /* it could be: "-endstate FOO"
1273 * e.g. DRPAUSE so we can issue more instructions
1274 * before entering RUN/IDLE and executing them.
1277 /* get arg as a string. */
1278 cp
= Jim_GetString( args
[i
], NULL
);
1279 /* is it the magic? */
1280 if( 0 == strcmp( "-endstate", cp
) ){
1281 /* is the statename valid? */
1282 cp
= Jim_GetString( args
[i
+1], NULL
);
1284 /* see if it is a valid state name */
1285 endstate
= tap_state_by_name(cp
);
1287 /* update the error message */
1288 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1290 if (!scan_is_safe(endstate
))
1291 LOG_WARNING("drscan with unsafe "
1292 "endstate \"%s\"", cp
);
1294 /* valid - so clear the error */
1296 /* and remove the last 2 args */
1301 /* Still an error? */
1303 return e
; /* too bad */
1305 } /* validate args */
1307 tap
= jtag_tap_by_jim_obj( interp
, args
[1] );
1312 num_fields
=(argc
-2)/2;
1313 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
1314 for (i
= 2; i
< argc
; i
+=2)
1320 Jim_GetLong(interp
, args
[i
], &bits
);
1321 str
= Jim_GetString(args
[i
+1], &len
);
1323 fields
[field_count
].tap
= tap
;
1324 fields
[field_count
].num_bits
= bits
;
1325 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
1326 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
1327 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
1331 jtag_add_dr_scan(num_fields
, fields
, endstate
);
1333 retval
= jtag_execute_queue();
1334 if (retval
!= ERROR_OK
)
1336 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
1341 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
1342 for (i
= 2; i
< argc
; i
+=2)
1347 Jim_GetLong(interp
, args
[i
], &bits
);
1348 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
1349 free(fields
[field_count
].out_value
);
1351 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
1356 Jim_SetResult(interp
, list
);
1364 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1366 tap_state_t states
[8];
1368 if ((argc
< 2) || ((size_t)argc
> (sizeof(states
)/sizeof(*states
)+1)))
1370 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1374 script_debug(interp
, "pathmove", argc
, args
);
1377 for (i
=0; i
<argc
-1; i
++)
1380 cp
= Jim_GetString( args
[i
+1], NULL
);
1381 states
[i
] = tap_state_by_name(cp
);
1384 /* update the error message */
1385 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1390 if ((jtag_add_statemove(states
[0]) != ERROR_OK
) || ( jtag_execute_queue()!= ERROR_OK
))
1392 Jim_SetResultString(interp
, "pathmove: jtag execute failed",-1);
1396 jtag_add_pathmove(argc
-2, states
+1);
1398 if (jtag_execute_queue()!= ERROR_OK
)
1400 Jim_SetResultString(interp
, "pathmove: failed",-1);
1408 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1410 script_debug(interp
, "flush_count", argc
, args
);
1412 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_get_flush_queue_count()));
1418 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1421 return ERROR_COMMAND_SYNTAX_ERROR
;
1425 if (strcmp(args
[0], "enable") == 0)
1426 jtag_set_verify_capture_ir(true);
1427 else if (strcmp(args
[0], "disable") == 0)
1428 jtag_set_verify_capture_ir(false);
1430 return ERROR_COMMAND_SYNTAX_ERROR
;
1433 const char *status
= jtag_will_verify_capture_ir() ? "enabled": "disabled";
1434 command_print(cmd_ctx
, "verify Capture-IR is %s", status
);
1439 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1442 return ERROR_COMMAND_SYNTAX_ERROR
;
1446 if (strcmp(args
[0], "enable") == 0)
1447 jtag_set_verify(true);
1448 else if (strcmp(args
[0], "disable") == 0)
1449 jtag_set_verify(false);
1451 return ERROR_COMMAND_SYNTAX_ERROR
;
1454 const char *status
= jtag_will_verify() ? "enabled": "disabled";
1455 command_print(cmd_ctx
, "verify jtag capture is %s", status
);
1460 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1463 return ERROR_COMMAND_SYNTAX_ERROR
;
1468 if (strcmp(args
[0], "short") == 0)
1469 use_new_table
= true;
1470 else if (strcmp(args
[0], "long") == 0)
1471 use_new_table
= false;
1473 return ERROR_COMMAND_SYNTAX_ERROR
;
1475 tap_use_new_tms_table(use_new_table
);
1478 command_print(cmd_ctx
, "tms sequence is %s",
1479 tap_uses_new_tms_table() ? "short": "long");
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)