adapter: use bitmask for driver's transports

In every driver, replace the array of strings with a bitmask that
lists the supported transports.
Add an extra field to carry the former first listed transport as a
"preferred" transport. It would be used as default when no command
'transport select' is used. This keeps backward compatibility with
scripts that do not define the transport, relying on such default.

Change-Id: I4976583f1a38fdcc1f85045023dc7c629001f743
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/8675
Tested-by: jenkins
Reviewed-by: zapb <dev@zapb.de>
This commit is contained in:
Antonio Borneo
2025-02-12 16:39:18 +01:00
parent 236208a5ff
commit a500b2ce67
46 changed files with 129 additions and 113 deletions

View File

@@ -16,6 +16,7 @@
#include "minidriver.h"
#include "interface.h"
#include "interfaces.h"
#include <helper/bits.h>
#include <transport/transport.h>
/**
@@ -24,7 +25,6 @@
*/
struct adapter_driver *adapter_driver;
const char * const jtag_only[] = { "jtag", NULL };
enum adapter_clk_mode {
CLOCK_MODE_UNSELECTED = 0,
@@ -402,11 +402,12 @@ COMMAND_HANDLER(dump_adapter_driver_list)
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, " }");
}
@@ -447,7 +448,8 @@ COMMAND_HANDLER(handle_adapter_driver_command)
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,

View File

