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 extern const Jim_Nvp nvp_jtag_tap_event
[];
44 /* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
47 #if BUILD_ECOSBOARD == 1
48 extern jtag_interface_t zy1000_interface
;
49 #elif defined(BUILD_MINIDRIVER_DUMMY)
50 extern jtag_interface_t minidummy_interface
;
51 #else // standard drivers
52 #if BUILD_PARPORT == 1
53 extern jtag_interface_t parport_interface
;
57 extern jtag_interface_t dummy_interface
;
60 #if BUILD_FT2232_FTD2XX == 1
61 extern jtag_interface_t ft2232_interface
;
64 #if BUILD_FT2232_LIBFTDI == 1
65 extern jtag_interface_t ft2232_interface
;
68 #if BUILD_AMTJTAGACCEL == 1
69 extern jtag_interface_t amt_jtagaccel_interface
;
73 extern jtag_interface_t ep93xx_interface
;
76 #if BUILD_AT91RM9200 == 1
77 extern jtag_interface_t at91rm9200_interface
;
80 #if BUILD_GW16012 == 1
81 extern jtag_interface_t gw16012_interface
;
84 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
85 extern jtag_interface_t presto_interface
;
88 #if BUILD_USBPROG == 1
89 extern jtag_interface_t usbprog_interface
;
93 extern jtag_interface_t jlink_interface
;
96 #if BUILD_VSLLINK == 1
97 extern jtag_interface_t vsllink_interface
;
101 extern jtag_interface_t rlink_interface
;
104 #if BUILD_ARMJTAGEW == 1
105 extern jtag_interface_t armjtagew_interface
;
107 #endif // standard drivers
110 * The list of built-in JTAG interfaces, containing entries for those
111 * drivers that were enabled by the @c configure script.
113 * The list should be defined to contain either one minidriver interface
114 * or some number of standard driver interfaces, never both.
116 jtag_interface_t
*jtag_interfaces
[] = {
117 #if BUILD_ECOSBOARD == 1
119 #elif defined(BUILD_MINIDRIVER_DUMMY)
120 &minidummy_interface
,
121 #else // standard drivers
122 #if BUILD_PARPORT == 1
128 #if BUILD_FT2232_FTD2XX == 1
131 #if BUILD_FT2232_LIBFTDI == 1
134 #if BUILD_AMTJTAGACCEL == 1
135 &amt_jtagaccel_interface
,
137 #if BUILD_EP93XX == 1
140 #if BUILD_AT91RM9200 == 1
141 &at91rm9200_interface
,
143 #if BUILD_GW16012 == 1
146 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
149 #if BUILD_USBPROG == 1
155 #if BUILD_VSLLINK == 1
161 #if BUILD_ARMJTAGEW == 1
162 &armjtagew_interface
,
164 #endif // standard drivers
168 extern struct jtag_interface_s
*jtag
;
169 extern jtag_interface_t
*jtag_interface
;
172 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
173 char *cmd
, char **args
, int argc
);
174 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
175 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
176 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
177 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
178 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
179 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
180 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
182 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
184 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
185 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
186 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
187 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
188 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
);
190 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
191 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
192 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
194 extern int jtag_examine_chain(void);
195 extern int jtag_validate_chain(void);
197 enum jtag_tap_cfg_param
{
201 static Jim_Nvp nvp_config_opts
[] = {
202 { .name
= "-event", .value
= JCFG_EVENT
},
204 { .name
= NULL
, .value
= -1 }
207 static int jtag_tap_configure_cmd( Jim_GetOptInfo
*goi
, jtag_tap_t
* tap
)
213 /* parse config or cget options */
214 while (goi
->argc
> 0) {
215 Jim_SetEmptyResult (goi
->interp
);
217 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
219 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
225 if (goi
->argc
== 0) {
226 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ..." );
230 e
= Jim_GetOpt_Nvp( goi
, nvp_jtag_tap_event
, &n
);
232 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
236 if (goi
->isconfigure
) {
237 if (goi
->argc
!= 1) {
238 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
242 if (goi
->argc
!= 0) {
243 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
249 jtag_tap_event_action_t
*jteap
;
251 jteap
= tap
->event_action
;
252 /* replace existing? */
254 if (jteap
->event
== (enum jtag_tap_event
)n
->value
) {
260 if (goi
->isconfigure
) {
263 jteap
= calloc(1, sizeof (*jteap
));
265 jteap
->event
= n
->value
;
266 Jim_GetOpt_Obj( goi
, &o
);
268 Jim_DecrRefCount(interp
, jteap
->body
);
270 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
271 Jim_IncrRefCount(jteap
->body
);
273 /* add to head of event list */
274 jteap
->next
= tap
->event_action
;
275 tap
->event_action
= jteap
;
276 Jim_SetEmptyResult(goi
->interp
);
280 Jim_SetEmptyResult(goi
->interp
);
282 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
289 } /* while (goi->argc) */
295 extern void jtag_tap_init(jtag_tap_t
*tap
);
296 extern void jtag_tap_free(jtag_tap_t
*tap
);
298 static int jim_newtap_cmd( Jim_GetOptInfo
*goi
)
307 const Jim_Nvp opts
[] = {
308 #define NTAP_OPT_IRLEN 0
309 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
310 #define NTAP_OPT_IRMASK 1
311 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
312 #define NTAP_OPT_IRCAPTURE 2
313 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
314 #define NTAP_OPT_ENABLED 3
315 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
316 #define NTAP_OPT_DISABLED 4
317 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
318 #define NTAP_OPT_EXPECTED_ID 5
319 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
320 { .name
= NULL
, .value
= -1 },
323 pTap
= malloc( sizeof(jtag_tap_t
) );
324 memset( pTap
, 0, sizeof(*pTap
) );
326 Jim_SetResult_sprintf( goi
->interp
, "no memory");
330 * we expect CHIP + TAP + OPTIONS
333 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
336 Jim_GetOpt_String( goi
, &cp
, NULL
);
337 pTap
->chip
= strdup(cp
);
339 Jim_GetOpt_String( goi
, &cp
, NULL
);
340 pTap
->tapname
= strdup(cp
);
342 /* name + dot + name + null */
343 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
345 sprintf( cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
346 pTap
->dotted_name
= cp
;
348 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
349 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
351 /* default is enabled */
354 /* deal with options */
355 #define NTREQ_IRLEN 1
356 #define NTREQ_IRCAPTURE 2
357 #define NTREQ_IRMASK 4
359 /* clear them as we find them */
360 reqbits
= (NTREQ_IRLEN
| NTREQ_IRCAPTURE
| NTREQ_IRMASK
);
363 e
= Jim_GetOpt_Nvp( goi
, opts
, &n
);
365 Jim_GetOpt_NvpUnknown( goi
, opts
, 0 );
368 LOG_DEBUG("Processing option: %s", n
->name
);
370 case NTAP_OPT_ENABLED
:
373 case NTAP_OPT_DISABLED
:
376 case NTAP_OPT_EXPECTED_ID
:
378 u32
*new_expected_ids
;
380 e
= Jim_GetOpt_Wide( goi
, &w
);
382 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
386 new_expected_ids
= malloc(sizeof(u32
) * (pTap
->expected_ids_cnt
+ 1));
387 if (new_expected_ids
== NULL
) {
388 Jim_SetResult_sprintf( goi
->interp
, "no memory");
392 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(u32
) * pTap
->expected_ids_cnt
);
394 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
396 free(pTap
->expected_ids
);
397 pTap
->expected_ids
= new_expected_ids
;
398 pTap
->expected_ids_cnt
++;
402 case NTAP_OPT_IRMASK
:
403 case NTAP_OPT_IRCAPTURE
:
404 e
= Jim_GetOpt_Wide( goi
, &w
);
406 Jim_SetResult_sprintf( goi
->interp
, "option: %s bad parameter", n
->name
);
409 if( (w
< 0) || (w
> 0xffff) ){
411 Jim_SetResult_sprintf( goi
->interp
, "option: %s - wacky value: %d (0x%x)",
412 n
->name
, (int)(w
), (int)(w
));
418 reqbits
&= (~(NTREQ_IRLEN
));
420 case NTAP_OPT_IRMASK
:
421 pTap
->ir_capture_mask
= w
;
422 reqbits
&= (~(NTREQ_IRMASK
));
424 case NTAP_OPT_IRCAPTURE
:
425 pTap
->ir_capture_value
= w
;
426 reqbits
&= (~(NTREQ_IRCAPTURE
));
429 } /* switch(n->value) */
430 } /* while( goi->argc ) */
432 /* Did all the required option bits get cleared? */
439 Jim_SetResult_sprintf(goi
->interp
,
440 "newtap: %s missing required parameters",
446 static int jim_jtag_command( Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
452 struct command_context_s
*context
;
460 JTAG_CMD_TAPISENABLED
,
465 const Jim_Nvp jtag_cmds
[] = {
466 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
467 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
468 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
469 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
470 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
471 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
472 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
473 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
475 { .name
= NULL
, .value
= -1 },
478 context
= Jim_GetAssocData(interp
, "context");
479 /* go past the command */
480 Jim_GetOpt_Setup( &goi
, interp
, argc
-1, argv
+1 );
482 e
= Jim_GetOpt_Nvp( &goi
, jtag_cmds
, &n
);
484 Jim_GetOpt_NvpUnknown( &goi
, jtag_cmds
, 0 );
487 Jim_SetEmptyResult( goi
.interp
);
489 case JTAG_CMD_INTERFACE
:
490 /* return the name of the interface */
491 /* TCL code might need to know the exact type... */
492 /* FUTURE: we allow this as a means to "set" the interface. */
494 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
497 Jim_SetResultString( goi
.interp
, jtag_interface
->name
, -1 );
499 case JTAG_CMD_INIT_RESET
:
501 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
504 e
= jtag_init_reset(context
);
506 Jim_SetResult_sprintf( goi
.interp
, "error: %d", e
);
510 case JTAG_CMD_NEWTAP
:
511 return jim_newtap_cmd( &goi
);
513 case JTAG_CMD_TAPISENABLED
:
514 case JTAG_CMD_TAPENABLE
:
515 case JTAG_CMD_TAPDISABLE
:
517 Jim_SetResultString( goi
.interp
, "Too many parameters",-1 );
523 t
= jtag_tap_by_jim_obj( goi
.interp
, goi
.argv
[0] );
528 case JTAG_CMD_TAPISENABLED
:
531 case JTAG_CMD_TAPENABLE
:
532 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_ENABLE
);
536 case JTAG_CMD_TAPDISABLE
:
537 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_DISABLE
);
542 Jim_SetResult( goi
.interp
, Jim_NewIntObj( goi
.interp
, e
) );
549 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ...");
556 Jim_GetOpt_Obj(&goi
, &o
);
557 t
= jtag_tap_by_jim_obj( goi
.interp
, o
);
563 return jtag_tap_configure_cmd( &goi
, t
);
567 case JTAG_CMD_CONFIGURE
:
569 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ?VALUE? ...");
576 Jim_GetOpt_Obj(&goi
, &o
);
577 t
= jtag_tap_by_jim_obj( goi
.interp
, o
);
583 return jtag_tap_configure_cmd( &goi
, t
);
590 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
592 register_jim( cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
594 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
595 COMMAND_CONFIG
, "try to configure interface");
596 register_command(cmd_ctx
, NULL
,
597 "interface_list", &handle_interface_list_command
,
598 COMMAND_ANY
, "list all built-in interfaces");
599 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
600 COMMAND_ANY
, "(DEPRECATED) set jtag speed (if supported)");
601 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
602 COMMAND_ANY
, "set maximum jtag speed (if supported); "
603 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
604 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
605 COMMAND_CONFIG
, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
606 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
608 "[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]");
609 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
610 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
611 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
612 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
614 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
615 COMMAND_EXEC
, "print current scan chain configuration");
617 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
618 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
619 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
620 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
621 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
622 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
623 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
624 register_jim(cmd_ctx
, "flush_count", Jim_Command_flush_count
, "returns number of times the JTAG queue has been flushed");
626 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
627 COMMAND_ANY
, "verify value captured during Capture-IR <enable|disable>");
628 register_command(cmd_ctx
, NULL
, "verify_jtag", handle_verify_jtag_command
,
629 COMMAND_ANY
, "verify value capture <enable|disable>");
630 register_command(cmd_ctx
, NULL
, "tms_sequence", handle_tms_sequence_command
,
631 COMMAND_ANY
, "choose short(default) or long tms_sequence <short|long>");
635 static int default_khz(int khz
, int *jtag_speed
)
637 LOG_ERROR("Translation from khz to jtag_speed not implemented");
641 static int default_speed_div(int speed
, int *khz
)
643 LOG_ERROR("Translation from jtag_speed to khz not implemented");
647 static int default_power_dropout(int *dropout
)
649 *dropout
=0; /* by default we can't detect power dropout */
653 static int default_srst_asserted(int *srst_asserted
)
655 *srst_asserted
=0; /* by default we can't detect srst asserted */
659 static int handle_interface_command(struct command_context_s
*cmd_ctx
,
660 char *cmd
, char **args
, int argc
)
662 /* check whether the interface is already configured */
665 LOG_WARNING("Interface already configured, ignoring");
669 /* interface name is a mandatory argument */
670 if (argc
!= 1 || args
[0][0] == '\0')
671 return ERROR_COMMAND_SYNTAX_ERROR
;
673 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
675 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) != 0)
678 int retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
);
679 if (ERROR_OK
!= retval
)
682 jtag_interface
= jtag_interfaces
[i
];
684 if (jtag_interface
->khz
== NULL
)
685 jtag_interface
->khz
= default_khz
;
686 if (jtag_interface
->speed_div
== NULL
)
687 jtag_interface
->speed_div
= default_speed_div
;
688 if (jtag_interface
->power_dropout
== NULL
)
689 jtag_interface
->power_dropout
= default_power_dropout
;
690 if (jtag_interface
->srst_asserted
== NULL
)
691 jtag_interface
->srst_asserted
= default_srst_asserted
;
696 /* no valid interface was found (i.e. the configuration option,
697 * didn't match one of the compiled-in interfaces
699 LOG_ERROR("The specified JTAG interface was not found (%s)", args
[0]);
700 handle_interface_list_command(cmd_ctx
, cmd
, args
, argc
);
701 return ERROR_JTAG_INVALID_INTERFACE
;
704 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
705 char *cmd
, char **args
, int argc
)
707 if (strcmp(cmd
, "interface_list") == 0 && argc
> 0)
708 return ERROR_COMMAND_SYNTAX_ERROR
;
710 command_print(cmd_ctx
, "The following JTAG interfaces are available:");
711 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
713 const char *name
= jtag_interfaces
[i
]->name
;
714 command_print(cmd_ctx
, "%u: %s", i
+ 1, name
);
720 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
724 Jim_Obj
*newargs
[ 10 ];
728 * argv[ 0] = ir length
729 * argv[ 1] = ir capture
731 * argv[ 3] = not actually used by anything but in the docs
735 command_print( cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
738 command_print( cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
739 command_print( cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
743 command_print( cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
744 command_print( cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
745 command_print( cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
746 command_print( cmd_ctx
, "And then refer to the taps by the dotted name.");
748 newargs
[0] = Jim_NewStringObj( interp
, "jtag", -1 );
749 newargs
[1] = Jim_NewStringObj( interp
, "newtap", -1 );
750 sprintf( buf
, "chip%d", jtag_tap_count() );
751 newargs
[2] = Jim_NewStringObj( interp
, buf
, -1 );
752 sprintf( buf
, "tap%d", jtag_tap_count() );
753 newargs
[3] = Jim_NewStringObj( interp
, buf
, -1 );
754 newargs
[4] = Jim_NewStringObj( interp
, "-irlen", -1 );
755 newargs
[5] = Jim_NewStringObj( interp
, args
[0], -1 );
756 newargs
[6] = Jim_NewStringObj( interp
, "-ircapture", -1 );
757 newargs
[7] = Jim_NewStringObj( interp
, args
[1], -1 );
758 newargs
[8] = Jim_NewStringObj( interp
, "-irmask", -1 );
759 newargs
[9] = Jim_NewStringObj( interp
, args
[2], -1 );
761 command_print( cmd_ctx
, "NEW COMMAND:");
762 sprintf( buf
, "%s %s %s %s %s %s %s %s %s %s",
763 Jim_GetString( newargs
[0], NULL
),
764 Jim_GetString( newargs
[1], NULL
),
765 Jim_GetString( newargs
[2], NULL
),
766 Jim_GetString( newargs
[3], NULL
),
767 Jim_GetString( newargs
[4], NULL
),
768 Jim_GetString( newargs
[5], NULL
),
769 Jim_GetString( newargs
[6], NULL
),
770 Jim_GetString( newargs
[7], NULL
),
771 Jim_GetString( newargs
[8], NULL
),
772 Jim_GetString( newargs
[9], NULL
) );
774 e
= jim_jtag_command( interp
, 10, newargs
);
776 command_print( cmd_ctx
, "%s", Jim_GetString( Jim_GetResult(interp
), NULL
) );
781 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
785 tap
= jtag_all_taps();
786 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
787 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
790 u32 expected
, expected_mask
, cur_instr
, ii
;
791 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
792 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
793 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
795 command_print(cmd_ctx
,
796 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
797 tap
->abs_chain_position
,
799 tap
->enabled
? 'Y' : 'n',
801 (tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
807 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
808 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
809 tap
->expected_ids
[ii
]);
818 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
824 return ERROR_COMMAND_SYNTAX_ERROR
;
826 /* Original versions cared about the order of these tokens:
827 * reset_config signals [combination [trst_type [srst_type]]]
828 * They also clobbered the previous configuration even on error.
830 * Here we don't care about the order, and only change values
831 * which have been explicitly specified.
833 for (; argc
; argc
--, args
++) {
838 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
839 if (strcmp(*args
, "none") == 0)
841 else if (strcmp(*args
, "trst_only") == 0)
842 tmp
= RESET_HAS_TRST
;
843 else if (strcmp(*args
, "srst_only") == 0)
844 tmp
= RESET_HAS_SRST
;
845 else if (strcmp(*args
, "trst_and_srst") == 0)
846 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
850 LOG_ERROR("extra reset_config %s spec (%s)",
852 return ERROR_INVALID_ARGUMENTS
;
857 /* combination (options for broken wiring) */
858 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
859 if (strcmp(*args
, "separate") == 0)
860 /* separate reset lines - default */;
861 else if (strcmp(*args
, "srst_pulls_trst") == 0)
862 tmp
|= RESET_SRST_PULLS_TRST
;
863 else if (strcmp(*args
, "trst_pulls_srst") == 0)
864 tmp
|= RESET_TRST_PULLS_SRST
;
865 else if (strcmp(*args
, "combined") == 0)
866 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
870 LOG_ERROR("extra reset_config %s spec (%s)",
871 "combination", *args
);
872 return ERROR_INVALID_ARGUMENTS
;
877 /* trst_type (NOP without HAS_TRST) */
878 m
= RESET_TRST_OPEN_DRAIN
;
879 if (strcmp(*args
, "trst_open_drain") == 0)
880 tmp
|= RESET_TRST_OPEN_DRAIN
;
881 else if (strcmp(*args
, "trst_push_pull") == 0)
882 /* push/pull from adapter - default */;
886 LOG_ERROR("extra reset_config %s spec (%s)",
888 return ERROR_INVALID_ARGUMENTS
;
893 /* srst_type (NOP without HAS_SRST) */
894 m
|= RESET_SRST_PUSH_PULL
;
895 if (strcmp(*args
, "srst_push_pull") == 0)
896 tmp
|= RESET_SRST_PUSH_PULL
;
897 else if (strcmp(*args
, "srst_open_drain") == 0)
898 /* open drain from adapter - default */;
902 LOG_ERROR("extra reset_config %s spec (%s)",
904 return ERROR_INVALID_ARGUMENTS
;
909 /* caller provided nonsense; fail */
910 LOG_ERROR("unknown reset_config flag (%s)", *args
);
911 return ERROR_INVALID_ARGUMENTS
;
914 /* Remember the bits which were specified (mask)
915 * and their new values (new_cfg).
921 /* clear previous values of those bits, save new values */
922 enum reset_types old_cfg
= jtag_get_reset_config();
925 jtag_set_reset_config(new_cfg
);
930 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
,
931 char *cmd
, char **args
, int argc
)
934 return ERROR_COMMAND_SYNTAX_ERROR
;
936 jtag_set_nsrst_delay(strtoul(args
[0], NULL
, 0));
937 command_print(cmd_ctx
, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
941 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
,
942 char *cmd
, char **args
, int argc
)
945 return ERROR_COMMAND_SYNTAX_ERROR
;
947 jtag_set_ntrst_delay(strtoul(args
[0], NULL
, 0));
948 command_print(cmd_ctx
, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
952 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
954 int retval
= ERROR_OK
;
957 return ERROR_COMMAND_SYNTAX_ERROR
;
960 LOG_DEBUG("handle jtag speed");
963 cur_speed
= strtoul(args
[0], NULL
, 0);
964 retval
= jtag_set_speed(cur_speed
);
967 command_print(cmd_ctx
, "jtag_speed: %d", jtag_get_speed());
972 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
975 return ERROR_COMMAND_SYNTAX_ERROR
;
977 int retval
= ERROR_OK
;
981 LOG_DEBUG("handle jtag khz");
983 jtag_set_speed_khz(strtoul(args
[0], NULL
, 0));
986 LOG_DEBUG("have interface set up");
988 retval
= jtag
->khz(jtag_get_speed_khz(), &speed_div1
);
989 if (ERROR_OK
!= retval
)
991 jtag_set_speed_khz(0);
994 cur_speed
= speed_div1
;
996 retval
= jtag_set_speed(cur_speed
);
999 cur_speed
= jtag_get_speed_khz();
1002 retval
= jtag
->speed_div(jtag_get_speed(), &cur_speed
);
1003 if (ERROR_OK
!= retval
)
1008 command_print(cmd_ctx
, "%d kHz", cur_speed
);
1010 command_print(cmd_ctx
, "RCLK - adaptive");
1015 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
,
1016 char *cmd
, char **args
, int argc
)
1019 return ERROR_COMMAND_SYNTAX_ERROR
;
1022 if (args
[0][0] == '1')
1024 else if (args
[0][0] == '0')
1027 return ERROR_COMMAND_SYNTAX_ERROR
;
1030 if (args
[1][0] == '1')
1032 else if (args
[1][0] == '0')
1035 return ERROR_COMMAND_SYNTAX_ERROR
;
1037 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
1038 return ERROR_JTAG_INIT_FAILED
;
1040 jtag_add_reset(trst
, srst
);
1041 jtag_execute_queue();
1046 static int handle_runtest_command(struct command_context_s
*cmd_ctx
,
1047 char *cmd
, char **args
, int argc
)
1050 return ERROR_COMMAND_SYNTAX_ERROR
;
1052 jtag_add_runtest(strtol(args
[0], NULL
, 0), jtag_get_end_state());
1053 jtag_execute_queue();
1059 * For "irscan" or "drscan" commands, the "end" (really, "next") state
1060 * should be stable ... and *NOT* a shift state, otherwise free-running
1061 * jtag clocks could change the values latched by the update state.
1063 static bool scan_is_safe(tap_state_t state
)
1078 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1081 scan_field_t
*fields
;
1083 tap_state_t endstate
;
1085 if ((argc
< 2) || (argc
% 2))
1087 return ERROR_COMMAND_SYNTAX_ERROR
;
1090 /* optional "-endstate" "statename" at the end of the arguments,
1091 * so that e.g. IRPAUSE can let us load the data register before
1092 * entering RUN/IDLE to execute the instruction we load here.
1094 endstate
= TAP_IDLE
;
1097 /* have at least one pair of numbers. */
1098 /* is last pair the magic text? */
1099 if( 0 == strcmp( "-endstate", args
[ argc
- 2 ] ) ){
1102 cpA
= args
[ argc
-1 ];
1103 for( endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++ ){
1104 cpS
= tap_state_name( endstate
);
1105 if( 0 == strcmp( cpA
, cpS
) ){
1109 if( endstate
>= TAP_NUM_STATES
){
1110 return ERROR_COMMAND_SYNTAX_ERROR
;
1112 if (!scan_is_safe(endstate
))
1113 LOG_WARNING("irscan with unsafe "
1114 "endstate \"%s\"", cpA
);
1115 /* found - remove the last 2 args */
1121 int num_fields
= argc
/ 2;
1123 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
1125 for (i
= 0; i
< num_fields
; i
++)
1127 tap
= jtag_tap_by_string( args
[i
*2] );
1130 command_print( cmd_ctx
, "Tap: %s unknown", args
[i
*2] );
1133 int field_size
= tap
->ir_length
;
1134 fields
[i
].tap
= tap
;
1135 fields
[i
].num_bits
= field_size
;
1136 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
1137 buf_set_u32(fields
[i
].out_value
, 0, field_size
, strtoul(args
[i
*2+1], NULL
, 0));
1138 fields
[i
].in_value
= NULL
;
1141 /* did we have an endstate? */
1142 jtag_add_ir_scan(num_fields
, fields
, endstate
);
1144 int retval
=jtag_execute_queue();
1146 for (i
= 0; i
< num_fields
; i
++)
1147 free(fields
[i
].out_value
);
1154 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1157 scan_field_t
*fields
;
1159 int field_count
= 0;
1162 tap_state_t endstate
;
1165 * args[2] = num_bits
1166 * args[3] = hex string
1167 * ... repeat num bits and hex string ...
1170 * args[N-2] = "-endstate"
1171 * args[N-1] = statename
1173 if ((argc
< 4) || ((argc
% 2)!=0))
1175 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1179 endstate
= TAP_IDLE
;
1181 /* validate arguments as numbers */
1183 for (i
= 2; i
< argc
; i
+=2)
1188 e
= Jim_GetLong(interp
, args
[i
], &bits
);
1189 /* If valid - try next arg */
1194 /* Not valid.. are we at the end? */
1195 if ( ((i
+2) != argc
) ){
1196 /* nope, then error */
1200 /* it could be: "-endstate FOO"
1201 * e.g. DRPAUSE so we can issue more instructions
1202 * before entering RUN/IDLE and executing them.
1205 /* get arg as a string. */
1206 cp
= Jim_GetString( args
[i
], NULL
);
1207 /* is it the magic? */
1208 if( 0 == strcmp( "-endstate", cp
) ){
1209 /* is the statename valid? */
1210 cp
= Jim_GetString( args
[i
+1], NULL
);
1212 /* see if it is a valid state name */
1213 endstate
= tap_state_by_name(cp
);
1215 /* update the error message */
1216 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1218 if (!scan_is_safe(endstate
))
1219 LOG_WARNING("drscan with unsafe "
1220 "endstate \"%s\"", cp
);
1222 /* valid - so clear the error */
1224 /* and remove the last 2 args */
1229 /* Still an error? */
1231 return e
; /* too bad */
1233 } /* validate args */
1235 tap
= jtag_tap_by_jim_obj( interp
, args
[1] );
1240 num_fields
=(argc
-2)/2;
1241 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
1242 for (i
= 2; i
< argc
; i
+=2)
1248 Jim_GetLong(interp
, args
[i
], &bits
);
1249 str
= Jim_GetString(args
[i
+1], &len
);
1251 fields
[field_count
].tap
= tap
;
1252 fields
[field_count
].num_bits
= bits
;
1253 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
1254 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
1255 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
1259 jtag_add_dr_scan(num_fields
, fields
, endstate
);
1261 retval
= jtag_execute_queue();
1262 if (retval
!= ERROR_OK
)
1264 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
1269 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
1270 for (i
= 2; i
< argc
; i
+=2)
1275 Jim_GetLong(interp
, args
[i
], &bits
);
1276 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
1277 free(fields
[field_count
].out_value
);
1279 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
1284 Jim_SetResult(interp
, list
);
1292 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1294 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_get_flush_queue_count()));
1300 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1303 return ERROR_COMMAND_SYNTAX_ERROR
;
1307 if (strcmp(args
[0], "enable") == 0)
1308 jtag_set_verify_capture_ir(true);
1309 else if (strcmp(args
[0], "disable") == 0)
1310 jtag_set_verify_capture_ir(false);
1312 return ERROR_COMMAND_SYNTAX_ERROR
;
1315 const char *status
= jtag_will_verify_capture_ir() ? "enabled": "disabled";
1316 command_print(cmd_ctx
, "verify Capture-IR is %s", status
);
1321 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1324 return ERROR_COMMAND_SYNTAX_ERROR
;
1328 if (strcmp(args
[0], "enable") == 0)
1329 jtag_set_verify(true);
1330 else if (strcmp(args
[0], "disable") == 0)
1331 jtag_set_verify(false);
1333 return ERROR_COMMAND_SYNTAX_ERROR
;
1336 const char *status
= jtag_will_verify() ? "enabled": "disabled";
1337 command_print(cmd_ctx
, "verify jtag capture is %s", status
);
1342 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1345 return ERROR_COMMAND_SYNTAX_ERROR
;
1350 if (strcmp(args
[0], "short") == 0)
1351 use_new_table
= true;
1352 else if (strcmp(args
[0], "long") == 0)
1353 use_new_table
= false;
1355 return ERROR_COMMAND_SYNTAX_ERROR
;
1357 tap_use_new_tms_table(use_new_table
);
1360 command_print(cmd_ctx
, "tms sequence is %s",
1361 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)