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 && 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 (argc
!= 1 || args
[0][0] == '\0')
632 return ERROR_COMMAND_SYNTAX_ERROR
;
634 for (unsigned i
= 0; NULL
!= jtag_interfaces
[i
]; i
++)
636 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) != 0)
639 int retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
);
640 if (ERROR_OK
!= retval
)
643 jtag_interface
= jtag_interfaces
[i
];
645 if (jtag_interface
->khz
== NULL
)
646 jtag_interface
->khz
= default_khz
;
647 if (jtag_interface
->speed_div
== NULL
)
648 jtag_interface
->speed_div
= default_speed_div
;
649 if (jtag_interface
->power_dropout
== NULL
)
650 jtag_interface
->power_dropout
= default_power_dropout
;
651 if (jtag_interface
->srst_asserted
== NULL
)
652 jtag_interface
->srst_asserted
= default_srst_asserted
;
657 /* no valid interface was found (i.e. the configuration option,
658 * didn't match one of the compiled-in interfaces
660 LOG_ERROR("The specified JTAG interface was not found (%s)", args
[0]);
661 CALL_COMMAND_HANDLER(handle_interface_list_command
);
662 return ERROR_JTAG_INVALID_INTERFACE
;
665 COMMAND_HANDLER(handle_scan_chain_command
)
667 struct jtag_tap
*tap
;
669 tap
= jtag_all_taps();
670 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
671 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
674 uint32_t expected
, expected_mask
, cur_instr
, ii
;
675 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
676 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
677 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
679 command_print(cmd_ctx
,
680 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
681 tap
->abs_chain_position
,
683 tap
->enabled
? 'Y' : 'n',
684 (unsigned int)(tap
->idcode
),
685 (unsigned int)(tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
686 (unsigned int)(tap
->ir_length
),
687 (unsigned int)(expected
),
688 (unsigned int)(expected_mask
),
689 (unsigned int)(cur_instr
));
691 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
692 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
693 (unsigned int)(tap
->expected_ids
[ii
]));
702 COMMAND_HANDLER(handle_reset_config_command
)
707 /* Original versions cared about the order of these tokens:
708 * reset_config signals [combination [trst_type [srst_type]]]
709 * They also clobbered the previous configuration even on error.
711 * Here we don't care about the order, and only change values
712 * which have been explicitly specified.
714 for (; argc
; argc
--, args
++) {
719 m
= RESET_SRST_NO_GATING
;
720 if (strcmp(*args
, "srst_gates_jtag") == 0)
721 /* default: don't use JTAG while SRST asserted */;
722 else if (strcmp(*args
, "srst_nogate") == 0)
723 tmp
= RESET_SRST_NO_GATING
;
727 LOG_ERROR("extra reset_config %s spec (%s)",
729 return ERROR_INVALID_ARGUMENTS
;
735 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
736 if (strcmp(*args
, "none") == 0)
738 else if (strcmp(*args
, "trst_only") == 0)
739 tmp
= RESET_HAS_TRST
;
740 else if (strcmp(*args
, "srst_only") == 0)
741 tmp
= RESET_HAS_SRST
;
742 else if (strcmp(*args
, "trst_and_srst") == 0)
743 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
747 LOG_ERROR("extra reset_config %s spec (%s)",
749 return ERROR_INVALID_ARGUMENTS
;
754 /* combination (options for broken wiring) */
755 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
756 if (strcmp(*args
, "separate") == 0)
757 /* separate reset lines - default */;
758 else if (strcmp(*args
, "srst_pulls_trst") == 0)
759 tmp
|= RESET_SRST_PULLS_TRST
;
760 else if (strcmp(*args
, "trst_pulls_srst") == 0)
761 tmp
|= RESET_TRST_PULLS_SRST
;
762 else if (strcmp(*args
, "combined") == 0)
763 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
767 LOG_ERROR("extra reset_config %s spec (%s)",
768 "combination", *args
);
769 return ERROR_INVALID_ARGUMENTS
;
774 /* trst_type (NOP without HAS_TRST) */
775 m
= RESET_TRST_OPEN_DRAIN
;
776 if (strcmp(*args
, "trst_open_drain") == 0)
777 tmp
|= RESET_TRST_OPEN_DRAIN
;
778 else if (strcmp(*args
, "trst_push_pull") == 0)
779 /* push/pull from adapter - default */;
783 LOG_ERROR("extra reset_config %s spec (%s)",
785 return ERROR_INVALID_ARGUMENTS
;
790 /* srst_type (NOP without HAS_SRST) */
791 m
|= RESET_SRST_PUSH_PULL
;
792 if (strcmp(*args
, "srst_push_pull") == 0)
793 tmp
|= RESET_SRST_PUSH_PULL
;
794 else if (strcmp(*args
, "srst_open_drain") == 0)
795 /* open drain from adapter - default */;
799 LOG_ERROR("extra reset_config %s spec (%s)",
801 return ERROR_INVALID_ARGUMENTS
;
806 /* caller provided nonsense; fail */
807 LOG_ERROR("unknown reset_config flag (%s)", *args
);
808 return ERROR_INVALID_ARGUMENTS
;
811 /* Remember the bits which were specified (mask)
812 * and their new values (new_cfg).
818 /* clear previous values of those bits, save new values */
820 int old_cfg
= jtag_get_reset_config();
824 jtag_set_reset_config(new_cfg
);
826 new_cfg
= jtag_get_reset_config();
830 * Display the (now-)current reset mode
834 /* minimal JTAG has neither SRST nor TRST (so that's the default) */
835 switch (new_cfg
& (RESET_HAS_TRST
| RESET_HAS_SRST
)) {
837 modes
[0] = "srst_only";
840 modes
[0] = "trst_only";
842 case RESET_TRST_AND_SRST
:
843 modes
[0] = "trst_and_srst";
850 /* normally SRST and TRST are decoupled; but bugs happen ... */
851 switch (new_cfg
& (RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
)) {
852 case RESET_SRST_PULLS_TRST
:
853 modes
[1] = "srst_pulls_trst";
855 case RESET_TRST_PULLS_SRST
:
856 modes
[1] = "trst_pulls_srst";
858 case RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
:
859 modes
[1] = "combined";
862 modes
[1] = "separate";
866 /* TRST-less connectors include Altera, Xilinx, and minimal JTAG */
867 if (new_cfg
& RESET_HAS_TRST
) {
868 if (new_cfg
& RESET_TRST_OPEN_DRAIN
)
869 modes
[3] = " trst_open_drain";
871 modes
[3] = " trst_push_pull";
875 /* SRST-less connectors include TI-14, Xilinx, and minimal JTAG */
876 if (new_cfg
& RESET_HAS_SRST
) {
877 if (new_cfg
& RESET_SRST_NO_GATING
)
878 modes
[2] = " srst_nogate";
880 modes
[2] = " srst_gates_jtag";
882 if (new_cfg
& RESET_SRST_PUSH_PULL
)
883 modes
[4] = " srst_push_pull";
885 modes
[4] = " srst_open_drain";
891 command_print(cmd_ctx
, "%s %s%s%s%s",
893 modes
[2], modes
[3], modes
[4]);
898 COMMAND_HANDLER(handle_jtag_nsrst_delay_command
)
901 return ERROR_COMMAND_SYNTAX_ERROR
;
905 COMMAND_PARSE_NUMBER(uint
, args
[0], delay
);
907 jtag_set_nsrst_delay(delay
);
909 command_print(cmd_ctx
, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
913 COMMAND_HANDLER(handle_jtag_ntrst_delay_command
)
916 return ERROR_COMMAND_SYNTAX_ERROR
;
920 COMMAND_PARSE_NUMBER(uint
, args
[0], delay
);
922 jtag_set_ntrst_delay(delay
);
924 command_print(cmd_ctx
, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
928 COMMAND_HANDLER(handle_jtag_nsrst_assert_width_command
)
931 return ERROR_COMMAND_SYNTAX_ERROR
;
935 COMMAND_PARSE_NUMBER(uint
, args
[0], delay
);
937 jtag_set_nsrst_assert_width(delay
);
939 command_print(cmd_ctx
, "jtag_nsrst_assert_width: %u", jtag_get_nsrst_assert_width());
943 COMMAND_HANDLER(handle_jtag_ntrst_assert_width_command
)
946 return ERROR_COMMAND_SYNTAX_ERROR
;
950 COMMAND_PARSE_NUMBER(uint
, args
[0], delay
);
952 jtag_set_ntrst_assert_width(delay
);
954 command_print(cmd_ctx
, "jtag_ntrst_assert_width: %u", jtag_get_ntrst_assert_width());
958 COMMAND_HANDLER(handle_jtag_khz_command
)
961 return ERROR_COMMAND_SYNTAX_ERROR
;
963 int retval
= ERROR_OK
;
967 COMMAND_PARSE_NUMBER(uint
, args
[0], khz
);
969 retval
= jtag_config_khz(khz
);
970 if (ERROR_OK
!= retval
)
974 int cur_speed
= jtag_get_speed_khz();
975 retval
= jtag_get_speed_readable(&cur_speed
);
976 if (ERROR_OK
!= retval
)
980 command_print(cmd_ctx
, "%d kHz", cur_speed
);
982 command_print(cmd_ctx
, "RCLK - adaptive");
987 COMMAND_HANDLER(handle_jtag_rclk_command
)
990 return ERROR_COMMAND_SYNTAX_ERROR
;
992 int retval
= ERROR_OK
;
996 COMMAND_PARSE_NUMBER(uint
, args
[0], khz
);
998 retval
= jtag_config_rclk(khz
);
999 if (ERROR_OK
!= retval
)
1003 int cur_khz
= jtag_get_speed_khz();
1004 retval
= jtag_get_speed_readable(&cur_khz
);
1005 if (ERROR_OK
!= retval
)
1009 command_print(cmd_ctx
, "RCLK not supported - fallback to %d kHz", cur_khz
);
1011 command_print(cmd_ctx
, "RCLK - adaptive");
1016 COMMAND_HANDLER(handle_jtag_reset_command
)
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 return jtag_execute_queue();
1044 COMMAND_HANDLER(handle_runtest_command
)
1047 return ERROR_COMMAND_SYNTAX_ERROR
;
1049 unsigned num_clocks
;
1050 COMMAND_PARSE_NUMBER(uint
, args
[0], num_clocks
);
1052 jtag_add_runtest(num_clocks
, TAP_IDLE
);
1053 return jtag_execute_queue();
1057 * For "irscan" or "drscan" commands, the "end" (really, "next") state
1058 * should be stable ... and *NOT* a shift state, otherwise free-running
1059 * jtag clocks could change the values latched by the update state.
1060 * Not surprisingly, this is the same constraint as SVF; the "irscan"
1061 * and "drscan" commands are a write-only subset of what SVF provides.
1063 static bool scan_is_safe(tap_state_t state
)
1078 COMMAND_HANDLER(handle_irscan_command
)
1081 struct scan_field
*fields
;
1082 struct jtag_tap
*tap
;
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 (strcmp("-endstate", args
[argc
- 2]) == 0) {
1100 endstate
= tap_state_by_name(args
[argc
- 1]);
1101 if (endstate
== TAP_INVALID
)
1102 return ERROR_COMMAND_SYNTAX_ERROR
;
1103 if (!scan_is_safe(endstate
))
1104 LOG_WARNING("unstable irscan endstate \"%s\"",
1110 int num_fields
= argc
/ 2;
1111 size_t fields_len
= sizeof(struct scan_field
) * num_fields
;
1112 fields
= malloc(fields_len
);
1113 memset(fields
, 0, fields_len
);
1116 for (i
= 0; i
< num_fields
; i
++)
1118 tap
= jtag_tap_by_string(args
[i
*2]);
1122 for (j
= 0; j
< i
; j
++)
1123 free(fields
[j
].out_value
);
1125 command_print(cmd_ctx
, "Tap: %s unknown", args
[i
*2]);
1129 int field_size
= tap
->ir_length
;
1130 fields
[i
].tap
= tap
;
1131 fields
[i
].num_bits
= field_size
;
1132 fields
[i
].out_value
= malloc(DIV_ROUND_UP(field_size
, 8));
1135 retval
= parse_u32(args
[i
* 2 + 1], &value
);
1136 if (ERROR_OK
!= retval
)
1138 buf_set_u32(fields
[i
].out_value
, 0, field_size
, value
);
1139 fields
[i
].in_value
= NULL
;
1142 /* did we have an endstate? */
1143 jtag_add_ir_scan(num_fields
, fields
, endstate
);
1145 retval
= jtag_execute_queue();
1148 for (i
= 0; i
< num_fields
; i
++)
1150 if (NULL
!= fields
[i
].out_value
)
1151 free(fields
[i
].out_value
);
1159 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1162 struct scan_field
*fields
;
1164 int field_count
= 0;
1166 struct jtag_tap
*tap
;
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 script_debug(interp
, "drscan", argc
, args
);
1188 /* validate arguments as numbers */
1190 for (i
= 2; i
< argc
; i
+= 2)
1195 e
= Jim_GetLong(interp
, args
[i
], &bits
);
1196 /* If valid - try next arg */
1201 /* Not valid.. are we at the end? */
1202 if (((i
+ 2) != argc
)) {
1203 /* nope, then error */
1207 /* it could be: "-endstate FOO"
1208 * e.g. DRPAUSE so we can issue more instructions
1209 * before entering RUN/IDLE and executing them.
1212 /* get arg as a string. */
1213 cp
= Jim_GetString(args
[i
], NULL
);
1214 /* is it the magic? */
1215 if (0 == strcmp("-endstate", cp
)) {
1216 /* is the statename valid? */
1217 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1219 /* see if it is a valid state name */
1220 endstate
= tap_state_by_name(cp
);
1222 /* update the error message */
1223 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1225 if (!scan_is_safe(endstate
))
1226 LOG_WARNING("drscan with unsafe "
1227 "endstate \"%s\"", cp
);
1229 /* valid - so clear the error */
1231 /* and remove the last 2 args */
1236 /* Still an error? */
1238 return e
; /* too bad */
1240 } /* validate args */
1242 tap
= jtag_tap_by_jim_obj(interp
, args
[1]);
1247 num_fields
= (argc
-2)/2;
1248 fields
= malloc(sizeof(struct scan_field
) * num_fields
);
1249 for (i
= 2; i
< argc
; i
+= 2)
1255 Jim_GetLong(interp
, args
[i
], &bits
);
1256 str
= Jim_GetString(args
[i
+ 1], &len
);
1258 fields
[field_count
].tap
= tap
;
1259 fields
[field_count
].num_bits
= bits
;
1260 fields
[field_count
].out_value
= malloc(DIV_ROUND_UP(bits
, 8));
1261 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
1262 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
1266 jtag_add_dr_scan(num_fields
, fields
, endstate
);
1268 retval
= jtag_execute_queue();
1269 if (retval
!= ERROR_OK
)
1271 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
1276 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
1277 for (i
= 2; i
< argc
; i
+= 2)
1282 Jim_GetLong(interp
, args
[i
], &bits
);
1283 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
1284 free(fields
[field_count
].out_value
);
1286 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
1291 Jim_SetResult(interp
, list
);
1299 static int Jim_Command_pathmove(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1301 tap_state_t states
[8];
1303 if ((argc
< 2) || ((size_t)argc
> (sizeof(states
)/sizeof(*states
) + 1)))
1305 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
1309 script_debug(interp
, "pathmove", argc
, args
);
1312 for (i
= 0; i
< argc
-1; i
++)
1315 cp
= Jim_GetString(args
[i
+ 1], NULL
);
1316 states
[i
] = tap_state_by_name(cp
);
1319 /* update the error message */
1320 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
1325 if ((jtag_add_statemove(states
[0]) != ERROR_OK
) || (jtag_execute_queue()!= ERROR_OK
))
1327 Jim_SetResultString(interp
, "pathmove: jtag execute failed",-1);
1331 jtag_add_pathmove(argc
-2, states
+ 1);
1333 if (jtag_execute_queue()!= ERROR_OK
)
1335 Jim_SetResultString(interp
, "pathmove: failed",-1);
1343 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
1345 script_debug(interp
, "flush_count", argc
, args
);
1347 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_get_flush_queue_count()));
1353 COMMAND_HANDLER(handle_verify_ircapture_command
)
1356 return ERROR_COMMAND_SYNTAX_ERROR
;
1360 if (strcmp(args
[0], "enable") == 0)
1361 jtag_set_verify_capture_ir(true);
1362 else if (strcmp(args
[0], "disable") == 0)
1363 jtag_set_verify_capture_ir(false);
1365 return ERROR_COMMAND_SYNTAX_ERROR
;
1368 const char *status
= jtag_will_verify_capture_ir() ? "enabled": "disabled";
1369 command_print(cmd_ctx
, "verify Capture-IR is %s", status
);
1374 COMMAND_HANDLER(handle_verify_jtag_command
)
1377 return ERROR_COMMAND_SYNTAX_ERROR
;
1381 if (strcmp(args
[0], "enable") == 0)
1382 jtag_set_verify(true);
1383 else if (strcmp(args
[0], "disable") == 0)
1384 jtag_set_verify(false);
1386 return ERROR_COMMAND_SYNTAX_ERROR
;
1389 const char *status
= jtag_will_verify() ? "enabled": "disabled";
1390 command_print(cmd_ctx
, "verify jtag capture is %s", status
);
1395 COMMAND_HANDLER(handle_tms_sequence_command
)
1398 return ERROR_COMMAND_SYNTAX_ERROR
;
1403 if (strcmp(args
[0], "short") == 0)
1404 use_new_table
= true;
1405 else if (strcmp(args
[0], "long") == 0)
1406 use_new_table
= false;
1408 return ERROR_COMMAND_SYNTAX_ERROR
;
1410 tap_use_new_tms_table(use_new_table
);
1413 command_print(cmd_ctx
, "tms sequence is %s",
1414 tap_uses_new_tms_table() ? "short": "long");
1419 int jtag_register_commands(struct command_context
*cmd_ctx
)
1421 register_jim(cmd_ctx
, "jtag", jim_jtag_command
,
1422 "perform jtag tap actions");
1424 register_command(cmd_ctx
, NULL
, "interface",
1425 handle_interface_command
, COMMAND_CONFIG
,
1426 "try to configure interface");
1427 register_command(cmd_ctx
, NULL
, "interface_list",
1428 &handle_interface_list_command
, COMMAND_ANY
,
1429 "list all built-in interfaces");
1431 register_command(cmd_ctx
, NULL
, "jtag_khz",
1432 handle_jtag_khz_command
, COMMAND_ANY
,
1433 "set maximum jtag speed (if supported); "
1434 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
1435 register_command(cmd_ctx
, NULL
, "jtag_rclk",
1436 handle_jtag_rclk_command
, COMMAND_ANY
,
1437 "fallback_speed_khz - set JTAG speed to RCLK or use fallback speed");
1438 register_command(cmd_ctx
, NULL
, "reset_config",
1439 handle_reset_config_command
, COMMAND_ANY
,
1441 "[none|trst_only|srst_only|trst_and_srst] "
1442 "[srst_pulls_trst|trst_pulls_srst|combined|separate] "
1443 "[srst_gates_jtag|srst_nogate] "
1444 "[trst_push_pull|trst_open_drain] "
1445 "[srst_push_pull|srst_open_drain]");
1447 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay",
1448 handle_jtag_nsrst_delay_command
, COMMAND_ANY
,
1449 "jtag_nsrst_delay <ms> "
1450 "- delay after deasserting srst in ms");
1451 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay",
1452 handle_jtag_ntrst_delay_command
, COMMAND_ANY
,
1453 "jtag_ntrst_delay <ms> "
1454 "- delay after deasserting trst in ms");
1456 register_command(cmd_ctx
, NULL
, "jtag_nsrst_assert_width",
1457 handle_jtag_nsrst_assert_width_command
, COMMAND_ANY
,
1458 "jtag_nsrst_assert_width <ms> "
1459 "- delay after asserting srst in ms");
1460 register_command(cmd_ctx
, NULL
, "jtag_ntrst_assert_width",
1461 handle_jtag_ntrst_assert_width_command
, COMMAND_ANY
,
1462 "jtag_ntrst_assert_width <ms> "
1463 "- delay after asserting trst in ms");
1465 register_command(cmd_ctx
, NULL
, "scan_chain",
1466 handle_scan_chain_command
, COMMAND_EXEC
,
1467 "print current scan chain configuration");
1469 register_command(cmd_ctx
, NULL
, "jtag_reset",
1470 handle_jtag_reset_command
, COMMAND_EXEC
,
1471 "toggle reset lines <trst> <srst>");
1472 register_command(cmd_ctx
, NULL
, "runtest",
1473 handle_runtest_command
, COMMAND_EXEC
,
1474 "move to Run-Test/Idle, and execute <num_cycles>");
1475 register_command(cmd_ctx
, NULL
, "irscan",
1476 handle_irscan_command
, COMMAND_EXEC
,
1477 "execute IR scan <device> <instr> [dev2] [instr2] ...");
1479 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
,
1480 "execute DR scan <device> "
1481 "<num_bits> <value> <num_bits1> <value2> ...");
1483 register_jim(cmd_ctx
, "flush_count", Jim_Command_flush_count
,
1484 "returns number of times the JTAG queue has been flushed");
1486 register_jim(cmd_ctx
, "pathmove", Jim_Command_pathmove
,
1487 "<state1>,<state2>,<state3>... "
1488 "- move JTAG to state1 then to state2, state3, etc.");
1490 register_command(cmd_ctx
, NULL
, "verify_ircapture",
1491 handle_verify_ircapture_command
, COMMAND_ANY
,
1492 "verify value captured during Capture-IR <enable | disable>");
1493 register_command(cmd_ctx
, NULL
, "verify_jtag",
1494 handle_verify_jtag_command
, COMMAND_ANY
,
1495 "verify value capture <enable | disable>");
1497 register_command(cmd_ctx
, NULL
, "tms_sequence",
1498 handle_tms_sequence_command
, COMMAND_ANY
,
1499 "choose short(default) or long tms_sequence <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)