Hi,

I don't have any possibility to test this on Windows. I'd appreciate if you 
were able to try and provide feedback.

BR,
Matthias

On Tuesday 23 February 2016 21:55:08 Kent Brinkley wrote:
> 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


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