@@ -350,8 +350,6 @@ static const struct command_registration am335xgpio_command_handlers[] = {
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,
@@ -494,7 +492,8 @@ static int am335xgpio_quit(void)
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,

View File

@@ -579,7 +579,8 @@ static struct jtag_interface amt_jtagaccel_interface = {
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,

View File

@@ -2388,7 +2388,8 @@ static struct jtag_interface angie_interface = {
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,

View File

@@ -486,7 +486,8 @@ static struct jtag_interface armjtagew_interface = {
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,

View File

@@ -186,7 +186,8 @@ static struct jtag_interface at91rm9200_interface = {
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,

View File

@@ -590,15 +590,14 @@ static int bcm2835gpio_quit(void)
}
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,

View File

@@ -534,15 +534,14 @@ static const struct swd_driver buspirate_swd = {
.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,

View File

@@ -2314,8 +2314,6 @@ static const struct swd_driver cmsis_dap_swd_driver = {
.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,
@@ -2323,7 +2321,8 @@ static struct jtag_interface cmsis_dap_interface = {
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,

View File

@@ -604,11 +604,10 @@ static const struct dap_ops dmem_dap_ops = {
.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,

View File

@@ -140,7 +140,8 @@ static struct jtag_interface dummy_interface = {
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,

View File

@@ -46,7 +46,8 @@ static struct jtag_interface ep93xx_interface = {
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,

View File

@@ -784,7 +784,8 @@ static struct jtag_interface esp_usb_jtag_interface = {
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,

View File

@@ -900,7 +900,8 @@ static struct jtag_interface ft232r_interface = {
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,

View File

@@ -1247,8 +1247,6 @@ static const struct swd_driver ftdi_swd = {
.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,
@@ -1256,7 +1254,8 @@ static struct jtag_interface ftdi_interface = {
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,

View File

@@ -514,7 +514,8 @@ static struct jtag_interface gw16012_interface = {
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,

View File

@@ -417,8 +417,6 @@ static const struct command_registration imx_gpio_command_handlers[] = {
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,
@@ -426,7 +424,8 @@ static struct jtag_interface imx_gpio_interface = {
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,

View File

@@ -2264,15 +2264,14 @@ static const struct swd_driver jlink_swd = {
.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,

View File

@@ -398,7 +398,8 @@ static struct jtag_interface jtag_dpi_interface = {
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,

View File

@@ -666,7 +666,8 @@ static struct jtag_interface jtag_vpi_interface = {
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,

View File

@@ -908,11 +908,10 @@ static const struct swd_driver kitprog_swd = {
.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,

View File

@@ -425,8 +425,6 @@ out_error:
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,
@@ -434,7 +432,8 @@ static struct jtag_interface linuxgpiod_interface = {
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,

View File

@@ -616,12 +616,10 @@ static const struct command_registration spidev_command_handlers[] = {
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,

View File

@@ -229,7 +229,8 @@ static struct jtag_interface opendous_interface = {
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,

View File

@@ -931,7 +931,8 @@ static struct jtag_interface openjtag_interface = {
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,

View File

@@ -684,7 +684,8 @@ static struct jtag_interface osbdm_interface = {
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,

View File

@@ -533,7 +533,8 @@ static struct jtag_interface parport_interface = {
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,

View File

@@ -528,7 +528,8 @@ static struct jtag_interface presto_interface = {
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,

View File

@@ -412,8 +412,6 @@ COMMAND_HANDLER(remote_bitbang_handle_remote_bitbang_host_command)
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)
@@ -484,7 +482,8 @@ static struct jtag_interface remote_bitbang_interface = {
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,

View File

@@ -1675,7 +1675,8 @@ static struct jtag_interface rlink_interface = {
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,

View File

@@ -508,11 +508,10 @@ static const struct dap_ops rshim_dap_ops = {
.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,

View File

@@ -5217,11 +5217,10 @@ static const struct swim_driver stlink_swim_ops = {
.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,

View File

@@ -545,8 +545,6 @@ static const struct command_registration sysfsgpio_command_handlers[] = {
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,
@@ -554,7 +552,8 @@ static struct jtag_interface sysfsgpio_interface = {
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,

View File

@@ -2271,7 +2271,8 @@ static struct jtag_interface ulink_interface = {
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,

View File

@@ -1057,7 +1057,8 @@ static struct jtag_interface usb_blaster_interface = {
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,

View File

@@ -590,7 +590,8 @@ static struct jtag_interface usbprog_interface = {
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,

View File

@@ -1342,11 +1342,10 @@ static const struct dap_ops vdebug_dap_ops = {
.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,

View File

@@ -913,8 +913,6 @@ static const struct command_registration vsllink_command_handlers[] = {
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,
@@ -930,7 +928,8 @@ static struct jtag_interface vsllink_interface = {
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,

View File

@@ -2058,15 +2058,14 @@ static const struct swd_driver xds110_swd_driver = {
.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,

View File

@@ -690,11 +690,10 @@ static const struct swd_driver xlnx_pcie_xvc_swd_ops = {
.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,

View File

@@ -367,7 +367,8 @@ static const struct command_registration hl_interface_command_handlers[] = {
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,

View File

@@ -15,8 +15,6 @@
struct target;
/** */
enum e_hl_transports;
/** */
extern const char *hl_transports[];
#define HLA_MAX_USB_IDS 16

View File

@@ -231,8 +231,6 @@ static struct transport hl_jtag_transport = {
.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)
{

View File

@@ -17,6 +17,7 @@
#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
@@ -208,8 +209,16 @@ struct adapter_driver {
/** 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
@@ -354,8 +363,6 @@ struct adapter_driver {
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);

View File

@@ -62,11 +62,15 @@ static const struct {
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
@@ -76,7 +80,7 @@ static bool transport_single_is_autoselected;
/** * 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)
@@ -118,13 +122,14 @@ static int transport_select(struct command_context *ctx, const char *name)
* 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
@@ -135,13 +140,14 @@ int allow_transports(struct command_context *ctx, const char * const *vector)
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;
@@ -226,10 +232,9 @@ COMMAND_HANDLER(handle_transport_init)
/* 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;
}
@@ -275,8 +280,9 @@ COMMAND_HANDLER(handle_transport_select)
}
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;
}
@@ -310,8 +316,9 @@ COMMAND_HANDLER(handle_transport_select)
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;

View File

@@ -95,9 +95,12 @@ struct transport *get_current_transport(void);
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);