diff --git a/src/jtag/Makefile.am b/src/jtag/Makefile.am
index 4ed5e7aa0..cbdfb2054 100644
--- a/src/jtag/Makefile.am
+++ b/src/jtag/Makefile.am
@@ -1,6 +1,5 @@
noinst_LTLIBRARIES += %D%/libjtag.la
-JTAG_SRCS = %D%/commands.c
%C%_libjtag_la_LIBADD =
if HLADAPTER
@@ -18,6 +17,8 @@ include %D%/drivers/Makefile.am
%C%_libjtag_la_SOURCES = \
%D%/adapter.c \
+ %D%/adapter.h \
+ %D%/commands.c \
%D%/core.c \
%D%/interface.c \
%D%/interfaces.c \
@@ -31,7 +32,6 @@ include %D%/drivers/Makefile.am
%D%/jtag.h \
%D%/swd.h \
%D%/swim.h \
- %D%/tcl.h \
- $(JTAG_SRCS)
+ %D%/tcl.h
STARTUP_TCL_SRCS += %D%/startup.tcl
diff --git a/src/jtag/adapter.c b/src/jtag/adapter.c
index 80d5ab048..47a1d794b 100644
--- a/src/jtag/adapter.c
+++ b/src/jtag/adapter.c
@@ -1,41 +1,22 @@
-/***************************************************************************
- * Copyright (C) 2005 by Dominic Rath *
- * Dominic.Rath@gmx.de *
- * *
- * Copyright (C) 2007-2010 Øyvind Harboe *
- * oyvind.harboe@zylin.com *
- * *
- * Copyright (C) 2009 SoftPLC Corporation *
- * http://softplc.com *
- * dick@softplc.com *
- * *
- * Copyright (C) 2009 Zachary T Welch *
- * zw@superlucidity.net *
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program. If not, see . *
- ***************************************************************************/
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2005 by Dominic Rath
+ * Copyright (C) 2007-2010 Øyvind Harboe
+ * Copyright (C) 2009 SoftPLC Corporation, http://softplc.com, Dick Hollenbeck
+ * Copyright (C) 2009 Zachary T Welch
+ * Copyright (C) 2018 Pengutronix, Oleksij Rempel
+ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
+#include "adapter.h"
#include "jtag.h"
#include "minidriver.h"
#include "interface.h"
#include "interfaces.h"
#include
-#include
#ifdef HAVE_STRINGS_H
#include
@@ -49,6 +30,88 @@
struct adapter_driver *adapter_driver;
const char * const jtag_only[] = { "jtag", NULL };
+/**
+ * Adapter configuration
+ */
+static struct {
+ char *usb_location;
+} adapter_config;
+
+/*
+ * 1 char: bus
+ * 2 * 7 chars: max 7 ports
+ * 1 char: test for overflow
+ * ------
+ * 16 chars
+ */
+#define USB_MAX_LOCATION_LENGTH 16
+
+#ifdef HAVE_LIBUSB_GET_PORT_NUMBERS
+static void adapter_usb_set_location(const char *location)
+{
+ if (strnlen(location, USB_MAX_LOCATION_LENGTH) == USB_MAX_LOCATION_LENGTH)
+ LOG_WARNING("usb location string is too long!!");
+
+ free(adapter_config.usb_location);
+
+ adapter_config.usb_location = strndup(location, USB_MAX_LOCATION_LENGTH);
+}
+#endif /* HAVE_LIBUSB_GET_PORT_NUMBERS */
+
+const char *adapter_usb_get_location(void)
+{
+ return adapter_config.usb_location;
+}
+
+bool adapter_usb_location_equal(uint8_t dev_bus, uint8_t *port_path, size_t path_len)
+{
+ size_t path_step, string_length;
+ char *ptr, *loc;
+ bool equal = false;
+
+ if (!adapter_usb_get_location())
+ return equal;
+
+ /* strtok need non const char */
+ loc = strndup(adapter_usb_get_location(), USB_MAX_LOCATION_LENGTH);
+ string_length = strnlen(loc, USB_MAX_LOCATION_LENGTH);
+
+ ptr = strtok(loc, "-");
+ if (!ptr) {
+ LOG_WARNING("no '-' in usb path\n");
+ goto done;
+ }
+
+ string_length -= strnlen(ptr, string_length);
+ /* check bus mismatch */
+ if (atoi(ptr) != dev_bus)
+ goto done;
+
+ path_step = 0;
+ while (path_step < path_len) {
+ ptr = strtok(NULL, ".");
+
+ /* no more tokens in path */
+ if (!ptr)
+ break;
+
+ /* path mismatch at some step */
+ if (path_step < path_len && atoi(ptr) != port_path[path_step])
+ break;
+
+ path_step++;
+ string_length -= strnlen(ptr, string_length) + 1;
+ };
+
+ /* walked the full path, all elements match */
+ if (path_step == path_len && !string_length)
+ equal = true;
+
+done:
+ free(loc);
+ return equal;
+}
+
static int jim_adapter_name(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
{
struct jim_getopt_info goi;
@@ -501,9 +564,9 @@ COMMAND_HANDLER(handle_adapter_reset_de_assert)
COMMAND_HANDLER(handle_usb_location_command)
{
if (CMD_ARGC == 1)
- jtag_usb_set_location(CMD_ARGV[0]);
+ adapter_usb_set_location(CMD_ARGV[0]);
- command_print(CMD, "adapter usb location: %s", jtag_usb_get_location());
+ command_print(CMD, "adapter usb location: %s", adapter_usb_get_location());
return ERROR_OK;
}
diff --git a/src/jtag/adapter.h b/src/jtag/adapter.h
new file mode 100644
index 000000000..854ee9ce6
--- /dev/null
+++ b/src/jtag/adapter.h
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (c) 2018 Pengutronix, Oleksij Rempel
+ */
+
+#ifndef OPENOCD_JTAG_ADAPTER_H
+#define OPENOCD_JTAG_ADAPTER_H
+
+#include
+#include
+#include
+
+/** @returns USB location string set with command 'adapter usb location' */
+const char *adapter_usb_get_location(void);
+
+/** @returns true if USB location string is "-[.[...]]" */
+bool adapter_usb_location_equal(uint8_t dev_bus, uint8_t *port_path, size_t path_len);
+
+#endif /* OPENOCD_JTAG_ADAPTER_H */
diff --git a/src/jtag/drivers/Makefile.am b/src/jtag/drivers/Makefile.am
index da60f366e..c2161523d 100644
--- a/src/jtag/drivers/Makefile.am
+++ b/src/jtag/drivers/Makefile.am
@@ -19,7 +19,6 @@ DRIVERFILES =
# Standard Driver: common files
DRIVERFILES += %D%/driver.c
-DRIVERFILES += %D%/jtag_usb_common.c
if USE_LIBUSB1
DRIVERFILES += %D%/libusb_helper.c
@@ -187,7 +186,6 @@ endif
DRIVERHEADERS = \
%D%/bitbang.h \
%D%/bitq.h \
- %D%/jtag_usb_common.h \
%D%/libftdi_helper.h \
%D%/libusb_helper.h \
%D%/cmsis_dap.h \
diff --git a/src/jtag/drivers/ftdi.c b/src/jtag/drivers/ftdi.c
index 82298c23d..5e7eae073 100644
--- a/src/jtag/drivers/ftdi.c
+++ b/src/jtag/drivers/ftdi.c
@@ -69,7 +69,7 @@
#endif
/* project specific includes */
-#include
+#include
#include
#include
#include
@@ -672,7 +672,7 @@ static int ftdi_initialize(void)
for (int i = 0; ftdi_vid[i] || ftdi_pid[i]; i++) {
mpsse_ctx = mpsse_open(&ftdi_vid[i], &ftdi_pid[i], ftdi_device_desc,
- ftdi_serial, jtag_usb_get_location(), ftdi_channel);
+ ftdi_serial, adapter_usb_get_location(), ftdi_channel);
if (mpsse_ctx)
break;
}
diff --git a/src/jtag/drivers/jlink.c b/src/jtag/drivers/jlink.c
index 53ae1dfae..12ac05fa6 100644
--- a/src/jtag/drivers/jlink.c
+++ b/src/jtag/drivers/jlink.c
@@ -38,7 +38,7 @@
#include
#include
#include
-#include
+#include
#include
#include
@@ -547,7 +547,7 @@ static bool jlink_usb_location_equal(struct jaylink_device *dev)
return false;
}
- equal = jtag_usb_location_equal(bus, ports, num_ports);
+ equal = adapter_usb_location_equal(bus, ports, num_ports);
free(ports);
return equal;
@@ -573,7 +573,7 @@ static int jlink_open_device(uint32_t ifaces, bool *found_device)
return ERROR_JTAG_INIT_FAILED;
}
- use_usb_location = !!jtag_usb_get_location();
+ use_usb_location = !!adapter_usb_get_location();
if (!use_serial_number && !use_usb_address && !use_usb_location && num_devices > 1) {
LOG_ERROR("Multiple devices found, specify the desired device");
diff --git a/src/jtag/drivers/jtag_usb_common.c b/src/jtag/drivers/jtag_usb_common.c
deleted file mode 100644
index 94cd7e74d..000000000
--- a/src/jtag/drivers/jtag_usb_common.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * SPDX-License-Identifier: GPL-2.0+
- * Copyright (c) 2018 Pengutronix, Oleksij Rempel
- */
-
-#include
-#include
-
-#include "jtag_usb_common.h"
-
-static char *jtag_usb_location;
-/*
- * 1 char: bus
- * 2 * 7 chars: max 7 ports
- * 1 char: test for overflow
- * ------
- * 16 chars
- */
-#define JTAG_USB_MAX_LOCATION_LENGTH 16
-
-void jtag_usb_set_location(const char *location)
-{
- if (strnlen(location, JTAG_USB_MAX_LOCATION_LENGTH) ==
- JTAG_USB_MAX_LOCATION_LENGTH)
- LOG_WARNING("usb location string is too long!!\n");
-
- free(jtag_usb_location);
-
- jtag_usb_location = strndup(location, JTAG_USB_MAX_LOCATION_LENGTH);
-}
-
-const char *jtag_usb_get_location(void)
-{
- return jtag_usb_location;
-}
-
-bool jtag_usb_location_equal(uint8_t dev_bus, uint8_t *port_path,
- size_t path_len)
-{
- size_t path_step, string_length;
- char *ptr, *loc;
- bool equal = false;
-
- /* strtok need non const char */
- loc = strndup(jtag_usb_get_location(), JTAG_USB_MAX_LOCATION_LENGTH);
- string_length = strnlen(loc, JTAG_USB_MAX_LOCATION_LENGTH);
-
- ptr = strtok(loc, "-");
- if (!ptr) {
- LOG_WARNING("no '-' in usb path\n");
- goto done;
- }
-
- string_length -= strnlen(ptr, string_length);
- /* check bus mismatch */
- if (atoi(ptr) != dev_bus)
- goto done;
-
- path_step = 0;
- while (path_step < path_len) {
- ptr = strtok(NULL, ".");
-
- /* no more tokens in path */
- if (!ptr)
- break;
-
- /* path mismatch at some step */
- if (path_step < path_len && atoi(ptr) != port_path[path_step])
- break;
-
- path_step++;
- string_length -= strnlen(ptr, string_length) + 1;
- };
-
- /* walked the full path, all elements match */
- if (path_step == path_len && !string_length)
- equal = true;
-
-done:
- free(loc);
- return equal;
-}
diff --git a/src/jtag/drivers/jtag_usb_common.h b/src/jtag/drivers/jtag_usb_common.h
deleted file mode 100644
index c4c28cc91..000000000
--- a/src/jtag/drivers/jtag_usb_common.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * SPDX-License-Identifier: GPL-2.0+
- * Copyright (c) 2018 Pengutronix, Oleksij Rempel
- */
-
-#ifndef OPENOCD_JTAG_USB_COMMON_H
-#define OPENOCD_JTAG_USB_COMMON_H
-
-#include
-#include
-
-void jtag_usb_set_location(const char *location);
-const char *jtag_usb_get_location(void);
-bool jtag_usb_location_equal(uint8_t dev_bus, uint8_t *port_path,
- size_t path_len);
-
-#endif /* OPENOCD_JTAG_USB_COMMON_H */
diff --git a/src/jtag/drivers/libusb_helper.c b/src/jtag/drivers/libusb_helper.c
index 3308d8742..b8f1124e3 100644
--- a/src/jtag/drivers/libusb_helper.c
+++ b/src/jtag/drivers/libusb_helper.c
@@ -20,8 +20,11 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
+
+#include
+
#include
-#include
+#include
#include "libusb_helper.h"
/*
@@ -85,7 +88,7 @@ static bool jtag_libusb_location_equal(struct libusb_device *device)
}
dev_bus = libusb_get_bus_number(device);
- return jtag_usb_location_equal(dev_bus, port_path, path_len);
+ return adapter_usb_location_equal(dev_bus, port_path, path_len);
}
#else /* HAVE_LIBUSB_GET_PORT_NUMBERS */
static bool jtag_libusb_location_equal(struct libusb_device *device)
@@ -177,7 +180,7 @@ int jtag_libusb_open(const uint16_t vids[], const uint16_t pids[],
if (!jtag_libusb_match_ids(&dev_desc, vids, pids))
continue;
- if (jtag_usb_get_location() && !jtag_libusb_location_equal(devs[idx]))
+ if (adapter_usb_get_location() && !jtag_libusb_location_equal(devs[idx]))
continue;
err_code = libusb_open(devs[idx], &libusb_handle);