AFAIK the patch below uses libusb, which is available on Windows too. He just referred in the command's help to the lsusb tool.
Instead of running lsusb -t on Windows you could use the Device manager -> View -> Devices by connection to see the physical topology of the USB devices. Kind regards, Miklos Marton 2016-02-23 17:01 keltezéssel, Kent Brinkley írta: > How does this work in the Windows world? lsubs is Linux command. > > +@deffn {Config Command} {ftdi_location} <bus>:<port>[,<port>]... > +Specifies the physical USB port of the adapter to use. The path roots > +at @var{bus} and walks down the physical ports, with each @var{port} > +option specifying a deeper level in the bus topology, the last > +@var{port} denoting where the target adapter is actually plugged. > +The USB bus topology can be queried with the command @emph{lsusb -t}. > +@end deffn > + > -----Original Message----- > From: gerrit [mailto:ger...@openocd.org] > Sent: Tuesday, February 23, 2016 5:44 AM > To: openocd-devel@lists.sourceforge.net > Subject: [OpenOCD-devel] [PATCH]: df78257 ftdi: allow selecting device by usb > bus location > > This is an automated email from Gerrit. > > Matthias Welwarsky (matth...@welwarsky.de) just uploaded a new patch set to > Gerrit, which you can find at http://openocd.zylin.com/3351 > > -- gerrit > > commit df782577cf5b5a1da89481ddcbf2a8eda2f949a5 > Author: Matthias Welwarsky <matthias.welwar...@sysgo.com> > Date: Tue Feb 2 17:03:08 2016 +0100 > > ftdi: allow selecting device by usb bus location > > This patch adds a 'ftdi_location' command to select an adapter by usb > bus number and port path. > > This is helpful if you have a rack full of adapters in a testing or > manufacturing setup where the only constant is the physical usb bus > location of the adapter you want to address. Vid:Pid are not unique, > serial number _may_ be unique (and maybe not with embedded adapters) but > will change when a new target is plugged. > > Specifying a location allows to understand instantly which board failed > bringup or testing. > > Change-Id: I403c7c6c8e34fe42041b3f967db80f3160a4f1a3 > Signed-off-by: Matthias Welwarsky <matthias.welwar...@sysgo.com> > > diff --git a/doc/openocd.texi b/doc/openocd.texi index d1f7855..0ab741e 100644 > --- a/doc/openocd.texi > +++ b/doc/openocd.texi > @@ -2558,6 +2558,14 @@ If not specified, serial numbers are not considered. > and are not restricted to containing only decimal digits.) @end deffn > > +@deffn {Config Command} {ftdi_location} <bus>:<port>[,<port>]... > +Specifies the physical USB port of the adapter to use. The path roots > +at @var{bus} and walks down the physical ports, with each @var{port} > +option specifying a deeper level in the bus topology, the last > +@var{port} denoting where the target adapter is actually plugged. > +The USB bus topology can be queried with the command @emph{lsusb -t}. > +@end deffn > + > @deffn {Config Command} {ftdi_channel} channel Selects the channel of the > FTDI device to use for MPSSE operations. Most adapters use the default, > channel 0, but there are exceptions. > diff --git a/src/jtag/drivers/ftdi.c b/src/jtag/drivers/ftdi.c index > 7f11391..b32fa6c 100644 > --- a/src/jtag/drivers/ftdi.c > +++ b/src/jtag/drivers/ftdi.c > @@ -91,6 +91,7 @@ > > static char *ftdi_device_desc; > static char *ftdi_serial; > +static char *ftdi_location; > static uint8_t ftdi_channel; > static uint8_t ftdi_jtag_mode = JTAG_MODE; > > @@ -631,7 +632,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, ftdi_channel); > + ftdi_serial, ftdi_location, ftdi_channel); > if (mpsse_ctx) > break; > } > @@ -698,6 +699,19 @@ COMMAND_HANDLER(ftdi_handle_serial_command) > return ERROR_OK; > } > > +COMMAND_HANDLER(ftdi_handle_location_command) > +{ > + if (CMD_ARGC == 1) { > + if (ftdi_location) > + free(ftdi_location); > + ftdi_location = strdup(CMD_ARGV[0]); > + } else { > + return ERROR_COMMAND_SYNTAX_ERROR; > + } > + > + return ERROR_OK; > +} > + > COMMAND_HANDLER(ftdi_handle_channel_command) > { > if (CMD_ARGC == 1) > @@ -876,6 +890,13 @@ static const struct command_registration > ftdi_command_handlers[] = { > .usage = "serial_string", > }, > { > + .name = "ftdi_location", > + .handler = &ftdi_handle_location_command, > + .mode = COMMAND_CONFIG, > + .help = "set the USB bus location of the FTDI device", > + .usage = "<bus>:port[,port]...", > + }, > + { > .name = "ftdi_channel", > .handler = &ftdi_handle_channel_command, > .mode = COMMAND_CONFIG, > diff --git a/src/jtag/drivers/mpsse.c b/src/jtag/drivers/mpsse.c index > d9f73a2..a3820a2 100644 > --- a/src/jtag/drivers/mpsse.c > +++ b/src/jtag/drivers/mpsse.c > @@ -104,12 +104,65 @@ static bool > string_descriptor_equal(libusb_device_handle *device, uint8_t str_in > return strncmp(string, desc_string, sizeof(desc_string)) == 0; } > > +static bool device_location_equal(libusb_device *device, const char > +*location) { > + char *loc = strdup(location); > + uint8_t port_path[7]; > + int path_step, path_len; > + uint8_t dev_bus = libusb_get_bus_number(device); > + char *ptr; > + bool result = false; > + > + path_len = libusb_get_port_numbers(device, port_path, 7); > + if (path_len == LIBUSB_ERROR_OVERFLOW) { > + LOG_ERROR("cannot determine path to usb device! (more than 7 > ports in path)"); > + goto done; > + } > + > + LOG_DEBUG("device path has %i steps", path_len); > + > + ptr = strtok(loc, ":"); > + if (ptr == NULL) { > + LOG_DEBUG("no ':' in path"); > + goto done; > + } > + if (atoi(ptr) != dev_bus) { > + LOG_DEBUG("bus mismatch"); > + goto done; > + } > + > + path_step = 0; > + while (path_step < 7) { > + ptr = strtok(NULL, ","); > + if (ptr == NULL) { > + LOG_DEBUG("no more tokens in path at step %i", > path_step); > + break; > + } > + > + if (path_step < path_len > + && atoi(ptr) != port_path[path_step]) { > + LOG_DEBUG("path mismatch at step %i", path_step); > + break; > + } > + > + path_step++; > + }; > + > + /* walked the full path, all elements match */ > + if (path_step == path_len) > + result = true; > + > + done: > + free(loc); > + return result; > +} > + > /* Helper to open a libusb device that matches vid, pid, product string > and/or serial string. > * Set any field to 0 as a wildcard. If the device is found true is > returned, with ctx containing > * the already opened handle. ctx->interface must be set to the desired > interface (channel) number > * prior to calling this function. */ > static bool open_matching_device(struct mpsse_ctx *ctx, const uint16_t > *vid, const uint16_t *pid, > - const char *product, const char *serial) > + const char *product, const char *serial, const char *location) > { > libusb_device **list; > struct libusb_device_descriptor desc; > @@ -141,6 +194,11 @@ static bool open_matching_device(struct mpsse_ctx *ctx, > const uint16_t *vid, con > continue; > } > > + if (location && !device_location_equal(device, location)) { > + libusb_close(ctx->usb_dev); > + continue; > + } > + > if (product && !string_descriptor_equal(ctx->usb_dev, > desc.iProduct, product)) { > libusb_close(ctx->usb_dev); > continue; > @@ -263,7 +321,7 @@ error: > } > > struct mpsse_ctx *mpsse_open(const uint16_t *vid, const uint16_t *pid, > const char *description, > - const char *serial, int channel) > + const char *serial, const char *location, int channel) > { > struct mpsse_ctx *ctx = calloc(1, sizeof(*ctx)); > int err; > @@ -292,16 +350,17 @@ struct mpsse_ctx *mpsse_open(const uint16_t *vid, const > uint16_t *pid, const cha > goto error; > } > > - if (!open_matching_device(ctx, vid, pid, description, serial)) { > + if (!open_matching_device(ctx, vid, pid, description, serial, > +location)) { > /* Four hex digits plus terminating zero each */ > char vidstr[5]; > char pidstr[5]; > - LOG_ERROR("unable to open ftdi device with vid %s, pid %s, > description '%s' and " > - "serial '%s'", > + LOG_ERROR("unable to open ftdi device with vid %s, pid %s, > description '%s', " > + "serial '%s' at bus location '%s'", > vid ? sprintf(vidstr, "%04x", *vid), vidstr : > "*", > pid ? sprintf(pidstr, "%04x", *pid), pidstr : > "*", > description ? description : "*", > - serial ? serial : "*"); > + serial ? serial : "*", > + location ? location : "*"); > ctx->usb_dev = 0; > goto error; > } > diff --git a/src/jtag/drivers/mpsse.h b/src/jtag/drivers/mpsse.h index > 3e287f7..4c06bbd 100644 > --- a/src/jtag/drivers/mpsse.h > +++ b/src/jtag/drivers/mpsse.h > @@ -43,7 +43,7 @@ struct mpsse_ctx; > > /* Device handling */ > struct mpsse_ctx *mpsse_open(const uint16_t *vid, const uint16_t *pid, > const char *description, > - const char *serial, int channel); > + const char *serial, const char *location, int channel); > void mpsse_close(struct mpsse_ctx *ctx); bool mpsse_is_high_speed(struct > mpsse_ctx *ctx); > > ------------------------------------------------------------------------------ Site24x7 APM Insight: Get Deep Visibility into Application Performance APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month Monitor end-to-end web transactions and take corrective actions now Troubleshoot faster and improve end-user experience. Signup Now! http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140 _______________________________________________ OpenOCD-devel mailing list OpenOCD-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openocd-devel