I agree that Device manager is the way to go on Windows, how about an example 
cfg file that shows the command.

-----Original Message-----
From: Márton Miklós [mailto:martonmiklosq...@gmail.com] 
Sent: Tuesday, February 23, 2016 1:54 PM
To: openocd-devel@lists.sourceforge.net
Subject: Re: [OpenOCD-devel] [PATCH]: df78257 ftdi: allow selecting device by 
usb bus location

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

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

Reply via email to