]> git.zerfleddert.de Git - usb-driver/blobdiff - usb-driver.c
reset the USB cable when /dev/windrvr6 is closed.
[usb-driver] / usb-driver.c
index 929c1019484581a25a1ae33986583585f936ff39..6320b9f74fe4bee537b735ca49700dcb317797e0 100644 (file)
@@ -39,6 +39,8 @@
 #include <errno.h>
 #include <inttypes.h>
 #include <sys/ioctl.h>
+#include <sys/utsname.h>
+#include <bits/wordsize.h>
 #include "usb-driver.h"
 #include "config.h"
 
@@ -47,9 +49,9 @@ static int windrvrfd = -1;
 static unsigned long ppbase = 0;
 static unsigned long ecpbase = 0;
 static struct parport_config *pport = NULL;
-FILE *modulesfp = NULL;
-FILE *baseaddrfp = NULL;
-int baseaddrnum = 0;
+static FILE *modulesfp = NULL;
+static FILE *baseaddrfp = NULL;
+static int baseaddrnum = 0;
 static int modules_read = 0;
 static struct usb_bus *busses = NULL;
 static struct usb_device *usbdevice;
@@ -72,7 +74,7 @@ void hexdump(unsigned char *buf, int len) {
        fprintf(stderr,"\n");
 }
 
-int usb_deviceinfo(unsigned char *buf) {
+static int usb_deviceinfo(unsigned char *buf) {
        int i,j,k,l;
        int len = 0;
        WDU_CONFIGURATION **pConfigs, **pActiveConfig;
@@ -232,7 +234,7 @@ int usb_deviceinfo(unsigned char *buf) {
        return len;
 }
 
-int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
+static int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
        struct header_struct* wdheader = (struct header_struct*)wdioctl;
        struct version_struct *version;
        int ret = 0;
@@ -534,7 +536,7 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
                                                           (desc->idProduct == e->matchTables[i].ProductId) &&
                                                           (desc->bDeviceClass == e->matchTables[i].bDeviceClass) &&
                                                           (desc->bDeviceSubClass == e->matchTables[i].bDeviceSubClass) &&
-                                                          ((devnum == -1) || (dev->devnum == devnum)) ) {
+                                                          ((devnum == -1) || (strtol(dev->filename, NULL, 10) == devnum)) ) {
                                                                   int ac;
                                                                   for (ac = 0; ac < desc->bNumConfigurations; ac++) {
                                                                           struct usb_interface *interface = dev->config[ac].interface;
@@ -828,8 +830,12 @@ int close(int fd) {
                if (usbinterface >= 0)
                        usb_release_interface(usb_devhandle, usbinterface);
 
-               if (usb_devhandle)
+               if (usb_devhandle) {
+#ifndef NO_USB_RESET
+                       usb_reset(usb_devhandle);
+#endif
                        usb_close(usb_devhandle);
+               }
 
                usb_devhandle = NULL;
                usbinterface = -1;
@@ -937,3 +943,21 @@ int access(const char *pathname, int mode) {
                return (*func)(pathname, mode);
        }
 }
+
+#if __WORDSIZE == 32
+int uname (struct utsname *__name) {
+       static int (*func) (struct utsname*);
+       int ret;
+
+       if (!func)
+               func = (int (*) (struct utsname*)) dlsym(RTLD_NEXT, "uname");
+       
+       ret = (*func)(__name);
+
+       if (ret == 0 && (!strcmp(__name->machine, "x86_64"))) {
+               strcpy(__name->machine, "i686");
+       }
+       
+       return ret;
+}
+#endif
Impressum, Datenschutz