]> www.infradead.org Git - users/borneoa/openocd-next.git/commitdiff
adapter: use bitmask for driver's transports
authorAntonio Borneo <borneo.antonio@gmail.com>
Wed, 12 Feb 2025 15:39:18 +0000 (16:39 +0100)
committerAntonio Borneo <borneo.antonio@gmail.com>
Thu, 1 May 2025 15:26:24 +0000 (15:26 +0000)
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>
46 files changed:
src/jtag/adapter.c
src/jtag/drivers/am335xgpio.c
src/jtag/drivers/amt_jtagaccel.c
src/jtag/drivers/angie.c
src/jtag/drivers/arm-jtag-ew.c
src/jtag/drivers/at91rm9200.c
src/jtag/drivers/bcm2835gpio.c
src/jtag/drivers/buspirate.c
src/jtag/drivers/cmsis_dap.c
src/jtag/drivers/dmem.c
src/jtag/drivers/dummy.c
src/jtag/drivers/ep93xx.c
src/jtag/drivers/esp_usb_jtag.c
src/jtag/drivers/ft232r.c
src/jtag/drivers/ftdi.c
src/jtag/drivers/gw16012.c
src/jtag/drivers/imx_gpio.c
src/jtag/drivers/jlink.c
src/jtag/drivers/jtag_dpi.c
src/jtag/drivers/jtag_vpi.c
src/jtag/drivers/kitprog.c
src/jtag/drivers/linuxgpiod.c
src/jtag/drivers/linuxspidev.c
src/jtag/drivers/opendous.c
src/jtag/drivers/openjtag.c
src/jtag/drivers/osbdm.c
src/jtag/drivers/parport.c
src/jtag/drivers/presto.c
src/jtag/drivers/remote_bitbang.c
src/jtag/drivers/rlink.c
src/jtag/drivers/rshim.c
src/jtag/drivers/stlink_usb.c
src/jtag/drivers/sysfsgpio.c
src/jtag/drivers/ulink.c
src/jtag/drivers/usb_blaster/usb_blaster.c
src/jtag/drivers/usbprog.c
src/jtag/drivers/vdebug.c
src/jtag/drivers/vsllink.c
src/jtag/drivers/xds110.c
src/jtag/drivers/xlnx-pcie-xvc.c
src/jtag/hla/hla_interface.c
src/jtag/hla/hla_interface.h
src/jtag/hla/hla_transport.c
src/jtag/interface.h
src/transport/transport.c
src/transport/transport.h

