Browse Source

pass pointer to usb-driver structure through impact

master
Michael Gernoth 17 years ago
parent
commit
19acdb82e4
  1. 22
      usb-driver.c
  2. 84
      xpcu.c
  3. 25
      xpcu.h

22
usb-driver.c

@ -33,7 +33,6 @@
#include <sys/stat.h>
#include <sys/time.h>
#include <stdio.h>
#include <usb.h>
#include <signal.h>
#include <errno.h>
#include <inttypes.h>
@ -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;
}

84
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;

25
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);

Loading…
Cancel
Save