#include "minidriver.h"
#include "interface.h"
#include "interfaces.h"
+#include <helper/bits.h>
#include <transport/transport.h>
/**
*/
struct adapter_driver *adapter_driver;
-const char * const jtag_only[] = { "jtag", NULL };
enum adapter_clk_mode {
CLOCK_MODE_UNSELECTED = 0,
for (unsigned int i = 0; adapter_drivers[i]; i++) {
const char *name = adapter_drivers[i]->name;
- const char * const *transports = adapter_drivers[i]->transports;
+ unsigned int transport_ids = adapter_drivers[i]->transport_ids;
command_print_sameline(CMD, "%-*s {", max_len, name);
- for (unsigned int j = 0; transports[j]; j++)
- command_print_sameline(CMD, " %s", transports[j]);
+ for (unsigned int j = BIT(0); j & TRANSPORT_VALID_MASK; j <<= 1)
+ if (j & transport_ids)
+ command_print_sameline(CMD, " %s", transport_name(j));
command_print(CMD, " }");
}
adapter_driver = adapter_drivers[i];
- return allow_transports(CMD_CTX, adapter_driver->transports);
+ return allow_transports(CMD_CTX, adapter_driver->transport_ids,
+ adapter_driver->transport_preferred_id);
}
/* no valid adapter driver was found (i.e. the configuration option,
COMMAND_REGISTRATION_DONE
};
-static const char * const am335xgpio_transports[] = { "jtag", "swd", NULL };
-
static struct jtag_interface am335xgpio_interface = {
.supported = DEBUG_CAP_TMS_SEQ,
.execute_queue = bitbang_execute_queue,
struct adapter_driver am335xgpio_adapter_driver = {
.name = "am335xgpio",
- .transports = am335xgpio_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = am335xgpio_command_handlers,
.init = am335xgpio_init,
struct adapter_driver amt_jtagaccel_adapter_driver = {
.name = "amt_jtagaccel",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = amtjtagaccel_command_handlers,
.init = amt_jtagaccel_init,
struct adapter_driver angie_adapter_driver = {
.name = "angie",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.init = angie_init,
.quit = angie_quit,
struct adapter_driver armjtagew_adapter_driver = {
.name = "arm-jtag-ew",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = armjtagew_command_handlers,
.init = armjtagew_init,
struct adapter_driver at91rm9200_adapter_driver = {
.name = "at91rm9200",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = at91rm9200_command_handlers,
.init = at91rm9200_init,
}
-static const char * const bcm2835_transports[] = { "jtag", "swd", NULL };
-
static struct jtag_interface bcm2835gpio_interface = {
.supported = DEBUG_CAP_TMS_SEQ,
.execute_queue = bitbang_execute_queue,
};
struct adapter_driver bcm2835gpio_adapter_driver = {
.name = "bcm2835gpio",
- .transports = bcm2835_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = bcm2835gpio_command_handlers,
.init = bcm2835gpio_init,
.run = buspirate_swd_run_queue,
};
-static const char * const buspirate_transports[] = { "jtag", "swd", NULL };
-
static struct jtag_interface buspirate_interface = {
.execute_queue = buspirate_execute_queue,
};
struct adapter_driver buspirate_adapter_driver = {
.name = "buspirate",
- .transports = buspirate_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = buspirate_command_handlers,
.init = buspirate_init,
.run = cmsis_dap_swd_run_queue,
};
-static const char * const cmsis_dap_transport[] = { "swd", "jtag", NULL };
-
static struct jtag_interface cmsis_dap_interface = {
.supported = DEBUG_CAP_TMS_SEQ,
.execute_queue = cmsis_dap_execute_queue,
struct adapter_driver cmsis_dap_adapter_driver = {
.name = "cmsis-dap",
- .transports = cmsis_dap_transport,
+ .transport_ids = TRANSPORT_SWD | TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_SWD,
.commands = cmsis_dap_command_handlers,
.init = cmsis_dap_init,
.run = dmem_dp_run,
};
-static const char *const dmem_dap_transport[] = { "dapdirect_swd", NULL };
-
struct adapter_driver dmem_dap_adapter_driver = {
.name = "dmem",
- .transports = dmem_dap_transport,
+ .transport_ids = TRANSPORT_DAPDIRECT_SWD,
+ .transport_preferred_id = TRANSPORT_DAPDIRECT_SWD,
.commands = dmem_dap_command_handlers,
.init = dmem_dap_init,
struct adapter_driver dummy_adapter_driver = {
.name = "dummy",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = dummy_command_handlers,
.init = &dummy_init,
struct adapter_driver ep93xx_adapter_driver = {
.name = "ep93xx",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.init = ep93xx_init,
.quit = ep93xx_quit,
struct adapter_driver esp_usb_adapter_driver = {
.name = "esp_usb_jtag",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = esp_usb_jtag_commands,
.init = esp_usb_jtag_init,
struct adapter_driver ft232r_adapter_driver = {
.name = "ft232r",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = ft232r_command_handlers,
.init = ft232r_init,
.run = ftdi_swd_run_queue,
};
-static const char * const ftdi_transports[] = { "jtag", "swd", NULL };
-
static struct jtag_interface ftdi_interface = {
.supported = DEBUG_CAP_TMS_SEQ,
.execute_queue = ftdi_execute_queue,
struct adapter_driver ftdi_adapter_driver = {
.name = "ftdi",
- .transports = ftdi_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = ftdi_command_handlers,
.init = ftdi_initialize,
struct adapter_driver gw16012_adapter_driver = {
.name = "gw16012",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = gw16012_command_handlers,
.init = gw16012_init,
COMMAND_REGISTRATION_DONE
};
-static const char * const imx_gpio_transports[] = { "jtag", "swd", NULL };
-
static struct jtag_interface imx_gpio_interface = {
.supported = DEBUG_CAP_TMS_SEQ,
.execute_queue = bitbang_execute_queue,
struct adapter_driver imx_gpio_adapter_driver = {
.name = "imx_gpio",
- .transports = imx_gpio_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = imx_gpio_command_handlers,
.init = imx_gpio_init,
.run = &jlink_swd_run_queue,
};
-static const char * const jlink_transports[] = { "jtag", "swd", NULL };
-
static struct jtag_interface jlink_interface = {
.execute_queue = &jlink_execute_queue,
};
struct adapter_driver jlink_adapter_driver = {
.name = "jlink",
- .transports = jlink_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = jlink_command_handlers,
.init = &jlink_init,
struct adapter_driver jtag_dpi_adapter_driver = {
.name = "jtag_dpi",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = jtag_dpi_command_handlers,
.init = jtag_dpi_init,
.quit = jtag_dpi_quit,
struct adapter_driver jtag_vpi_adapter_driver = {
.name = "jtag_vpi",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = jtag_vpi_command_handlers,
.init = jtag_vpi_init,
.run = kitprog_swd_run_queue,
};
-static const char * const kitprog_transports[] = { "swd", NULL };
-
struct adapter_driver kitprog_adapter_driver = {
.name = "kitprog",
- .transports = kitprog_transports,
+ .transport_ids = TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_SWD,
.commands = kitprog_command_handlers,
.init = kitprog_init,
return ERROR_JTAG_INIT_FAILED;
}
-static const char *const linuxgpiod_transport[] = { "swd", "jtag", NULL };
-
static struct jtag_interface linuxgpiod_interface = {
.supported = DEBUG_CAP_TMS_SEQ,
.execute_queue = bitbang_execute_queue,
struct adapter_driver linuxgpiod_adapter_driver = {
.name = "linuxgpiod",
- .transports = linuxgpiod_transport,
+ .transport_ids = TRANSPORT_SWD | TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_SWD,
.init = linuxgpiod_init,
.quit = linuxgpiod_quit,
COMMAND_REGISTRATION_DONE
};
-// Only SWD transport supported
-static const char *const spidev_transports[] = { "swd", NULL };
-
struct adapter_driver linuxspidev_adapter_driver = {
.name = "linuxspidev",
- .transports = spidev_transports,
+ .transport_ids = TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_SWD,
.commands = spidev_command_handlers,
.init = spidev_init,
struct adapter_driver opendous_adapter_driver = {
.name = "opendous",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = opendous_command_handlers,
.init = opendous_init,
struct adapter_driver openjtag_adapter_driver = {
.name = "openjtag",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = openjtag_command_handlers,
.init = openjtag_init,
struct adapter_driver osbdm_adapter_driver = {
.name = "osbdm",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.init = osbdm_init,
.quit = osbdm_quit,
struct adapter_driver parport_adapter_driver = {
.name = "parport",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = parport_command_handlers,
.init = parport_init,
struct adapter_driver presto_adapter_driver = {
.name = "presto",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.init = presto_jtag_init,
.quit = presto_jtag_quit,
return ERROR_COMMAND_SYNTAX_ERROR;
}
-static const char * const remote_bitbang_transports[] = { "jtag", "swd", NULL };
-
COMMAND_HANDLER(remote_bitbang_handle_remote_bitbang_use_remote_sleep_command)
{
if (CMD_ARGC != 1)
struct adapter_driver remote_bitbang_adapter_driver = {
.name = "remote_bitbang",
- .transports = remote_bitbang_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = remote_bitbang_command_handlers,
.init = &remote_bitbang_init,
struct adapter_driver rlink_adapter_driver = {
.name = "rlink",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.init = rlink_init,
.quit = rlink_quit,
.quit = rshim_disconnect,
};
-static const char *const rshim_dap_transport[] = { "dapdirect_swd", NULL };
-
struct adapter_driver rshim_dap_adapter_driver = {
.name = "rshim",
- .transports = rshim_dap_transport,
+ .transport_ids = TRANSPORT_DAPDIRECT_SWD,
+ .transport_preferred_id = TRANSPORT_DAPDIRECT_SWD,
.commands = rshim_dap_command_handlers,
.init = rshim_dap_init,
.reconnect = stlink_swim_op_reconnect,
};
-static const char *const stlink_dap_transport[] = { "dapdirect_swd", "dapdirect_jtag", "swim", NULL };
-
struct adapter_driver stlink_dap_adapter_driver = {
.name = "st-link",
- .transports = stlink_dap_transport,
+ .transport_ids = TRANSPORT_DAPDIRECT_SWD | TRANSPORT_DAPDIRECT_JTAG | TRANSPORT_SWIM,
+ .transport_preferred_id = TRANSPORT_DAPDIRECT_SWD,
.commands = stlink_dap_command_handlers,
.init = stlink_dap_init,
static int sysfsgpio_init(void);
static int sysfsgpio_quit(void);
-static const char * const sysfsgpio_transports[] = { "jtag", "swd", NULL };
-
static struct jtag_interface sysfsgpio_interface = {
.supported = DEBUG_CAP_TMS_SEQ,
.execute_queue = bitbang_execute_queue,
struct adapter_driver sysfsgpio_adapter_driver = {
.name = "sysfsgpio",
- .transports = sysfsgpio_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = sysfsgpio_command_handlers,
.init = sysfsgpio_init,
struct adapter_driver ulink_adapter_driver = {
.name = "ulink",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = ulink_command_handlers,
.init = ulink_init,
struct adapter_driver usb_blaster_adapter_driver = {
.name = "usb_blaster",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = ublast_command_handlers,
.init = ublast_init,
struct adapter_driver usbprog_adapter_driver = {
.name = "usbprog",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.init = usbprog_init,
.quit = usbprog_quit,
.quit = NULL, /* optional */
};
-static const char *const vdebug_transports[] = { "jtag", "dapdirect_swd", NULL };
-
struct adapter_driver vdebug_adapter_driver = {
.name = "vdebug",
- .transports = vdebug_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_DAPDIRECT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.speed = vdebug_jtag_speed,
.khz = vdebug_jtag_khz,
.speed_div = vdebug_jtag_div,
COMMAND_REGISTRATION_DONE
};
-static const char * const vsllink_transports[] = {"jtag", "swd", NULL};
-
static const struct swd_driver vsllink_swd_driver = {
.init = vsllink_swd_init,
.switch_seq = vsllink_swd_switch_seq,
struct adapter_driver vsllink_adapter_driver = {
.name = "vsllink",
- .transports = vsllink_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = vsllink_command_handlers,
.init = vsllink_init,
.run = xds110_swd_run_queue,
};
-static const char * const xds110_transport[] = { "swd", "jtag", NULL };
-
static struct jtag_interface xds110_interface = {
.execute_queue = xds110_execute_queue,
};
struct adapter_driver xds110_adapter_driver = {
.name = "xds110",
- .transports = xds110_transport,
+ .transport_ids = TRANSPORT_SWD | TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_SWD,
.commands = xds110_command_handlers,
.init = xds110_init,
.run = xlnx_pcie_xvc_swd_run_queue,
};
-static const char * const xlnx_pcie_xvc_transports[] = { "jtag", "swd", NULL };
-
struct adapter_driver xlnx_pcie_xvc_adapter_driver = {
.name = "xlnx_pcie_xvc",
- .transports = xlnx_pcie_xvc_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = xlnx_pcie_xvc_command_handlers,
.init = &xlnx_pcie_xvc_init,
struct adapter_driver hl_adapter_driver = {
.name = "hla",
- .transports = hl_transports,
+ .transport_ids = TRANSPORT_HLA_SWD | TRANSPORT_HLA_JTAG,
+ .transport_preferred_id = TRANSPORT_HLA_SWD,
.commands = hl_interface_command_handlers,
.init = hl_interface_init,
struct target;
/** */
enum e_hl_transports;
-/** */
-extern const char *hl_transports[];
#define HLA_MAX_USB_IDS 16
.override_target = hl_interface_override_target,
};
-const char *hl_transports[] = { "hla_swd", "hla_jtag", NULL };
-
static void hl_constructor(void) __attribute__ ((constructor));
static void hl_constructor(void)
{
#include <jtag/jtag.h>
#include <jtag/swim.h>
#include <target/arm_tpiu_swo.h>
+#include <transport/transport.h>
/* @file
* The "Cable Helper API" is what the cable drivers can use to help
/** The name of the interface driver. */
const char * const name;
- /** transports supported in C code (NULL terminated vector) */
- const char * const *transports;
+ /**
+ * Bitmask of transport IDs supported in C code.
+ */
+ unsigned int transport_ids;
+
+ /**
+ * ID of transport that gets auto-selected when not specified by the user.
+ * The auto-selection of transport is DEPRECATED.
+ */
+ unsigned int transport_preferred_id;
/**
* The interface driver may register additional commands to expose
const struct swim_driver *swim_ops;
};
-extern const char * const jtag_only[];
-
int adapter_resets(int assert_trst, int assert_srst);
int adapter_assert_reset(void);
int adapter_deassert_reset(void);
static struct transport *transport_list;
/**
- * NULL-terminated Vector of names of transports which the
- * currently selected debug adapter supports. This is declared
- * by the time that adapter is fully set up.
+ * Bitmask of transport IDs which the currently selected debug adapter supports.
+ * This is declared by the time that adapter is fully set up.
*/
-static const char * const *allowed_transports;
+static unsigned int allowed_transports;
+
+/**
+ * Transport ID auto-selected when not specified by the user.
+ */
+static unsigned int preferred_transport;
/**
* Adapter supports a single transport; it has been auto-selected
/** * The transport being used for the current OpenOCD session. */
static struct transport *session;
-static const char *transport_name(unsigned int id)
+const char *transport_name(unsigned int id)
{
for (unsigned int i = 0; i < ARRAY_SIZE(transport_names); i++)
if (id == transport_names[i].id)
* to declare the set of transports supported by an adapter. When
* there is only one member of that set, it is automatically selected.
*/
-int allow_transports(struct command_context *ctx, const char * const *vector)
+int allow_transports(struct command_context *ctx, unsigned int transport_ids,
+ unsigned int transport_preferred_id)
{
/* NOTE: caller is required to provide only a list
- * of *valid* transport names
+ * of *valid* transports
*
* REVISIT should we validate that? and insist there's
- * at least one non-NULL element in that list?
+ * at least one valid element in that list?
*
* ... allow removals, e.g. external strapping prevents use
* of one transport; C code should be definitive about what
return ERROR_FAIL;
}
- allowed_transports = vector;
+ allowed_transports = transport_ids;
+ preferred_transport = transport_preferred_id;
/* autoselect if there's no choice ... */
- if (!vector[1]) {
- LOG_DEBUG("only one transport option; autoselecting '%s'", vector[0]);
+ if (IS_PWR_OF_2(transport_ids)) {
+ LOG_DEBUG("only one transport option; autoselecting '%s'", transport_name(transport_ids));
transport_single_is_autoselected = true;
- return transport_select(ctx, vector[0]);
+ return transport_select(ctx, transport_name(transport_ids));
}
return ERROR_OK;
/* no session transport configured, print transports then fail */
LOG_ERROR("Transports available:");
- const char * const *vector = allowed_transports;
- while (*vector) {
- LOG_ERROR("%s", *vector);
- vector++;
+ for (unsigned int i = BIT(0); i & TRANSPORT_VALID_MASK; i <<= 1) {
+ if (i & allowed_transports)
+ LOG_ERROR("%s", transport_name(i));
}
return ERROR_FAIL;
}
}
LOG_WARNING("DEPRECATED: auto-selecting transport \"%s\". "
"Use 'transport select %s' to suppress this message.",
- allowed_transports[0], allowed_transports[0]);
- int retval = transport_select(CMD_CTX, allowed_transports[0]);
+ transport_name(preferred_transport),
+ transport_name(preferred_transport));
+ int retval = transport_select(CMD_CTX, transport_name(preferred_transport));
if (retval != ERROR_OK)
return retval;
}
return ERROR_FAIL;
}
- for (unsigned int i = 0; allowed_transports[i]; i++) {
- if (!strcmp(allowed_transports[i], CMD_ARGV[0])) {
+ for (unsigned int i = BIT(0); i & TRANSPORT_VALID_MASK; i <<= 1) {
+ if ((i & allowed_transports)
+ && !strcmp(transport_name(i), CMD_ARGV[0])) {
int retval = transport_select(CMD_CTX, CMD_ARGV[0]);
if (retval != ERROR_OK)
return retval;
const char *get_current_transport_name(void);
+const char *transport_name(unsigned int id);
+
int transport_register_commands(struct command_context *ctx);
-int allow_transports(struct command_context *ctx, const char * const *vector);
+int allow_transports(struct command_context *ctx, unsigned int transport_ids,
+ unsigned int transport_preferred_id);
bool transport_is_jtag(void);
bool transport_is_swd(void);