#ifndef OPENOCD_JTAG_INTERFACE_H
#define OPENOCD_JTAG_INTERFACE_H
-#include "jtag.h"
+#include <jtag/jtag.h>
/* @file
* The "Cable Helper API" is what the cable drivers can use to help
*/
tap_state_t tap_state_transition(tap_state_t current_state, bool tms);
-/// Provides user-friendly name lookup of TAP states.
-tap_state_t tap_state_by_name(const char *name);
-
/// Allow switching between old and new TMS tables. @see tap_get_tms_path
void tap_use_new_tms_table(bool use_new);
/// @returns True if new TMS table is active; false otherwise.
}
#endif // _DEBUG_JTAG_IO_
-typedef struct jtag_interface_s
-{
+/**
+ * Represents a driver for a debugging interface.
+ *
+ * @todo Rename; perhaps "debug_driver". This isn't an interface,
+ * it's a driver! Also, not all drivers support JTAG.
+ *
+ * @todo We need a per-instance structure too, and changes to pass
+ * that structure to the driver. Instances can for example be in
+ * either SWD or JTAG modes. This will help remove globals, and
+ * eventually to cope with systems which have more than one such
+ * debugging interface.
+ */
+struct jtag_interface {
/// The name of the JTAG interface driver.
char* name;
+ /**
+ * Bit vector listing capabilities exposed by this driver.
+ */
+ unsigned supported;
+#define DEBUG_CAP_TMS_SEQ (1 << 0)
+
+ /** transports supported in C code (NULL terminated vector) */
+ const char **transports;
+
+ const struct swd_driver *swd;
+
/**
* Execute queued commands.
* @returns ERROR_OK on success, or an error code on failure.
/**
* The interface driver may register additional commands to expose
* additional features not covered by the standard command set.
- * @param cmd_ctx The context in which commands should be registered.
- * @returns ERROR_OK on success, or an error code on failure.
*/
- int (*register_commands)(struct command_context_s* cmd_ctx);
+ const struct command_registration *commands;
/**
- * Interface driver must initalize any resources and connect to a
+ * Interface driver must initialize any resources and connect to a
* JTAG device.
+ *
+ * quit() is invoked if and only if init() succeeds. quit() is always
+ * invoked if init() succeeds. Same as malloc() + free(). Always
+ * invoke free() if malloc() succeeds and do not invoke free()
+ * otherwise.
+ *
* @returns ERROR_OK on success, or an error code on failure.
*/
int (*init)(void);
/**
* Interface driver must tear down all resources and disconnect from
* the JTAG device.
+ *
* @returns ERROR_OK on success, or an error code on failure.
*/
int (*quit)(void);
* @returns ERROR_OK on success, or an error code on failure.
*/
int (*srst_asserted)(int* srst_asserted);
-} jtag_interface_t;
+};
+
+
+extern const char *jtag_only[];
+extern const struct swd_driver *swd;
#endif // OPENOCD_JTAG_INTERFACE_H