From 93f2afa45f4cfcb8afd08dae5a17996dba5c7a9c Mon Sep 17 00:00:00 2001 From: David Brownell Date: Fri, 2 Jul 2010 16:45:28 -0400 Subject: initial "transport" framework This adds the guts of a transport framework with initialization, which should work with current JTAG-only configurations (tested with FT2232). Each debug adapter can declare the transports it supports, and exactly one transport is initialized. (with its commands) in any given OpenOCD session. * Define a new "struct transport with init hooks and a few "transport" subcommands to support it: "list" ... list the transports configured (just "jtag" for now) "select" ... makes the debug session use that transport "init" ... initializes the selected transport (internal) * "interface_transports" ... declares transports the current interface can support. (Some will do this from C code instead, when there are no hardware versioning (or other) issues to prevent it. Plus some FT2232 tweaks, including a few to streamline upcoming support for an SWD transport (initially for Luminary adapters). Eventually src/jtag should probably become src/transport, moving jtag-specific stuff to transport/jtag. Signed-off-by: David Brownell --- src/jtag/adapter.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'src/jtag/adapter.c') diff --git a/src/jtag/adapter.c b/src/jtag/adapter.c index 50e2a022..15b3ddc2 100644 --- a/src/jtag/adapter.c +++ b/src/jtag/adapter.c @@ -35,6 +35,7 @@ #include "minidriver.h" #include "interface.h" #include "interfaces.h" +#include "transport.h" #ifdef HAVE_STRINGS_H #include @@ -92,6 +93,25 @@ static int default_srst_asserted(int *srst_asserted) return ERROR_OK; } +COMMAND_HANDLER(interface_transport_command) +{ + char **transports; + int retval; + + retval = CALL_COMMAND_HANDLER(transport_list_parse, &transports); + if (retval != ERROR_OK) { + return retval; + + retval = allow_transports(CMD_CTX, (const char **)transports); + if (retval != ERROR_OK) { + for (unsigned i = 0; transports[i]; i++) + free(transports[i]); + free(transports); + } + } + return retval; +} + COMMAND_HANDLER(handle_interface_list_command) { if (strcmp(CMD_NAME, "interface_list") == 0 && CMD_ARGC > 0) @@ -451,6 +471,13 @@ static const struct command_registration interface_command_handlers[] = { .help = "Select a debug adapter interface (driver)", .usage = "driver_name", }, + { + .name = "interface_transports", + .handler = interface_transport_command, + .mode = COMMAND_CONFIG, + .help = "Declare transports the interface supports.", + .usage = "transport ... ", + }, { .name = "interface_list", .handler = handle_interface_list_command, -- cgit v1.2.3