make it possible to specify the USB bus
authorMichael Gernoth <michael@gernoth.net>
Sun, 26 Aug 2007 11:56:47 +0000 (13:56 +0200)
committerMichael Gernoth <michael@gernoth.net>
Sun, 26 Aug 2007 11:56:47 +0000 (13:56 +0200)
document the usage for multiple cables

README
usb-driver.c

diff --git a/README b/README
index 5ce99d8823148324754cf8fef0a72073175fada0..f9b6cec9bb558abf9466d6f9f51b914710f53cc4 100644 (file)
--- 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
 ============================
 
index 1fcfae19d172872a5de2c89e87898cfbfbdcec54..05ba48a5424686995f1997b68c89e0650e4fdc64 100644 (file)
@@ -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);
 
Impressum, Datenschutz