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
= adapter_get_speed_khz();
89 int actual_khz
= requested_khz
;
91 retval
= adapter_get_speed(&speed_var
);
92 if (retval
!= ERROR_OK
)
94 retval
= adapter_driver
->speed(speed_var
);
95 if (retval
!= ERROR_OK
)
97 retval
= adapter_get_speed_readable(&actual_khz
);
98 if (retval
!= ERROR_OK
)
99 LOG_INFO("adapter-specific clock speed value %d", 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 free(adapter_config
.usb_location
);
125 struct jtag_tap
*t
= jtag_all_taps();
127 struct jtag_tap
*n
= t
->next_tap
;
135 unsigned int adapter_get_speed_khz(void)
137 return adapter_config
.speed_khz
;
140 static int adapter_khz_to_speed(unsigned int khz
, int *speed
)
142 LOG_DEBUG("convert khz to adapter specific speed value");
143 adapter_config
.speed_khz
= khz
;
144 if (!is_adapter_initialized())
146 LOG_DEBUG("have adapter set up");
147 if (!adapter_driver
->khz
) {
148 LOG_ERROR("Translation from khz to adapter speed not implemented");
152 int retval
= adapter_driver
->khz(adapter_get_speed_khz(), &speed_div1
);
153 if (retval
!= ERROR_OK
)
159 static int adapter_rclk_to_speed(unsigned int fallback_speed_khz
, int *speed
)
161 int retval
= adapter_khz_to_speed(0, speed
);
162 if ((retval
!= ERROR_OK
) && fallback_speed_khz
) {
163 LOG_DEBUG("trying fallback speed...");
164 retval
= adapter_khz_to_speed(fallback_speed_khz
, speed
);
169 static int adapter_set_speed(int speed
)
171 /* this command can be called during CONFIG,
172 * in which case adapter isn't initialized */
173 return is_adapter_initialized() ? adapter_driver
->speed(speed
) : ERROR_OK
;
176 int adapter_config_khz(unsigned int khz
)
178 LOG_DEBUG("handle adapter khz");
179 adapter_config
.clock_mode
= CLOCK_MODE_KHZ
;
181 int retval
= adapter_khz_to_speed(khz
, &speed
);
182 return (retval
!= ERROR_OK
) ? retval
: adapter_set_speed(speed
);
185 int adapter_config_rclk(unsigned int fallback_speed_khz
)
187 LOG_DEBUG("handle adapter rclk");
188 adapter_config
.clock_mode
= CLOCK_MODE_RCLK
;
189 adapter_config
.rclk_fallback_speed_khz
= fallback_speed_khz
;
191 int retval
= adapter_rclk_to_speed(fallback_speed_khz
, &speed
);
192 return (retval
!= ERROR_OK
) ? retval
: adapter_set_speed(speed
);
195 int adapter_get_speed(int *speed
)
197 switch (adapter_config
.clock_mode
) {
199 adapter_khz_to_speed(adapter_get_speed_khz(), speed
);
201 case CLOCK_MODE_RCLK
:
202 adapter_rclk_to_speed(adapter_config
.rclk_fallback_speed_khz
, speed
);
205 LOG_ERROR("BUG: unknown adapter clock mode");
211 int adapter_get_speed_readable(int *khz
)
214 int retval
= adapter_get_speed(&speed_var
);
215 if (retval
!= ERROR_OK
)
217 if (!is_adapter_initialized())
219 if (!adapter_driver
->speed_div
) {
220 LOG_ERROR("Translation from adapter speed to khz not implemented");
223 return adapter_driver
->speed_div(speed_var
, khz
);
228 * 2 * 7 chars: max 7 ports
229 * 1 char: test for overflow
233 #define USB_MAX_LOCATION_LENGTH 16
235 #ifdef HAVE_LIBUSB_GET_PORT_NUMBERS
236 static void adapter_usb_set_location(const char *location
)
238 if (strnlen(location
, USB_MAX_LOCATION_LENGTH
) == USB_MAX_LOCATION_LENGTH
)
239 LOG_WARNING("usb location string is too long!!");
241 free(adapter_config
.usb_location
);
243 adapter_config
.usb_location
= strndup(location
, USB_MAX_LOCATION_LENGTH
);
245 #endif /* HAVE_LIBUSB_GET_PORT_NUMBERS */
247 const char *adapter_usb_get_location(void)
249 return adapter_config
.usb_location
;
252 bool adapter_usb_location_equal(uint8_t dev_bus
, uint8_t *port_path
, size_t path_len
)
254 size_t path_step
, string_length
;
258 if (!adapter_usb_get_location())
261 /* strtok need non const char */
262 loc
= strndup(adapter_usb_get_location(), USB_MAX_LOCATION_LENGTH
);
263 string_length
= strnlen(loc
, USB_MAX_LOCATION_LENGTH
);
265 ptr
= strtok(loc
, "-");
267 LOG_WARNING("no '-' in usb path\n");
271 string_length
-= strnlen(ptr
, string_length
);
272 /* check bus mismatch */
273 if (atoi(ptr
) != dev_bus
)
277 while (path_step
< path_len
) {
278 ptr
= strtok(NULL
, ".");
280 /* no more tokens in path */
284 /* path mismatch at some step */
285 if (path_step
< path_len
&& atoi(ptr
) != port_path
[path_step
])
289 string_length
-= strnlen(ptr
, string_length
) + 1;
292 /* walked the full path, all elements match */
293 if (path_step
== path_len
&& !string_length
)
301 static int jim_adapter_name(Jim_Interp
*interp
, int argc
, Jim_Obj
* const *argv
)
303 struct jim_getopt_info goi
;
304 jim_getopt_setup(&goi
, interp
, argc
-1, argv
+ 1);
306 /* return the name of the interface */
307 /* TCL code might need to know the exact type... */
308 /* FUTURE: we allow this as a means to "set" the interface. */
310 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
-1, "(no params)");
313 const char *name
= adapter_driver
? adapter_driver
->name
: NULL
;
314 Jim_SetResultString(goi
.interp
, name
? name
: "undefined", -1);
318 COMMAND_HANDLER(adapter_transports_command
)
323 retval
= CALL_COMMAND_HANDLER(transport_list_parse
, &transports
);
324 if (retval
!= ERROR_OK
)
327 retval
= allow_transports(CMD_CTX
, (const char **)transports
);
329 if (retval
!= ERROR_OK
) {
330 for (unsigned i
= 0; transports
[i
]; i
++)
337 COMMAND_HANDLER(handle_adapter_list_command
)
339 if (strcmp(CMD_NAME
, "list") == 0 && CMD_ARGC
> 0)
340 return ERROR_COMMAND_SYNTAX_ERROR
;
342 command_print(CMD
, "The following debug adapters are available:");
343 for (unsigned i
= 0; adapter_drivers
[i
]; i
++) {
344 const char *name
= adapter_drivers
[i
]->name
;
345 command_print(CMD
, "%u: %s", i
+ 1, name
);
351 COMMAND_HANDLER(handle_adapter_driver_command
)
355 /* check whether the interface is already configured */
356 if (adapter_driver
) {
357 LOG_WARNING("Interface already configured, ignoring");
361 /* interface name is a mandatory argument */
362 if (CMD_ARGC
!= 1 || CMD_ARGV
[0][0] == '\0')
363 return ERROR_COMMAND_SYNTAX_ERROR
;
365 for (unsigned i
= 0; adapter_drivers
[i
]; i
++) {
366 if (strcmp(CMD_ARGV
[0], adapter_drivers
[i
]->name
) != 0)
369 if (adapter_drivers
[i
]->commands
) {
370 retval
= register_commands(CMD_CTX
, NULL
,
371 adapter_drivers
[i
]->commands
);
372 if (retval
!= ERROR_OK
)
376 adapter_driver
= adapter_drivers
[i
];
378 return allow_transports(CMD_CTX
, adapter_driver
->transports
);
381 /* no valid interface was found (i.e. the configuration option,
382 * didn't match one of the compiled-in interfaces
384 LOG_ERROR("The specified debug interface was not found (%s)",
386 CALL_COMMAND_HANDLER(handle_adapter_list_command
);
387 return ERROR_JTAG_INVALID_INTERFACE
;
390 COMMAND_HANDLER(handle_reset_config_command
)
395 /* Original versions cared about the order of these tokens:
396 * reset_config signals [combination [trst_type [srst_type]]]
397 * They also clobbered the previous configuration even on error.
399 * Here we don't care about the order, and only change values
400 * which have been explicitly specified.
402 for (; CMD_ARGC
; CMD_ARGC
--, CMD_ARGV
++) {
407 m
= RESET_SRST_NO_GATING
;
408 if (strcmp(*CMD_ARGV
, "srst_gates_jtag") == 0)
409 /* default: don't use JTAG while SRST asserted */;
410 else if (strcmp(*CMD_ARGV
, "srst_nogate") == 0)
411 tmp
= RESET_SRST_NO_GATING
;
415 LOG_ERROR("extra reset_config %s spec (%s)",
416 "gating", *CMD_ARGV
);
417 return ERROR_COMMAND_SYNTAX_ERROR
;
423 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
424 if (strcmp(*CMD_ARGV
, "none") == 0)
426 else if (strcmp(*CMD_ARGV
, "trst_only") == 0)
427 tmp
= RESET_HAS_TRST
;
428 else if (strcmp(*CMD_ARGV
, "srst_only") == 0)
429 tmp
= RESET_HAS_SRST
;
430 else if (strcmp(*CMD_ARGV
, "trst_and_srst") == 0)
431 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
435 LOG_ERROR("extra reset_config %s spec (%s)",
436 "signal", *CMD_ARGV
);
437 return ERROR_COMMAND_SYNTAX_ERROR
;
442 /* combination (options for broken wiring) */
443 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
444 if (strcmp(*CMD_ARGV
, "separate") == 0)
445 /* separate reset lines - default */;
446 else if (strcmp(*CMD_ARGV
, "srst_pulls_trst") == 0)
447 tmp
|= RESET_SRST_PULLS_TRST
;
448 else if (strcmp(*CMD_ARGV
, "trst_pulls_srst") == 0)
449 tmp
|= RESET_TRST_PULLS_SRST
;
450 else if (strcmp(*CMD_ARGV
, "combined") == 0)
451 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
455 LOG_ERROR("extra reset_config %s spec (%s)",
456 "combination", *CMD_ARGV
);
457 return ERROR_COMMAND_SYNTAX_ERROR
;
462 /* trst_type (NOP without HAS_TRST) */
463 m
= RESET_TRST_OPEN_DRAIN
;
464 if (strcmp(*CMD_ARGV
, "trst_open_drain") == 0)
465 tmp
|= RESET_TRST_OPEN_DRAIN
;
466 else if (strcmp(*CMD_ARGV
, "trst_push_pull") == 0)
467 /* push/pull from adapter - default */;
471 LOG_ERROR("extra reset_config %s spec (%s)",
472 "trst_type", *CMD_ARGV
);
473 return ERROR_COMMAND_SYNTAX_ERROR
;
478 /* srst_type (NOP without HAS_SRST) */
479 m
= RESET_SRST_PUSH_PULL
;
480 if (strcmp(*CMD_ARGV
, "srst_push_pull") == 0)
481 tmp
|= RESET_SRST_PUSH_PULL
;
482 else if (strcmp(*CMD_ARGV
, "srst_open_drain") == 0)
483 /* open drain from adapter - default */;
487 LOG_ERROR("extra reset_config %s spec (%s)",
488 "srst_type", *CMD_ARGV
);
489 return ERROR_COMMAND_SYNTAX_ERROR
;
494 /* connect_type - only valid when srst_nogate */
495 m
= RESET_CNCT_UNDER_SRST
;
496 if (strcmp(*CMD_ARGV
, "connect_assert_srst") == 0)
497 tmp
|= RESET_CNCT_UNDER_SRST
;
498 else if (strcmp(*CMD_ARGV
, "connect_deassert_srst") == 0)
499 /* connect normally - default */;
503 LOG_ERROR("extra reset_config %s spec (%s)",
504 "connect_type", *CMD_ARGV
);
505 return ERROR_COMMAND_SYNTAX_ERROR
;
510 /* caller provided nonsense; fail */
511 LOG_ERROR("unknown reset_config flag (%s)", *CMD_ARGV
);
512 return ERROR_COMMAND_SYNTAX_ERROR
;
515 /* Remember the bits which were specified (mask)
516 * and their new values (new_cfg).
522 /* clear previous values of those bits, save new values */
524 int old_cfg
= jtag_get_reset_config();
528 jtag_set_reset_config(new_cfg
);
530 new_cfg
= jtag_get_reset_config();
533 * Display the (now-)current reset mode
537 /* minimal JTAG has neither SRST nor TRST (so that's the default) */
538 switch (new_cfg
& (RESET_HAS_TRST
| RESET_HAS_SRST
)) {
540 modes
[0] = "srst_only";
543 modes
[0] = "trst_only";
545 case RESET_TRST_AND_SRST
:
546 modes
[0] = "trst_and_srst";
553 /* normally SRST and TRST are decoupled; but bugs happen ... */
554 switch (new_cfg
& (RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
)) {
555 case RESET_SRST_PULLS_TRST
:
556 modes
[1] = "srst_pulls_trst";
558 case RESET_TRST_PULLS_SRST
:
559 modes
[1] = "trst_pulls_srst";
561 case RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
:
562 modes
[1] = "combined";
565 modes
[1] = "separate";
569 /* TRST-less connectors include Altera, Xilinx, and minimal JTAG */
570 if (new_cfg
& RESET_HAS_TRST
) {
571 if (new_cfg
& RESET_TRST_OPEN_DRAIN
)
572 modes
[3] = " trst_open_drain";
574 modes
[3] = " trst_push_pull";
578 /* SRST-less connectors include TI-14, Xilinx, and minimal JTAG */
579 if (new_cfg
& RESET_HAS_SRST
) {
580 if (new_cfg
& RESET_SRST_NO_GATING
)
581 modes
[2] = " srst_nogate";
583 modes
[2] = " srst_gates_jtag";
585 if (new_cfg
& RESET_SRST_PUSH_PULL
)
586 modes
[4] = " srst_push_pull";
588 modes
[4] = " srst_open_drain";
590 if (new_cfg
& RESET_CNCT_UNDER_SRST
)
591 modes
[5] = " connect_assert_srst";
593 modes
[5] = " connect_deassert_srst";
600 command_print(CMD
, "%s %s%s%s%s%s",
602 modes
[2], modes
[3], modes
[4], modes
[5]);
607 COMMAND_HANDLER(handle_adapter_srst_delay_command
)
610 return ERROR_COMMAND_SYNTAX_ERROR
;
613 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], delay
);
615 jtag_set_nsrst_delay(delay
);
617 command_print(CMD
, "adapter srst delay: %u", jtag_get_nsrst_delay());
621 COMMAND_HANDLER(handle_adapter_srst_pulse_width_command
)
624 return ERROR_COMMAND_SYNTAX_ERROR
;
627 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], width
);
629 jtag_set_nsrst_assert_width(width
);
631 command_print(CMD
, "adapter srst pulse_width: %u", jtag_get_nsrst_assert_width());
635 COMMAND_HANDLER(handle_adapter_speed_command
)
638 return ERROR_COMMAND_SYNTAX_ERROR
;
640 int retval
= ERROR_OK
;
643 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], khz
);
645 retval
= adapter_config_khz(khz
);
646 if (retval
!= ERROR_OK
)
650 int cur_speed
= adapter_get_speed_khz();
651 retval
= adapter_get_speed_readable(&cur_speed
);
652 if (retval
!= ERROR_OK
)
656 command_print(CMD
, "adapter speed: %d kHz", cur_speed
);
658 command_print(CMD
, "adapter speed: RCLK - adaptive");
663 COMMAND_HANDLER(handle_adapter_reset_de_assert
)
666 VALUE_UNDEFINED
= -1,
671 enum values srst
= VALUE_UNDEFINED
;
672 enum values trst
= VALUE_UNDEFINED
;
673 enum reset_types jtag_reset_config
= jtag_get_reset_config();
677 if (transport_is_jtag()) {
678 if (jtag_reset_config
& RESET_HAS_TRST
)
679 signal
= jtag_get_trst() ? "asserted" : "deasserted";
681 signal
= "not present";
682 command_print(CMD
, "trst %s", signal
);
685 if (jtag_reset_config
& RESET_HAS_SRST
)
686 signal
= jtag_get_srst() ? "asserted" : "deasserted";
688 signal
= "not present";
689 command_print(CMD
, "srst %s", signal
);
694 if (CMD_ARGC
!= 1 && CMD_ARGC
!= 3)
695 return ERROR_COMMAND_SYNTAX_ERROR
;
697 value
= (strcmp(CMD_NAME
, "assert") == 0) ? VALUE_ASSERT
: VALUE_DEASSERT
;
698 if (strcmp(CMD_ARGV
[0], "srst") == 0)
700 else if (strcmp(CMD_ARGV
[0], "trst") == 0)
703 return ERROR_COMMAND_SYNTAX_ERROR
;
706 if (strcmp(CMD_ARGV
[1], "assert") == 0)
707 value
= VALUE_ASSERT
;
708 else if (strcmp(CMD_ARGV
[1], "deassert") == 0)
709 value
= VALUE_DEASSERT
;
711 return ERROR_COMMAND_SYNTAX_ERROR
;
713 if (strcmp(CMD_ARGV
[2], "srst") == 0 && srst
== VALUE_UNDEFINED
)
715 else if (strcmp(CMD_ARGV
[2], "trst") == 0 && trst
== VALUE_UNDEFINED
)
718 return ERROR_COMMAND_SYNTAX_ERROR
;
721 if (trst
== VALUE_UNDEFINED
) {
722 if (transport_is_jtag())
723 trst
= jtag_get_trst() ? VALUE_ASSERT
: VALUE_DEASSERT
;
725 trst
= VALUE_DEASSERT
; /* unused, safe value */
728 if (srst
== VALUE_UNDEFINED
) {
729 if (jtag_reset_config
& RESET_HAS_SRST
)
730 srst
= jtag_get_srst() ? VALUE_ASSERT
: VALUE_DEASSERT
;
732 srst
= VALUE_DEASSERT
; /* unused, safe value */
735 if (trst
== VALUE_ASSERT
&& !transport_is_jtag()) {
736 LOG_ERROR("transport has no trst signal");
740 if (srst
== VALUE_ASSERT
&& !(jtag_reset_config
& RESET_HAS_SRST
)) {
741 LOG_ERROR("adapter has no srst signal");
745 return adapter_resets((trst
== VALUE_DEASSERT
) ? TRST_DEASSERT
: TRST_ASSERT
,
746 (srst
== VALUE_DEASSERT
) ? SRST_DEASSERT
: SRST_ASSERT
);
749 #ifdef HAVE_LIBUSB_GET_PORT_NUMBERS
750 COMMAND_HANDLER(handle_usb_location_command
)
753 adapter_usb_set_location(CMD_ARGV
[0]);
755 command_print(CMD
, "adapter usb location: %s", adapter_usb_get_location());
759 #endif /* HAVE_LIBUSB_GET_PORT_NUMBERS */
761 static const struct command_registration adapter_usb_command_handlers
[] = {
762 #ifdef HAVE_LIBUSB_GET_PORT_NUMBERS
765 .handler
= &handle_usb_location_command
,
766 .mode
= COMMAND_CONFIG
,
767 .help
= "display or set the USB bus location of the USB device",
768 .usage
= "[<bus>-port[.port]...]",
770 #endif /* HAVE_LIBUSB_GET_PORT_NUMBERS */
771 COMMAND_REGISTRATION_DONE
774 static const struct command_registration adapter_srst_command_handlers
[] = {
777 .handler
= handle_adapter_srst_delay_command
,
779 .help
= "delay after deasserting SRST in ms",
780 .usage
= "[milliseconds]",
783 .name
= "pulse_width",
784 .handler
= handle_adapter_srst_pulse_width_command
,
786 .help
= "SRST assertion pulse width in ms",
787 .usage
= "[milliseconds]",
789 COMMAND_REGISTRATION_DONE
792 static const struct command_registration adapter_command_handlers
[] = {
795 .handler
= handle_adapter_driver_command
,
796 .mode
= COMMAND_CONFIG
,
797 .help
= "Select a debug adapter driver",
798 .usage
= "driver_name",
802 .handler
= handle_adapter_speed_command
,
804 .help
= "With an argument, change to the specified maximum "
805 "jtag speed. For JTAG, 0 KHz signifies adaptive "
807 "With or without argument, display current setting.",
812 .handler
= handle_adapter_list_command
,
814 .help
= "List all built-in debug adapter drivers",
820 .jim_handler
= jim_adapter_name
,
821 .help
= "Returns the name of the currently "
822 "selected adapter (driver)",
827 .help
= "srst adapter command group",
829 .chain
= adapter_srst_command_handlers
,
832 .name
= "transports",
833 .handler
= adapter_transports_command
,
834 .mode
= COMMAND_CONFIG
,
835 .help
= "Declare transports the adapter supports.",
836 .usage
= "transport ...",
841 .help
= "usb adapter command group",
843 .chain
= adapter_usb_command_handlers
,
847 .handler
= handle_adapter_reset_de_assert
,
848 .mode
= COMMAND_EXEC
,
849 .help
= "Controls SRST and TRST lines.",
850 .usage
= "|deassert [srst|trst [assert|deassert srst|trst]]",
854 .handler
= handle_adapter_reset_de_assert
,
855 .mode
= COMMAND_EXEC
,
856 .help
= "Controls SRST and TRST lines.",
857 .usage
= "|assert [srst|trst [deassert|assert srst|trst]]",
859 COMMAND_REGISTRATION_DONE
862 static const struct command_registration interface_command_handlers
[] = {
866 .help
= "adapter command group",
868 .chain
= adapter_command_handlers
,
871 .name
= "reset_config",
872 .handler
= handle_reset_config_command
,
874 .help
= "configure adapter reset behavior",
875 .usage
= "[none|trst_only|srst_only|trst_and_srst] "
876 "[srst_pulls_trst|trst_pulls_srst|combined|separate] "
877 "[srst_gates_jtag|srst_nogate] "
878 "[trst_push_pull|trst_open_drain] "
879 "[srst_push_pull|srst_open_drain] "
880 "[connect_deassert_srst|connect_assert_srst]",
882 COMMAND_REGISTRATION_DONE
886 * Register the commands which deal with arbitrary debug adapter drivers.
888 * @todo Remove internal assumptions that all debug adapters use JTAG for
889 * transport. Various types and data structures are not named generically.
891 int adapter_register_commands(struct command_context
*ctx
)
893 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)