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);