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 extern struct jtag_interface *jtag_interface;
50 const char * const jtag_only[] = { "jtag", NULL };
52 static int jim_adapter_name(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
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 = jtag_interface ? jtag_interface->name : NULL;
65 Jim_SetResultString(goi.interp, name ? : "undefined", -1);
69 COMMAND_HANDLER(interface_transport_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_interface_list_command)
90 if (strcmp(CMD_NAME, "interface_list") == 0 && CMD_ARGC > 0)
91 return ERROR_COMMAND_SYNTAX_ERROR;
93 command_print(CMD, "The following debug interfaces are available:");
94 for (unsigned i = 0; NULL != jtag_interfaces[i]; i++) {
95 const char *name = jtag_interfaces[i]->name;
96 command_print(CMD, "%u: %s", i + 1, name);
102 COMMAND_HANDLER(handle_interface_command)
106 /* check whether the interface is already configured */
107 if (jtag_interface) {
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; NULL != jtag_interfaces[i]; i++) {
117 if (strcmp(CMD_ARGV[0], jtag_interfaces[i]->name) != 0)
120 if (NULL != jtag_interfaces[i]->commands) {
121 retval = register_commands(CMD_CTX, NULL,
122 jtag_interfaces[i]->commands);
123 if (ERROR_OK != retval)
127 jtag_interface = jtag_interfaces[i];
129 /* LEGACY SUPPORT ... adapter drivers must declare what
130 * transports they allow. Until they all do so, assume
131 * the legacy drivers are JTAG-only
133 if (!jtag_interface->transports)
134 LOG_WARNING("Adapter driver '%s' did not declare "
135 "which transports it allows; assuming "
136 "legacy JTAG-only", jtag_interface->name);
137 return allow_transports(CMD_CTX, jtag_interface->transports
138 ? jtag_interface->transports : jtag_only);
141 /* no valid interface was found (i.e. the configuration option,
142 * didn't match one of the compiled-in interfaces
144 LOG_ERROR("The specified debug interface was not found (%s)",
146 CALL_COMMAND_HANDLER(handle_interface_list_command);
147 return ERROR_JTAG_INVALID_INTERFACE;
150 COMMAND_HANDLER(handle_reset_config_command)
155 /* Original versions cared about the order of these tokens:
156 * reset_config signals [combination [trst_type [srst_type]]]
157 * They also clobbered the previous configuration even on error.
159 * Here we don't care about the order, and only change values
160 * which have been explicitly specified.
162 for (; CMD_ARGC; CMD_ARGC--, CMD_ARGV++) {
167 m = RESET_SRST_NO_GATING;
168 if (strcmp(*CMD_ARGV, "srst_gates_jtag") == 0)
169 /* default: don't use JTAG while SRST asserted */;
170 else if (strcmp(*CMD_ARGV, "srst_nogate") == 0)
171 tmp = RESET_SRST_NO_GATING;
175 LOG_ERROR("extra reset_config %s spec (%s)",
176 "gating", *CMD_ARGV);
177 return ERROR_COMMAND_SYNTAX_ERROR;
183 m = RESET_HAS_TRST | RESET_HAS_SRST;
184 if (strcmp(*CMD_ARGV, "none") == 0)
186 else if (strcmp(*CMD_ARGV, "trst_only") == 0)
187 tmp = RESET_HAS_TRST;
188 else if (strcmp(*CMD_ARGV, "srst_only") == 0)
189 tmp = RESET_HAS_SRST;
190 else if (strcmp(*CMD_ARGV, "trst_and_srst") == 0)
191 tmp = RESET_HAS_TRST | RESET_HAS_SRST;
195 LOG_ERROR("extra reset_config %s spec (%s)",
196 "signal", *CMD_ARGV);
197 return ERROR_COMMAND_SYNTAX_ERROR;
202 /* combination (options for broken wiring) */
203 m = RESET_SRST_PULLS_TRST | RESET_TRST_PULLS_SRST;
204 if (strcmp(*CMD_ARGV, "separate") == 0)
205 /* separate reset lines - default */;
206 else if (strcmp(*CMD_ARGV, "srst_pulls_trst") == 0)
207 tmp |= RESET_SRST_PULLS_TRST;
208 else if (strcmp(*CMD_ARGV, "trst_pulls_srst") == 0)
209 tmp |= RESET_TRST_PULLS_SRST;
210 else if (strcmp(*CMD_ARGV, "combined") == 0)
211 tmp |= RESET_SRST_PULLS_TRST | RESET_TRST_PULLS_SRST;
215 LOG_ERROR("extra reset_config %s spec (%s)",
216 "combination", *CMD_ARGV);
217 return ERROR_COMMAND_SYNTAX_ERROR;
222 /* trst_type (NOP without HAS_TRST) */
223 m = RESET_TRST_OPEN_DRAIN;
224 if (strcmp(*CMD_ARGV, "trst_open_drain") == 0)
225 tmp |= RESET_TRST_OPEN_DRAIN;
226 else if (strcmp(*CMD_ARGV, "trst_push_pull") == 0)
227 /* push/pull from adapter - default */;
231 LOG_ERROR("extra reset_config %s spec (%s)",
232 "trst_type", *CMD_ARGV);
233 return ERROR_COMMAND_SYNTAX_ERROR;
238 /* srst_type (NOP without HAS_SRST) */
239 m = RESET_SRST_PUSH_PULL;
240 if (strcmp(*CMD_ARGV, "srst_push_pull") == 0)
241 tmp |= RESET_SRST_PUSH_PULL;
242 else if (strcmp(*CMD_ARGV, "srst_open_drain") == 0)
243 /* open drain from adapter - default */;
247 LOG_ERROR("extra reset_config %s spec (%s)",
248 "srst_type", *CMD_ARGV);
249 return ERROR_COMMAND_SYNTAX_ERROR;
254 /* connect_type - only valid when srst_nogate */
255 m = RESET_CNCT_UNDER_SRST;
256 if (strcmp(*CMD_ARGV, "connect_assert_srst") == 0)
257 tmp |= RESET_CNCT_UNDER_SRST;
258 else if (strcmp(*CMD_ARGV, "connect_deassert_srst") == 0)
259 /* connect normally - default */;
263 LOG_ERROR("extra reset_config %s spec (%s)",
264 "connect_type", *CMD_ARGV);
265 return ERROR_COMMAND_SYNTAX_ERROR;
270 /* caller provided nonsense; fail */
271 LOG_ERROR("unknown reset_config flag (%s)", *CMD_ARGV);
272 return ERROR_COMMAND_SYNTAX_ERROR;
275 /* Remember the bits which were specified (mask)
276 * and their new values (new_cfg).
282 /* clear previous values of those bits, save new values */
284 int old_cfg = jtag_get_reset_config();
288 jtag_set_reset_config(new_cfg);
290 new_cfg = jtag_get_reset_config();
293 * Display the (now-)current reset mode
297 /* minimal JTAG has neither SRST nor TRST (so that's the default) */
298 switch (new_cfg & (RESET_HAS_TRST | RESET_HAS_SRST)) {
300 modes[0] = "srst_only";
303 modes[0] = "trst_only";
305 case RESET_TRST_AND_SRST:
306 modes[0] = "trst_and_srst";
313 /* normally SRST and TRST are decoupled; but bugs happen ... */
314 switch (new_cfg & (RESET_SRST_PULLS_TRST | RESET_TRST_PULLS_SRST)) {
315 case RESET_SRST_PULLS_TRST:
316 modes[1] = "srst_pulls_trst";
318 case RESET_TRST_PULLS_SRST:
319 modes[1] = "trst_pulls_srst";
321 case RESET_SRST_PULLS_TRST | RESET_TRST_PULLS_SRST:
322 modes[1] = "combined";
325 modes[1] = "separate";
329 /* TRST-less connectors include Altera, Xilinx, and minimal JTAG */
330 if (new_cfg & RESET_HAS_TRST) {
331 if (new_cfg & RESET_TRST_OPEN_DRAIN)
332 modes[3] = " trst_open_drain";
334 modes[3] = " trst_push_pull";
338 /* SRST-less connectors include TI-14, Xilinx, and minimal JTAG */
339 if (new_cfg & RESET_HAS_SRST) {
340 if (new_cfg & RESET_SRST_NO_GATING)
341 modes[2] = " srst_nogate";
343 modes[2] = " srst_gates_jtag";
345 if (new_cfg & RESET_SRST_PUSH_PULL)
346 modes[4] = " srst_push_pull";
348 modes[4] = " srst_open_drain";
350 if (new_cfg & RESET_CNCT_UNDER_SRST)
351 modes[5] = " connect_assert_srst";
353 modes[5] = " connect_deassert_srst";
360 command_print(CMD, "%s %s%s%s%s%s",
362 modes[2], modes[3], modes[4], modes[5]);
367 COMMAND_HANDLER(handle_adapter_nsrst_delay_command)
370 return ERROR_COMMAND_SYNTAX_ERROR;
373 COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], delay);
375 jtag_set_nsrst_delay(delay);
377 command_print(CMD, "adapter_nsrst_delay: %u", jtag_get_nsrst_delay());
381 COMMAND_HANDLER(handle_adapter_nsrst_assert_width_command)
384 return ERROR_COMMAND_SYNTAX_ERROR;
387 COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], width);
389 jtag_set_nsrst_assert_width(width);
391 command_print(CMD, "adapter_nsrst_assert_width: %u", jtag_get_nsrst_assert_width());
395 COMMAND_HANDLER(handle_adapter_khz_command)
398 return ERROR_COMMAND_SYNTAX_ERROR;
400 int retval = ERROR_OK;
403 COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], khz);
405 retval = jtag_config_khz(khz);
406 if (ERROR_OK != retval)
410 int cur_speed = jtag_get_speed_khz();
411 retval = jtag_get_speed_readable(&cur_speed);
412 if (ERROR_OK != retval)
416 command_print(CMD, "adapter speed: %d kHz", cur_speed);
418 command_print(CMD, "adapter speed: RCLK - adaptive");
423 #ifndef HAVE_JTAG_MINIDRIVER_H
424 #ifdef HAVE_LIBUSB_GET_PORT_NUMBERS
425 COMMAND_HANDLER(handle_usb_location_command)
428 jtag_usb_set_location(CMD_ARGV[0]);
430 command_print(CMD, "adapter usb location: %s", jtag_usb_get_location());
434 #endif /* HAVE_LIBUSB_GET_PORT_NUMBERS */
436 static const struct command_registration adapter_usb_command_handlers[] = {
437 #ifdef HAVE_LIBUSB_GET_PORT_NUMBERS
440 .handler = &handle_usb_location_command,
441 .mode = COMMAND_CONFIG,
442 .help = "display or set the USB bus location of the USB device",
443 .usage = "[<bus>-port[.port]...]",
445 #endif /* HAVE_LIBUSB_GET_PORT_NUMBERS */
446 COMMAND_REGISTRATION_DONE
448 #endif /* MINIDRIVER */
450 static const struct command_registration adapter_command_handlers[] = {
451 #ifndef HAVE_JTAG_MINIDRIVER_H
455 .help = "usb adapter command group",
457 .chain = adapter_usb_command_handlers,
459 #endif /* MINIDRIVER */
460 COMMAND_REGISTRATION_DONE
463 static const struct command_registration interface_command_handlers[] = {
467 .help = "adapter command group",
469 .chain = adapter_command_handlers,
472 .name = "adapter_khz",
473 .handler = handle_adapter_khz_command,
475 .help = "With an argument, change to the specified maximum "
476 "jtag speed. For JTAG, 0 KHz signifies adaptive "
478 "With or without argument, display current setting.",
482 .name = "adapter_name",
484 .jim_handler = jim_adapter_name,
485 .help = "Returns the name of the currently "
486 "selected adapter (driver)",
489 .name = "adapter_nsrst_delay",
490 .handler = handle_adapter_nsrst_delay_command,
492 .help = "delay after deasserting SRST in ms",
493 .usage = "[milliseconds]",
496 .name = "adapter_nsrst_assert_width",
497 .handler = handle_adapter_nsrst_assert_width_command,
499 .help = "delay after asserting SRST in ms",
500 .usage = "[milliseconds]",
504 .handler = handle_interface_command,
505 .mode = COMMAND_CONFIG,
506 .help = "Select a debug adapter interface (driver)",
507 .usage = "driver_name",
510 .name = "interface_transports",
511 .handler = interface_transport_command,
512 .mode = COMMAND_CONFIG,
513 .help = "Declare transports the interface supports.",
514 .usage = "transport ... ",
517 .name = "interface_list",
518 .handler = handle_interface_list_command,
520 .help = "List all built-in debug adapter interfaces (drivers)",
524 .name = "reset_config",
525 .handler = handle_reset_config_command,
527 .help = "configure adapter reset behavior",
528 .usage = "[none|trst_only|srst_only|trst_and_srst] "
529 "[srst_pulls_trst|trst_pulls_srst|combined|separate] "
530 "[srst_gates_jtag|srst_nogate] "
531 "[trst_push_pull|trst_open_drain] "
532 "[srst_push_pull|srst_open_drain] "
533 "[connect_deassert_srst|connect_assert_srst]",
535 COMMAND_REGISTRATION_DONE
539 * Register the commands which deal with arbitrary debug adapter drivers.
541 * @todo Remove internal assumptions that all debug adapters use JTAG for
542 * transport. Various types and data structures are not named generically.
544 int interface_register_commands(struct command_context *ctx)
546 return register_commands(ctx, NULL, interface_command_handlers);