From 19acdb82e419d2075cc277a273941fb1e9a51ba0 Mon Sep 17 00:00:00 2001 From: Michael Gernoth Date: Sat, 12 Apr 2008 15:26:58 +0200 Subject: [PATCH 1/1] pass pointer to usb-driver structure through impact --- usb-driver.c | 22 ++++++-------- xpcu.c | 84 +++++++++++++++++++++++++++------------------------- xpcu.h | 25 +++++----------- 3 files changed, 61 insertions(+), 70 deletions(-) diff --git a/usb-driver.c b/usb-driver.c index b4d3414..0cc74bf 100644 --- a/usb-driver.c +++ b/usb-driver.c @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -49,7 +48,6 @@ static int windrvrfd = -1; static unsigned long ppbase = 0; static unsigned long ecpbase = 0; static struct parport_config *pport = NULL; -static struct xpcu_s *xpcu = NULL; static FILE *modulesfp = NULL; static FILE *baseaddrfp = NULL; static int baseaddrnum = 0; @@ -156,7 +154,7 @@ static int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { #ifndef NO_WINDRVR ret = (*ioctl_func) (fd, request, wdioctl); #else - ret = xpcu_transfer(xpcu, ut); + ret = xpcu_transfer(ut); #endif #ifdef DEBUG @@ -184,7 +182,7 @@ static int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { #ifndef NO_WINDRVR ret = (*ioctl_func) (fd, request, wdioctl); #else - ret = xpcu_int_state(xpcu, it, ENABLE_INTERRUPT); + ret = xpcu_int_state(it, ENABLE_INTERRUPT); #endif DPRINTF("<- Handle: 0x%lx, Options: %lx, ncmds: %lu, enableok: %lu, count: %lu, lost: %lu, stopped: %lu\n", @@ -207,7 +205,7 @@ static int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { #ifndef NO_WINDRVR ret = (*ioctl_func) (fd, request, wdioctl); #else - ret = xpcu_int_state(xpcu, it, DISABLE_INTERRUPT); + ret = xpcu_int_state(it, DISABLE_INTERRUPT); #endif DPRINTF("<- Handle: 0x%lx, Options: %lx, ncmds: %lu, enableok: %lu, count: %lu, lost: %lu, stopped: %lu\n", it->hInterrupt, it->dwOptions, @@ -227,7 +225,7 @@ static int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { #ifndef NO_WINDRVR ret = (*ioctl_func) (fd, request, wdioctl); #else - ret = xpcu_set_interface(xpcu, usi); + ret = xpcu_set_interface(usi); #endif DPRINTF("<- unique: 0x%lx, interfacenum: %lu, alternatesetting: %lu, options: %lx\n", usi->dwUniqueID, usi->dwInterfaceNum, @@ -245,7 +243,7 @@ static int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { ugdd->dwUniqueID, ugdd->dwBytes, ugdd->dwOptions); - ret = xpcu_deviceinfo(xpcu, ugdd); + ret = xpcu_deviceinfo(ugdd); } break; @@ -271,7 +269,7 @@ static int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { #ifndef NO_WINDRVR ret = (*ioctl_func) (fd, request, wdioctl); #else - xpcu = xpcu_find(e); + ret = xpcu_find(e); #endif #ifdef DEBUG @@ -333,7 +331,7 @@ static int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { #ifndef NO_WINDRVR ret = (*ioctl_func) (fd, request, wdioctl); #else - ret = xpcu_close(xpcu, e); + ret = xpcu_close(e); #endif } break; @@ -351,7 +349,7 @@ static int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { #ifndef NO_WINDRVR ret = (*ioctl_func) (fd, request, wdioctl); #else - ret = xpcu_int_wait(xpcu, it); + ret = xpcu_int_wait(it); #endif DPRINTF("<- INT_WAIT_RETURN: Handle: 0x%lx, Options: %lx, ncmds: %lu, enableok: %lu, count: %lu, lost: %lu, stopped: %lu\n", @@ -413,7 +411,7 @@ static int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) { #ifndef NO_WINDRVR ret = (*ioctl_func) (fd, request, wdioctl); #else - ret = xpcu_found(xpcu, e); + ret = xpcu_found(e); #endif #ifdef DEBUG @@ -507,8 +505,6 @@ int close(int fd) { if (fd == windrvrfd && windrvrfd >= 0) { DPRINTF("close windrvrfd\n"); - - xpcu = NULL; windrvrfd = -1; } diff --git a/xpcu.c b/xpcu.c index 719829b..66c4fe3 100644 --- a/xpcu.c +++ b/xpcu.c @@ -9,19 +9,26 @@ #include "usb-driver.h" #include "xpcu.h" +struct xpcu_s { + struct usb_device *dev; + usb_dev_handle *handle; + int interface; + int alternate; + unsigned long card_type; + pthread_mutex_t interrupt; +}; + static struct usb_bus *busses = NULL; static pthread_mutex_t dummy_interrupt = PTHREAD_MUTEX_INITIALIZER; -int xpcu_deviceinfo(struct xpcu_s *xpcu, struct usb_get_device_data *ugdd) { +int xpcu_deviceinfo(struct usb_get_device_data *ugdd) { + struct xpcu_s *xpcu = (struct xpcu_s*)ugdd->dwUniqueID; int i,j,k,l; int len = 0; unsigned char *buf = NULL; WDU_CONFIGURATION **pConfigs, **pActiveConfig; WDU_INTERFACE **pActiveInterface; - if (ugdd->dwUniqueID != (unsigned long)xpcu) - return -ENODEV; - if (!xpcu) return -ENODEV; @@ -217,12 +224,10 @@ static int xpcu_claim(struct xpcu_s *xpcu, int claim) { return ret; } -int xpcu_transfer(struct xpcu_s *xpcu, struct usb_transfer *ut) { +int xpcu_transfer(struct usb_transfer *ut) { + struct xpcu_s *xpcu = (struct xpcu_s*)ut->dwUniqueID; int ret = 0; - if (ut->dwUniqueID != (unsigned long)xpcu) - return -ENODEV; - if (!xpcu) return -ENODEV; @@ -256,10 +261,9 @@ int xpcu_transfer(struct xpcu_s *xpcu, struct usb_transfer *ut) { return ret; } -int xpcu_set_interface(struct xpcu_s *xpcu, struct usb_set_interface *usi) { - if (usi->dwUniqueID != (unsigned long)xpcu) - return -ENODEV; - +int xpcu_set_interface(struct usb_set_interface *usi) { + struct xpcu_s *xpcu = (struct xpcu_s*)usi->dwUniqueID; + if (!xpcu) return -ENODEV; @@ -293,14 +297,13 @@ static void xpcu_init(void) { } -struct xpcu_s *xpcu_find(struct event *e) { - static struct xpcu_s xpcu; +int xpcu_find(struct event *e) { + struct xpcu_s *xpcu = NULL; char* devpos; struct usb_bus *bus; int busnum = -1, devnum = -1; int i; - bzero(&xpcu, sizeof(xpcu)); xpcu_init(); devpos = getenv("XILINX_USB_DEV"); @@ -376,11 +379,16 @@ struct xpcu_s *xpcu_find(struct event *e) { /* TODO: check interfaceClass! */ DPRINTF("found device with libusb\n"); - xpcu.interface = -1; - xpcu.alternate = -1; - xpcu.dev = dev; - xpcu.card_type = e->dwCardType; - pthread_mutex_init(&xpcu.interrupt, NULL); + xpcu = malloc(sizeof(struct xpcu_s)); + if (!xpcu) + return -ENOMEM; + + bzero(xpcu, sizeof(struct xpcu_s)); + xpcu->interface = -1; + xpcu->alternate = -1; + xpcu->dev = dev; + xpcu->card_type = e->dwCardType; + pthread_mutex_init(&xpcu->interrupt, NULL); e->handle = (unsigned long)&xpcu; } } @@ -390,16 +398,15 @@ struct xpcu_s *xpcu_find(struct event *e) { } } - if (!xpcu.dev) { - e->handle = 0; - return NULL; - } + e->handle = (unsigned long)xpcu; - return &xpcu; + return 0; } -int xpcu_found(struct xpcu_s *xpcu, struct event *e) { - if (e->handle && e->handle == (unsigned long)xpcu && xpcu->dev) { +int xpcu_found(struct event *e) { + struct xpcu_s *xpcu = (struct xpcu_s*)e->handle; + + if (xpcu && xpcu->dev) { struct usb_interface *interface = xpcu->dev->config->interface; e->dwCardType = xpcu->card_type; @@ -418,10 +425,9 @@ int xpcu_found(struct xpcu_s *xpcu, struct event *e) { return 0; } -int xpcu_close(struct xpcu_s *xpcu, struct event *e) { - if (e->handle != (unsigned long)xpcu) - return -ENODEV; - +int xpcu_close(struct event *e) { + struct xpcu_s *xpcu = (struct xpcu_s*)e->handle; + if (!xpcu) return -ENODEV; @@ -431,21 +437,17 @@ int xpcu_close(struct xpcu_s *xpcu, struct event *e) { usb_close(xpcu->handle); } - xpcu->handle = NULL; - xpcu->interface = -1; - xpcu->alternate = -1; busses = NULL; + free(xpcu); } return 0; } -int xpcu_int_state(struct xpcu_s *xpcu, struct interrupt *it, int enable) { - static pthread_mutex_t *interrupt = &dummy_interrupt; +int xpcu_int_state(struct interrupt *it, int enable) { + struct xpcu_s *xpcu = (struct xpcu_s*)it->hInterrupt; + pthread_mutex_t *interrupt = &dummy_interrupt; - if (it->hInterrupt != (unsigned long)xpcu) - return -ENODEV; - if (xpcu) interrupt = &xpcu->interrupt; @@ -463,7 +465,9 @@ int xpcu_int_state(struct xpcu_s *xpcu, struct interrupt *it, int enable) { return 0; } -int xpcu_int_wait(struct xpcu_s *xpcu, struct interrupt *it) { +int xpcu_int_wait(struct interrupt *it) { + struct xpcu_s *xpcu = (struct xpcu_s*)it->hInterrupt; + if (it->hInterrupt != (unsigned long)xpcu) return -ENODEV; diff --git a/xpcu.h b/xpcu.h index 30ff4f1..8afcee0 100644 --- a/xpcu.h +++ b/xpcu.h @@ -4,20 +4,11 @@ #define ENABLE_INTERRUPT 1 #define DISABLE_INTERRUPT 0 -struct xpcu_s { - struct usb_device *dev; - usb_dev_handle *handle; - int interface; - int alternate; - unsigned long card_type; - pthread_mutex_t interrupt; -}; - -int __attribute__ ((visibility ("hidden"))) xpcu_deviceinfo(struct xpcu_s *xpcu, struct usb_get_device_data *ugdd); -int __attribute__ ((visibility ("hidden"))) xpcu_transfer(struct xpcu_s *xpcu, struct usb_transfer *ut); -int __attribute__ ((visibility ("hidden"))) xpcu_set_interface(struct xpcu_s *xpcu, struct usb_set_interface *usi); -struct xpcu_s __attribute__ ((visibility ("hidden"))) *xpcu_find(struct event *e); -int __attribute__ ((visibility ("hidden"))) xpcu_found(struct xpcu_s *xpcu, struct event *e); -int __attribute__ ((visibility ("hidden"))) xpcu_close(struct xpcu_s *xpcu, struct event *e); -int __attribute__ ((visibility ("hidden"))) xpcu_int_state(struct xpcu_s *xpcu, struct interrupt *it, int enable); -int __attribute__ ((visibility ("hidden"))) xpcu_int_wait(struct xpcu_s *xpcu, struct interrupt *it); +int __attribute__ ((visibility ("hidden"))) xpcu_deviceinfo(struct usb_get_device_data *ugdd); +int __attribute__ ((visibility ("hidden"))) xpcu_transfer(struct usb_transfer *ut); +int __attribute__ ((visibility ("hidden"))) xpcu_set_interface(struct usb_set_interface *usi); +int __attribute__ ((visibility ("hidden"))) xpcu_find(struct event *e); +int __attribute__ ((visibility ("hidden"))) xpcu_found(struct event *e); +int __attribute__ ((visibility ("hidden"))) xpcu_close(struct event *e); +int __attribute__ ((visibility ("hidden"))) xpcu_int_state(struct interrupt *it, int enable); +int __attribute__ ((visibility ("hidden"))) xpcu_int_wait(struct interrupt *it); -- 2.39.5