forked from auracaster/openocd
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:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -15,8 +15,6 @@
|
||||
struct target;
|
||||
/** */
|
||||
enum e_hl_transports;
|
||||
/** */
|
||||
extern const char *hl_transports[];
|
||||
|
||||
#define HLA_MAX_USB_IDS 16
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user