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/transport.h | |
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/transport.h')
-rw-r--r-- | src/jtag/transport.h | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/jtag/transport.h b/src/jtag/transport.h new file mode 100644 index 00000000..d2d38ec2 --- /dev/null +++ b/src/jtag/transport.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2010 by David Brownell + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "helper/command.h" + +/** + * Wrapper for transport lifecycle operations. + * + * OpenOCD talks to targets through some kind of debugging + * or programming adapter, using some protocol that probably + * has target-specific aspects. + * + * A "transport" reflects electrical protocol to the target, + * e..g jtag, swd, spi, uart, ... NOT the messaging protocols + * layered over it (e.g. JTAG has eICE, CoreSight, Nexus, OnCE, + * and more). + * + * In addition to the lifecycle operations packaged by this + * structure, a transport also involves an interface supported + * by debug adapters and used by components such as debug targets. + * For non-debug transports, there may be interfaces used to + * write to flash chips. + */ +struct transport { + /** + * Each transport has a unique name, used to select it + * from among the alternatives. Examples might include + * "jtag", * "swd", "AVR_ISP" and more. + */ + const char *name; + + /** + * When a transport is selected, this method registers + * its commands and activates the transport (e.g. resets + * the link). + * + * After those commands are registered, they will often + * be used for further configuration of the debug link. + */ + int (*select)(struct command_context *ctx); + + /** + * server startup uses this method to validate transport + * configuration. (For example, with JTAG this interrogates + * the scan chain against the list of expected TAPs.) + */ + int (*init)(struct command_context *ctx); + + /** + * Transports are stored in a singly linked list. + */ + struct transport *next; +}; + +int transport_register(struct transport *new_transport); + +struct transport *get_current_transport(void); + +int transport_register_commands(struct command_context *ctx); + +COMMAND_HELPER(transport_list_parse, char ***vector); + +int allow_transports(struct command_context *ctx, const char **vector); + +bool transports_are_declared(void); |