#include <signal.h>
#include <pthread.h>
#include <errno.h>
+#include <inttypes.h>
#include "usb-driver.h"
static int (*ioctl_func) (int, int, void *) = NULL;
static struct usb_bus *busses = NULL;
static struct usb_device *usbdevice;
static usb_dev_handle *usb_devhandle = NULL;
+static int usbinterface = -1;
static unsigned long card_type;
static int ints_enabled = 0;
static pthread_mutex_t int_wait = PTHREAD_MUTEX_INITIALIZER;
#define NO_WINDRVR 1
-#undef DEBUG
#ifdef DEBUG
#define DPRINTF(format, args...) fprintf(stderr, format, ##args)
return (*ioctl_func) (fd, request, wdioctl);
}
- switch(request) {
+ switch(request & ~(0xc0000000)) {
case VERSION:
version = (struct version_struct*)(wdheader->data);
strcpy(version->version, "WinDriver no more");
DPRINTF("LICENSE\n");
break;
+ case CARD_REGISTER_OLD:
case CARD_REGISTER:
/* TODO: Implement for LPT-support */
#if 0
{
struct card_register* cr = (struct card_register*)(wdheader->data);
+#ifndef NO_WINDRVR
+ ret = (*ioctl_func) (fd, request, wdioctl);
+#endif
}
#endif
DPRINTF("CARD_REGISTER\n");
}
break;
+ case INT_ENABLE_OLD:
case INT_ENABLE:
DPRINTF("INT_ENABLE\n");
{
ret = usb_claim_interface(usb_devhandle, usbdevice->config[0].interface[usi->dwInterfaceNum].altsetting[usi->dwAlternateSetting].bInterfaceNumber);
if (!ret) {
if(!ret) {
+ usbinterface = usbdevice->config[0].interface[usi->dwInterfaceNum].altsetting[usi->dwAlternateSetting].bInterfaceNumber;
ret = usb_set_altinterface(usb_devhandle, usi->dwAlternateSetting);
if (ret)
fprintf(stderr, "usb_set_altinterface: %d\n", ret);
}
break;
+ case USB_GET_DEVICE_DATA_OLD:
case USB_GET_DEVICE_DATA:
DPRINTF("USB_GET_DEVICE_DATA\n");
{
}
break;
+ case EVENT_REGISTER_OLD:
case EVENT_REGISTER:
DPRINTF("EVENT_REGISTER\n");
{
}
break;
+ case TRANSFER_OLD:
case TRANSFER:
DPRINTF("TRANSFER\n");
#ifndef NO_WINDRVR
#endif
break;
+ case MULTI_TRANSFER:
+ DPRINTF("MULTI_TRANSFER\n");
+#ifndef NO_WINDRVR
+ ret = (*ioctl_func) (fd, request, wdioctl);
+#endif
+ break;
+
case EVENT_UNREGISTER:
DPRINTF("EVENT_UNREGISTER\n");
#ifndef NO_WINDRVR
if (!func)
func = (int (*) (int)) dlsym(RTLD_NEXT, "close");
- if (fd == windrvrfd) {
+ if (fd == windrvrfd && windrvrfd >= 0) {
DPRINTF("close windrvrfd\n");
+ if (usbinterface >= 0)
+ usb_release_interface(usb_devhandle, usbinterface);
+
+ if (usb_devhandle)
+ usb_close(usb_devhandle);
+
+ usb_devhandle = NULL;
+ usbinterface = -1;
windrvrfd = -1;
}