1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
8 * Copyright (C) 2009 SoftPLC Corporation *
12 * Copyright (C) 2009 Zachary T Welch *
13 * zw@superlucidity.net *
15 * This program is free software; you can redistribute it and/or modify *
16 * it under the terms of the GNU General Public License as published by *
17 * the Free Software Foundation; either version 2 of the License, or *
18 * (at your option) any later version. *
20 * This program is distributed in the hope that it will be useful, *
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
23 * GNU General Public License for more details. *
25 * You should have received a copy of the GNU General Public License *
26 * along with this program; if not, write to the *
27 * Free Software Foundation, Inc., *
28 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
29 ***************************************************************************/
35 #include "minidriver.h"
36 #include "interface.h"
37 #include "interfaces.h"
43 static const Jim_Nvp nvp_jtag_tap_event
[] = {
44 { .value
= JTAG_TRST_ASSERTED
, .name
= "post-reset" },
45 { .value
= JTAG_TAP_EVENT_SETUP
, .name
= "setup" },
46 { .value
= JTAG_TAP_EVENT_ENABLE
, .name
= "tap-enable" },
47 { .value
= JTAG_TAP_EVENT_DISABLE
, .name
= "tap-disable" },
49 { .name
= NULL
, .value
= -1 }
52 extern struct jtag_interface
*jtag_interface
;
54 enum jtag_tap_cfg_param
{
58 static Jim_Nvp nvp_config_opts
[] = {
59 { .name
= "-event", .value
= JCFG_EVENT
},
61 { .name
= NULL
, .value
= -1 }
64 static int jtag_tap_configure_cmd(Jim_GetOptInfo
*goi
, struct jtag_tap
* tap
)
70 /* parse config or cget options */
71 while (goi
->argc
> 0) {
72 Jim_SetEmptyResult (goi
->interp
);
74 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
76 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
83 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ...");
87 e
= Jim_GetOpt_Nvp(goi
, nvp_jtag_tap_event
, &n
);
89 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
93 if (goi
->isconfigure
) {
95 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
100 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
106 struct jtag_tap_event_action
*jteap
;
108 jteap
= tap
->event_action
;
109 /* replace existing? */
111 if (jteap
->event
== (enum jtag_event
)n
->value
) {
117 if (goi
->isconfigure
) {
121 jteap
= calloc(1, sizeof (*jteap
));
124 jteap
->event
= n
->value
;
125 Jim_GetOpt_Obj(goi
, &o
);
127 Jim_DecrRefCount(interp
, jteap
->body
);
129 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
130 Jim_IncrRefCount(jteap
->body
);
134 /* add to head of event list */
135 jteap
->next
= tap
->event_action
;
136 tap
->event_action
= jteap
;
138 Jim_SetEmptyResult(goi
->interp
);
142 Jim_SetEmptyResult(goi
->interp
);
144 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
151 } /* while (goi->argc) */
156 static int is_bad_irval(int ir_length
, jim_wide w
)
166 static int jim_newtap_cmd(Jim_GetOptInfo
*goi
)
168 struct jtag_tap
*pTap
;
174 const Jim_Nvp opts
[] = {
175 #define NTAP_OPT_IRLEN 0
176 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
177 #define NTAP_OPT_IRMASK 1
178 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
179 #define NTAP_OPT_IRCAPTURE 2
180 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
181 #define NTAP_OPT_ENABLED 3
182 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
183 #define NTAP_OPT_DISABLED 4
184 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
185 #define NTAP_OPT_EXPECTED_ID 5
186 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
187 { .name
= NULL
, .value
= -1 },
190 pTap
= calloc(1, sizeof(struct jtag_tap
));
192 Jim_SetResult_sprintf(goi
->interp
, "no memory");
197 * we expect CHIP + TAP + OPTIONS
200 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
204 Jim_GetOpt_String(goi
, &cp
, NULL
);
205 pTap
->chip
= strdup(cp
);
207 Jim_GetOpt_String(goi
, &cp
, NULL
);
208 pTap
->tapname
= strdup(cp
);
210 /* name + dot + name + null */
211 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
213 sprintf(cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
214 pTap
->dotted_name
= cp
;
216 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
217 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
219 /* IEEE specifies that the two LSBs of an IR scan are 01, so make
220 * that the default. The "-irlen" and "-irmask" options are only
221 * needed to cope with nonstandard TAPs, or to specify more bits.
223 pTap
->ir_capture_mask
= 0x03;
224 pTap
->ir_capture_value
= 0x01;
227 e
= Jim_GetOpt_Nvp(goi
, opts
, &n
);
229 Jim_GetOpt_NvpUnknown(goi
, opts
, 0);
230 free((void *)pTap
->dotted_name
);
234 LOG_DEBUG("Processing option: %s", n
->name
);
236 case NTAP_OPT_ENABLED
:
237 pTap
->disabled_after_reset
= false;
239 case NTAP_OPT_DISABLED
:
240 pTap
->disabled_after_reset
= true;
242 case NTAP_OPT_EXPECTED_ID
:
244 uint32_t *new_expected_ids
;
246 e
= Jim_GetOpt_Wide(goi
, &w
);
248 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
249 free((void *)pTap
->dotted_name
);
254 new_expected_ids
= malloc(sizeof(uint32_t) * (pTap
->expected_ids_cnt
+ 1));
255 if (new_expected_ids
== NULL
) {
256 Jim_SetResult_sprintf(goi
->interp
, "no memory");
257 free((void *)pTap
->dotted_name
);
262 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(uint32_t) * pTap
->expected_ids_cnt
);
264 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
266 free(pTap
->expected_ids
);
267 pTap
->expected_ids
= new_expected_ids
;
268 pTap
->expected_ids_cnt
++;
272 case NTAP_OPT_IRMASK
:
273 case NTAP_OPT_IRCAPTURE
:
274 e
= Jim_GetOpt_Wide(goi
, &w
);
276 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
277 free((void *)pTap
->dotted_name
);
283 if (w
> (jim_wide
) (8 * sizeof(pTap
->ir_capture_value
)))
284 LOG_WARNING("%s: huge IR length %d",
289 case NTAP_OPT_IRMASK
:
290 if (is_bad_irval(pTap
->ir_length
, w
)) {
291 LOG_ERROR("%s: IR mask %x too big",
294 free((void *)pTap
->dotted_name
);
299 LOG_WARNING("%s: nonstandard IR mask",
301 pTap
->ir_capture_mask
= w
;
303 case NTAP_OPT_IRCAPTURE
:
304 if (is_bad_irval(pTap
->ir_length
, w
)) {
305 LOG_ERROR("%s: IR capture %x too big",
308 free((void *)pTap
->dotted_name
);
313 LOG_WARNING("%s: nonstandard IR value",
315 pTap
->ir_capture_value
= w
;
318 } /* switch (n->value) */
319 } /* while (goi->argc) */
321 /* default is enabled-after-reset */
322 pTap
->enabled
= !pTap
->disabled_after_reset
;
324 /* Did all the required option bits get cleared? */
325 if (pTap
->ir_length
!= 0)
331 Jim_SetResult_sprintf(goi
->interp
,
332 "newtap: %s missing IR length",
338 static void jtag_tap_handle_event(struct jtag_tap
*tap
, enum jtag_event e
)
340 struct jtag_tap_event_action
* jteap
;
342 for (jteap
= tap
->event_action
; jteap
!= NULL
; jteap
= jteap
->next
) {
343 if (jteap
->event
== e
) {
344 LOG_DEBUG("JTAG tap: %s event: %d (%s)\n\taction: %s",
347 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
,
348 Jim_GetString(jteap
->body
, NULL
));
349 if (Jim_EvalObj(interp
, jteap
->body
) != JIM_OK
) {
350 Jim_PrintErrorMessage(interp
);
352 case JTAG_TAP_EVENT_ENABLE
:
353 case JTAG_TAP_EVENT_DISABLE
:
354 /* NOTE: we currently assume the handlers
355 * can't fail. Right here is where we should
356 * really be verifying the scan chains ...
358 tap
->enabled
= (e
== JTAG_TAP_EVENT_ENABLE
);
359 LOG_INFO("JTAG tap: %s %s", tap
->dotted_name
,
360 tap
->enabled
? "enabled" : "disabled");
370 static int jim_jtag_command(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
376 struct command_context
*context
;
385 JTAG_CMD_TAPISENABLED
,
391 const Jim_Nvp jtag_cmds
[] = {
392 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
393 { .name
= "arp_init" , .value
= JTAG_CMD_INIT
},
394 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
395 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
396 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
397 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
398 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
399 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
400 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
401 { .name
= "names" , .value
= JTAG_CMD_NAMES
},
403 { .name
= NULL
, .value
= -1 },
406 context
= Jim_GetAssocData(interp
, "context");
407 /* go past the command */
408 Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+ 1);
410 e
= Jim_GetOpt_Nvp(&goi
, jtag_cmds
, &n
);
412 Jim_GetOpt_NvpUnknown(&goi
, jtag_cmds
, 0);
415 Jim_SetEmptyResult(goi
.interp
);
417 case JTAG_CMD_INTERFACE
:
418 /* return the name of the interface */
419 /* TCL code might need to know the exact type... */
420 /* FUTURE: we allow this as a means to "set" the interface. */
422 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
425 const char *name
= jtag_interface
? jtag_interface
->name
: NULL
;
426 Jim_SetResultString(goi
.interp
, name
? : "undefined", -1);
430 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
433 e
= jtag_init_inner(context
);
435 Jim_SetResult_sprintf(goi
.interp
, "error: %d", e
);
439 case JTAG_CMD_INIT_RESET
:
441 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
444 e
= jtag_init_reset(context
);
446 Jim_SetResult_sprintf(goi
.interp
, "error: %d", e
);
450 case JTAG_CMD_NEWTAP
:
451 return jim_newtap_cmd(&goi
);
453 case JTAG_CMD_TAPISENABLED
:
454 case JTAG_CMD_TAPENABLE
:
455 case JTAG_CMD_TAPDISABLE
:
457 Jim_SetResultString(goi
.interp
, "Too many parameters",-1);
464 t
= jtag_tap_by_jim_obj(goi
.interp
, goi
.argv
[0]);
469 case JTAG_CMD_TAPISENABLED
:
471 case JTAG_CMD_TAPENABLE
:
474 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_ENABLE
);
478 /* FIXME add JTAG sanity checks, w/o TLR
479 * - scan chain length grew by one (this)
480 * - IDs and IR lengths are as expected
483 jtag_call_event_callbacks(JTAG_TAP_EVENT_ENABLE
);
485 case JTAG_CMD_TAPDISABLE
:
488 jtag_tap_handle_event(t
, JTAG_TAP_EVENT_DISABLE
);
492 /* FIXME add JTAG sanity checks, w/o TLR
493 * - scan chain length shrank by one (this)
494 * - IDs and IR lengths are as expected
497 jtag_call_event_callbacks(JTAG_TAP_EVENT_DISABLE
);
501 Jim_SetResult(goi
.interp
, Jim_NewIntObj(goi
.interp
, e
));
508 Jim_WrongNumArgs(goi
.interp
, 0, NULL
,
509 "cget tap_name queryparm");
516 Jim_GetOpt_Obj(&goi
, &o
);
517 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
523 return jtag_tap_configure_cmd(&goi
, t
);
527 case JTAG_CMD_CONFIGURE
:
529 Jim_WrongNumArgs(goi
.interp
, 0, NULL
,
530 "configure tap_name attribute value ...");
537 Jim_GetOpt_Obj(&goi
, &o
);
538 t
= jtag_tap_by_jim_obj(goi
.interp
, o
);
544 return jtag_tap_configure_cmd(&goi
, t
);
550 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
, "Too many parameters");
553 Jim_SetResult(goi
.interp
, Jim_NewListObj(goi
.interp
, NULL
, 0));
555 struct jtag_tap
*tap
;
557 for (tap
= jtag_all_taps(); tap
; tap
= tap
->next_tap
) {
558 Jim_ListAppendElement(goi
.interp
,
559 Jim_GetResult(goi
.interp
),
560 Jim_NewStringObj(goi
.interp
,
561 tap
->dotted_name
, -1));
573 void jtag_notify_event(enum jtag_event event
)
575 struct jtag_tap
*tap
;
577 for (tap
= jtag_all_taps(); tap
; tap
= tap
->next_tap
)
578 jtag_tap_handle_event(tap
, event
);
582 static int default_khz(int khz
, int *jtag_speed
)
584 LOG_ERROR("Translation from khz to jtag_speed not implemented");
588 static int default_speed_div(int speed
, int *khz
)
590 LOG_ERROR("Translation from jtag_speed to khz not implemented");
594 static int default_power_dropout(int *dropout
)
596 *dropout
= 0; /* by default we can't detect power dropout */
600 static int default_srst_asserted(int *srst_asserted
)
602 *srst_asserted
= 0; /* by default we can't detect srst asserted */
606 COMMAND_HANDLER(handle_interface_list_command
)
608 if (strcmp(CMD_NAME
, "interface_list") == 0 && CMD_ARGC
> 0)
609 return ERROR_COMMAND_SYNTAX_ERROR
;
611 command_print(CMD_CTX
, "The following JTAG interfaces are available:");
612 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
614 const char *name
= jtag_interfaces
[i
]->name
;
615 command_print(CMD_CTX
, "%u: %s", i
+ 1, name
);
621 COMMAND_HANDLER(handle_interface_command
)
623 /* check whether the interface is already configured */
626 LOG_WARNING("Interface already configured, ignoring");
630 /* interface name is a mandatory argument */
631 if (CMD_ARGC
!= 1 || CMD_ARGV
[0][0] == '\0')
632 return ERROR_COMMAND_SYNTAX_ERROR
;
634 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
636 if (strcmp(CMD_ARGV
[0], jtag_interfaces
[i
]->name
) != 0)
639 if (NULL
!= jtag_interfaces
[i
]->commands
)
641 int retval
= register_commands(CMD_CTX
, NULL
,
642 jtag_interfaces
[i
]->commands
);
643 if (ERROR_OK
!= retval
)
647 jtag_interface
= jtag_interfaces
[i
];
649 if (jtag_interface
->khz
== NULL
)
650 jtag_interface
->khz
= default_khz
;
651 if (jtag_interface
->speed_div
== NULL
)
652 jtag_interface
->speed_div
= default_speed_div
;
653 if (jtag_interface
->power_dropout
== NULL
)
654 jtag_interface
->power_dropout
= default_power_dropout
;
655 if (jtag_interface
->srst_asserted
== NULL
)
656 jtag_interface
->srst_asserted
= default_srst_asserted
;
661 /* no valid interface was found (i.e. the configuration option,
662 * didn't match one of the compiled-in interfaces
664 LOG_ERROR("The specified JTAG interface was not found (%s)", CMD_ARGV
[0]);
665 CALL_COMMAND_HANDLER(handle_interface_list_command
);
666 return ERROR_JTAG_INVALID_INTERFACE
;
669 COMMAND_HANDLER(handle_scan_chain_command
)
671 struct jtag_tap
*tap
;
673 tap
= jtag_all_taps();
674 command_print(CMD_CTX
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
675 command_print(CMD_CTX
, "---|--------------------|---------|------------|------------|------|------|------|---------");
678 uint32_t expected
, expected_mask
, cur_instr
, ii
;
679 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
680 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
681 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
683 command_print(CMD_CTX
,
684 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
685 tap
->abs_chain_position
,
687 tap
->enabled
? 'Y' : 'n',
688 (unsigned int)(tap
->idcode
),
689 (unsigned int)(tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
690 (unsigned int)(tap
->ir_length
),
691 (unsigned int)(expected
),
692 (unsigned int)(expected_mask
),
693 (unsigned int)(cur_instr
));
695 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
696 command_print(CMD_CTX
, " | | | | 0x%08x | | | | ",
697 (unsigned int)(tap
->expected_ids
[ii
]));
706 COMMAND_HANDLER(handle_reset_config_command
)
711 /* Original versions cared about the order of these tokens:
712 * reset_config signals [combination [trst_type [srst_type]]]
713 * They also clobbered the previous configuration even on error.
715 * Here we don't care about the order, and only change values
716 * which have been explicitly specified.
718 for (; CMD_ARGC
; CMD_ARGC
--, CMD_ARGV
++) {
723 m
= RESET_SRST_NO_GATING
;
724 if (strcmp(*CMD_ARGV
, "srst_gates_jtag") == 0)
725 /* default: don't use JTAG while SRST asserted */;
726 else if (strcmp(*CMD_ARGV
, "srst_nogate") == 0)
727 tmp
= RESET_SRST_NO_GATING
;
731 LOG_ERROR("extra reset_config %s spec (%s)",
732 "gating", *CMD_ARGV
);
733 return ERROR_INVALID_ARGUMENTS
;
739 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
740 if (strcmp(*CMD_ARGV
, "none") == 0)
742 else if (strcmp(*CMD_ARGV
, "trst_only") == 0)
743 tmp
= RESET_HAS_TRST
;
744 else if (strcmp(*CMD_ARGV
, "srst_only") == 0)
745 tmp
= RESET_HAS_SRST
;
746 else if (strcmp(*CMD_ARGV
, "trst_and_srst") == 0)
747 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
751 LOG_ERROR("extra reset_config %s spec (%s)",
752 "signal", *CMD_ARGV
);
753 return ERROR_INVALID_ARGUMENTS
;
758 /* combination (options for broken wiring) */
759 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
760 if (strcmp(*CMD_ARGV
, "separate") == 0)
761 /* separate reset lines - default */;
762 else if (strcmp(*CMD_ARGV
, "srst_pulls_trst") == 0)
763 tmp
|= RESET_SRST_PULLS_TRST
;
764 else if (strcmp(*CMD_ARGV
, "trst_pulls_srst") == 0)
765 tmp
|= RESET_TRST_PULLS_SRST
;
766 else if (strcmp(*CMD_ARGV
, "combined") == 0)
767 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
771 LOG_ERROR("extra reset_config %s spec (%s)",
772 "combination", *CMD_ARGV
);
773 return ERROR_INVALID_ARGUMENTS
;
778 /* trst_type (NOP without HAS_TRST) */
779 m
= RESET_TRST_OPEN_DRAIN
;
780 if (strcmp(*CMD_ARGV
, "trst_open_drain") == 0)
781 tmp
|= RESET_TRST_OPEN_DRAIN
;
782 else if (strcmp(*CMD_ARGV
, "trst_push_pull") == 0)
783 /* push/pull from adapter - default */;
787 LOG_ERROR("extra reset_config %s spec (%s)",
788 "trst_type", *CMD_ARGV
);
789 return ERROR_INVALID_ARGUMENTS
;
794 /* srst_type (NOP without HAS_SRST) */
795 m
|= RESET_SRST_PUSH_PULL
;
796 if (strcmp(*CMD_ARGV
, "srst_push_pull") == 0)
797 tmp
|= RESET_SRST_PUSH_PULL
;
798 else if (strcmp(*CMD_ARGV
, "srst_open_drain") == 0)
799 /* open drain from adapter - default */;
803 LOG_ERROR("extra reset_config %s spec (%s)",
804 "srst_type", *CMD_ARGV
);
805 return ERROR_INVALID_ARGUMENTS
;
810 /* caller provided nonsense; fail */
811 LOG_ERROR("unknown reset_config flag (%s)", *CMD_ARGV
);
812 return ERROR_INVALID_ARGUMENTS
;
815 /* Remember the bits which were specified (mask)
816 * and their new values (new_cfg).
822 /* clear previous values of those bits, save new values */
824 int old_cfg
= jtag_get_reset_config();
828 jtag_set_reset_config(new_cfg
);
830 new_cfg
= jtag_get_reset_config();
834 * Display the (now-)current reset mode
838 /* minimal JTAG has neither SRST nor TRST (so that's the default) */
839 switch (new_cfg
& (RESET_HAS_TRST
| RESET_HAS_SRST
)) {
841 modes
[0] = "srst_only";
844 modes
[0] = "trst_only";
846 case RESET_TRST_AND_SRST
:
847 modes
[0] = "trst_and_srst";
854 /* normally SRST and TRST are decoupled; but bugs happen ... */
855 switch (new_cfg
& (RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
)) {
856 case RESET_SRST_PULLS_TRST
:
857 modes
[1] = "srst_pulls_trst";
859 case RESET_TRST_PULLS_SRST
:
860 modes
[1] = "trst_pulls_srst";
862 case RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
:
863 modes
[1] = "combined";
866 modes
[1] = "separate";
870 /* TRST-less connectors include Altera, Xilinx, and minimal JTAG */
871 if (new_cfg
& RESET_HAS_TRST
) {
872 if (new_cfg
& RESET_TRST_OPEN_DRAIN
)
873 modes
[3] = " trst_open_drain";
875 modes
[3] = " trst_push_pull";
879 /* SRST-less connectors include TI-14, Xilinx, and minimal JTAG */
880 if (new_cfg
& RESET_HAS_SRST
) {
881 if (new_cfg
& RESET_SRST_NO_GATING
)
882 modes
[2] = " srst_nogate";
884 modes
[2] = " srst_gates_jtag";
886 if (new_cfg
& RESET_SRST_PUSH_PULL
)
887 modes
[4] = " srst_push_pull";
889 modes
[4] = " srst_open_drain";
895 command_print(CMD_CTX
, "%s %s%s%s%s",
897 modes
[2], modes
[3], modes
[4]);
902 COMMAND_HANDLER(handle_jtag_nsrst_delay_command
)
905 return ERROR_COMMAND_SYNTAX_ERROR
;
909 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], delay
);
911 jtag_set_nsrst_delay(delay
);
913 command_print(CMD_CTX
, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
917 COMMAND_HANDLER(handle_jtag_ntrst_delay_command
)
920 return ERROR_COMMAND_SYNTAX_ERROR
;
924 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], delay
);
926 jtag_set_ntrst_delay(delay
);
928 command_print(CMD_CTX
, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
932 COMMAND_HANDLER(handle_jtag_nsrst_assert_width_command
)
935 return ERROR_COMMAND_SYNTAX_ERROR
;
939 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], delay
);
941 jtag_set_nsrst_assert_width(delay
);
943 command_print(CMD_CTX
, "jtag_nsrst_assert_width: %u", jtag_get_nsrst_assert_width());
947 COMMAND_HANDLER(handle_jtag_ntrst_assert_width_command
)
950 return ERROR_COMMAND_SYNTAX_ERROR
;
954 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], delay
);
956 jtag_set_ntrst_assert_width(delay
);
958 command_print(CMD_CTX
, "jtag_ntrst_assert_width: %u", jtag_get_ntrst_assert_width());
962 COMMAND_HANDLER(handle_jtag_khz_command
)
965 return ERROR_COMMAND_SYNTAX_ERROR
;
967 int retval
= ERROR_OK
;
971 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], khz
);
973 retval
= jtag_config_khz(khz
);
974 if (ERROR_OK
!= retval
)
978 int cur_speed
= jtag_get_speed_khz();
979 retval
= jtag_get_speed_readable(&cur_speed
);
980 if (ERROR_OK
!= retval
)
984 command_print(CMD_CTX
, "%d kHz", cur_speed
);
986 command_print(CMD_CTX
, "RCLK - adaptive");
991 COMMAND_HANDLER(handle_jtag_rclk_command
)
994 return ERROR_COMMAND_SYNTAX_ERROR
;
996 int retval
= ERROR_OK
;
1000 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], khz
);
1002 retval
= jtag_config_rclk(khz
);
1003 if (ERROR_OK
!= retval
)
1007 int cur_khz
= jtag_get_speed_khz();
1008 retval
= jtag_get_speed_readable(&cur_khz
);
1009 if (ERROR_OK
!= retval
)
1013 command_print(CMD_CTX
, "RCLK not supported - fallback to %d kHz", cur_khz
);
1015 command_print(CMD_CTX
, "RCLK - adaptive");
1020 COMMAND_HANDLER(handle_jtag_reset_command
)
1023 return ERROR_COMMAND_SYNTAX_ERROR
;
1026 if (CMD_ARGV
[0][0] == '1')
1028 else if (CMD_ARGV
[0][0] == '0')
1031 return ERROR_COMMAND_SYNTAX_ERROR
;
1034 if (CMD_ARGV
[1][0] == '1')
1036 else if (CMD_ARGV
[1][0] == '0')
1039 return ERROR_COMMAND_SYNTAX_ERROR
;
1041 if (jtag_interface_init(CMD_CTX
) != ERROR_OK
)
1042 return ERROR_JTAG_INIT_FAILED
;
1044 jtag_add_reset(trst
, srst
);
1045 return jtag_execute_queue();
1048 COMMAND_HANDLER(handle_runtest_command
)
1051 return ERROR_COMMAND_SYNTAX_ERROR
;
1053 unsigned num_clocks
;
1054 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], num_clocks
);
1056 jtag_add_runtest(num_clocks
, TAP_IDLE
);
1057 return jtag_execute_queue();
1061 * For "irscan" or "drscan" commands, the "end" (really, "next") state
1062 * should be stable ... and *NOT* a shift state, otherwise free-running
1063 * jtag clocks could change the values latched by the update state.
1064 * Not surprisingly, this is the same constraint as SVF; the "irscan"
1065 * and "drscan" commands are a write-only subset of what SVF provides.
1067 static bool scan_is_safe(tap_state_t state
)
1082 COMMAND_HANDLER(handle_irscan_command
)
1085 struct scan_field
*fields
;
1086 struct jtag_tap
*tap
;
1087 tap_state_t endstate
;
1089 if ((CMD_ARGC
< 2) || (CMD_ARGC
% 2))
1091 return ERROR_COMMAND_SYNTAX_ERROR
;
1094 /* optional "-endstate" "statename" at the end of the arguments,
1095 * so that e.g. IRPAUSE can let us load the data register before
1096 * entering RUN/IDLE to execute the instruction we load here.
1098 endstate
= TAP_IDLE
;
1100 if (CMD_ARGC
>= 4) {
1101 /* have at least one pair of numbers. */
1102 /* is last pair the magic text? */
1103 if (strcmp("-endstate", CMD_ARGV
[CMD_ARGC
- 2]) == 0) {
1104 endstate
= tap_state_by_name(CMD_ARGV
[CMD_ARGC
- 1]);
1105 if (endstate
== TAP_INVALID
)
1106 return ERROR_COMMAND_SYNTAX_ERROR
;
1107 if (!scan_is_safe(endstate
))
1108 LOG_WARNING("unstable irscan endstate \"%s\"",
1109 CMD_ARGV
[CMD_ARGC
- 1]);
1114 int num_fields
= CMD_ARGC
/ 2;
1115 size_t fields_len
= sizeof(struct scan_field
) * num_fields
;
1116 fields
= malloc(fields_len
);
1117 memset(fields
, 0, fields_len
);
1120 for (i
= 0; i
< num_fields
; i
++)
1122 tap
= jtag_tap_by_string(CMD_ARGV
[i
*2]);
1126 for (j
= 0; j
< i
; j
++)
1127 free(fields
[j
].out_value
);
1129 command_print(CMD_CTX
, "Tap: %s unknown", CMD_ARGV
[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(DIV_ROUND_UP(field_size
, 8));
1139 retval
= parse_u32(CMD_ARGV
[i
* 2 + 1], &value
);
1140 if (ERROR_OK
!= retval
)
1142 buf_set_u32(fields
[i
].out_value
, 0, field_size
, value
);
1143 fields
[i
].in_value
= NULL
;
1146 /* did we have an endstate? */
1147 jtag_add_ir_scan(num_fields
, fields
, endstate
);
1149 retval
= jtag_execute_queue();
1152 for (i
= 0; i
< num_fields
; i
++)
1154 if (NULL
!= fields
[i
].out_value
)
1155 free(fields
[i
].out_value
);
1163 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1166 struct scan_field
*fields
;
1168 int field_count
= 0;
1170 struct jtag_tap
*tap
;
1171 tap_state_t endstate
;
1174 * args[2] = num_bits
1175 * args[3] = hex string
1176 * ... repeat num bits and hex string ...
1179 * args[N-2] = "-endstate"
1180 * args[N-1] = statename
1182 if ((argc
< 4) || ((argc
% 2) != 0))
1184 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1188 endstate
= TAP_IDLE
;
1190 script_debug(interp
, "drscan", argc
, args
);
1192 /* validate arguments as numbers */
1194 for (i
= 2; i
< argc
; i
+= 2)
1199 e
= Jim_GetLong(interp
, args
[i
], &bits
);
1200 /* If valid - try next arg */
1205 /* Not valid.. are we at the end? */
1206 if (((i
+ 2) != argc
)) {
1207 /* nope, then error */
1211 /* it could be: "-endstate FOO"
1212 * e.g. DRPAUSE so we can issue more instructions
1213 * before entering RUN/IDLE and executing them.
1216 /* get arg as a string. */
1217 cp
= Jim_GetString(args
[i
], NULL
);
1218 /* is it the magic? */
1219 if (0 == strcmp("-endstate", cp
)) {
1220 /* is the statename valid? */
1221 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1223 /* see if it is a valid state name */
1224 endstate
= tap_state_by_name(cp
);
1226 /* update the error message */
1227 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1229 if (!scan_is_safe(endstate
))
1230 LOG_WARNING("drscan with unsafe "
1231 "endstate \"%s\"", cp
);
1233 /* valid - so clear the error */
1235 /* and remove the last 2 args */
1240 /* Still an error? */
1242 return e
; /* too bad */
1244 } /* validate args */
1246 tap
= jtag_tap_by_jim_obj(interp
, args
[1]);
1251 num_fields
= (argc
-2)/2;
1252 fields
= malloc(sizeof(struct scan_field
) * num_fields
);
1253 for (i
= 2; i
< argc
; i
+= 2)
1259 Jim_GetLong(interp
, args
[i
], &bits
);
1260 str
= Jim_GetString(args
[i
+ 1], &len
);
1262 fields
[field_count
].tap
= tap
;
1263 fields
[field_count
].num_bits
= bits
;
1264 fields
[field_count
].out_value
= malloc(DIV_ROUND_UP(bits
, 8));
1265 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
1266 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
1270 jtag_add_dr_scan(num_fields
, fields
, endstate
);
1272 retval
= jtag_execute_queue();
1273 if (retval
!= ERROR_OK
)
1275 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
1280 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
1281 for (i
= 2; i
< argc
; i
+= 2)
1286 Jim_GetLong(interp
, args
[i
], &bits
);
1287 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
1288 free(fields
[field_count
].out_value
);
1290 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
1295 Jim_SetResult(interp
, list
);
1303 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1305 tap_state_t states
[8];
1307 if ((argc
< 2) || ((size_t)argc
> (sizeof(states
)/sizeof(*states
) + 1)))
1309 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1313 script_debug(interp
, "pathmove", argc
, args
);
1316 for (i
= 0; i
< argc
-1; i
++)
1319 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1320 states
[i
] = tap_state_by_name(cp
);
1323 /* update the error message */
1324 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1329 if ((jtag_add_statemove(states
[0]) != ERROR_OK
) || (jtag_execute_queue()!= ERROR_OK
))
1331 Jim_SetResultString(interp
, "pathmove: jtag execute failed",-1);
1335 jtag_add_pathmove(argc
-2, states
+ 1);
1337 if (jtag_execute_queue()!= ERROR_OK
)
1339 Jim_SetResultString(interp
, "pathmove: failed",-1);
1347 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1349 script_debug(interp
, "flush_count", argc
, args
);
1351 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_get_flush_queue_count()));
1357 COMMAND_HANDLER(handle_verify_ircapture_command
)
1360 return ERROR_COMMAND_SYNTAX_ERROR
;
1365 COMMAND_PARSE_ENABLE(CMD_ARGV
[0], enable
);
1366 jtag_set_verify_capture_ir(enable
);
1369 const char *status
= jtag_will_verify_capture_ir() ? "enabled": "disabled";
1370 command_print(CMD_CTX
, "verify Capture-IR is %s", status
);
1375 COMMAND_HANDLER(handle_verify_jtag_command
)
1378 return ERROR_COMMAND_SYNTAX_ERROR
;
1383 COMMAND_PARSE_ENABLE(CMD_ARGV
[0], enable
);
1384 jtag_set_verify(enable
);
1387 const char *status
= jtag_will_verify() ? "enabled": "disabled";
1388 command_print(CMD_CTX
, "verify jtag capture is %s", status
);
1393 COMMAND_HANDLER(handle_tms_sequence_command
)
1396 return ERROR_COMMAND_SYNTAX_ERROR
;
1401 if (strcmp(CMD_ARGV
[0], "short") == 0)
1402 use_new_table
= true;
1403 else if (strcmp(CMD_ARGV
[0], "long") == 0)
1404 use_new_table
= false;
1406 return ERROR_COMMAND_SYNTAX_ERROR
;
1408 tap_use_new_tms_table(use_new_table
);
1411 command_print(CMD_CTX
, "tms sequence is %s",
1412 tap_uses_new_tms_table() ? "short": "long");
1417 static const struct command_registration jtag_command_handlers
[] = {
1419 .name
= "interface",
1420 .handler
= &handle_interface_command
,
1421 .mode
= COMMAND_CONFIG
,
1422 .help
= "select a JTAG interface",
1423 .usage
= "<driver_name>",
1426 .name
= "interface_list",
1427 .handler
= &handle_interface_list_command
,
1428 .mode
= COMMAND_ANY
,
1429 .help
= "list all built-in interfaces",
1433 .handler
= &handle_jtag_khz_command
,
1434 .mode
= COMMAND_ANY
,
1435 .help
= "set maximum jtag speed (if supported)",
1436 .usage
= "<khz:0=rtck>",
1439 .name
= "jtag_rclk",
1440 .handler
= &handle_jtag_rclk_command
,
1441 .mode
= COMMAND_ANY
,
1442 .help
= "set JTAG speed to RCLK or use fallback speed",
1443 .usage
= "<fallback_speed_khz>",
1446 .name
= "reset_config",
1447 .handler
= &handle_reset_config_command
,
1448 .mode
= COMMAND_ANY
,
1449 .help
= "configure JTAG reset behavior",
1450 .usage
= "[none|trst_only|srst_only|trst_and_srst] "
1451 "[srst_pulls_trst|trst_pulls_srst|combined|separate] "
1452 "[srst_gates_jtag|srst_nogate] "
1453 "[trst_push_pull|trst_open_drain] "
1454 "[srst_push_pull|srst_open_drain]",
1457 .name
= "jtag_nsrst_delay",
1458 .handler
= &handle_jtag_nsrst_delay_command
,
1459 .mode
= COMMAND_ANY
,
1460 .help
= "delay after deasserting srst in ms",
1464 .name
= "jtag_ntrst_delay",
1465 .handler
= &handle_jtag_ntrst_delay_command
,
1466 .mode
= COMMAND_ANY
,
1467 .help
= "delay after deasserting trst in ms",
1471 .name
= "jtag_nsrst_assert_width",
1472 .handler
= &handle_jtag_nsrst_assert_width_command
,
1473 .mode
= COMMAND_ANY
,
1474 .help
= "delay after asserting srst in ms",
1478 .name
= "jtag_ntrst_assert_width",
1479 .handler
= &handle_jtag_ntrst_assert_width_command
,
1480 .mode
= COMMAND_ANY
,
1481 .help
= "delay after asserting trst in ms",
1485 .name
= "scan_chain",
1486 .handler
= &handle_scan_chain_command
,
1487 .mode
= COMMAND_EXEC
,
1488 .help
= "print current scan chain configuration",
1491 .name
= "jtag_reset",
1492 .handler
= &handle_jtag_reset_command
,
1493 .mode
= COMMAND_EXEC
,
1494 .help
= "toggle reset lines",
1495 .usage
= "<trst> <srst>",
1499 .handler
= &handle_runtest_command
,
1500 .mode
= COMMAND_EXEC
,
1501 .help
= "move to Run-Test/Idle, and execute <num_cycles>",
1502 .usage
= "<num_cycles>"
1506 .handler
= &handle_irscan_command
,
1507 .mode
= COMMAND_EXEC
,
1508 .help
= "execute IR scan",
1509 .usage
= "<device> <instr> [dev2] [instr2] ...",
1512 .name
= "verify_ircapture",
1513 .handler
= &handle_verify_ircapture_command
,
1514 .mode
= COMMAND_ANY
,
1515 .help
= "verify value captured during Capture-IR",
1516 .usage
= "<enable | disable>",
1519 .name
= "verify_jtag",
1520 .handler
= &handle_verify_jtag_command
,
1521 .mode
= COMMAND_ANY
,
1522 .help
= "verify value capture",
1523 .usage
= "<enable | disable>",
1526 .name
= "tms_sequence",
1527 .handler
= &handle_tms_sequence_command
,
1528 .mode
= COMMAND_ANY
,
1529 .help
= "choose short(default) or long tms_sequence",
1530 .usage
= "<short | long>",
1535 .mode
= COMMAND_ANY
,
1536 .jim_handler
= &jim_jtag_command
,
1537 .help
= "perform jtag tap actions",
1541 .mode
= COMMAND_EXEC
,
1542 .jim_handler
= &Jim_Command_drscan
,
1543 .help
= "execute DR scan <device> "
1544 "<num_bits> <value> <num_bits1> <value2> ...",
1547 .name
= "flush_count",
1548 .mode
= COMMAND_EXEC
,
1549 .jim_handler
= &Jim_Command_flush_count
,
1550 .help
= "returns number of times the JTAG queue has been flushed",
1554 .mode
= COMMAND_EXEC
,
1555 .jim_handler
= &Jim_Command_pathmove
,
1556 .usage
= "<state1>,<state2>,<state3>... ",
1557 .help
= "move JTAG to state1 then to state2, state3, etc.",
1559 COMMAND_REGISTRATION_DONE
1562 int jtag_register_commands(struct command_context
*cmd_ctx
)
1564 return register_commands(cmd_ctx
, NULL
, jtag_command_handlers
);
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)