some cleanups
This commit is contained in:
parent
fdd05738df
commit
f1405f1379
279
usb-driver.c
279
usb-driver.c
@ -1,13 +1,28 @@
|
|||||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
|
/* libusb connector for XILINX impact
|
||||||
|
*
|
||||||
|
* Copyright (c) 2007 Michael Gernoth <michael@gernoth.net>
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to
|
||||||
|
* deal in the Software without restriction, including without limitation the
|
||||||
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
* IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
#define _GNU_SOURCE 1
|
#define _GNU_SOURCE 1
|
||||||
|
|
||||||
#if defined(RTLD_NEXT)
|
|
||||||
#define REAL_LIBC RTLD_NEXT
|
|
||||||
#else
|
|
||||||
#define REAL_LIBC ((void *) -1L)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -38,6 +53,7 @@ static pthread_mutex_t int_wait = PTHREAD_MUTEX_INITIALIZER;
|
|||||||
#undef DEBUG
|
#undef DEBUG
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
#define DPRINTF(format, args...) fprintf(stderr, format, ##args)
|
||||||
void hexdump(unsigned char *buf, int len) {
|
void hexdump(unsigned char *buf, int len) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -46,7 +62,10 @@ void hexdump(unsigned char *buf, int len) {
|
|||||||
if ((i % 16) == 15)
|
if ((i % 16) == 15)
|
||||||
fprintf(stderr,"\n");
|
fprintf(stderr,"\n");
|
||||||
}
|
}
|
||||||
|
fprintf(stderr,"\n");
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
#define DPRINTF(format, args...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int usb_deviceinfo(unsigned char *buf) {
|
int usb_deviceinfo(unsigned char *buf) {
|
||||||
@ -224,15 +243,11 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
|
|||||||
version = (struct version_struct*)(wdheader->data);
|
version = (struct version_struct*)(wdheader->data);
|
||||||
strcpy(version->version, "WinDriver no more");
|
strcpy(version->version, "WinDriver no more");
|
||||||
version->versionul = 802;
|
version->versionul = 802;
|
||||||
#ifdef DEBUG
|
DPRINTF("VERSION\n");
|
||||||
fprintf(stderr,"faking VERSION\n");
|
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LICENSE:
|
case LICENSE:
|
||||||
#ifdef DEBUG
|
DPRINTF("LICENSE\n");
|
||||||
fprintf(stderr,"faking LICENSE\n");
|
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CARD_REGISTER:
|
case CARD_REGISTER:
|
||||||
@ -242,28 +257,24 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
|
|||||||
struct card_register* cr = (struct card_register*)(wdheader->data);
|
struct card_register* cr = (struct card_register*)(wdheader->data);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef DEBUG
|
DPRINTF("CARD_REGISTER\n");
|
||||||
fprintf(stderr,"faking CARD_REGISTER\n");
|
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case USB_TRANSFER:
|
case USB_TRANSFER:
|
||||||
#ifdef DEBUG
|
DPRINTF("in USB_TRANSFER");
|
||||||
fprintf(stderr,"in USB_TRANSFER");
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
struct usb_transfer *ut = (struct usb_transfer*)(wdheader->data);
|
struct usb_transfer *ut = (struct usb_transfer*)(wdheader->data);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr," unique: %lu, pipe: %lu, read: %lu, options: %lx, size: %lu, timeout: %lx\n", ut->dwUniqueID, ut->dwPipeNum, ut->fRead, ut->dwOptions, ut->dwBufferSize, ut->dwTimeout);
|
DPRINTF(" unique: %lu, pipe: %lu, read: %lu, options: %lx, size: %lu, timeout: %lx\n",
|
||||||
fprintf(stderr,"setup packet: ");
|
ut->dwUniqueID, ut->dwPipeNum, ut->fRead,
|
||||||
|
ut->dwOptions, ut->dwBufferSize, ut->dwTimeout);
|
||||||
|
DPRINTF("setup packet: ");
|
||||||
hexdump(ut->SetupPacket, 8);
|
hexdump(ut->SetupPacket, 8);
|
||||||
fprintf(stderr,"\n");
|
|
||||||
|
|
||||||
if (!ut->fRead && ut->dwBufferSize)
|
if (!ut->fRead && ut->dwBufferSize)
|
||||||
{
|
{
|
||||||
hexdump(ut->pBuffer, ut->dwBufferSize);
|
hexdump(ut->pBuffer, ut->dwBufferSize);
|
||||||
fprintf(stderr,"\n");
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -278,9 +289,7 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
|
|||||||
value = ut->SetupPacket[2] | (ut->SetupPacket[3] << 8);
|
value = ut->SetupPacket[2] | (ut->SetupPacket[3] << 8);
|
||||||
index = ut->SetupPacket[4] | (ut->SetupPacket[5] << 8);
|
index = ut->SetupPacket[4] | (ut->SetupPacket[5] << 8);
|
||||||
size = ut->SetupPacket[6] | (ut->SetupPacket[7] << 8);
|
size = ut->SetupPacket[6] | (ut->SetupPacket[7] << 8);
|
||||||
#ifdef DEBUG
|
DPRINTF("requesttype: %x, request: %x, value: %u, index: %u, size: %u\n", requesttype, request, value, index, size);
|
||||||
fprintf(stderr, "requesttype: %x, request: %x, value: %u, index: %u, size: %u\n", requesttype, request, value, index, size);
|
|
||||||
#endif
|
|
||||||
ret = usb_control_msg(usb_devhandle, requesttype, request, value, index, ut->pBuffer, size, ut->dwTimeout);
|
ret = usb_control_msg(usb_devhandle, requesttype, request, value, index, ut->pBuffer, size, ut->dwTimeout);
|
||||||
} else {
|
} else {
|
||||||
if (ut->fRead) {
|
if (ut->fRead) {
|
||||||
@ -300,27 +309,25 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr,"Transferred: %lu (%s)\n",ut->dwBytesTransferred, (ut->fRead?"read":"write"));
|
DPRINTF("Transferred: %lu (%s)\n",ut->dwBytesTransferred, (ut->fRead?"read":"write"));
|
||||||
if (ut->fRead && ut->dwBytesTransferred)
|
if (ut->fRead && ut->dwBytesTransferred)
|
||||||
{
|
{
|
||||||
fprintf(stderr,"Read: ");
|
DPRINTF("Read: ");
|
||||||
hexdump(ut->pBuffer, ut->dwBytesTransferred);
|
hexdump(ut->pBuffer, ut->dwBytesTransferred);
|
||||||
fprintf(stderr,"\n");
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INT_ENABLE:
|
case INT_ENABLE:
|
||||||
#ifdef DEBUG
|
DPRINTF("INT_ENABLE\n");
|
||||||
fprintf(stderr,"INT_ENABLE\n");
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
struct interrupt *it = (struct interrupt*)(wdheader->data);
|
struct interrupt *it = (struct interrupt*)(wdheader->data);
|
||||||
|
|
||||||
#ifdef DEBUG
|
DPRINTF("Handle: %lu, Options: %lx, ncmds: %lu, enableok: %lu, count: %lu, lost: %lu, stopped: %lu\n",
|
||||||
fprintf(stderr,"Handle: %lu, Options: %lx, ncmds: %lu, enableok: %lu, count: %lu, lost: %lu, stopped: %lu\n", it->hInterrupt, it->dwOptions, it->dwCmds, it->fEnableOk, it->dwCounter, it->dwLost, it->fStopped);
|
it->hInterrupt, it->dwOptions,
|
||||||
#endif
|
it->dwCmds, it->fEnableOk, it->dwCounter,
|
||||||
|
it->dwLost, it->fStopped);
|
||||||
|
|
||||||
it->fEnableOk = 1;
|
it->fEnableOk = 1;
|
||||||
ints_enabled = 1;
|
ints_enabled = 1;
|
||||||
@ -330,15 +337,14 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case INT_DISABLE:
|
case INT_DISABLE:
|
||||||
#ifdef DEBUG
|
DPRINTF("INT_DISABLE\n");
|
||||||
fprintf(stderr,"INT_DISABLE\n");
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
struct interrupt *it = (struct interrupt*)(wdheader->data);
|
struct interrupt *it = (struct interrupt*)(wdheader->data);
|
||||||
|
|
||||||
#ifdef DEBUG
|
DPRINTF("Handle: %lu, Options: %lx, ncmds: %lu, enableok: %lu, count: %lu, lost: %lu, stopped: %lu\n",
|
||||||
fprintf(stderr,"Handle: %lu, Options: %lx, ncmds: %lu, enableok: %lu, count: %lu, lost: %lu, stopped: %lu\n", it->hInterrupt, it->dwOptions, it->dwCmds, it->fEnableOk, it->dwCounter, it->dwLost, it->fStopped);
|
it->hInterrupt, it->dwOptions,
|
||||||
#endif
|
it->dwCmds, it->fEnableOk, it->dwCounter,
|
||||||
|
it->dwLost, it->fStopped);
|
||||||
#ifndef NO_WINDRVR
|
#ifndef NO_WINDRVR
|
||||||
ret = (*ioctl_func) (fd, request, wdioctl);
|
ret = (*ioctl_func) (fd, request, wdioctl);
|
||||||
#else
|
#else
|
||||||
@ -347,22 +353,21 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
|
|||||||
ints_enabled = 0;
|
ints_enabled = 0;
|
||||||
pthread_mutex_unlock(&int_wait);
|
pthread_mutex_unlock(&int_wait);
|
||||||
#endif
|
#endif
|
||||||
#ifdef DEBUG
|
DPRINTF("Handle: %lu, Options: %lx, ncmds: %lu, enableok: %lu, count: %lu, lost: %lu, stopped: %lu\n",
|
||||||
fprintf(stderr,"Handle: %lu, Options: %lx, ncmds: %lu, enableok: %lu, count: %lu, lost: %lu, stopped: %lu\n", it->hInterrupt, it->dwOptions, it->dwCmds, it->fEnableOk, it->dwCounter, it->dwLost, it->fStopped);
|
it->hInterrupt, it->dwOptions,
|
||||||
#endif
|
it->dwCmds, it->fEnableOk, it->dwCounter,
|
||||||
|
it->dwLost, it->fStopped);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case USB_SET_INTERFACE:
|
case USB_SET_INTERFACE:
|
||||||
#ifdef DEBUG
|
DPRINTF("USB_SET_INTERFACE\n");
|
||||||
fprintf(stderr,"USB_SET_INTERFACE\n");
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
struct usb_set_interface *usi = (struct usb_set_interface*)(wdheader->data);
|
struct usb_set_interface *usi = (struct usb_set_interface*)(wdheader->data);
|
||||||
|
|
||||||
#ifdef DEBUG
|
DPRINTF("unique: %lu, interfacenum: %lu, alternatesetting: %lu, options: %lx\n",
|
||||||
fprintf(stderr,"unique: %lu, interfacenum: %lu, alternatesetting: %lu, options: %lx\n", usi->dwUniqueID, usi->dwInterfaceNum, usi->dwAlternateSetting, usi->dwOptions);
|
usi->dwUniqueID, usi->dwInterfaceNum,
|
||||||
#endif
|
usi->dwAlternateSetting, usi->dwOptions);
|
||||||
#ifndef NO_WINDRVR
|
#ifndef NO_WINDRVR
|
||||||
ret = (*ioctl_func) (fd, request, wdioctl);
|
ret = (*ioctl_func) (fd, request, wdioctl);
|
||||||
#else
|
#else
|
||||||
@ -381,27 +386,28 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
|
|||||||
fprintf(stderr, "usb_set_configuration: %d (%s)\n", ret, usb_strerror());
|
fprintf(stderr, "usb_set_configuration: %d (%s)\n", ret, usb_strerror());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "usb_claim_interface: %d -> %d (%s)\n", usbdevice->config[0].interface[usi->dwInterfaceNum].altsetting[usi->dwAlternateSetting].bInterfaceNumber, ret, usb_strerror());
|
fprintf(stderr, "usb_claim_interface: %d -> %d (%s)\n",
|
||||||
|
usbdevice->config[0].interface[usi->dwInterfaceNum].altsetting[usi->dwAlternateSetting].bInterfaceNumber,
|
||||||
|
ret, usb_strerror());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef DEBUG
|
DPRINTF("unique: %lu, interfacenum: %lu, alternatesetting: %lu, options: %lx\n",
|
||||||
fprintf(stderr,"unique: %lu, interfacenum: %lu, alternatesetting: %lu, options: %lx\n", usi->dwUniqueID, usi->dwInterfaceNum, usi->dwAlternateSetting, usi->dwOptions);
|
usi->dwUniqueID, usi->dwInterfaceNum,
|
||||||
#endif
|
usi->dwAlternateSetting, usi->dwOptions);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case USB_GET_DEVICE_DATA:
|
case USB_GET_DEVICE_DATA:
|
||||||
#ifdef DEBUG
|
DPRINTF("USB_GET_DEVICE_DATA\n");
|
||||||
fprintf(stderr,"faking USB_GET_DEVICE_DATA\n");
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
struct usb_get_device_data *ugdd = (struct usb_get_device_data*)(wdheader->data);
|
struct usb_get_device_data *ugdd = (struct usb_get_device_data*)(wdheader->data);
|
||||||
int pSize;
|
int pSize;
|
||||||
|
|
||||||
#ifdef DEBUG
|
DPRINTF("unique: %lu, bytes: %lu, options: %lx\n",
|
||||||
fprintf(stderr, "unique: %lu, bytes: %lu, options: %lx\n", ugdd->dwUniqueID, ugdd->dwBytes, ugdd->dwOptions);
|
ugdd->dwUniqueID, ugdd->dwBytes,
|
||||||
#endif
|
ugdd->dwOptions);
|
||||||
|
|
||||||
pSize = ugdd->dwBytes;
|
pSize = ugdd->dwBytes;
|
||||||
if (!ugdd->dwBytes) {
|
if (!ugdd->dwBytes) {
|
||||||
if (usbdevice) {
|
if (usbdevice) {
|
||||||
@ -414,21 +420,31 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case EVENT_REGISTER:
|
case EVENT_REGISTER:
|
||||||
#ifdef DEBUG
|
DPRINTF("EVENT_REGISTER\n");
|
||||||
fprintf(stderr,"EVENT_REGISTER\n");
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
struct event *e = (struct event*)(wdheader->data);
|
struct event *e = (struct event*)(wdheader->data);
|
||||||
struct usb_bus *bus;
|
struct usb_bus *bus;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#ifdef DEBUG
|
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",
|
||||||
fprintf(stderr,"handle: %lu, action: %lu, status: %lu, eventid: %lu, cardtype: %lu, kplug: %lu, options: %lu, dev: %lx:%lx, unique: %lu, ver: %lu, nummatch: %lu\n", e->handle, e->dwAction, e->dwStatus, e->dwEventId, e->dwCardType, e->hKernelPlugIn, e->dwOptions, e->u.Usb.deviceId.dwVendorId, e->u.Usb.deviceId.dwProductId, e->u.Usb.dwUniqueID, e->dwEventVer, e->dwNumMatchTables);
|
e->handle, e->dwAction,
|
||||||
#endif
|
e->dwStatus, e->dwEventId, e->dwCardType,
|
||||||
|
e->hKernelPlugIn, e->dwOptions,
|
||||||
|
e->u.Usb.deviceId.dwVendorId,
|
||||||
|
e->u.Usb.deviceId.dwProductId,
|
||||||
|
e->u.Usb.dwUniqueID, e->dwEventVer,
|
||||||
|
e->dwNumMatchTables);
|
||||||
|
|
||||||
for (i = 0; i < e->dwNumMatchTables; i++) {
|
for (i = 0; i < e->dwNumMatchTables; i++) {
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr,"match: dev: %04x:%04x, class: %x, subclass: %x, intclass: %x, intsubclass: %x, intproto: %x\n", e->matchTables[i].VendorId, e->matchTables[i].ProductId, e->matchTables[i].bDeviceClass, e->matchTables[i].bDeviceSubClass, e->matchTables[i].bInterfaceClass, e->matchTables[i].bInterfaceSubClass, e->matchTables[i].bInterfaceProtocol);
|
DPRINTF("match: dev: %04x:%04x, class: %x, subclass: %x, intclass: %x, intsubclass: %x, intproto: %x\n",
|
||||||
#endif
|
e->matchTables[i].VendorId,
|
||||||
|
e->matchTables[i].ProductId,
|
||||||
|
e->matchTables[i].bDeviceClass,
|
||||||
|
e->matchTables[i].bDeviceSubClass,
|
||||||
|
e->matchTables[i].bInterfaceClass,
|
||||||
|
e->matchTables[i].bInterfaceSubClass,
|
||||||
|
e->matchTables[i].bInterfaceProtocol);
|
||||||
|
|
||||||
for (bus = busses; bus; bus = bus->next) {
|
for (bus = busses; bus; bus = bus->next) {
|
||||||
struct usb_device *dev;
|
struct usb_device *dev;
|
||||||
@ -446,15 +462,16 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
|
|||||||
int ai;
|
int ai;
|
||||||
|
|
||||||
for (ai = 0; ai < interface->num_altsetting; ai++) {
|
for (ai = 0; ai < interface->num_altsetting; ai++) {
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "intclass: %x, intsubclass: %x, intproto: %x\n", interface->altsetting[i].bInterfaceClass, interface->altsetting[i].bInterfaceSubClass, interface->altsetting[i].bInterfaceProtocol);
|
DPRINTF("intclass: %x, intsubclass: %x, intproto: %x\n",
|
||||||
#endif
|
interface->altsetting[i].bInterfaceClass,
|
||||||
|
interface->altsetting[i].bInterfaceSubClass,
|
||||||
|
interface->altsetting[i].bInterfaceProtocol);
|
||||||
|
|
||||||
if ((interface->altsetting[ai].bInterfaceSubClass == e->matchTables[i].bInterfaceSubClass) &&
|
if ((interface->altsetting[ai].bInterfaceSubClass == e->matchTables[i].bInterfaceSubClass) &&
|
||||||
(interface->altsetting[ai].bInterfaceProtocol == e->matchTables[i].bInterfaceProtocol)){
|
(interface->altsetting[ai].bInterfaceProtocol == e->matchTables[i].bInterfaceProtocol)){
|
||||||
/* TODO: check interfaceClass! */
|
/* TODO: check interfaceClass! */
|
||||||
#ifdef DEBUG
|
DPRINTF("found device with libusb\n");
|
||||||
fprintf(stderr,"!!!FOUND DEVICE WITH LIBUSB!!!\n");
|
|
||||||
#endif
|
|
||||||
usbdevice = dev;
|
usbdevice = dev;
|
||||||
card_type = e->dwCardType;
|
card_type = e->dwCardType;
|
||||||
}
|
}
|
||||||
@ -472,39 +489,51 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr,"handle: %lu, action: %lu, status: %lu, eventid: %lu, cardtype: %lu, kplug: %lu, options: %lu, dev: %lx:%lx, unique: %lu, ver: %lu, nummatch: %lu\n", e->handle, e->dwAction, e->dwStatus, e->dwEventId, e->dwCardType, e->hKernelPlugIn, e->dwOptions, e->u.Usb.deviceId.dwVendorId, e->u.Usb.deviceId.dwProductId, e->u.Usb.dwUniqueID, e->dwEventVer, e->dwNumMatchTables);
|
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",
|
||||||
|
e->handle, e->dwAction,
|
||||||
|
e->dwStatus, e->dwEventId, e->dwCardType,
|
||||||
|
e->hKernelPlugIn, e->dwOptions,
|
||||||
|
e->u.Usb.deviceId.dwVendorId,
|
||||||
|
e->u.Usb.deviceId.dwProductId,
|
||||||
|
e->u.Usb.dwUniqueID, e->dwEventVer,
|
||||||
|
e->dwNumMatchTables);
|
||||||
|
|
||||||
for (i = 0; i < e->dwNumMatchTables; i++)
|
for (i = 0; i < e->dwNumMatchTables; i++)
|
||||||
fprintf(stderr,"match: dev: %04x:%04x, class: %x, subclass: %x, intclass: %x, intsubclass: %x, intproto: %x\n", e->matchTables[i].VendorId, e->matchTables[i].ProductId, e->matchTables[i].bDeviceClass, e->matchTables[i].bDeviceSubClass, e->matchTables[i].bInterfaceClass, e->matchTables[i].bInterfaceSubClass, e->matchTables[i].bInterfaceProtocol);
|
DPRINTF("match: dev: %04x:%04x, class: %x, subclass: %x, intclass: %x, intsubclass: %x, intproto: %x\n",
|
||||||
|
e->matchTables[i].VendorId,
|
||||||
|
e->matchTables[i].ProductId,
|
||||||
|
e->matchTables[i].bDeviceClass,
|
||||||
|
e->matchTables[i].bDeviceSubClass,
|
||||||
|
e->matchTables[i].bInterfaceClass,
|
||||||
|
e->matchTables[i].bInterfaceSubClass,
|
||||||
|
e->matchTables[i].bInterfaceProtocol);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TRANSFER:
|
case TRANSFER:
|
||||||
fprintf(stderr,"TRANSFER\n");
|
DPRINTF("TRANSFER\n");
|
||||||
#ifndef NO_WINDRVR
|
#ifndef NO_WINDRVR
|
||||||
ret = (*ioctl_func) (fd, request, wdioctl);
|
ret = (*ioctl_func) (fd, request, wdioctl);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EVENT_UNREGISTER:
|
case EVENT_UNREGISTER:
|
||||||
#ifdef DEBUG
|
DPRINTF("EVENT_UNREGISTER\n");
|
||||||
fprintf(stderr,"EVENT_UNREGISTER\n");
|
|
||||||
#endif
|
|
||||||
#ifndef NO_WINDRVR
|
#ifndef NO_WINDRVR
|
||||||
ret = (*ioctl_func) (fd, request, wdioctl);
|
ret = (*ioctl_func) (fd, request, wdioctl);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INT_WAIT:
|
case INT_WAIT:
|
||||||
#ifdef DEBUG
|
DPRINTF("INT_WAIT\n");
|
||||||
fprintf(stderr,"INT_WAIT\n");
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
struct interrupt *it = (struct interrupt*)(wdheader->data);
|
struct interrupt *it = (struct interrupt*)(wdheader->data);
|
||||||
|
|
||||||
#ifdef DEBUG
|
DPRINTF("Handle: %lu, Options: %lx, ncmds: %lu, enableok: %lu, count: %lu, lost: %lu, stopped: %lu\n",
|
||||||
fprintf(stderr,"Handle: %lu, Options: %lx, ncmds: %lu, enableok: %lu, count: %lu, lost: %lu, stopped: %lu\n", it->hInterrupt, it->dwOptions, it->dwCmds, it->fEnableOk, it->dwCounter, it->dwLost, it->fStopped);
|
it->hInterrupt, it->dwOptions,
|
||||||
#endif
|
it->dwCmds, it->fEnableOk, it->dwCounter,
|
||||||
|
it->dwLost, it->fStopped);
|
||||||
|
|
||||||
#ifndef NO_WINDRVR
|
#ifndef NO_WINDRVR
|
||||||
ret = (*ioctl_func) (fd, request, wdioctl);
|
ret = (*ioctl_func) (fd, request, wdioctl);
|
||||||
@ -522,31 +551,44 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG
|
DPRINTF("INT_WAIT_RETURN: Handle: %lu, Options: %lx, ncmds: %lu, enableok: %lu, count: %lu, lost: %lu, stopped: %lu\n",
|
||||||
fprintf(stderr,"INT_WAIT_RETURN: Handle: %lu, Options: %lx, ncmds: %lu, enableok: %lu, count: %lu, lost: %lu, stopped: %lu\n", it->hInterrupt, it->dwOptions, it->dwCmds, it->fEnableOk, it->dwCounter, it->dwLost, it->fStopped);
|
it->hInterrupt, it->dwOptions, it->dwCmds,
|
||||||
#endif
|
it->fEnableOk, it->dwCounter, it->dwLost,
|
||||||
|
it->fStopped);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CARD_UNREGISTER:
|
case CARD_UNREGISTER:
|
||||||
fprintf(stderr,"CARD_UNREGISTER\n");
|
DPRINTF("CARD_UNREGISTER\n");
|
||||||
#ifndef NO_WINDRVR
|
#ifndef NO_WINDRVR
|
||||||
ret = (*ioctl_func) (fd, request, wdioctl);
|
ret = (*ioctl_func) (fd, request, wdioctl);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EVENT_PULL:
|
case EVENT_PULL:
|
||||||
#ifdef DEBUG
|
DPRINTF("EVENT_PULL\n");
|
||||||
fprintf(stderr,"EVENT_PULL\n");
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
struct event *e = (struct event*)(wdheader->data);
|
struct event *e = (struct event*)(wdheader->data);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
fprintf(stderr,"handle: %lu, action: %lu, status: %lu, eventid: %lu, cardtype: %lx, kplug: %lu, options: %lu, dev: %lx:%lx, unique: %lu, ver: %lu, nummatch: %lu\n", e->handle, e->dwAction, e->dwStatus, e->dwEventId, e->dwCardType, e->hKernelPlugIn, e->dwOptions, e->u.Usb.deviceId.dwVendorId, e->u.Usb.deviceId.dwProductId, e->u.Usb.dwUniqueID, e->dwEventVer, e->dwNumMatchTables);
|
DPRINTF("handle: %lu, action: %lu, status: %lu, eventid: %lu, cardtype: %lx, kplug: %lu, options: %lu, dev: %lx:%lx, unique: %lu, ver: %lu, nummatch: %lu\n",
|
||||||
|
e->handle, e->dwAction, e->dwStatus,
|
||||||
|
e->dwEventId, e->dwCardType, e->hKernelPlugIn,
|
||||||
|
e->dwOptions, e->u.Usb.deviceId.dwVendorId,
|
||||||
|
e->u.Usb.deviceId.dwProductId,
|
||||||
|
e->u.Usb.dwUniqueID, e->dwEventVer,
|
||||||
|
e->dwNumMatchTables);
|
||||||
|
|
||||||
for (i = 0; i < e->dwNumMatchTables; i++)
|
for (i = 0; i < e->dwNumMatchTables; i++)
|
||||||
fprintf(stderr,"match: dev: %04x:%04x, class: %x, subclass: %x, intclass: %x, intsubclass: %x, intproto: %x\n", e->matchTables[i].VendorId, e->matchTables[i].ProductId, e->matchTables[i].bDeviceClass, e->matchTables[i].bDeviceSubClass, e->matchTables[i].bInterfaceClass, e->matchTables[i].bInterfaceSubClass, e->matchTables[i].bInterfaceProtocol);
|
DPRINTF("match: dev: %04x:%04x, class: %x, subclass: %x, intclass: %x, intsubclass: %x, intproto: %x\n",
|
||||||
|
e->matchTables[i].VendorId,
|
||||||
|
e->matchTables[i].ProductId,
|
||||||
|
e->matchTables[i].bDeviceClass,
|
||||||
|
e->matchTables[i].bDeviceSubClass,
|
||||||
|
e->matchTables[i].bInterfaceClass,
|
||||||
|
e->matchTables[i].bInterfaceSubClass,
|
||||||
|
e->matchTables[i].bInterfaceProtocol);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef NO_WINDRVR
|
#ifndef NO_WINDRVR
|
||||||
@ -570,9 +612,23 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr,"handle: %lu, action: %lu, status: %lu, eventid: %lu, cardtype: %lx, kplug: %lu, options: %lu, dev: %lx:%lx, unique: %lu, ver: %lu, nummatch: %lu\n", e->handle, e->dwAction, e->dwStatus, e->dwEventId, e->dwCardType, e->hKernelPlugIn, e->dwOptions, e->u.Usb.deviceId.dwVendorId, e->u.Usb.deviceId.dwProductId, e->u.Usb.dwUniqueID, e->dwEventVer, e->dwNumMatchTables);
|
DPRINTF("handle: %lu, action: %lu, status: %lu, eventid: %lu, cardtype: %lx, kplug: %lu, options: %lu, dev: %lx:%lx, unique: %lu, ver: %lu, nummatch: %lu\n",
|
||||||
|
e->handle, e->dwAction, e->dwStatus,
|
||||||
|
e->dwEventId, e->dwCardType, e->hKernelPlugIn,
|
||||||
|
e->dwOptions, e->u.Usb.deviceId.dwVendorId,
|
||||||
|
e->u.Usb.deviceId.dwProductId,
|
||||||
|
e->u.Usb.dwUniqueID, e->dwEventVer,
|
||||||
|
e->dwNumMatchTables);
|
||||||
|
|
||||||
for (i = 0; i < e->dwNumMatchTables; i++)
|
for (i = 0; i < e->dwNumMatchTables; i++)
|
||||||
fprintf(stderr,"match: dev: %04x:%04x, class: %x, subclass: %x, intclass: %x, intsubclass: %x, intproto: %x\n", e->matchTables[i].VendorId, e->matchTables[i].ProductId, e->matchTables[i].bDeviceClass, e->matchTables[i].bDeviceSubClass, e->matchTables[i].bInterfaceClass, e->matchTables[i].bInterfaceSubClass, e->matchTables[i].bInterfaceProtocol);
|
DPRINTF("match: dev: %04x:%04x, class: %x, subclass: %x, intclass: %x, intsubclass: %x, intproto: %x\n",
|
||||||
|
e->matchTables[i].VendorId,
|
||||||
|
e->matchTables[i].ProductId,
|
||||||
|
e->matchTables[i].bDeviceClass,
|
||||||
|
e->matchTables[i].bDeviceSubClass,
|
||||||
|
e->matchTables[i].bInterfaceClass,
|
||||||
|
e->matchTables[i].bInterfaceSubClass,
|
||||||
|
e->matchTables[i].bInterfaceProtocol);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -595,7 +651,7 @@ int ioctl(int fd, int request, ...) {
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!ioctl_func)
|
if (!ioctl_func)
|
||||||
ioctl_func = (int (*) (int, int, void *)) dlsym (REAL_LIBC, "ioctl");
|
ioctl_func = (int (*) (int, int, void *)) dlsym (RTLD_NEXT, "ioctl");
|
||||||
|
|
||||||
va_start (args, request);
|
va_start (args, request);
|
||||||
argp = va_arg (args, void *);
|
argp = va_arg (args, void *);
|
||||||
@ -616,7 +672,7 @@ int open (const char *pathname, int flags, ...) {
|
|||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
if (!func)
|
if (!func)
|
||||||
func = (int (*) (const char *, int, mode_t)) dlsym (REAL_LIBC, "open");
|
func = (int (*) (const char *, int, mode_t)) dlsym (RTLD_NEXT, "open");
|
||||||
|
|
||||||
if (flags & O_CREAT) {
|
if (flags & O_CREAT) {
|
||||||
va_start(args, flags);
|
va_start(args, flags);
|
||||||
@ -625,9 +681,7 @@ int open (const char *pathname, int flags, ...) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!strcmp (pathname, "/dev/windrvr6")) {
|
if (!strcmp (pathname, "/dev/windrvr6")) {
|
||||||
#ifdef DEBUG
|
DPRINTF("opening windrvr6\n");
|
||||||
fprintf(stderr,"opening windrvr6\n");
|
|
||||||
#endif
|
|
||||||
#ifdef NO_WINDRVR
|
#ifdef NO_WINDRVR
|
||||||
windrvrfd = fd = (*func) ("/dev/null", flags, mode);
|
windrvrfd = fd = (*func) ("/dev/null", flags, mode);
|
||||||
#else
|
#else
|
||||||
@ -651,12 +705,10 @@ int close(int fd) {
|
|||||||
static int (*func) (int) = NULL;
|
static int (*func) (int) = NULL;
|
||||||
|
|
||||||
if (!func)
|
if (!func)
|
||||||
func = (int (*) (int)) dlsym(REAL_LIBC, "close");
|
func = (int (*) (int)) dlsym(RTLD_NEXT, "close");
|
||||||
|
|
||||||
if (fd == windrvrfd) {
|
if (fd == windrvrfd) {
|
||||||
#ifdef DEBUG
|
DPRINTF("close windrvrfd\n");
|
||||||
fprintf(stderr,"close windrvrfd\n");
|
|
||||||
#endif
|
|
||||||
windrvrfd = 0;
|
windrvrfd = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -668,14 +720,12 @@ FILE *fopen(const char *path, const char *mode) {
|
|||||||
static FILE* (*func) (const char*, const char*) = NULL;
|
static FILE* (*func) (const char*, const char*) = NULL;
|
||||||
|
|
||||||
if (!func)
|
if (!func)
|
||||||
func = (FILE* (*) (const char*, const char*)) dlsym(REAL_LIBC, "fopen");
|
func = (FILE* (*) (const char*, const char*)) dlsym(RTLD_NEXT, "fopen");
|
||||||
|
|
||||||
ret = (*func) (path, mode);
|
ret = (*func) (path, mode);
|
||||||
|
|
||||||
if (!strcmp (path, "/proc/modules")) {
|
if (!strcmp (path, "/proc/modules")) {
|
||||||
#ifdef DEBUG
|
DPRINTF("opening /proc/modules\n");
|
||||||
fprintf(stderr,"opening /proc/modules\n");
|
|
||||||
#endif
|
|
||||||
#ifdef NO_WINDRVR
|
#ifdef NO_WINDRVR
|
||||||
modulesfp = ret;
|
modulesfp = ret;
|
||||||
modules_read = 0;
|
modules_read = 0;
|
||||||
@ -692,7 +742,7 @@ char *fgets(char *s, int size, FILE *stream) {
|
|||||||
|
|
||||||
|
|
||||||
if (!func)
|
if (!func)
|
||||||
func = (char* (*) (char*, int, FILE*)) dlsym(REAL_LIBC, "fgets");
|
func = (char* (*) (char*, int, FILE*)) dlsym(RTLD_NEXT, "fgets");
|
||||||
|
|
||||||
if (modulesfp == stream) {
|
if (modulesfp == stream) {
|
||||||
if (modules_read < sizeof(modules)) {
|
if (modules_read < sizeof(modules)) {
|
||||||
@ -711,7 +761,7 @@ int fclose(FILE *fp) {
|
|||||||
static int (*func) (FILE*) = NULL;
|
static int (*func) (FILE*) = NULL;
|
||||||
|
|
||||||
if (!func)
|
if (!func)
|
||||||
func = (int (*) (FILE*)) dlsym(REAL_LIBC, "fclose");
|
func = (int (*) (FILE*)) dlsym(RTLD_NEXT, "fclose");
|
||||||
|
|
||||||
if (fp == modulesfp) {
|
if (fp == modulesfp) {
|
||||||
modulesfp = NULL;
|
modulesfp = NULL;
|
||||||
@ -724,7 +774,7 @@ int access(const char *pathname, int mode) {
|
|||||||
static int (*func) (const char*, int);
|
static int (*func) (const char*, int);
|
||||||
|
|
||||||
if (!func)
|
if (!func)
|
||||||
func = (int (*) (const char*, int)) dlsym(REAL_LIBC, "access");
|
func = (int (*) (const char*, int)) dlsym(RTLD_NEXT, "access");
|
||||||
|
|
||||||
if (!strcmp(pathname, "/dev/windrvr6")) {
|
if (!strcmp(pathname, "/dev/windrvr6")) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -732,4 +782,3 @@ int access(const char *pathname, int mode) {
|
|||||||
return (*func)(pathname, mode);
|
return (*func)(pathname, mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
Reference in New Issue
Block a user