1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * Copyright (C) 2005 by Dominic Rath <Dominic.Rath@gmx.de>
4 * Copyright (C) 2007-2010 Øyvind Harboe <oyvind.harboe@zylin.com>
5 * Copyright (C) 2009 SoftPLC Corporation, http://softplc.com, Dick Hollenbeck <dick@softplc.com>
6 * Copyright (C) 2009 Zachary T Welch <zw@superlucidity.net>
7 * Copyright (C) 2018 Pengutronix, Oleksij Rempel <kernel@pengutronix.de>
16 #include "minidriver.h"
17 #include "interface.h"
18 #include "interfaces.h"
19 #include <transport/transport.h>
27 * Holds support for configuring debug adapters from TCl scripts.
30 struct adapter_driver
*adapter_driver
;
31 const char * const jtag_only
[] = { "jtag", NULL
};
33 enum adapter_clk_mode
{
34 CLOCK_MODE_UNSELECTED
= 0,
40 * Adapter configuration
43 bool adapter_initialized
;
45 enum adapter_clk_mode clock_mode
;
47 int rclk_fallback_speed_khz
;
50 bool is_adapter_initialized(void)
52 return adapter_config
.adapter_initialized
;
56 * Do low-level setup like initializing registers, output signals,
59 int adapter_init(struct command_context
*cmd_ctx
)
61 if (is_adapter_initialized())
64 if (!adapter_driver
) {
65 /* nothing was previously specified by "adapter driver" command */
66 LOG_ERROR("Debug Adapter has to be specified, "
67 "see \"adapter driver\" command");
68 return ERROR_JTAG_INVALID_INTERFACE
;
72 retval
= adapter_driver
->init();
73 if (retval
!= ERROR_OK
)
75 adapter_config
.adapter_initialized
= true;
77 if (!adapter_driver
->speed
) {
78 LOG_INFO("This adapter doesn't support configurable speed");
82 if (adapter_config
.clock_mode
== CLOCK_MODE_UNSELECTED
) {
83 LOG_ERROR("An adapter speed is not selected in the init script."
84 " Insert a call to \"adapter speed\" or \"jtag_rclk\" to proceed.");
85 return ERROR_JTAG_INIT_FAILED
;
88 int requested_khz
= jtag_get_speed_khz();
89 int actual_khz
= requested_khz
;
90 int jtag_speed_var
= 0;
91 retval
= jtag_get_speed(&jtag_speed_var
);
92 if (retval
!= ERROR_OK
)
94 retval
= adapter_driver
->speed(jtag_speed_var
);
95 if (retval
!= ERROR_OK
)
97 retval
= jtag_get_speed_readable(&actual_khz
);
98 if (retval
!= ERROR_OK
)
99 LOG_INFO("adapter-specific clock speed value %d", jtag_speed_var
);
100 else if (actual_khz
) {
101 /* Adaptive clocking -- JTAG-specific */
102 if ((adapter_config
.clock_mode
== CLOCK_MODE_RCLK
)
103 || ((adapter_config
.clock_mode
== CLOCK_MODE_KHZ
) && !requested_khz
)) {
104 LOG_INFO("RCLK (adaptive clock speed) not supported - fallback to %d kHz"
107 LOG_INFO("clock speed %d kHz", actual_khz
);
109 LOG_INFO("RCLK (adaptive clock speed)");
114 int adapter_quit(void)
116 if (is_adapter_initialized() && adapter_driver
->quit
) {
117 /* close the JTAG interface */
118 int result
= adapter_driver
->quit();
119 if (result
!= ERROR_OK
)
120 LOG_ERROR("failed: %d", result
);
123 struct jtag_tap
*t
= jtag_all_taps();
125 struct jtag_tap
*n
= t
->next_tap
;
133 unsigned jtag_get_speed_khz(void)
135 return adapter_config
.speed_khz
;
138 static int adapter_khz_to_speed(unsigned khz
, int *speed
)
140 LOG_DEBUG("convert khz to interface specific speed value");
141 adapter_config
.speed_khz
= khz
;
142 if (!is_adapter_initialized())
144 LOG_DEBUG("have interface set up");
145 if (!adapter_driver
->khz
) {
146 LOG_ERROR("Translation from khz to jtag_speed not implemented");
150 int retval
= adapter_driver
->khz(jtag_get_speed_khz(), &speed_div1
);
151 if (retval
!= ERROR_OK
)
157 static int jtag_rclk_to_speed(unsigned fallback_speed_khz
, int *speed
)
159 int retval
= adapter_khz_to_speed(0, speed
);
160 if ((retval
!= ERROR_OK
) && fallback_speed_khz
) {
161 LOG_DEBUG("trying fallback speed...");
162 retval
= adapter_khz_to_speed(fallback_speed_khz
, speed
);
167 static int jtag_set_speed(int speed
)
169 /* this command can be called during CONFIG,
170 * in which case jtag isn't initialized */
171 return is_adapter_initialized() ? adapter_driver
->speed(speed
) : ERROR_OK
;
174 int jtag_config_khz(unsigned khz
)
176 LOG_DEBUG("handle jtag khz");
177 adapter_config
.clock_mode
= CLOCK_MODE_KHZ
;
179 int retval
= adapter_khz_to_speed(khz
, &speed
);
180 return (retval
!= ERROR_OK
) ? retval
: jtag_set_speed(speed
);
183 int jtag_config_rclk(unsigned fallback_speed_khz
)
185 LOG_DEBUG("handle jtag rclk");
186 adapter_config
.clock_mode
= CLOCK_MODE_RCLK
;
187 adapter_config
.rclk_fallback_speed_khz
= fallback_speed_khz
;
189 int retval
= jtag_rclk_to_speed(fallback_speed_khz
, &speed
);
190 return (retval
!= ERROR_OK
) ? retval
: jtag_set_speed(speed
);
193 int jtag_get_speed(int *speed
)
195 switch (adapter_config
.clock_mode
) {
197 adapter_khz_to_speed(jtag_get_speed_khz(), speed
);
199 case CLOCK_MODE_RCLK
:
200 jtag_rclk_to_speed(adapter_config
.rclk_fallback_speed_khz
, speed
);
203 LOG_ERROR("BUG: unknown jtag clock mode");
209 int jtag_get_speed_readable(int *khz
)
211 int jtag_speed_var
= 0;
212 int retval
= jtag_get_speed(&jtag_speed_var
);
213 if (retval
!= ERROR_OK
)
215 if (!is_adapter_initialized())
217 if (!adapter_driver
->speed_div
) {
218 LOG_ERROR("Translation from jtag_speed to khz not implemented");
221 return adapter_driver
->speed_div(jtag_speed_var
, khz
);
226 * 2 * 7 chars: max 7 ports
227 * 1 char: test for overflow
231 #define USB_MAX_LOCATION_LENGTH 16
233 #ifdef HAVE_LIBUSB_GET_PORT_NUMBERS
234 static void adapter_usb_set_location(const char *location
)
236 if (strnlen(location
, USB_MAX_LOCATION_LENGTH
) == USB_MAX_LOCATION_LENGTH
)
237 LOG_WARNING("usb location string is too long!!");
239 free(adapter_config
.usb_location
);
241 adapter_config
.usb_location
= strndup(location
, USB_MAX_LOCATION_LENGTH
);
243 #endif /* HAVE_LIBUSB_GET_PORT_NUMBERS */
245 const char *adapter_usb_get_location(void)
247 return adapter_config
.usb_location
;
250 bool adapter_usb_location_equal(uint8_t dev_bus
, uint8_t *port_path
, size_t path_len
)
252 size_t path_step
, string_length
;
256 if (!adapter_usb_get_location())
259 /* strtok need non const char */
260 loc
= strndup(adapter_usb_get_location(), USB_MAX_LOCATION_LENGTH
);
261 string_length
= strnlen(loc
, USB_MAX_LOCATION_LENGTH
);
263 ptr
= strtok(loc
, "-");
265 LOG_WARNING("no '-' in usb path\n");
269 string_length
-= strnlen(ptr
, string_length
);
270 /* check bus mismatch */
271 if (atoi(ptr
) != dev_bus
)
275 while (path_step
< path_len
) {
276 ptr
= strtok(NULL
, ".");
278 /* no more tokens in path */
282 /* path mismatch at some step */
283 if (path_step
< path_len
&& atoi(ptr
) != port_path
[path_step
])
287 string_length
-= strnlen(ptr
, string_length
) + 1;
290 /* walked the full path, all elements match */
291 if (path_step
== path_len
&& !string_length
)
299 static int jim_adapter_name(Jim_Interp
*interp
, int argc
, Jim_Obj
* const *argv
)
301 struct jim_getopt_info goi
;
302 jim_getopt_setup(&goi
, interp
, argc
-1, argv
+ 1);
304 /* return the name of the interface */
305 /* TCL code might need to know the exact type... */
306 /* FUTURE: we allow this as a means to "set" the interface. */
308 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
311 const char *name
= adapter_driver
? adapter_driver
->name
: NULL
;
312 Jim_SetResultString(goi
.interp
, name
? name
: "undefined", -1);
316 COMMAND_HANDLER(adapter_transports_command
)
321 retval
= CALL_COMMAND_HANDLER(transport_list_parse
, &transports
);
322 if (retval
!= ERROR_OK
)
325 retval
= allow_transports(CMD_CTX
, (const char **)transports
);
327 if (retval
!= ERROR_OK
) {
328 for (unsigned i
= 0; transports
[i
]; i
++)
335 COMMAND_HANDLER(handle_adapter_list_command
)
337 if (strcmp(CMD_NAME
, "list") == 0 && CMD_ARGC
> 0)
338 return ERROR_COMMAND_SYNTAX_ERROR
;
340 command_print(CMD
, "The following debug adapters are available:");
341 for (unsigned i
= 0; adapter_drivers
[i
]; i
++) {
342 const char *name
= adapter_drivers
[i
]->name
;
343 command_print(CMD
, "%u: %s", i
+ 1, name
);
349 COMMAND_HANDLER(handle_adapter_driver_command
)
353 /* check whether the interface is already configured */
354 if (adapter_driver
) {
355 LOG_WARNING("Interface already configured, ignoring");
359 /* interface name is a mandatory argument */
360 if (CMD_ARGC
!= 1 || CMD_ARGV
[0][0] == '\0')
361 return ERROR_COMMAND_SYNTAX_ERROR
;
363 for (unsigned i
= 0; adapter_drivers
[i
]; i
++) {
364 if (strcmp(CMD_ARGV
[0], adapter_drivers
[i
]->name
) != 0)
367 if (adapter_drivers
[i
]->commands
) {
368 retval
= register_commands(CMD_CTX
, NULL
,
369 adapter_drivers
[i
]->commands
);
370 if (retval
!= ERROR_OK
)
374 adapter_driver
= adapter_drivers
[i
];
376 return allow_transports(CMD_CTX
, adapter_driver
->transports
);
379 /* no valid interface was found (i.e. the configuration option,
380 * didn't match one of the compiled-in interfaces
382 LOG_ERROR("The specified debug interface was not found (%s)",
384 CALL_COMMAND_HANDLER(handle_adapter_list_command
);
385 return ERROR_JTAG_INVALID_INTERFACE
;
388 COMMAND_HANDLER(handle_reset_config_command
)
393 /* Original versions cared about the order of these tokens:
394 * reset_config signals [combination [trst_type [srst_type]]]
395 * They also clobbered the previous configuration even on error.
397 * Here we don't care about the order, and only change values
398 * which have been explicitly specified.
400 for (; CMD_ARGC
; CMD_ARGC
--, CMD_ARGV
++) {
405 m
= RESET_SRST_NO_GATING
;
406 if (strcmp(*CMD_ARGV
, "srst_gates_jtag") == 0)
407 /* default: don't use JTAG while SRST asserted */;
408 else if (strcmp(*CMD_ARGV
, "srst_nogate") == 0)
409 tmp
= RESET_SRST_NO_GATING
;
413 LOG_ERROR("extra reset_config %s spec (%s)",
414 "gating", *CMD_ARGV
);
415 return ERROR_COMMAND_SYNTAX_ERROR
;
421 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
422 if (strcmp(*CMD_ARGV
, "none") == 0)
424 else if (strcmp(*CMD_ARGV
, "trst_only") == 0)
425 tmp
= RESET_HAS_TRST
;
426 else if (strcmp(*CMD_ARGV
, "srst_only") == 0)
427 tmp
= RESET_HAS_SRST
;
428 else if (strcmp(*CMD_ARGV
, "trst_and_srst") == 0)
429 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
433 LOG_ERROR("extra reset_config %s spec (%s)",
434 "signal", *CMD_ARGV
);
435 return ERROR_COMMAND_SYNTAX_ERROR
;
440 /* combination (options for broken wiring) */
441 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
442 if (strcmp(*CMD_ARGV
, "separate") == 0)
443 /* separate reset lines - default */;
444 else if (strcmp(*CMD_ARGV
, "srst_pulls_trst") == 0)
445 tmp
|= RESET_SRST_PULLS_TRST
;
446 else if (strcmp(*CMD_ARGV
, "trst_pulls_srst") == 0)
447 tmp
|= RESET_TRST_PULLS_SRST
;
448 else if (strcmp(*CMD_ARGV
, "combined") == 0)
449 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
453 LOG_ERROR("extra reset_config %s spec (%s)",
454 "combination", *CMD_ARGV
);
455 return ERROR_COMMAND_SYNTAX_ERROR
;
460 /* trst_type (NOP without HAS_TRST) */
461 m
= RESET_TRST_OPEN_DRAIN
;
462 if (strcmp(*CMD_ARGV
, "trst_open_drain") == 0)
463 tmp
|= RESET_TRST_OPEN_DRAIN
;
464 else if (strcmp(*CMD_ARGV
, "trst_push_pull") == 0)
465 /* push/pull from adapter - default */;
469 LOG_ERROR("extra reset_config %s spec (%s)",
470 "trst_type", *CMD_ARGV
);
471 return ERROR_COMMAND_SYNTAX_ERROR
;
476 /* srst_type (NOP without HAS_SRST) */
477 m
= RESET_SRST_PUSH_PULL
;
478 if (strcmp(*CMD_ARGV
, "srst_push_pull") == 0)
479 tmp
|= RESET_SRST_PUSH_PULL
;
480 else if (strcmp(*CMD_ARGV
, "srst_open_drain") == 0)
481 /* open drain from adapter - default */;
485 LOG_ERROR("extra reset_config %s spec (%s)",
486 "srst_type", *CMD_ARGV
);
487 return ERROR_COMMAND_SYNTAX_ERROR
;
492 /* connect_type - only valid when srst_nogate */
493 m
= RESET_CNCT_UNDER_SRST
;
494 if (strcmp(*CMD_ARGV
, "connect_assert_srst") == 0)
495 tmp
|= RESET_CNCT_UNDER_SRST
;
496 else if (strcmp(*CMD_ARGV
, "connect_deassert_srst") == 0)
497 /* connect normally - default */;
501 LOG_ERROR("extra reset_config %s spec (%s)",
502 "connect_type", *CMD_ARGV
);
503 return ERROR_COMMAND_SYNTAX_ERROR
;
508 /* caller provided nonsense; fail */
509 LOG_ERROR("unknown reset_config flag (%s)", *CMD_ARGV
);
510 return ERROR_COMMAND_SYNTAX_ERROR
;
513 /* Remember the bits which were specified (mask)
514 * and their new values (new_cfg).
520 /* clear previous values of those bits, save new values */
522 int old_cfg
= jtag_get_reset_config();
526 jtag_set_reset_config(new_cfg
);
528 new_cfg
= jtag_get_reset_config();
531 * Display the (now-)current reset mode
535 /* minimal JTAG has neither SRST nor TRST (so that's the default) */
536 switch (new_cfg
& (RESET_HAS_TRST
| RESET_HAS_SRST
)) {
538 modes
[0] = "srst_only";
541 modes
[0] = "trst_only";
543 case RESET_TRST_AND_SRST
:
544 modes
[0] = "trst_and_srst";
551 /* normally SRST and TRST are decoupled; but bugs happen ... */
552 switch (new_cfg
& (RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
)) {
553 case RESET_SRST_PULLS_TRST
:
554 modes
[1] = "srst_pulls_trst";
556 case RESET_TRST_PULLS_SRST
:
557 modes
[1] = "trst_pulls_srst";
559 case RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
:
560 modes
[1] = "combined";
563 modes
[1] = "separate";
567 /* TRST-less connectors include Altera, Xilinx, and minimal JTAG */
568 if (new_cfg
& RESET_HAS_TRST
) {
569 if (new_cfg
& RESET_TRST_OPEN_DRAIN
)
570 modes
[3] = " trst_open_drain";
572 modes
[3] = " trst_push_pull";
576 /* SRST-less connectors include TI-14, Xilinx, and minimal JTAG */
577 if (new_cfg
& RESET_HAS_SRST
) {
578 if (new_cfg
& RESET_SRST_NO_GATING
)
579 modes
[2] = " srst_nogate";
581 modes
[2] = " srst_gates_jtag";
583 if (new_cfg
& RESET_SRST_PUSH_PULL
)
584 modes
[4] = " srst_push_pull";
586 modes
[4] = " srst_open_drain";
588 if (new_cfg
& RESET_CNCT_UNDER_SRST
)
589 modes
[5] = " connect_assert_srst";
591 modes
[5] = " connect_deassert_srst";
598 command_print(CMD
, "%s %s%s%s%s%s",
600 modes
[2], modes
[3], modes
[4], modes
[5]);
605 COMMAND_HANDLER(handle_adapter_srst_delay_command
)
608 return ERROR_COMMAND_SYNTAX_ERROR
;
611 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], delay
);
613 jtag_set_nsrst_delay(delay
);
615 command_print(CMD
, "adapter srst delay: %u", jtag_get_nsrst_delay());
619 COMMAND_HANDLER(handle_adapter_srst_pulse_width_command
)
622 return ERROR_COMMAND_SYNTAX_ERROR
;
625 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], width
);
627 jtag_set_nsrst_assert_width(width
);
629 command_print(CMD
, "adapter srst pulse_width: %u", jtag_get_nsrst_assert_width());
633 COMMAND_HANDLER(handle_adapter_speed_command
)
636 return ERROR_COMMAND_SYNTAX_ERROR
;
638 int retval
= ERROR_OK
;
641 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], khz
);
643 retval
= jtag_config_khz(khz
);
644 if (retval
!= ERROR_OK
)
648 int cur_speed
= jtag_get_speed_khz();
649 retval
= jtag_get_speed_readable(&cur_speed
);
650 if (retval
!= ERROR_OK
)
654 command_print(CMD
, "adapter speed: %d kHz", cur_speed
);
656 command_print(CMD
, "adapter speed: RCLK - adaptive");
661 COMMAND_HANDLER(handle_adapter_reset_de_assert
)
664 VALUE_UNDEFINED
= -1,
669 enum values srst
= VALUE_UNDEFINED
;
670 enum values trst
= VALUE_UNDEFINED
;
671 enum reset_types jtag_reset_config
= jtag_get_reset_config();
675 if (transport_is_jtag()) {
676 if (jtag_reset_config
& RESET_HAS_TRST
)
677 signal
= jtag_get_trst() ? "asserted" : "deasserted";
679 signal
= "not present";
680 command_print(CMD
, "trst %s", signal
);
683 if (jtag_reset_config
& RESET_HAS_SRST
)
684 signal
= jtag_get_srst() ? "asserted" : "deasserted";
686 signal
= "not present";
687 command_print(CMD
, "srst %s", signal
);
692 if (CMD_ARGC
!= 1 && CMD_ARGC
!= 3)
693 return ERROR_COMMAND_SYNTAX_ERROR
;
695 value
= (strcmp(CMD_NAME
, "assert") == 0) ? VALUE_ASSERT
: VALUE_DEASSERT
;
696 if (strcmp(CMD_ARGV
[0], "srst") == 0)
698 else if (strcmp(CMD_ARGV
[0], "trst") == 0)
701 return ERROR_COMMAND_SYNTAX_ERROR
;
704 if (strcmp(CMD_ARGV
[1], "assert") == 0)
705 value
= VALUE_ASSERT
;
706 else if (strcmp(CMD_ARGV
[1], "deassert") == 0)
707 value
= VALUE_DEASSERT
;
709 return ERROR_COMMAND_SYNTAX_ERROR
;
711 if (strcmp(CMD_ARGV
[2], "srst") == 0 && srst
== VALUE_UNDEFINED
)
713 else if (strcmp(CMD_ARGV
[2], "trst") == 0 && trst
== VALUE_UNDEFINED
)
716 return ERROR_COMMAND_SYNTAX_ERROR
;
719 if (trst
== VALUE_UNDEFINED
) {
720 if (transport_is_jtag())
721 trst
= jtag_get_trst() ? VALUE_ASSERT
: VALUE_DEASSERT
;
723 trst
= VALUE_DEASSERT
; /* unused, safe value */
726 if (srst
== VALUE_UNDEFINED
) {
727 if (jtag_reset_config
& RESET_HAS_SRST
)
728 srst
= jtag_get_srst() ? VALUE_ASSERT
: VALUE_DEASSERT
;
730 srst
= VALUE_DEASSERT
; /* unused, safe value */
733 if (trst
== VALUE_ASSERT
&& !transport_is_jtag()) {
734 LOG_ERROR("transport has no trst signal");
738 if (srst
== VALUE_ASSERT
&& !(jtag_reset_config
& RESET_HAS_SRST
)) {
739 LOG_ERROR("adapter has no srst signal");
743 return adapter_resets((trst
== VALUE_DEASSERT
) ? TRST_DEASSERT
: TRST_ASSERT
,
744 (srst
== VALUE_DEASSERT
) ? SRST_DEASSERT
: SRST_ASSERT
);
747 #ifdef HAVE_LIBUSB_GET_PORT_NUMBERS
748 COMMAND_HANDLER(handle_usb_location_command
)
751 adapter_usb_set_location(CMD_ARGV
[0]);
753 command_print(CMD
, "adapter usb location: %s", adapter_usb_get_location());
757 #endif /* HAVE_LIBUSB_GET_PORT_NUMBERS */
759 static const struct command_registration adapter_usb_command_handlers
[] = {
760 #ifdef HAVE_LIBUSB_GET_PORT_NUMBERS
763 .handler
= &handle_usb_location_command
,
764 .mode
= COMMAND_CONFIG
,
765 .help
= "display or set the USB bus location of the USB device",
766 .usage
= "[<bus>-port[.port]...]",
768 #endif /* HAVE_LIBUSB_GET_PORT_NUMBERS */
769 COMMAND_REGISTRATION_DONE
772 static const struct command_registration adapter_srst_command_handlers
[] = {
775 .handler
= handle_adapter_srst_delay_command
,
777 .help
= "delay after deasserting SRST in ms",
778 .usage
= "[milliseconds]",
781 .name
= "pulse_width",
782 .handler
= handle_adapter_srst_pulse_width_command
,
784 .help
= "SRST assertion pulse width in ms",
785 .usage
= "[milliseconds]",
787 COMMAND_REGISTRATION_DONE
790 static const struct command_registration adapter_command_handlers
[] = {
793 .handler
= handle_adapter_driver_command
,
794 .mode
= COMMAND_CONFIG
,
795 .help
= "Select a debug adapter driver",
796 .usage
= "driver_name",
800 .handler
= handle_adapter_speed_command
,
802 .help
= "With an argument, change to the specified maximum "
803 "jtag speed. For JTAG, 0 KHz signifies adaptive "
805 "With or without argument, display current setting.",
810 .handler
= handle_adapter_list_command
,
812 .help
= "List all built-in debug adapter drivers",
818 .jim_handler
= jim_adapter_name
,
819 .help
= "Returns the name of the currently "
820 "selected adapter (driver)",
825 .help
= "srst adapter command group",
827 .chain
= adapter_srst_command_handlers
,
830 .name
= "transports",
831 .handler
= adapter_transports_command
,
832 .mode
= COMMAND_CONFIG
,
833 .help
= "Declare transports the adapter supports.",
834 .usage
= "transport ...",
839 .help
= "usb adapter command group",
841 .chain
= adapter_usb_command_handlers
,
845 .handler
= handle_adapter_reset_de_assert
,
846 .mode
= COMMAND_EXEC
,
847 .help
= "Controls SRST and TRST lines.",
848 .usage
= "|deassert [srst|trst [assert|deassert srst|trst]]",
852 .handler
= handle_adapter_reset_de_assert
,
853 .mode
= COMMAND_EXEC
,
854 .help
= "Controls SRST and TRST lines.",
855 .usage
= "|assert [srst|trst [deassert|assert srst|trst]]",
857 COMMAND_REGISTRATION_DONE
860 static const struct command_registration interface_command_handlers
[] = {
864 .help
= "adapter command group",
866 .chain
= adapter_command_handlers
,
869 .name
= "reset_config",
870 .handler
= handle_reset_config_command
,
872 .help
= "configure adapter reset behavior",
873 .usage
= "[none|trst_only|srst_only|trst_and_srst] "
874 "[srst_pulls_trst|trst_pulls_srst|combined|separate] "
875 "[srst_gates_jtag|srst_nogate] "
876 "[trst_push_pull|trst_open_drain] "
877 "[srst_push_pull|srst_open_drain] "
878 "[connect_deassert_srst|connect_assert_srst]",
880 COMMAND_REGISTRATION_DONE
884 * Register the commands which deal with arbitrary debug adapter drivers.
886 * @todo Remove internal assumptions that all debug adapters use JTAG for
887 * transport. Various types and data structures are not named generically.
889 int interface_register_commands(struct command_context
*ctx
)
891 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)