diff options
author | David Brownell <dbrownell@users.sourceforge.net> | 2010-07-02 16:45:28 -0400 |
---|---|---|
committer | David Brownell <db@helium.(none)> | 2010-07-02 16:45:28 -0400 |
commit | 93f2afa45f4cfcb8afd08dae5a17996dba5c7a9c (patch) | |
tree | 0c03935bd09e77c5edd98e1b356f0ffbc3df239b /src/jtag/adapter.c | |
parent | deb176d33514eb6b702b14043c338b2d0053f11d (diff) |
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 <db@helium.(none)>
Diffstat (limited to 'src/jtag/adapter.c')
-rw-r--r-- | src/jtag/adapter.c | 27 |
1 files changed, 27 insertions, 0 deletions
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 <strings.h> @@ -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) @@ -452,6 +472,13 @@ static const struct command_registration interface_command_handlers[] = { .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, .mode = COMMAND_ANY, |