From 3a2a22bc86116bf7c99b1475bd8962ea26008fd3 Mon Sep 17 00:00:00 2001 From: Michael Gernoth Date: Sun, 26 Aug 2007 13:56:47 +0200 Subject: [PATCH] make it possible to specify the USB bus document the usage for multiple cables --- README | 8 ++++++++ usb-driver.c | 43 +++++++++++++++++++++++++++++++++---------- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/README b/README index 5ce99d8..f9b6cec 100644 --- a/README +++ b/README @@ -74,6 +74,14 @@ these steps: 4. restart udev and re-plug the cable +If you have multiple cables connected, you can specify the cable to use +in the XILINX_USB_DEV environment-variable as "bus:device". +These identifiers are available in the output of lsusb: +Bus 001 Device 004: ID 03fd:0008 Xilinx, Inc. + ^^^ ^^^ +To use this cable, set the XILINX_USB_DEV variable to "001:004". + + Notes for the parallel cable ============================ diff --git a/usb-driver.c b/usb-driver.c index 1fcfae1..05ba48a 100644 --- a/usb-driver.c +++ b/usb-driver.c @@ -466,9 +466,8 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { { struct event *e = (struct event*)(wdheader->data); struct usb_bus *bus; - char* device_num; - char* remainder; - int devnum = -1; + char* devpos; + int busnum = -1, devnum = -1; int i; DPRINTF("handle: %lu, action: %lu, status: %lu, eventid: %lu, cardtype: %lu, kplug: %lu, options: %lu, dev: %lx:%lx, unique: %lu, ver: %lu, nummatch: %lu\n", @@ -480,14 +479,35 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { e->u.Usb.dwUniqueID, e->dwEventVer, e->dwNumMatchTables); - device_num=getenv("XILINX_USB_DEVNUM"); - if (device_num!=NULL) { - DPRINTF("XILINX_USB_BUS=%s\n",device_num); - devnum=strtol(device_num,&remainder,10); - if (device_num==remainder) /* no integer in env variable */ - devnum=-1; - } + devpos = getenv("XILINX_USB_DEV"); + if (devpos != NULL) { + int j; + char *devstr = NULL, *remainder; + + DPRINTF("XILINX_USB_DEV=%s\n", devpos); + for (j = 0; j < strlen(devpos) && devpos[j] != 0; j++) { + if (devpos[j] == ':') { + devpos[j] = 0; + devstr = &(devpos[j+1]); + } + } + + if (devstr && strlen(devstr) > 0) { + busnum = strtol(devpos, &remainder, 10); + if (devpos == remainder) { + busnum = -1; + } else { + devnum = strtol(devstr, &remainder, 10); + if (devstr == remainder) { + devnum = -1; + } else { + fprintf(stderr,"Using XILINX platform cable USB at %03d:%03d\n", + busnum, devnum); + } + } + } + } for (i = 0; i < e->dwNumMatchTables; i++) { @@ -503,6 +523,9 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { for (bus = busses; bus; bus = bus->next) { struct usb_device *dev; + if ((devnum != -1) && (strtol(bus->dirname, NULL, 10) != busnum)) + continue; + for (dev = bus->devices; dev; dev = dev->next) { struct usb_device_descriptor *desc = &(dev->descriptor); -- 2.39.5