index 694721746115b3099b07ed960c65e96055dc8743..6785a74ef1b4e5dc6a77c72de77a4a27a9e2deae 100644 (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,
index cacf4e7c796ee18455442efe6eeb71ba914ed78a..a4727cc8918a4871904833a682b29048b533cf9d 100644 (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,
index 80254ff0743a494b5cba7d142c996b9618f72bc2..633c20413a768d96bc96f479682a21620af88e3d 100644 (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,
index 46a4c82e5bd25b520748b859b33de00ff5d4afe7..56a118eaedbc28787dd3dc87dd21996078e0a2c3 100644 (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,
index 45e03840ea8aaded44a8bacf9ac07ede17ee6e80..9d8c592edb3c8299c13c274c52cdf202ef045b35 100644 (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,
index a77e29aa6e544f2f950378c9ef86680d86ae80bc..ddcf857a6b885620c1fa843da6fa435d0ea7299e 100644 (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,
index e8689aa03778ea3391c0185a5c1426ed9839c24c..1a105aac441187e2206a43520cd169bb618f16a8 100644 (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,
index 93f0ba3838c8d2bd9103559ec41c3b7ab9d04c38..4283616adc5fcdbd9666031e0801461c15bd6f88 100644 (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,
index be9ebaed584b52ae000b99f09c50c4156c01bc0a..2bfcfcc2b0b04a250bf0974639db201ab56b3f33 100644 (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,
index 4dc582115c051a6457520ced57eb36dc089cdc5d..e50e84aeeba17ccfbb0478f19ce61ed6df11d724 100644 (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,
index 79b29fbae7dfbe66b13c164ed736d241dc60639c..471668c3abbe46aaacd7eb7e1384a9aaaed37e5c 100644 (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,
index ea9faf19b733a2fc53efec4af9fb50801bc38b60..f3e1676f9f53f91c5e10bee4c8eaf108f98aaa19 100644 (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,
index 95040595439e6d8feef01a76aeef8841a8db1f14..a1330351107b4ae1ee8b48b7997b7238b95fa4cd 100644 (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,
index f4e5af4dd44bad0bf02a2949274d581bf4352fd0..f88e4b9408d57cd02056938a7a11ea2a51f76bda 100644 (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,
index ec0ae4c00b73f4f9f45dd59d35e1a98b19b4abcb..a8f6f60159da39bb3ad953205142c0dada7b3c8d 100644 (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,
index 7200e757c714a26833cf729eea89cd883d6ade12..805065f1f454c30b8d558f243865417e0359c8fb 100644 (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,
index 18dc2ddf6761943a89bb5a160c2cd67525a7f490..a4a76ca5a3f87e0f9380c1278639733e634d9b03 100644 (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,
index 4d15cf5e6323aa04d31dc204d909e64360552156..9caf37f6f0c503fe331e81f64c13e74504dbfd80 100644 (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,
index 046186a619ddc12b8970345fb37bb1961284dcb2..d6418d39c7417f37ea1f90215faf5b0fc246043a 100644 (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,
index f6cb3de5d2b280465815dd328e393771ee52ec05..fac27b30606febd41f8fc6491053fbaec4f090fd 100644 (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,
index 98b0d166810f73f297886157b1a0740d63f333c2..88e301cebc7399e803b629ab42988b4db169cd3a 100644 (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,
index eda7b1a80e17fd049bfee180123e43ab1727cff5..36c7e04934d06c5d56be7dc4f1e9a65f2010d7b3 100644 (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,
index 18abdc7db36bdf5c9669b9575719ee8cac5ae2a8..396f1a19a9ffc80782e2e71d97c0a453e41ce493 100644 (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,
index 999afb3fc7daf3b68387d70681508312a7df549a..04626cb1e5cc17df6e273df9bf7576cde55a5392 100644 (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,
index 14bcc171eb2d9a699d7f74e2ff152fbfbc4a60ee..943ad854e8da0ca2cba690d9d2799d94f6f18f90 100644 (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,
index 80f66d197ea7f5c606fb3a0701750fa70c09ff0f..de2e1f8ebeac5c01cdafd9c0e415ee8f34546511 100644 (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,
index 3b20fe247821d49a5041de59779f3af4f2aa1772..143f3bde1fa35bb1315514cc2efee1bf1a188efc 100644 (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,
index f6e13f7eb4eaf7443ae85ac69ada4a2c54738a03..84b881cdc8ff2797026bec43810da269e01fe0e1 100644 (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,
index bb608ba0a5cb648bcb4aee1b4945f36bb3906534..449c61654534a55004248811796ea2d64c26cc39 100644 (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,
index 6ea3729a5fe83967e77f7d49758d0797002e16f1..a818996255dc3e35b6635a16a8fed681d7596e41 100644 (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,
index b37fe8c453c621090974e7a8ca3caa5d27aaea9a..89bdadd698d227cbdef1607233bf7099ddac1a8f 100644 (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,
index d77f28b0f44c0f3a1abbc859f73b3c44f4af7c07..e018f71cd997283e74ed0f78189d1f71fedd490f 100644 (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,
index ccd3974a42399008f5d9be59e005304f1b75dc90..279b35377c11fe6db08226b31a54035c749952b6 100644 (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,
index 0a13bf6d44c96d67bd820b637a998d67e8d429c6..417d560cde7cf523363f43644360cdfec4d91e23 100644 (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,
index 1782cc424e2530dc67e40a0a2ef2989936caebcf..81344664e210962e26fdea270acc6d8e41ef134d 100644 (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,
index 24407f0037805fcef341415c4bb2d84b93a843ed..264b45f721e12b08fbeede36e71d34a0b44e978c 100644 (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,
index fd1e6a7e7b4021d1e8d670afb1691e30b61bb31d..38685950a880daa3debfaea9099a713fb2ce9441 100644 (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,
index c10ed13800e7eb2969fe30db3e3615e4310e8300..145f0682ac3236d372de1c08a68999a8dbb066b1 100644 (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,
index c84371001fc52604dc19336e54a1548d5d31b1ad..d1bb7059089243e4c2e310a130d035aafe6f2131 100644 (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,
index 37c6777e4ed660a4484e26048833c17c8ff666f1..3baa183d95e5e4323ffca114d28842eab0ebaa6f 100644 (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,
index 96862b0d05a094cc2fef9ff4c56eeb0c57daf29f..a9d196ccec90ffd2400497558eda9ccf500b9d12 100644 (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,
index f1550d991566c8f79be98bbd1585c4a0ebf0489f..c0ee05498df26b7e2b7fd32c292c1183e8e7cafc 100644 (file)
@@ -15,8 +15,6 @@
 struct target;
 /** */
 enum e_hl_transports;
-/** */
-extern const char *hl_transports[];
 
 #define HLA_MAX_USB_IDS 16
 
index 333825eff18449c4d35cf7f9574104b9c34eef76..d8ece0776bf96e4bf738487528827d4e3ac835ca 100644 (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)
 {
index b2d7123fd40ba9b2e25829c6483cb4e544475243..475dbed36e21ec2d3d235539f329019879f43180 100644 (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);
index 411b0a5e0f9215a2bd95b1d5b6a40f47c1007887..b7a3913cc4ce95d429581c6b38be3e91566952a7 100644 (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;
index dde7c6ba76d62ec1471fb2117ced2b8d1a3d6740..f6f0f4f4db5165e30ca1674a9ee322b50d537bac 100644 (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);