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"
44 extern const Jim_Nvp nvp_jtag_tap_event
[];
46 /* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
49 #if BUILD_ECOSBOARD == 1
50 extern jtag_interface_t zy1000_interface
;
51 #elif defined(BUILD_MINIDRIVER_DUMMY)
52 extern jtag_interface_t minidummy_interface
;
53 #else // standard drivers
54 #if BUILD_PARPORT == 1
55 extern jtag_interface_t parport_interface
;
59 extern jtag_interface_t dummy_interface
;
62 #if BUILD_FT2232_FTD2XX == 1
63 extern jtag_interface_t ft2232_interface
;
66 #if BUILD_FT2232_LIBFTDI == 1
67 extern jtag_interface_t ft2232_interface
;
70 #if BUILD_AMTJTAGACCEL == 1
71 extern jtag_interface_t amt_jtagaccel_interface
;
75 extern jtag_interface_t ep93xx_interface
;
78 #if BUILD_AT91RM9200 == 1
79 extern jtag_interface_t at91rm9200_interface
;
82 #if BUILD_GW16012 == 1
83 extern jtag_interface_t gw16012_interface
;
86 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
87 extern jtag_interface_t presto_interface
;
90 #if BUILD_USBPROG == 1
91 extern jtag_interface_t usbprog_interface
;
95 extern jtag_interface_t jlink_interface
;
98 #if BUILD_VSLLINK == 1
99 extern jtag_interface_t vsllink_interface
;
103 extern jtag_interface_t rlink_interface
;
106 #if BUILD_ARMJTAGEW == 1
107 extern jtag_interface_t armjtagew_interface
;
109 #endif // standard drivers
112 * The list of built-in JTAG interfaces, containing entries for those
113 * drivers that were enabled by the @c configure script.
115 * The list should be defined to contain either one minidriver interface
116 * or some number of standard driver interfaces, never both.
118 jtag_interface_t
*jtag_interfaces
[] = {
119 #if BUILD_ECOSBOARD == 1
121 #elif defined(BUILD_MINIDRIVER_DUMMY)
122 &minidummy_interface
,
123 #else // standard drivers
124 #if BUILD_PARPORT == 1
130 #if BUILD_FT2232_FTD2XX == 1
133 #if BUILD_FT2232_LIBFTDI == 1
136 #if BUILD_AMTJTAGACCEL == 1
137 &amt_jtagaccel_interface
,
139 #if BUILD_EP93XX == 1
142 #if BUILD_AT91RM9200 == 1
143 &at91rm9200_interface
,
145 #if BUILD_GW16012 == 1
148 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
151 #if BUILD_USBPROG == 1
157 #if BUILD_VSLLINK == 1
163 #if BUILD_ARMJTAGEW == 1
164 &armjtagew_interface
,
166 #endif // standard drivers
170 extern struct jtag_interface_s
*jtag
;
171 extern jtag_interface_t
*jtag_interface
;
174 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
175 char *cmd
, char **args
, int argc
);
176 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
177 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
178 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
179 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
180 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
181 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
182 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
184 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
186 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
187 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
188 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
189 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
190 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
);
192 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
193 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
194 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
196 extern int jtag_examine_chain(void);
197 extern int jtag_validate_chain(void);
199 enum jtag_tap_cfg_param
{
203 static Jim_Nvp nvp_config_opts
[] = {
204 { .name
= "-event", .value
= JCFG_EVENT
},
206 { .name
= NULL
, .value
= -1 }
209 static int jtag_tap_configure_cmd( Jim_GetOptInfo
*goi
, jtag_tap_t
* tap
)
215 /* parse config or cget options */
216 while (goi
->argc
> 0) {
217 Jim_SetEmptyResult (goi
->interp
);
219 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
221 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
227 if (goi
->argc
== 0) {
228 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ..." );
232 e
= Jim_GetOpt_Nvp( goi
, nvp_jtag_tap_event
, &n
);
234 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
238 if (goi
->isconfigure
) {
239 if (goi
->argc
!= 1) {
240 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
244 if (goi
->argc
!= 0) {
245 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
251 jtag_tap_event_action_t
*jteap
;
253 jteap
= tap
->event_action
;
254 /* replace existing? */
256 if (jteap
->event
== (enum jtag_tap_event
)n
->value
) {
262 if (goi
->isconfigure
) {
265 jteap
= calloc(1, sizeof (*jteap
));
267 jteap
->event
= n
->value
;
268 Jim_GetOpt_Obj( goi
, &o
);
270 Jim_DecrRefCount(interp
, jteap
->body
);
272 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
273 Jim_IncrRefCount(jteap
->body
);
275 /* add to head of event list */
276 jteap
->next
= tap
->event_action
;
277 tap
->event_action
= jteap
;
278 Jim_SetEmptyResult(goi
->interp
);
282 Jim_SetEmptyResult(goi
->interp
);
284 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
291 } /* while (goi->argc) */
297 extern void jtag_tap_init(jtag_tap_t
*tap
);
298 extern void jtag_tap_free(jtag_tap_t
*tap
);
300 static int jim_newtap_cmd( Jim_GetOptInfo
*goi
)
309 const Jim_Nvp opts
[] = {
310 #define NTAP_OPT_IRLEN 0
311 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
312 #define NTAP_OPT_IRMASK 1
313 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
314 #define NTAP_OPT_IRCAPTURE 2
315 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
316 #define NTAP_OPT_ENABLED 3
317 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
318 #define NTAP_OPT_DISABLED 4
319 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
320 #define NTAP_OPT_EXPECTED_ID 5
321 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
322 { .name
= NULL
, .value
= -1 },
325 pTap
= malloc( sizeof(jtag_tap_t
) );
326 memset( pTap
, 0, sizeof(*pTap
) );
328 Jim_SetResult_sprintf( goi
->interp
, "no memory");
332 * we expect CHIP + TAP + OPTIONS
335 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
338 Jim_GetOpt_String( goi
, &cp
, NULL
);
339 pTap
->chip
= strdup(cp
);
341 Jim_GetOpt_String( goi
, &cp
, NULL
);
342 pTap
->tapname
= strdup(cp
);
344 /* name + dot + name + null */
345 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
347 sprintf( cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
348 pTap
->dotted_name
= cp
;
350 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
351 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
353 /* default is enabled */
356 /* deal with options */
357 #define NTREQ_IRLEN 1
358 #define NTREQ_IRCAPTURE 2
359 #define NTREQ_IRMASK 4
361 /* clear them as we find them */
362 reqbits
= (NTREQ_IRLEN
| NTREQ_IRCAPTURE
| NTREQ_IRMASK
);
365 e
= Jim_GetOpt_Nvp( goi
, opts
, &n
);
367 Jim_GetOpt_NvpUnknown( goi
, opts
, 0 );
370 LOG_DEBUG("Processing option: %s", n
->name
);
372 case NTAP_OPT_ENABLED
:
375 case NTAP_OPT_DISABLED
:
378 case NTAP_OPT_EXPECTED_ID
:
380 u32
*new_expected_ids
;
382 e
= Jim_GetOpt_Wide( goi
, &w
);
384 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
388 new_expected_ids
= malloc(sizeof(u32
) * (pTap
->expected_ids_cnt
+ 1));
389 if (new_expected_ids
== NULL
) {
390 Jim_SetResult_sprintf( goi
->interp
, "no memory");
394 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(u32
) * pTap
->expected_ids_cnt
);
396 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
398 free(pTap
->expected_ids
);
399 pTap
->expected_ids
= new_expected_ids
;
400 pTap
->expected_ids_cnt
++;
404 case NTAP_OPT_IRMASK
:
405 case NTAP_OPT_IRCAPTURE
:
406 e
= Jim_GetOpt_Wide( goi
, &w
);
408 Jim_SetResult_sprintf( goi
->interp
, "option: %s bad parameter", n
->name
);
411 if( (w
< 0) || (w
> 0xffff) ){
413 Jim_SetResult_sprintf( goi
->interp
, "option: %s - wacky value: %d (0x%x)",
414 n
->name
, (int)(w
), (int)(w
));
420 reqbits
&= (~(NTREQ_IRLEN
));
422 case NTAP_OPT_IRMASK
:
423 pTap
->ir_capture_mask
= w
;
424 reqbits
&= (~(NTREQ_IRMASK
));
426 case NTAP_OPT_IRCAPTURE
:
427 pTap
->ir_capture_value
= w
;
428 reqbits
&= (~(NTREQ_IRCAPTURE
));
431 } /* switch(n->value) */
432 } /* while( goi->argc ) */
434 /* Did all the required option bits get cleared? */
441 Jim_SetResult_sprintf(goi
->interp
,
442 "newtap: %s missing required parameters",
448 static int jim_jtag_command( Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
454 struct command_context_s
*context
;
462 JTAG_CMD_TAPISENABLED
,
467 const Jim_Nvp jtag_cmds
[] = {
468 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
469 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
470 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
471 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
472 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
473 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
474 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
475 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
477 { .name
= NULL
, .value
= -1 },
480 context
= Jim_GetAssocData(interp
, "context");
481 /* go past the command */
482 Jim_GetOpt_Setup( &goi
, interp
, argc
-1, argv
+1 );
484 e
= Jim_GetOpt_Nvp( &goi
, jtag_cmds
, &n
);
486 Jim_GetOpt_NvpUnknown( &goi
, jtag_cmds
, 0 );
489 Jim_SetEmptyResult( goi
.interp
);
491 case JTAG_CMD_INTERFACE
:
492 /* return the name of the interface */
493 /* TCL code might need to know the exact type... */
494 /* FUTURE: we allow this as a means to "set" the interface. */
496 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
499 Jim_SetResultString( goi
.interp
, jtag_interface
->name
, -1 );
501 case JTAG_CMD_INIT_RESET
:
503 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
506 e
= jtag_init_reset(context
);
508 Jim_SetResult_sprintf( goi
.interp
, "error: %d", e
);
512 case JTAG_CMD_NEWTAP
:
513 return jim_newtap_cmd( &goi
);
515 case JTAG_CMD_TAPISENABLED
:
516 case JTAG_CMD_TAPENABLE
:
517 case JTAG_CMD_TAPDISABLE
:
519 Jim_SetResultString( goi
.interp
, "Too many parameters",-1 );
525 t
= jtag_tap_by_jim_obj( goi
.interp
, goi
.argv
[0] );
530 case JTAG_CMD_TAPISENABLED
:
533 case JTAG_CMD_TAPENABLE
:
534 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_ENABLE
);
538 case JTAG_CMD_TAPDISABLE
:
539 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_DISABLE
);
544 Jim_SetResult( goi
.interp
, Jim_NewIntObj( goi
.interp
, e
) );
551 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ...");
558 Jim_GetOpt_Obj(&goi
, &o
);
559 t
= jtag_tap_by_jim_obj( goi
.interp
, o
);
565 return jtag_tap_configure_cmd( &goi
, t
);
569 case JTAG_CMD_CONFIGURE
:
571 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ?VALUE? ...");
578 Jim_GetOpt_Obj(&goi
, &o
);
579 t
= jtag_tap_by_jim_obj( goi
.interp
, o
);
585 return jtag_tap_configure_cmd( &goi
, t
);
592 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
594 register_jim( cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
596 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
597 COMMAND_CONFIG
, "try to configure interface");
598 register_command(cmd_ctx
, NULL
,
599 "interface_list", &handle_interface_list_command
,
600 COMMAND_ANY
, "list all built-in interfaces");
601 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
602 COMMAND_ANY
, "(DEPRECATED) set jtag speed (if supported)");
603 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
604 COMMAND_ANY
, "set maximum jtag speed (if supported); "
605 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
606 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
607 COMMAND_CONFIG
, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
608 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
610 "[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]");
611 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
612 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
613 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
614 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
616 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
617 COMMAND_EXEC
, "print current scan chain configuration");
619 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
620 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
621 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
622 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
623 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
624 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
625 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
626 register_jim(cmd_ctx
, "flush_count", Jim_Command_flush_count
, "returns number of times the JTAG queue has been flushed");
628 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
629 COMMAND_ANY
, "verify value captured during Capture-IR <enable|disable>");
630 register_command(cmd_ctx
, NULL
, "verify_jtag", handle_verify_jtag_command
,
631 COMMAND_ANY
, "verify value capture <enable|disable>");
632 register_command(cmd_ctx
, NULL
, "tms_sequence", handle_tms_sequence_command
,
633 COMMAND_ANY
, "choose short(default) or long tms_sequence <short|long>");
637 static int default_khz(int khz
, int *jtag_speed
)
639 LOG_ERROR("Translation from khz to jtag_speed not implemented");
643 static int default_speed_div(int speed
, int *khz
)
645 LOG_ERROR("Translation from jtag_speed to khz not implemented");
649 static int default_power_dropout(int *dropout
)
651 *dropout
=0; /* by default we can't detect power dropout */
655 static int default_srst_asserted(int *srst_asserted
)
657 *srst_asserted
=0; /* by default we can't detect srst asserted */
661 static int handle_interface_command(struct command_context_s
*cmd_ctx
,
662 char *cmd
, char **args
, int argc
)
664 /* check whether the interface is already configured */
667 LOG_WARNING("Interface already configured, ignoring");
671 /* interface name is a mandatory argument */
672 if (argc
!= 1 || args
[0][0] == '\0')
673 return ERROR_COMMAND_SYNTAX_ERROR
;
675 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
677 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) != 0)
680 int retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
);
681 if (ERROR_OK
!= retval
)
684 jtag_interface
= jtag_interfaces
[i
];
686 if (jtag_interface
->khz
== NULL
)
687 jtag_interface
->khz
= default_khz
;
688 if (jtag_interface
->speed_div
== NULL
)
689 jtag_interface
->speed_div
= default_speed_div
;
690 if (jtag_interface
->power_dropout
== NULL
)
691 jtag_interface
->power_dropout
= default_power_dropout
;
692 if (jtag_interface
->srst_asserted
== NULL
)
693 jtag_interface
->srst_asserted
= default_srst_asserted
;
698 /* no valid interface was found (i.e. the configuration option,
699 * didn't match one of the compiled-in interfaces
701 LOG_ERROR("The specified JTAG interface was not found (%s)", args
[0]);
702 handle_interface_list_command(cmd_ctx
, cmd
, args
, argc
);
703 return ERROR_JTAG_INVALID_INTERFACE
;
706 static int handle_interface_list_command(struct command_context_s
*cmd_ctx
,
707 char *cmd
, char **args
, int argc
)
709 if (strcmp(cmd
, "interface_list") == 0 && argc
> 0)
710 return ERROR_COMMAND_SYNTAX_ERROR
;
712 command_print(cmd_ctx
, "The following JTAG interfaces are available:");
713 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
715 const char *name
= jtag_interfaces
[i
]->name
;
716 command_print(cmd_ctx
, "%u: %s", i
+ 1, name
);
722 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
726 Jim_Obj
*newargs
[ 10 ];
730 * argv[ 0] = ir length
731 * argv[ 1] = ir capture
733 * argv[ 3] = not actually used by anything but in the docs
737 command_print( cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
740 command_print( cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
741 command_print( cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
745 command_print( cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
746 command_print( cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
747 command_print( cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
748 command_print( cmd_ctx
, "And then refer to the taps by the dotted name.");
750 newargs
[0] = Jim_NewStringObj( interp
, "jtag", -1 );
751 newargs
[1] = Jim_NewStringObj( interp
, "newtap", -1 );
752 sprintf( buf
, "chip%d", jtag_tap_count() );
753 newargs
[2] = Jim_NewStringObj( interp
, buf
, -1 );
754 sprintf( buf
, "tap%d", jtag_tap_count() );
755 newargs
[3] = Jim_NewStringObj( interp
, buf
, -1 );
756 newargs
[4] = Jim_NewStringObj( interp
, "-irlen", -1 );
757 newargs
[5] = Jim_NewStringObj( interp
, args
[0], -1 );
758 newargs
[6] = Jim_NewStringObj( interp
, "-ircapture", -1 );
759 newargs
[7] = Jim_NewStringObj( interp
, args
[1], -1 );
760 newargs
[8] = Jim_NewStringObj( interp
, "-irmask", -1 );
761 newargs
[9] = Jim_NewStringObj( interp
, args
[2], -1 );
763 command_print( cmd_ctx
, "NEW COMMAND:");
764 sprintf( buf
, "%s %s %s %s %s %s %s %s %s %s",
765 Jim_GetString( newargs
[0], NULL
),
766 Jim_GetString( newargs
[1], NULL
),
767 Jim_GetString( newargs
[2], NULL
),
768 Jim_GetString( newargs
[3], NULL
),
769 Jim_GetString( newargs
[4], NULL
),
770 Jim_GetString( newargs
[5], NULL
),
771 Jim_GetString( newargs
[6], NULL
),
772 Jim_GetString( newargs
[7], NULL
),
773 Jim_GetString( newargs
[8], NULL
),
774 Jim_GetString( newargs
[9], NULL
) );
776 e
= jim_jtag_command( interp
, 10, newargs
);
778 command_print( cmd_ctx
, "%s", Jim_GetString( Jim_GetResult(interp
), NULL
) );
783 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
787 tap
= jtag_all_taps();
788 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
789 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
792 u32 expected
, expected_mask
, cur_instr
, ii
;
793 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
794 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
795 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
797 command_print(cmd_ctx
,
798 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
799 tap
->abs_chain_position
,
801 tap
->enabled
? 'Y' : 'n',
803 (tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
809 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
810 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
811 tap
->expected_ids
[ii
]);
820 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
826 return ERROR_COMMAND_SYNTAX_ERROR
;
828 /* Original versions cared about the order of these tokens:
829 * reset_config signals [combination [trst_type [srst_type]]]
830 * They also clobbered the previous configuration even on error.
832 * Here we don't care about the order, and only change values
833 * which have been explicitly specified.
835 for (; argc
; argc
--, args
++) {
840 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
841 if (strcmp(*args
, "none") == 0)
843 else if (strcmp(*args
, "trst_only") == 0)
844 tmp
= RESET_HAS_TRST
;
845 else if (strcmp(*args
, "srst_only") == 0)
846 tmp
= RESET_HAS_SRST
;
847 else if (strcmp(*args
, "trst_and_srst") == 0)
848 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
852 LOG_ERROR("extra reset_config %s spec (%s)",
854 return ERROR_INVALID_ARGUMENTS
;
859 /* combination (options for broken wiring) */
860 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
861 if (strcmp(*args
, "separate") == 0)
862 /* separate reset lines - default */;
863 else if (strcmp(*args
, "srst_pulls_trst") == 0)
864 tmp
|= RESET_SRST_PULLS_TRST
;
865 else if (strcmp(*args
, "trst_pulls_srst") == 0)
866 tmp
|= RESET_TRST_PULLS_SRST
;
867 else if (strcmp(*args
, "combined") == 0)
868 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
872 LOG_ERROR("extra reset_config %s spec (%s)",
873 "combination", *args
);
874 return ERROR_INVALID_ARGUMENTS
;
879 /* trst_type (NOP without HAS_TRST) */
880 m
= RESET_TRST_OPEN_DRAIN
;
881 if (strcmp(*args
, "trst_open_drain") == 0)
882 tmp
|= RESET_TRST_OPEN_DRAIN
;
883 else if (strcmp(*args
, "trst_push_pull") == 0)
884 /* push/pull from adapter - default */;
888 LOG_ERROR("extra reset_config %s spec (%s)",
890 return ERROR_INVALID_ARGUMENTS
;
895 /* srst_type (NOP without HAS_SRST) */
896 m
|= RESET_SRST_PUSH_PULL
;
897 if (strcmp(*args
, "srst_push_pull") == 0)
898 tmp
|= RESET_SRST_PUSH_PULL
;
899 else if (strcmp(*args
, "srst_open_drain") == 0)
900 /* open drain from adapter - default */;
904 LOG_ERROR("extra reset_config %s spec (%s)",
906 return ERROR_INVALID_ARGUMENTS
;
911 /* caller provided nonsense; fail */
912 LOG_ERROR("unknown reset_config flag (%s)", *args
);
913 return ERROR_INVALID_ARGUMENTS
;
916 /* Remember the bits which were specified (mask)
917 * and their new values (new_cfg).
923 /* clear previous values of those bits, save new values */
924 enum reset_types old_cfg
= jtag_get_reset_config();
927 jtag_set_reset_config(new_cfg
);
932 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
,
933 char *cmd
, char **args
, int argc
)
936 return ERROR_COMMAND_SYNTAX_ERROR
;
938 jtag_set_nsrst_delay(strtoul(args
[0], NULL
, 0));
939 command_print(cmd_ctx
, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
943 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
,
944 char *cmd
, char **args
, int argc
)
947 return ERROR_COMMAND_SYNTAX_ERROR
;
949 jtag_set_ntrst_delay(strtoul(args
[0], NULL
, 0));
950 command_print(cmd_ctx
, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
954 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
956 int retval
= ERROR_OK
;
959 return ERROR_COMMAND_SYNTAX_ERROR
;
962 LOG_DEBUG("handle jtag speed");
965 cur_speed
= strtoul(args
[0], NULL
, 0);
966 retval
= jtag_set_speed(cur_speed
);
969 command_print(cmd_ctx
, "jtag_speed: %d", jtag_get_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
= speed_div1
;
998 retval
= jtag_set_speed(cur_speed
);
1004 cur_speed
= jtag_get_speed_khz();
1007 retval
= jtag
->speed_div(jtag_get_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)