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 /* flag if the kHz speed was defined */
43 static bool hasKHz
= false;
45 /* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
48 #if BUILD_ECOSBOARD == 1
49 extern jtag_interface_t zy1000_interface
;
50 #elif defined(BUILD_MINIDRIVER_DUMMY)
51 extern jtag_interface_t minidummy_interface
;
52 #else // standard drivers
53 #if BUILD_PARPORT == 1
54 extern jtag_interface_t parport_interface
;
58 extern jtag_interface_t dummy_interface
;
61 #if BUILD_FT2232_FTD2XX == 1
62 extern jtag_interface_t ft2232_interface
;
65 #if BUILD_FT2232_LIBFTDI == 1
66 extern jtag_interface_t ft2232_interface
;
69 #if BUILD_AMTJTAGACCEL == 1
70 extern jtag_interface_t amt_jtagaccel_interface
;
74 extern jtag_interface_t ep93xx_interface
;
77 #if BUILD_AT91RM9200 == 1
78 extern jtag_interface_t at91rm9200_interface
;
81 #if BUILD_GW16012 == 1
82 extern jtag_interface_t gw16012_interface
;
85 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
86 extern jtag_interface_t presto_interface
;
89 #if BUILD_USBPROG == 1
90 extern jtag_interface_t usbprog_interface
;
94 extern jtag_interface_t jlink_interface
;
97 #if BUILD_VSLLINK == 1
98 extern jtag_interface_t vsllink_interface
;
102 extern jtag_interface_t rlink_interface
;
105 #if BUILD_ARMJTAGEW == 1
106 extern jtag_interface_t armjtagew_interface
;
108 #endif // standard drivers
111 * The list of built-in JTAG interfaces, containing entries for those
112 * drivers that were enabled by the @c configure script.
114 * The list should be defined to contain either one minidriver interface
115 * or some number of standard driver interfaces, never both.
117 jtag_interface_t
*jtag_interfaces
[] = {
118 #if BUILD_ECOSBOARD == 1
120 #elif defined(BUILD_MINIDRIVER_DUMMY)
121 &minidummy_interface
,
122 #else // standard drivers
123 #if BUILD_PARPORT == 1
129 #if BUILD_FT2232_FTD2XX == 1
132 #if BUILD_FT2232_LIBFTDI == 1
135 #if BUILD_AMTJTAGACCEL == 1
136 &amt_jtagaccel_interface
,
138 #if BUILD_EP93XX == 1
141 #if BUILD_AT91RM9200 == 1
142 &at91rm9200_interface
,
144 #if BUILD_GW16012 == 1
147 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
150 #if BUILD_USBPROG == 1
156 #if BUILD_VSLLINK == 1
162 #if BUILD_ARMJTAGEW == 1
163 &armjtagew_interface
,
165 #endif // standard drivers
169 extern struct jtag_interface_s
*jtag
;
170 extern jtag_interface_t
*jtag_interface
;
173 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
174 char *cmd
, char **args
, int argc
);
175 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
176 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
177 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
178 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
179 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
180 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
181 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
183 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
185 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
186 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
187 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
188 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
189 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
);
191 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
192 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
193 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
195 extern int jtag_examine_chain(void);
196 extern int jtag_validate_chain(void);
198 enum jtag_tap_cfg_param
{
202 static Jim_Nvp nvp_config_opts
[] = {
203 { .name
= "-event", .value
= JCFG_EVENT
},
205 { .name
= NULL
, .value
= -1 }
208 static int jtag_tap_configure_cmd( Jim_GetOptInfo
*goi
, jtag_tap_t
* tap
)
214 /* parse config or cget options */
215 while (goi
->argc
> 0) {
216 Jim_SetEmptyResult (goi
->interp
);
218 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
220 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
226 if (goi
->argc
== 0) {
227 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ..." );
231 e
= Jim_GetOpt_Nvp( goi
, nvp_jtag_tap_event
, &n
);
233 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
237 if (goi
->isconfigure
) {
238 if (goi
->argc
!= 1) {
239 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
243 if (goi
->argc
!= 0) {
244 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
250 jtag_tap_event_action_t
*jteap
;
252 jteap
= tap
->event_action
;
253 /* replace existing? */
255 if (jteap
->event
== (enum jtag_tap_event
)n
->value
) {
261 if (goi
->isconfigure
) {
264 jteap
= calloc(1, sizeof (*jteap
));
266 jteap
->event
= n
->value
;
267 Jim_GetOpt_Obj( goi
, &o
);
269 Jim_DecrRefCount(interp
, jteap
->body
);
271 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
272 Jim_IncrRefCount(jteap
->body
);
274 /* add to head of event list */
275 jteap
->next
= tap
->event_action
;
276 tap
->event_action
= jteap
;
277 Jim_SetEmptyResult(goi
->interp
);
281 Jim_SetEmptyResult(goi
->interp
);
283 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
290 } /* while (goi->argc) */
296 extern void jtag_tap_init(jtag_tap_t
*tap
);
297 extern void jtag_tap_free(jtag_tap_t
*tap
);
299 static int jim_newtap_cmd( Jim_GetOptInfo
*goi
)
308 const Jim_Nvp opts
[] = {
309 #define NTAP_OPT_IRLEN 0
310 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
311 #define NTAP_OPT_IRMASK 1
312 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
313 #define NTAP_OPT_IRCAPTURE 2
314 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
315 #define NTAP_OPT_ENABLED 3
316 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
317 #define NTAP_OPT_DISABLED 4
318 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
319 #define NTAP_OPT_EXPECTED_ID 5
320 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
321 { .name
= NULL
, .value
= -1 },
324 pTap
= malloc( sizeof(jtag_tap_t
) );
325 memset( pTap
, 0, sizeof(*pTap
) );
327 Jim_SetResult_sprintf( goi
->interp
, "no memory");
331 * we expect CHIP + TAP + OPTIONS
334 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
337 Jim_GetOpt_String( goi
, &cp
, NULL
);
338 pTap
->chip
= strdup(cp
);
340 Jim_GetOpt_String( goi
, &cp
, NULL
);
341 pTap
->tapname
= strdup(cp
);
343 /* name + dot + name + null */
344 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
346 sprintf( cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
347 pTap
->dotted_name
= cp
;
349 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
350 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
352 /* default is enabled */
355 /* deal with options */
356 #define NTREQ_IRLEN 1
357 #define NTREQ_IRCAPTURE 2
358 #define NTREQ_IRMASK 4
360 /* clear them as we find them */
361 reqbits
= (NTREQ_IRLEN
| NTREQ_IRCAPTURE
| NTREQ_IRMASK
);
364 e
= Jim_GetOpt_Nvp( goi
, opts
, &n
);
366 Jim_GetOpt_NvpUnknown( goi
, opts
, 0 );
369 LOG_DEBUG("Processing option: %s", n
->name
);
371 case NTAP_OPT_ENABLED
:
374 case NTAP_OPT_DISABLED
:
377 case NTAP_OPT_EXPECTED_ID
:
379 u32
*new_expected_ids
;
381 e
= Jim_GetOpt_Wide( goi
, &w
);
383 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
387 new_expected_ids
= malloc(sizeof(u32
) * (pTap
->expected_ids_cnt
+ 1));
388 if (new_expected_ids
== NULL
) {
389 Jim_SetResult_sprintf( goi
->interp
, "no memory");
393 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(u32
) * pTap
->expected_ids_cnt
);
395 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
397 free(pTap
->expected_ids
);
398 pTap
->expected_ids
= new_expected_ids
;
399 pTap
->expected_ids_cnt
++;
403 case NTAP_OPT_IRMASK
:
404 case NTAP_OPT_IRCAPTURE
:
405 e
= Jim_GetOpt_Wide( goi
, &w
);
407 Jim_SetResult_sprintf( goi
->interp
, "option: %s bad parameter", n
->name
);
410 if( (w
< 0) || (w
> 0xffff) ){
412 Jim_SetResult_sprintf( goi
->interp
, "option: %s - wacky value: %d (0x%x)",
413 n
->name
, (int)(w
), (int)(w
));
419 reqbits
&= (~(NTREQ_IRLEN
));
421 case NTAP_OPT_IRMASK
:
422 pTap
->ir_capture_mask
= w
;
423 reqbits
&= (~(NTREQ_IRMASK
));
425 case NTAP_OPT_IRCAPTURE
:
426 pTap
->ir_capture_value
= w
;
427 reqbits
&= (~(NTREQ_IRCAPTURE
));
430 } /* switch(n->value) */
431 } /* while( goi->argc ) */
433 /* Did all the required option bits get cleared? */
440 Jim_SetResult_sprintf(goi
->interp
,
441 "newtap: %s missing required parameters",
447 static int jim_jtag_command( Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
453 struct command_context_s
*context
;
461 JTAG_CMD_TAPISENABLED
,
466 const Jim_Nvp jtag_cmds
[] = {
467 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
468 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
469 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
470 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
471 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
472 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
473 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
474 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
476 { .name
= NULL
, .value
= -1 },
479 context
= Jim_GetAssocData(interp
, "context");
480 /* go past the command */
481 Jim_GetOpt_Setup( &goi
, interp
, argc
-1, argv
+1 );
483 e
= Jim_GetOpt_Nvp( &goi
, jtag_cmds
, &n
);
485 Jim_GetOpt_NvpUnknown( &goi
, jtag_cmds
, 0 );
488 Jim_SetEmptyResult( goi
.interp
);
490 case JTAG_CMD_INTERFACE
:
491 /* return the name of the interface */
492 /* TCL code might need to know the exact type... */
493 /* FUTURE: we allow this as a means to "set" the interface. */
495 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
498 Jim_SetResultString( goi
.interp
, jtag_interface
->name
, -1 );
500 case JTAG_CMD_INIT_RESET
:
502 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
505 e
= jtag_init_reset(context
);
507 Jim_SetResult_sprintf( goi
.interp
, "error: %d", e
);
511 case JTAG_CMD_NEWTAP
:
512 return jim_newtap_cmd( &goi
);
514 case JTAG_CMD_TAPISENABLED
:
515 case JTAG_CMD_TAPENABLE
:
516 case JTAG_CMD_TAPDISABLE
:
518 Jim_SetResultString( goi
.interp
, "Too many parameters",-1 );
524 t
= jtag_tap_by_jim_obj( goi
.interp
, goi
.argv
[0] );
529 case JTAG_CMD_TAPISENABLED
:
532 case JTAG_CMD_TAPENABLE
:
533 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_ENABLE
);
537 case JTAG_CMD_TAPDISABLE
:
538 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_DISABLE
);
543 Jim_SetResult( goi
.interp
, Jim_NewIntObj( goi
.interp
, e
) );
550 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ...");
557 Jim_GetOpt_Obj(&goi
, &o
);
558 t
= jtag_tap_by_jim_obj( goi
.interp
, o
);
564 return jtag_tap_configure_cmd( &goi
, t
);
568 case JTAG_CMD_CONFIGURE
:
570 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ?VALUE? ...");
577 Jim_GetOpt_Obj(&goi
, &o
);
578 t
= jtag_tap_by_jim_obj( goi
.interp
, o
);
584 return jtag_tap_configure_cmd( &goi
, t
);
591 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
593 register_jim( cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
595 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
596 COMMAND_CONFIG
, "try to configure interface");
597 register_command(cmd_ctx
, NULL
,
598 "interface_list", &handle_interface_list_command
,
599 COMMAND_ANY
, "list all built-in interfaces");
600 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
601 COMMAND_ANY
, "(DEPRECATED) set jtag speed (if supported)");
602 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
603 COMMAND_ANY
, "set maximum jtag speed (if supported); "
604 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
605 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
606 COMMAND_CONFIG
, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
607 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
609 "[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]");
610 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
611 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
612 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
613 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
615 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
616 COMMAND_EXEC
, "print current scan chain configuration");
618 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
619 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
620 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
621 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
622 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
623 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
624 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
625 register_jim(cmd_ctx
, "flush_count", Jim_Command_flush_count
, "returns number of times the JTAG queue has been flushed");
627 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
628 COMMAND_ANY
, "verify value captured during Capture-IR <enable|disable>");
629 register_command(cmd_ctx
, NULL
, "verify_jtag", handle_verify_jtag_command
,
630 COMMAND_ANY
, "verify value capture <enable|disable>");
631 register_command(cmd_ctx
, NULL
, "tms_sequence", handle_tms_sequence_command
,
632 COMMAND_ANY
, "choose short(default) or long tms_sequence <short|long>");
636 static int default_khz(int khz
, int *jtag_speed
)
638 LOG_ERROR("Translation from khz to jtag_speed not implemented");
642 static int default_speed_div(int speed
, int *khz
)
644 LOG_ERROR("Translation from jtag_speed to khz not implemented");
648 static int default_power_dropout(int *dropout
)
650 *dropout
=0; /* by default we can't detect power dropout */
654 static int default_srst_asserted(int *srst_asserted
)
656 *srst_asserted
=0; /* by default we can't detect srst asserted */
660 static int handle_interface_command(struct command_context_s
*cmd_ctx
,
661 char *cmd
, char **args
, int argc
)
663 /* check whether the interface is already configured */
666 LOG_WARNING("Interface already configured, ignoring");
670 /* interface name is a mandatory argument */
671 if (argc
!= 1 || args
[0][0] == '\0')
672 return ERROR_COMMAND_SYNTAX_ERROR
;
674 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
676 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) != 0)
679 int retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
);
680 if (ERROR_OK
!= retval
)
683 jtag_interface
= jtag_interfaces
[i
];
685 if (jtag_interface
->khz
== NULL
)
686 jtag_interface
->khz
= default_khz
;
687 if (jtag_interface
->speed_div
== NULL
)
688 jtag_interface
->speed_div
= default_speed_div
;
689 if (jtag_interface
->power_dropout
== NULL
)
690 jtag_interface
->power_dropout
= default_power_dropout
;
691 if (jtag_interface
->srst_asserted
== NULL
)
692 jtag_interface
->srst_asserted
= default_srst_asserted
;
697 /* no valid interface was found (i.e. the configuration option,
698 * didn't match one of the compiled-in interfaces
700 LOG_ERROR("The specified JTAG interface was not found (%s)", args
[0]);
701 handle_interface_list_command(cmd_ctx
, cmd
, args
, argc
);
702 return ERROR_JTAG_INVALID_INTERFACE
;
705 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
706 char *cmd
, char **args
, int argc
)
708 if (strcmp(cmd
, "interface_list") == 0 && argc
> 0)
709 return ERROR_COMMAND_SYNTAX_ERROR
;
711 command_print(cmd_ctx
, "The following JTAG interfaces are available:");
712 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
714 const char *name
= jtag_interfaces
[i
]->name
;
715 command_print(cmd_ctx
, "%u: %s", i
+ 1, name
);
721 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
725 Jim_Obj
*newargs
[ 10 ];
729 * argv[ 0] = ir length
730 * argv[ 1] = ir capture
732 * argv[ 3] = not actually used by anything but in the docs
736 command_print( cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
739 command_print( cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
740 command_print( cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
744 command_print( cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
745 command_print( cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
746 command_print( cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
747 command_print( cmd_ctx
, "And then refer to the taps by the dotted name.");
749 newargs
[0] = Jim_NewStringObj( interp
, "jtag", -1 );
750 newargs
[1] = Jim_NewStringObj( interp
, "newtap", -1 );
751 sprintf( buf
, "chip%d", jtag_tap_count() );
752 newargs
[2] = Jim_NewStringObj( interp
, buf
, -1 );
753 sprintf( buf
, "tap%d", jtag_tap_count() );
754 newargs
[3] = Jim_NewStringObj( interp
, buf
, -1 );
755 newargs
[4] = Jim_NewStringObj( interp
, "-irlen", -1 );
756 newargs
[5] = Jim_NewStringObj( interp
, args
[0], -1 );
757 newargs
[6] = Jim_NewStringObj( interp
, "-ircapture", -1 );
758 newargs
[7] = Jim_NewStringObj( interp
, args
[1], -1 );
759 newargs
[8] = Jim_NewStringObj( interp
, "-irmask", -1 );
760 newargs
[9] = Jim_NewStringObj( interp
, args
[2], -1 );
762 command_print( cmd_ctx
, "NEW COMMAND:");
763 sprintf( buf
, "%s %s %s %s %s %s %s %s %s %s",
764 Jim_GetString( newargs
[0], NULL
),
765 Jim_GetString( newargs
[1], NULL
),
766 Jim_GetString( newargs
[2], NULL
),
767 Jim_GetString( newargs
[3], NULL
),
768 Jim_GetString( newargs
[4], NULL
),
769 Jim_GetString( newargs
[5], NULL
),
770 Jim_GetString( newargs
[6], NULL
),
771 Jim_GetString( newargs
[7], NULL
),
772 Jim_GetString( newargs
[8], NULL
),
773 Jim_GetString( newargs
[9], NULL
) );
775 e
= jim_jtag_command( interp
, 10, newargs
);
777 command_print( cmd_ctx
, "%s", Jim_GetString( Jim_GetResult(interp
), NULL
) );
782 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
786 tap
= jtag_all_taps();
787 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
788 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
791 u32 expected
, expected_mask
, cur_instr
, ii
;
792 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
793 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
794 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
796 command_print(cmd_ctx
,
797 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
798 tap
->abs_chain_position
,
800 tap
->enabled
? 'Y' : 'n',
802 (tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
808 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
809 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
810 tap
->expected_ids
[ii
]);
819 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
825 return ERROR_COMMAND_SYNTAX_ERROR
;
827 /* Original versions cared about the order of these tokens:
828 * reset_config signals [combination [trst_type [srst_type]]]
829 * They also clobbered the previous configuration even on error.
831 * Here we don't care about the order, and only change values
832 * which have been explicitly specified.
834 for (; argc
; argc
--, args
++) {
839 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
840 if (strcmp(*args
, "none") == 0)
842 else if (strcmp(*args
, "trst_only") == 0)
843 tmp
= RESET_HAS_TRST
;
844 else if (strcmp(*args
, "srst_only") == 0)
845 tmp
= RESET_HAS_SRST
;
846 else if (strcmp(*args
, "trst_and_srst") == 0)
847 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
851 LOG_ERROR("extra reset_config %s spec (%s)",
853 return ERROR_INVALID_ARGUMENTS
;
858 /* combination (options for broken wiring) */
859 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
860 if (strcmp(*args
, "separate") == 0)
861 /* separate reset lines - default */;
862 else if (strcmp(*args
, "srst_pulls_trst") == 0)
863 tmp
|= RESET_SRST_PULLS_TRST
;
864 else if (strcmp(*args
, "trst_pulls_srst") == 0)
865 tmp
|= RESET_TRST_PULLS_SRST
;
866 else if (strcmp(*args
, "combined") == 0)
867 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
871 LOG_ERROR("extra reset_config %s spec (%s)",
872 "combination", *args
);
873 return ERROR_INVALID_ARGUMENTS
;
878 /* trst_type (NOP without HAS_TRST) */
879 m
= RESET_TRST_OPEN_DRAIN
;
880 if (strcmp(*args
, "trst_open_drain") == 0)
881 tmp
|= RESET_TRST_OPEN_DRAIN
;
882 else if (strcmp(*args
, "trst_push_pull") == 0)
883 /* push/pull from adapter - default */;
887 LOG_ERROR("extra reset_config %s spec (%s)",
889 return ERROR_INVALID_ARGUMENTS
;
894 /* srst_type (NOP without HAS_SRST) */
895 m
|= RESET_SRST_PUSH_PULL
;
896 if (strcmp(*args
, "srst_push_pull") == 0)
897 tmp
|= RESET_SRST_PUSH_PULL
;
898 else if (strcmp(*args
, "srst_open_drain") == 0)
899 /* open drain from adapter - default */;
903 LOG_ERROR("extra reset_config %s spec (%s)",
905 return ERROR_INVALID_ARGUMENTS
;
910 /* caller provided nonsense; fail */
911 LOG_ERROR("unknown reset_config flag (%s)", *args
);
912 return ERROR_INVALID_ARGUMENTS
;
915 /* Remember the bits which were specified (mask)
916 * and their new values (new_cfg).
922 /* clear previous values of those bits, save new values */
923 jtag_reset_config
&= ~mask
;
924 jtag_reset_config
|= new_cfg
;
929 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
,
930 char *cmd
, char **args
, int argc
)
933 return ERROR_COMMAND_SYNTAX_ERROR
;
935 jtag_set_nsrst_delay(strtoul(args
[0], NULL
, 0));
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
;
946 jtag_set_ntrst_delay(strtoul(args
[0], NULL
, 0));
947 command_print(cmd_ctx
, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
951 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
953 int retval
= ERROR_OK
;
956 return ERROR_COMMAND_SYNTAX_ERROR
;
959 LOG_DEBUG("handle jtag speed");
962 cur_speed
= jtag_speed
= strtoul(args
[0], NULL
, 0);
964 /* this command can be called during CONFIG,
965 * in which case jtag isn't initialized */
967 retval
= jtag
->speed(cur_speed
);
969 command_print(cmd_ctx
, "jtag_speed: %d", jtag_speed
);
974 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
977 return ERROR_COMMAND_SYNTAX_ERROR
;
979 int retval
= ERROR_OK
;
983 LOG_DEBUG("handle jtag khz");
985 jtag_set_speed_khz(strtoul(args
[0], NULL
, 0));
988 LOG_DEBUG("have interface set up");
990 retval
= jtag
->khz(jtag_get_speed_khz(), &speed_div1
);
991 if (ERROR_OK
!= retval
)
993 jtag_set_speed_khz(0);
996 cur_speed
= jtag_speed
= speed_div1
;
998 retval
= jtag
->speed(cur_speed
);
1004 cur_speed
= jtag_get_speed_khz();
1007 retval
= jtag
->speed_div(jtag_speed
, &cur_speed
);
1008 if (ERROR_OK
!= retval
)
1013 command_print(cmd_ctx
, "%d kHz", cur_speed
);
1015 command_print(cmd_ctx
, "RCLK - adaptive");
1020 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
,
1021 char *cmd
, char **args
, int argc
)
1024 return ERROR_COMMAND_SYNTAX_ERROR
;
1027 if (args
[0][0] == '1')
1029 else if (args
[0][0] == '0')
1032 return ERROR_COMMAND_SYNTAX_ERROR
;
1035 if (args
[1][0] == '1')
1037 else if (args
[1][0] == '0')
1040 return ERROR_COMMAND_SYNTAX_ERROR
;
1042 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
1043 return ERROR_JTAG_INIT_FAILED
;
1045 jtag_add_reset(trst
, srst
);
1046 jtag_execute_queue();
1051 static int handle_runtest_command(struct command_context_s
*cmd_ctx
,
1052 char *cmd
, char **args
, int argc
)
1055 return ERROR_COMMAND_SYNTAX_ERROR
;
1057 jtag_add_runtest(strtol(args
[0], NULL
, 0), jtag_get_end_state());
1058 jtag_execute_queue();
1064 * For "irscan" or "drscan" commands, the "end" (really, "next") state
1065 * should be stable ... and *NOT* a shift state, otherwise free-running
1066 * jtag clocks could change the values latched by the update state.
1068 static bool scan_is_safe(tap_state_t state
)
1083 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1086 scan_field_t
*fields
;
1088 tap_state_t endstate
;
1090 if ((argc
< 2) || (argc
% 2))
1092 return ERROR_COMMAND_SYNTAX_ERROR
;
1095 /* optional "-endstate" "statename" at the end of the arguments,
1096 * so that e.g. IRPAUSE can let us load the data register before
1097 * entering RUN/IDLE to execute the instruction we load here.
1099 endstate
= TAP_IDLE
;
1102 /* have at least one pair of numbers. */
1103 /* is last pair the magic text? */
1104 if( 0 == strcmp( "-endstate", args
[ argc
- 2 ] ) ){
1107 cpA
= args
[ argc
-1 ];
1108 for( endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++ ){
1109 cpS
= tap_state_name( endstate
);
1110 if( 0 == strcmp( cpA
, cpS
) ){
1114 if( endstate
>= TAP_NUM_STATES
){
1115 return ERROR_COMMAND_SYNTAX_ERROR
;
1117 if (!scan_is_safe(endstate
))
1118 LOG_WARNING("irscan with unsafe "
1119 "endstate \"%s\"", cpA
);
1120 /* found - remove the last 2 args */
1126 int num_fields
= argc
/ 2;
1128 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
1130 for (i
= 0; i
< num_fields
; i
++)
1132 tap
= jtag_tap_by_string( args
[i
*2] );
1135 command_print( cmd_ctx
, "Tap: %s unknown", args
[i
*2] );
1138 int field_size
= tap
->ir_length
;
1139 fields
[i
].tap
= tap
;
1140 fields
[i
].num_bits
= field_size
;
1141 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
1142 buf_set_u32(fields
[i
].out_value
, 0, field_size
, strtoul(args
[i
*2+1], NULL
, 0));
1143 fields
[i
].in_value
= NULL
;
1146 /* did we have an endstate? */
1147 jtag_add_ir_scan(num_fields
, fields
, endstate
);
1149 int retval
=jtag_execute_queue();
1151 for (i
= 0; i
< num_fields
; i
++)
1152 free(fields
[i
].out_value
);
1159 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1162 scan_field_t
*fields
;
1164 int field_count
= 0;
1167 tap_state_t endstate
;
1170 * args[2] = num_bits
1171 * args[3] = hex string
1172 * ... repeat num bits and hex string ...
1175 * args[N-2] = "-endstate"
1176 * args[N-1] = statename
1178 if ((argc
< 4) || ((argc
% 2)!=0))
1180 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1184 endstate
= TAP_IDLE
;
1186 /* validate arguments as numbers */
1188 for (i
= 2; i
< argc
; i
+=2)
1193 e
= Jim_GetLong(interp
, args
[i
], &bits
);
1194 /* If valid - try next arg */
1199 /* Not valid.. are we at the end? */
1200 if ( ((i
+2) != argc
) ){
1201 /* nope, then error */
1205 /* it could be: "-endstate FOO"
1206 * e.g. DRPAUSE so we can issue more instructions
1207 * before entering RUN/IDLE and executing them.
1210 /* get arg as a string. */
1211 cp
= Jim_GetString( args
[i
], NULL
);
1212 /* is it the magic? */
1213 if( 0 == strcmp( "-endstate", cp
) ){
1214 /* is the statename valid? */
1215 cp
= Jim_GetString( args
[i
+1], NULL
);
1217 /* see if it is a valid state name */
1218 endstate
= tap_state_by_name(cp
);
1220 /* update the error message */
1221 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1223 if (!scan_is_safe(endstate
))
1224 LOG_WARNING("drscan with unsafe "
1225 "endstate \"%s\"", cp
);
1227 /* valid - so clear the error */
1229 /* and remove the last 2 args */
1234 /* Still an error? */
1236 return e
; /* too bad */
1238 } /* validate args */
1240 tap
= jtag_tap_by_jim_obj( interp
, args
[1] );
1245 num_fields
=(argc
-2)/2;
1246 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
1247 for (i
= 2; i
< argc
; i
+=2)
1253 Jim_GetLong(interp
, args
[i
], &bits
);
1254 str
= Jim_GetString(args
[i
+1], &len
);
1256 fields
[field_count
].tap
= tap
;
1257 fields
[field_count
].num_bits
= bits
;
1258 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
1259 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
1260 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
1264 jtag_add_dr_scan(num_fields
, fields
, endstate
);
1266 retval
= jtag_execute_queue();
1267 if (retval
!= ERROR_OK
)
1269 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
1274 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
1275 for (i
= 2; i
< argc
; i
+=2)
1280 Jim_GetLong(interp
, args
[i
], &bits
);
1281 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
1282 free(fields
[field_count
].out_value
);
1284 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
1289 Jim_SetResult(interp
, list
);
1297 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1299 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_get_flush_queue_count()));
1305 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1309 if (strcmp(args
[0], "enable") == 0)
1311 jtag_verify_capture_ir
= 1;
1313 else if (strcmp(args
[0], "disable") == 0)
1315 jtag_verify_capture_ir
= 0;
1318 return ERROR_COMMAND_SYNTAX_ERROR
;
1320 } else if (argc
!= 0)
1322 return ERROR_COMMAND_SYNTAX_ERROR
;
1325 command_print(cmd_ctx
, "verify Capture-IR is %s", (jtag_verify_capture_ir
) ? "enabled": "disabled");
1330 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1333 return ERROR_COMMAND_SYNTAX_ERROR
;
1337 if (strcmp(args
[0], "enable") == 0)
1338 jtag_set_verify(true);
1339 else if (strcmp(args
[0], "disable") == 0)
1340 jtag_set_verify(false);
1342 return ERROR_COMMAND_SYNTAX_ERROR
;
1345 const char *status
= jtag_will_verify() ? "enabled": "disabled";
1346 command_print(cmd_ctx
, "verify jtag capture is %s", status
);
1351 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1354 return ERROR_COMMAND_SYNTAX_ERROR
;
1359 if (strcmp(args
[0], "short") == 0)
1360 use_new_table
= true;
1361 else if (strcmp(args
[0], "long") == 0)
1362 use_new_table
= false;
1364 return ERROR_COMMAND_SYNTAX_ERROR
;
1366 tap_use_new_tms_table(use_new_table
);
1369 command_print(cmd_ctx
, "tms sequence is %s",
1370 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)