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/core.c | |
parent | deb176d33514eb6b702b14043c338b2d0053f11d (diff) | |
download | riscv-openocd-93f2afa45f4cfcb8afd08dae5a17996dba5c7a9c.zip riscv-openocd-93f2afa45f4cfcb8afd08dae5a17996dba5c7a9c.tar.gz riscv-openocd-93f2afa45f4cfcb8afd08dae5a17996dba5c7a9c.tar.bz2 |
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/core.c')
-rw-r--r-- | src/jtag/core.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/jtag/core.c b/src/jtag/core.c index 782f10f..1643d9b 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -33,11 +33,15 @@ #include "jtag.h" #include "interface.h" +#include "transport.h" #ifdef HAVE_STRINGS_H #include <strings.h> #endif +/* SVF and XSVF are higher level JTAG command sets (for boundary scan) */ +#include "svf/svf.h" +#include "xsvf/xsvf.h" /// The number of JTAG queue flushes (for profiling and debugging purposes). static int jtag_flush_queue_count; @@ -1348,6 +1352,21 @@ int adapter_init(struct command_context *cmd_ctx) return ERROR_JTAG_INIT_FAILED; } + /* LEGACY SUPPORT ... adapter drivers must declare what + * transports they allow. Until they all do so, assume + * the legacy drivers are JTAG-only + */ + if (!transports_are_declared()) { + static const char *jtag_only[] = { "jtag", NULL, }; + LOG_ERROR("Adapter driver '%s' did not declare " + "which transports it allows; assuming" + "JTAG-only", jtag->name); + int retval = allow_transports(cmd_ctx, jtag_only); + if (retval != ERROR_OK) + return retval; + } + + int requested_khz = jtag_get_speed_khz(); int actual_khz = requested_khz; int retval = jtag_get_speed_readable(&actual_khz); @@ -1706,3 +1725,45 @@ unsigned jtag_get_ntrst_assert_width(void) { return jtag_ntrst_assert_width; } + +static int jtag_select(struct command_context *ctx) +{ + int retval; + + /* NOTE: interface init must already have been done. + * That works with only C code ... no Tcl glue required. + */ + + + retval = jtag_register_commands(ctx); + + if (retval != ERROR_OK) + return retval; + + retval = svf_register_commands(ctx); + + if (retval != ERROR_OK) + return retval; + + return xsvf_register_commands(ctx); +} + +static struct transport jtag_transport = { + .name = "jtag", + .select = jtag_select, + .init = jtag_init, +}; + +static void jtag_constructor(void) __attribute__((constructor)); +static void jtag_constructor(void) +{ + transport_register(&jtag_transport); +} + +/** Returns true if the current debug session + * is using JTAG as its transport. + */ +bool transport_is_jtag(void) +{ + return get_current_transport() == &jtag_transport; +} |