X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/usb-driver/blobdiff_plain/5e3d963bcb6112d798f674b876b167c633ff6b59..d377df04c9ee2d7e7fb94168b5e0a3df5e3152f5:/usb-driver.c diff --git a/usb-driver.c b/usb-driver.c index f2f8477..1fcfae1 100644 --- a/usb-driver.c +++ b/usb-driver.c @@ -41,15 +41,12 @@ #include #include "usb-driver.h" #include "config.h" -#include "parport.h" -#ifdef JTAGKEY -#include "jtagkey.h" -#endif static int (*ioctl_func) (int, int, void *) = NULL; 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; @@ -248,7 +245,7 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { switch(request & ~(0xc0000000)) { case VERSION: version = (struct version_struct*)(wdheader->data); - strcpy(version->version, "libusb-driver.so $Revision: 1.67 $"); + strcpy(version->version, "libusb-driver.so version: " USB_DRIVER_VERSION); version->versionul = 802; DPRINTF("VERSION\n"); break; @@ -278,12 +275,11 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { ret = (*ioctl_func) (fd, request, wdioctl); #else -#ifdef JTAGKEY - if (!config_is_real_pport((unsigned long)cr->Card.Item[0].I.IO.dwAddr / 0x10)) - ret = jtagkey_open((unsigned long)cr->Card.Item[0].I.IO.dwAddr / 0x10); - else -#endif - ret = parport_open((unsigned long)cr->Card.Item[0].I.IO.dwAddr / 0x10); + pport = config_get((unsigned long)cr->Card.Item[0].I.IO.dwAddr / 0x10); + if (!pport) + break; + + ret = pport->open((unsigned long)cr->Card.Item[0].I.IO.dwAddr / 0x10); ppbase = (unsigned long)cr->Card.Item[0].I.IO.dwAddr; @@ -470,6 +466,9 @@ 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; 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", @@ -481,6 +480,15 @@ 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; + } + + for (i = 0; i < e->dwNumMatchTables; i++) { DPRINTF("match: dev: %04x:%04x, class: %x, subclass: %x, intclass: %x, intsubclass: %x, intproto: %x\n", @@ -501,7 +509,8 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { if((desc->idVendor == e->matchTables[i].VendorId) && (desc->idProduct == e->matchTables[i].ProductId) && (desc->bDeviceClass == e->matchTables[i].bDeviceClass) && - (desc->bDeviceSubClass == e->matchTables[i].bDeviceSubClass)) { + (desc->bDeviceSubClass == e->matchTables[i].bDeviceSubClass) && + ((devnum == -1) || (dev->devnum == devnum)) ) { int ac; for (ac = 0; ac < desc->bNumConfigurations; ac++) { struct usb_interface *interface = dev->config[ac].interface; @@ -566,14 +575,7 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { #ifndef NO_WINDRVR ret = (*ioctl_func) (fd, request, wdioctl); #else - -#ifdef JTAGKEY - if (!config_is_real_pport(ppbase / 0x10)) { - ret = jtagkey_transfer(tr, fd, request, ppbase, ecpbase, 1); - break; - } -#endif /* JTAGKEY */ - ret = pp_transfer(tr, fd, request, ppbase, ecpbase, 1); + ret = pport->transfer(tr, fd, request, ppbase, ecpbase, 1); #endif } break; @@ -587,13 +589,7 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { #ifndef NO_WINDRVR ret = (*ioctl_func) (fd, request, wdioctl); #else - -#ifdef JTAGKEY - if (!config_is_real_pport(ppbase / 0x10)) { - ret = jtagkey_transfer(tr, fd, request, ppbase, ecpbase, num); - } else -#endif /* JTAGKEY */ - ret = pp_transfer(tr, fd, request, ppbase, ecpbase, num); + ret = pport->transfer(tr, fd, request, ppbase, ecpbase, num); #endif } break; @@ -653,12 +649,10 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { #ifndef NO_WINDRVR ret = (*ioctl_func) (fd, request, wdioctl); #else -#ifdef JTAGKEY - if (cr->hCard == 0xff) - jtagkey_close(cr->hCard); - else -#endif - parport_close(cr->hCard); + if (pport) + pport->close(cr->hCard); + + pport = NULL; #endif } break; @@ -912,8 +906,8 @@ int access(const char *pathname, int mode) { if (!func) func = (int (*) (const char*, int)) dlsym(RTLD_NEXT, "access"); - - if (!strcmp(pathname, "/dev/windrvr6")) { + + if (pathname && !strcmp(pathname, "/dev/windrvr6")) { return 0; } else { return (*func)(pathname, mode);