1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2007-2010 Ø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, see <http://www.gnu.org/licenses/>. *
27 ***************************************************************************/
34 #include "minidriver.h"
35 #include "interface.h"
36 #include "interfaces.h"
37 #include <transport/transport.h>
38 #include <jtag/drivers/jtag_usb_common.h>
46 * Holds support for configuring debug adapters from TCl scripts.
49 struct adapter_driver
*adapter_driver
;
50 const char * const jtag_only
[] = { "jtag", NULL
};
52 static int jim_adapter_name(Jim_Interp
*interp
, int argc
, Jim_Obj
* const *argv
)
54 struct jim_getopt_info goi
;
55 jim_getopt_setup(&goi
, interp
, argc
-1, argv
+ 1);
57 /* return the name of the interface */
58 /* TCL code might need to know the exact type... */
59 /* FUTURE: we allow this as a means to "set" the interface. */
61 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
64 const char *name
= adapter_driver
? adapter_driver
->name
: NULL
;
65 Jim_SetResultString(goi
.interp
, name
? name
: "undefined", -1);
69 COMMAND_HANDLER(adapter_transports_command
)
74 retval
= CALL_COMMAND_HANDLER(transport_list_parse
, &transports
);
75 if (retval
!= ERROR_OK
)
78 retval
= allow_transports(CMD_CTX
, (const char **)transports
);
80 if (retval
!= ERROR_OK
) {
81 for (unsigned i
= 0; transports
[i
]; i
++)
88 COMMAND_HANDLER(handle_adapter_list_command
)
90 if (strcmp(CMD_NAME
, "list") == 0 && CMD_ARGC
> 0)
91 return ERROR_COMMAND_SYNTAX_ERROR
;
93 command_print(CMD
, "The following debug adapters are available:");
94 for (unsigned i
= 0; adapter_drivers
[i
]; i
++) {
95 const char *name
= adapter_drivers
[i
]->name
;
96 command_print(CMD
, "%u: %s", i
+ 1, name
);
102 COMMAND_HANDLER(handle_adapter_driver_command
)
106 /* check whether the interface is already configured */
107 if (adapter_driver
) {
108 LOG_WARNING("Interface already configured, ignoring");
112 /* interface name is a mandatory argument */
113 if (CMD_ARGC
!= 1 || CMD_ARGV
[0][0] == '\0')
114 return ERROR_COMMAND_SYNTAX_ERROR
;
116 for (unsigned i
= 0; adapter_drivers
[i
]; i
++) {
117 if (strcmp(CMD_ARGV
[0], adapter_drivers
[i
]->name
) != 0)
120 if (adapter_drivers
[i
]->commands
) {
121 retval
= register_commands(CMD_CTX
, NULL
,
122 adapter_drivers
[i
]->commands
);
123 if (retval
!= ERROR_OK
)
127 adapter_driver
= adapter_drivers
[i
];
129 return allow_transports(CMD_CTX
, adapter_driver
->transports
);
132 /* no valid interface was found (i.e. the configuration option,
133 * didn't match one of the compiled-in interfaces
135 LOG_ERROR("The specified debug interface was not found (%s)",
137 CALL_COMMAND_HANDLER(handle_adapter_list_command
);
138 return ERROR_JTAG_INVALID_INTERFACE
;
141 COMMAND_HANDLER(handle_reset_config_command
)
146 /* Original versions cared about the order of these tokens:
147 * reset_config signals [combination [trst_type [srst_type]]]
148 * They also clobbered the previous configuration even on error.
150 * Here we don't care about the order, and only change values
151 * which have been explicitly specified.
153 for (; CMD_ARGC
; CMD_ARGC
--, CMD_ARGV
++) {
158 m
= RESET_SRST_NO_GATING
;
159 if (strcmp(*CMD_ARGV
, "srst_gates_jtag") == 0)
160 /* default: don't use JTAG while SRST asserted */;
161 else if (strcmp(*CMD_ARGV
, "srst_nogate") == 0)
162 tmp
= RESET_SRST_NO_GATING
;
166 LOG_ERROR("extra reset_config %s spec (%s)",
167 "gating", *CMD_ARGV
);
168 return ERROR_COMMAND_SYNTAX_ERROR
;
174 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
175 if (strcmp(*CMD_ARGV
, "none") == 0)
177 else if (strcmp(*CMD_ARGV
, "trst_only") == 0)
178 tmp
= RESET_HAS_TRST
;
179 else if (strcmp(*CMD_ARGV
, "srst_only") == 0)
180 tmp
= RESET_HAS_SRST
;
181 else if (strcmp(*CMD_ARGV
, "trst_and_srst") == 0)
182 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
186 LOG_ERROR("extra reset_config %s spec (%s)",
187 "signal", *CMD_ARGV
);
188 return ERROR_COMMAND_SYNTAX_ERROR
;
193 /* combination (options for broken wiring) */
194 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
195 if (strcmp(*CMD_ARGV
, "separate") == 0)
196 /* separate reset lines - default */;
197 else if (strcmp(*CMD_ARGV
, "srst_pulls_trst") == 0)
198 tmp
|= RESET_SRST_PULLS_TRST
;
199 else if (strcmp(*CMD_ARGV
, "trst_pulls_srst") == 0)
200 tmp
|= RESET_TRST_PULLS_SRST
;
201 else if (strcmp(*CMD_ARGV
, "combined") == 0)
202 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
206 LOG_ERROR("extra reset_config %s spec (%s)",
207 "combination", *CMD_ARGV
);
208 return ERROR_COMMAND_SYNTAX_ERROR
;
213 /* trst_type (NOP without HAS_TRST) */
214 m
= RESET_TRST_OPEN_DRAIN
;
215 if (strcmp(*CMD_ARGV
, "trst_open_drain") == 0)
216 tmp
|= RESET_TRST_OPEN_DRAIN
;
217 else if (strcmp(*CMD_ARGV
, "trst_push_pull") == 0)
218 /* push/pull from adapter - default */;
222 LOG_ERROR("extra reset_config %s spec (%s)",
223 "trst_type", *CMD_ARGV
);
224 return ERROR_COMMAND_SYNTAX_ERROR
;
229 /* srst_type (NOP without HAS_SRST) */
230 m
= RESET_SRST_PUSH_PULL
;
231 if (strcmp(*CMD_ARGV
, "srst_push_pull") == 0)
232 tmp
|= RESET_SRST_PUSH_PULL
;
233 else if (strcmp(*CMD_ARGV
, "srst_open_drain") == 0)
234 /* open drain from adapter - default */;
238 LOG_ERROR("extra reset_config %s spec (%s)",
239 "srst_type", *CMD_ARGV
);
240 return ERROR_COMMAND_SYNTAX_ERROR
;
245 /* connect_type - only valid when srst_nogate */
246 m
= RESET_CNCT_UNDER_SRST
;
247 if (strcmp(*CMD_ARGV
, "connect_assert_srst") == 0)
248 tmp
|= RESET_CNCT_UNDER_SRST
;
249 else if (strcmp(*CMD_ARGV
, "connect_deassert_srst") == 0)
250 /* connect normally - default */;
254 LOG_ERROR("extra reset_config %s spec (%s)",
255 "connect_type", *CMD_ARGV
);
256 return ERROR_COMMAND_SYNTAX_ERROR
;
261 /* caller provided nonsense; fail */
262 LOG_ERROR("unknown reset_config flag (%s)", *CMD_ARGV
);
263 return ERROR_COMMAND_SYNTAX_ERROR
;
266 /* Remember the bits which were specified (mask)
267 * and their new values (new_cfg).
273 /* clear previous values of those bits, save new values */
275 int old_cfg
= jtag_get_reset_config();
279 jtag_set_reset_config(new_cfg
);
281 new_cfg
= jtag_get_reset_config();
284 * Display the (now-)current reset mode
288 /* minimal JTAG has neither SRST nor TRST (so that's the default) */
289 switch (new_cfg
& (RESET_HAS_TRST
| RESET_HAS_SRST
)) {
291 modes
[0] = "srst_only";
294 modes
[0] = "trst_only";
296 case RESET_TRST_AND_SRST
:
297 modes
[0] = "trst_and_srst";
304 /* normally SRST and TRST are decoupled; but bugs happen ... */
305 switch (new_cfg
& (RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
)) {
306 case RESET_SRST_PULLS_TRST
:
307 modes
[1] = "srst_pulls_trst";
309 case RESET_TRST_PULLS_SRST
:
310 modes
[1] = "trst_pulls_srst";
312 case RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
:
313 modes
[1] = "combined";
316 modes
[1] = "separate";
320 /* TRST-less connectors include Altera, Xilinx, and minimal JTAG */
321 if (new_cfg
& RESET_HAS_TRST
) {
322 if (new_cfg
& RESET_TRST_OPEN_DRAIN
)
323 modes
[3] = " trst_open_drain";
325 modes
[3] = " trst_push_pull";
329 /* SRST-less connectors include TI-14, Xilinx, and minimal JTAG */
330 if (new_cfg
& RESET_HAS_SRST
) {
331 if (new_cfg
& RESET_SRST_NO_GATING
)
332 modes
[2] = " srst_nogate";
334 modes
[2] = " srst_gates_jtag";
336 if (new_cfg
& RESET_SRST_PUSH_PULL
)
337 modes
[4] = " srst_push_pull";
339 modes
[4] = " srst_open_drain";
341 if (new_cfg
& RESET_CNCT_UNDER_SRST
)
342 modes
[5] = " connect_assert_srst";
344 modes
[5] = " connect_deassert_srst";
351 command_print(CMD
, "%s %s%s%s%s%s",
353 modes
[2], modes
[3], modes
[4], modes
[5]);
358 COMMAND_HANDLER(handle_adapter_srst_delay_command
)
361 return ERROR_COMMAND_SYNTAX_ERROR
;
364 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], delay
);
366 jtag_set_nsrst_delay(delay
);
368 command_print(CMD
, "adapter srst delay: %u", jtag_get_nsrst_delay());
372 COMMAND_HANDLER(handle_adapter_srst_pulse_width_command
)
375 return ERROR_COMMAND_SYNTAX_ERROR
;
378 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], width
);
380 jtag_set_nsrst_assert_width(width
);
382 command_print(CMD
, "adapter srst pulse_width: %u", jtag_get_nsrst_assert_width());
386 COMMAND_HANDLER(handle_adapter_speed_command
)
389 return ERROR_COMMAND_SYNTAX_ERROR
;
391 int retval
= ERROR_OK
;
394 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], khz
);
396 retval
= jtag_config_khz(khz
);
397 if (retval
!= ERROR_OK
)
401 int cur_speed
= jtag_get_speed_khz();
402 retval
= jtag_get_speed_readable(&cur_speed
);
403 if (retval
!= ERROR_OK
)
407 command_print(CMD
, "adapter speed: %d kHz", cur_speed
);
409 command_print(CMD
, "adapter speed: RCLK - adaptive");
414 COMMAND_HANDLER(handle_adapter_reset_de_assert
)
417 VALUE_UNDEFINED
= -1,
422 enum values srst
= VALUE_UNDEFINED
;
423 enum values trst
= VALUE_UNDEFINED
;
424 enum reset_types jtag_reset_config
= jtag_get_reset_config();
428 if (transport_is_jtag()) {
429 if (jtag_reset_config
& RESET_HAS_TRST
)
430 signal
= jtag_get_trst() ? "asserted" : "deasserted";
432 signal
= "not present";
433 command_print(CMD
, "trst %s", signal
);
436 if (jtag_reset_config
& RESET_HAS_SRST
)
437 signal
= jtag_get_srst() ? "asserted" : "deasserted";
439 signal
= "not present";
440 command_print(CMD
, "srst %s", signal
);
445 if (CMD_ARGC
!= 1 && CMD_ARGC
!= 3)
446 return ERROR_COMMAND_SYNTAX_ERROR
;
448 value
= (strcmp(CMD_NAME
, "assert") == 0) ? VALUE_ASSERT
: VALUE_DEASSERT
;
449 if (strcmp(CMD_ARGV
[0], "srst") == 0)
451 else if (strcmp(CMD_ARGV
[0], "trst") == 0)
454 return ERROR_COMMAND_SYNTAX_ERROR
;
457 if (strcmp(CMD_ARGV
[1], "assert") == 0)
458 value
= VALUE_ASSERT
;
459 else if (strcmp(CMD_ARGV
[1], "deassert") == 0)
460 value
= VALUE_DEASSERT
;
462 return ERROR_COMMAND_SYNTAX_ERROR
;
464 if (strcmp(CMD_ARGV
[2], "srst") == 0 && srst
== VALUE_UNDEFINED
)
466 else if (strcmp(CMD_ARGV
[2], "trst") == 0 && trst
== VALUE_UNDEFINED
)
469 return ERROR_COMMAND_SYNTAX_ERROR
;
472 if (trst
== VALUE_UNDEFINED
) {
473 if (transport_is_jtag())
474 trst
= jtag_get_trst() ? VALUE_ASSERT
: VALUE_DEASSERT
;
476 trst
= VALUE_DEASSERT
; /* unused, safe value */
479 if (srst
== VALUE_UNDEFINED
) {
480 if (jtag_reset_config
& RESET_HAS_SRST
)
481 srst
= jtag_get_srst() ? VALUE_ASSERT
: VALUE_DEASSERT
;
483 srst
= VALUE_DEASSERT
; /* unused, safe value */
486 if (trst
== VALUE_ASSERT
&& !transport_is_jtag()) {
487 LOG_ERROR("transport has no trst signal");
491 if (srst
== VALUE_ASSERT
&& !(jtag_reset_config
& RESET_HAS_SRST
)) {
492 LOG_ERROR("adapter has no srst signal");
496 return adapter_resets((trst
== VALUE_DEASSERT
) ? TRST_DEASSERT
: TRST_ASSERT
,
497 (srst
== VALUE_DEASSERT
) ? SRST_DEASSERT
: SRST_ASSERT
);
500 #ifdef HAVE_LIBUSB_GET_PORT_NUMBERS
501 COMMAND_HANDLER(handle_usb_location_command
)
504 jtag_usb_set_location(CMD_ARGV
[0]);
506 command_print(CMD
, "adapter usb location: %s", jtag_usb_get_location());
510 #endif /* HAVE_LIBUSB_GET_PORT_NUMBERS */
512 static const struct command_registration adapter_usb_command_handlers
[] = {
513 #ifdef HAVE_LIBUSB_GET_PORT_NUMBERS
516 .handler
= &handle_usb_location_command
,
517 .mode
= COMMAND_CONFIG
,
518 .help
= "display or set the USB bus location of the USB device",
519 .usage
= "[<bus>-port[.port]...]",
521 #endif /* HAVE_LIBUSB_GET_PORT_NUMBERS */
522 COMMAND_REGISTRATION_DONE
525 static const struct command_registration adapter_srst_command_handlers
[] = {
528 .handler
= handle_adapter_srst_delay_command
,
530 .help
= "delay after deasserting SRST in ms",
531 .usage
= "[milliseconds]",
534 .name
= "pulse_width",
535 .handler
= handle_adapter_srst_pulse_width_command
,
537 .help
= "SRST assertion pulse width in ms",
538 .usage
= "[milliseconds]",
540 COMMAND_REGISTRATION_DONE
543 static const struct command_registration adapter_command_handlers
[] = {
546 .handler
= handle_adapter_driver_command
,
547 .mode
= COMMAND_CONFIG
,
548 .help
= "Select a debug adapter driver",
549 .usage
= "driver_name",
553 .handler
= handle_adapter_speed_command
,
555 .help
= "With an argument, change to the specified maximum "
556 "jtag speed. For JTAG, 0 KHz signifies adaptive "
558 "With or without argument, display current setting.",
563 .handler
= handle_adapter_list_command
,
565 .help
= "List all built-in debug adapter drivers",
571 .jim_handler
= jim_adapter_name
,
572 .help
= "Returns the name of the currently "
573 "selected adapter (driver)",
578 .help
= "srst adapter command group",
580 .chain
= adapter_srst_command_handlers
,
583 .name
= "transports",
584 .handler
= adapter_transports_command
,
585 .mode
= COMMAND_CONFIG
,
586 .help
= "Declare transports the adapter supports.",
587 .usage
= "transport ...",
592 .help
= "usb adapter command group",
594 .chain
= adapter_usb_command_handlers
,
598 .handler
= handle_adapter_reset_de_assert
,
599 .mode
= COMMAND_EXEC
,
600 .help
= "Controls SRST and TRST lines.",
601 .usage
= "|deassert [srst|trst [assert|deassert srst|trst]]",
605 .handler
= handle_adapter_reset_de_assert
,
606 .mode
= COMMAND_EXEC
,
607 .help
= "Controls SRST and TRST lines.",
608 .usage
= "|assert [srst|trst [deassert|assert srst|trst]]",
610 COMMAND_REGISTRATION_DONE
613 static const struct command_registration interface_command_handlers
[] = {
617 .help
= "adapter command group",
619 .chain
= adapter_command_handlers
,
622 .name
= "reset_config",
623 .handler
= handle_reset_config_command
,
625 .help
= "configure adapter reset behavior",
626 .usage
= "[none|trst_only|srst_only|trst_and_srst] "
627 "[srst_pulls_trst|trst_pulls_srst|combined|separate] "
628 "[srst_gates_jtag|srst_nogate] "
629 "[trst_push_pull|trst_open_drain] "
630 "[srst_push_pull|srst_open_drain] "
631 "[connect_deassert_srst|connect_assert_srst]",
633 COMMAND_REGISTRATION_DONE
637 * Register the commands which deal with arbitrary debug adapter drivers.
639 * @todo Remove internal assumptions that all debug adapters use JTAG for
640 * transport. Various types and data structures are not named generically.
642 int interface_register_commands(struct command_context
*ctx
)
644 return register_commands(ctx
, NULL
, interface_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)