From: michael <michael>
Date: Thu, 22 Feb 2007 21:29:38 +0000 (+0000)
Subject: fill in struct
X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/usb-driver/commitdiff_plain/f95f1d2e4eef8b6854a63ae64e2e0b25374bfe23

fill in struct
impact still segfaults...
---

diff --git a/usb-driver.c b/usb-driver.c
index f15910f..a5fae9b 100644
--- a/usb-driver.c
+++ b/usb-driver.c
@@ -32,6 +32,130 @@ static unsigned long card_type;
 void hexdump(unsigned char *buf, int len);
 void diff(unsigned char *buf1, unsigned char *buf2, int len);
 
+int usb_deviceinfo(unsigned char *buf) {
+	int i,j,k,l;
+	int len = 0;
+
+	if (buf) {
+		struct usb_device_info *udi = (struct usb_device_info*)(buf+len);
+
+		udi->Descriptor.bLength = sizeof(WDU_DEVICE_DESCRIPTOR);
+		udi->Descriptor.bDescriptorType = usb_cable->descriptor.bDescriptorType;
+		udi->Descriptor.bcdUSB = usb_cable->descriptor.bcdUSB;
+		udi->Descriptor.bDeviceClass = usb_cable->descriptor.bDeviceClass;
+		udi->Descriptor.bDeviceSubClass = usb_cable->descriptor.bDeviceSubClass;
+		udi->Descriptor.bDeviceProtocol = usb_cable->descriptor.bDeviceProtocol;
+		udi->Descriptor.bMaxPacketSize0 = usb_cable->descriptor.bMaxPacketSize0;
+		udi->Descriptor.idVendor = usb_cable->descriptor.idVendor;
+		udi->Descriptor.idProduct = usb_cable->descriptor.idProduct;
+		udi->Descriptor.bcdDevice = usb_cable->descriptor.bcdDevice;
+		udi->Descriptor.iManufacturer = usb_cable->descriptor.iManufacturer;
+		udi->Descriptor.iProduct = usb_cable->descriptor.iProduct;
+		udi->Descriptor.iSerialNumber = usb_cable->descriptor.iSerialNumber;
+		udi->Descriptor.bNumConfigurations = usb_cable->descriptor.bNumConfigurations;
+
+		/* TODO: Fix Pipe0! */
+		udi->Pipe0.dwNumber = 0x00;
+		udi->Pipe0.dwMaximumPacketSize = usb_cable->descriptor.bMaxPacketSize0;
+		udi->Pipe0.type = 0;
+		udi->Pipe0.direction = 3;
+		udi->Pipe0.dwInterval = 0;
+	}
+
+	len = sizeof(struct usb_device_info);
+
+	for (i=0; i<usb_cable->descriptor.bNumConfigurations; i++)
+	{
+		struct usb_config_descriptor *conf_desc = &usb_cable->config[i];
+		if (buf) {
+			WDU_CONFIGURATION *cfg = (WDU_CONFIGURATION*)(buf+len);
+
+			cfg->Descriptor.bLength = conf_desc->bLength;
+			cfg->Descriptor.bDescriptorType = conf_desc->bDescriptorType;
+			cfg->Descriptor.wTotalLength = conf_desc->wTotalLength;
+			cfg->Descriptor.bNumInterfaces = conf_desc->bNumInterfaces;
+			cfg->Descriptor.bConfigurationValue = conf_desc->bConfigurationValue;
+			cfg->Descriptor.iConfiguration = conf_desc->iConfiguration;
+			cfg->Descriptor.bmAttributes = conf_desc->bmAttributes;
+			cfg->Descriptor.MaxPower = conf_desc->MaxPower;
+
+			cfg->dwNumInterfaces = conf_desc->bNumInterfaces;
+		}
+		len += sizeof(WDU_CONFIGURATION);
+		if (buf) {
+			for (j=0; j<conf_desc->bNumInterfaces; j++) {
+				WDU_INTERFACE *iface = (WDU_INTERFACE*)(buf+len);
+				iface->dwNumAltSettings = usb_cable->config[i].interface[j].num_altsetting;
+
+				len += sizeof(WDU_INTERFACE);
+			}
+		} else {
+			len += sizeof(WDU_INTERFACE) * conf_desc->bNumInterfaces;
+		}
+
+		for (j=0; j<conf_desc->bNumInterfaces; j++)
+		{
+			struct usb_interface *interface = &usb_cable->config[i].interface[j];
+			for(k=0; k<interface->num_altsetting; k++)
+			{
+				unsigned char bNumEndpoints;
+				bNumEndpoints = interface->altsetting[k].bNumEndpoints;
+				if (buf) {
+					WDU_ALTERNATE_SETTING *altset = (WDU_ALTERNATE_SETTING*)(buf+len);
+
+					altset->Descriptor.bLength = interface->altsetting[k].bLength;
+					altset->Descriptor.bDescriptorType = interface->altsetting[k].bDescriptorType;
+					altset->Descriptor.bInterfaceNumber = interface->altsetting[k].bInterfaceNumber;
+					altset->Descriptor.bAlternateSetting = interface->altsetting[k].bAlternateSetting;
+					altset->Descriptor.bNumEndpoints = interface->altsetting[k].bNumEndpoints;
+					altset->Descriptor.bInterfaceClass = interface->altsetting[k].bInterfaceClass;
+					altset->Descriptor.bInterfaceSubClass = interface->altsetting[k].bInterfaceSubClass;
+					altset->Descriptor.bInterfaceProtocol = interface->altsetting[k].bInterfaceProtocol;
+					altset->Descriptor.iInterface = interface->altsetting[k].iInterface;
+
+				}
+				len +=sizeof(WDU_ALTERNATE_SETTING);
+
+				if (buf) {
+					for (l = 0; l < bNumEndpoints; l++) {
+						WDU_ENDPOINT_DESCRIPTOR *ed = (WDU_ENDPOINT_DESCRIPTOR*)(buf+len);
+						WDU_PIPE_INFO *pi;
+
+						ed->bLength = interface->altsetting[k].endpoint[l].bLength;
+						ed->bDescriptorType = interface->altsetting[k].endpoint[l].bDescriptorType;
+						ed->bEndpointAddress = interface->altsetting[k].endpoint[l].bEndpointAddress;
+						ed->bmAttributes = interface->altsetting[k].endpoint[l].bmAttributes;
+						ed->wMaxPacketSize = interface->altsetting[k].endpoint[l].wMaxPacketSize;
+						ed->bInterval = interface->altsetting[k].endpoint[l].bInterval;
+
+						len += sizeof(WDU_ENDPOINT_DESCRIPTOR);
+						
+						pi = (WDU_PIPE_INFO*)(buf+len);
+
+						pi->dwNumber = interface->altsetting[k].endpoint[l].bEndpointAddress;
+						pi->dwMaximumPacketSize = WDU_GET_MAX_PACKET_SIZE(interface->altsetting[k].endpoint[l].wMaxPacketSize);
+						pi->type = interface->altsetting[k].endpoint[l].bmAttributes & USB_ENDPOINT_TYPE_MASK;
+						if (pi->type == PIPE_TYPE_CONTROL)
+							pi->direction = WDU_DIR_IN_OUT;
+						else
+						{
+							pi->direction = interface->altsetting[k].endpoint[l].bEndpointAddress & USB_ENDPOINT_DIR_MASK ?  WDU_DIR_IN : WDU_DIR_OUT;
+						}
+
+						pi->dwInterval = interface->altsetting[k].endpoint[l].bInterval;
+
+						len += sizeof(WDU_PIPE_INFO);
+					}
+				} else {
+					len +=(sizeof(WDU_ENDPOINT_DESCRIPTOR)+sizeof(WDU_PIPE_INFO))*bNumEndpoints;
+				}
+			}
+		}
+	}
+
+	return len;
+}
+
 int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
 	struct header_struct* wdheader = (struct header_struct*)wdioctl;
 	struct version_struct *version;
@@ -140,60 +264,14 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
 
 				fprintf(stderr, "unique: %lu, bytes: %lu, options: %lx\n", ugdd->dwUniqueID, ugdd->dwBytes, ugdd->dwOptions);
 				pSize = ugdd->dwBytes;
-				if (pSize) {
-					hexdump(ugdd->pBuf, pSize);
-				}
 #ifndef NO_WINDRVR
 				ret = (*ioctl_func) (fd, request, wdioctl);
 #else
 				if (!ugdd->dwBytes) {
 					if (usb_cable) {
-						int i,j,k;
-						ugdd->dwBytes = sizeof(struct usb_device_info);
-
-						for (i=0; i<usb_cable->descriptor.bNumConfigurations; i++)
-						{
-							struct usb_config_descriptor *conf_desc = &usb_cable->config[i];
-							ugdd->dwBytes+=sizeof(WDU_CONFIGURATION);
-							ugdd->dwBytes+=sizeof(WDU_INTERFACE) * conf_desc->bNumInterfaces;
-
-							for (j=0; j<conf_desc->bNumInterfaces; j++)
-							{
-								struct usb_interface *interface = &usb_cable->config[i].interface[j];
-								for(k=0; k<interface->num_altsetting; k++)
-								{
-									unsigned char bNumEndpoints;
-									bNumEndpoints = interface->altsetting[k].bNumEndpoints;
-									ugdd->dwBytes+=sizeof(WDU_ALTERNATE_SETTING);
-									ugdd->dwBytes+=(sizeof(WDU_ENDPOINT_DESCRIPTOR)+sizeof(WDU_PIPE_INFO))*bNumEndpoints;
-								}
-							}
-						}
-
-						
+						ugdd->dwBytes = usb_deviceinfo(NULL);
 					}
 				} else {
-					struct usb_device_info_get *udi = (struct usb_device_info_get*)ugdd->pBuf;
-					struct usb_endpoint_descriptor *ep;
-unsigned char dings[] = {0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0xfd, 0x03, 0x08, 0x00, 0x00, 0x00, 0x01, 0x02,
-0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x45, 0x21, 0x08, 0x38, 0x45, 0x21, 0x08,
-0x4c, 0x45, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x20, 0x00, 0x01, 0x02, 0x00, 0x80,
-0x8c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x4c, 0x45, 0x21, 0x08, 0x58, 0x45, 0x21, 0x08,
-0x01, 0x00, 0x00, 0x00, 0x58, 0x45, 0x21, 0x08, 0x09, 0x04, 0x00, 0x00, 0x02, 0xff, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x6c, 0x45, 0x21, 0x08, 0x7c, 0x45, 0x21, 0x08, 0x07, 0x05, 0x02, 0x02,
-0x00, 0x02, 0x00, 0x00, 0x07, 0x05, 0x86, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
-0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x86, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00};
-
 //unique: 94, bytes: 276, options: 0
 //Vendor: 3fd
 //12 01 00 02 00 00 00 40 fd 03 08 00 00 00 01 02                              12 01 00 02 00 00 00 40 fd 03 08 00 00 00 01 02
@@ -215,41 +293,7 @@ unsigned char dings[] = {0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0xfd, 0
 //86 00 00 00 00 02 00 00 02 00 00 00 01 00 00 00                              00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 //00 00 00 00                                                                  00 00 00 00
 
-					bzero(udi, ugdd->dwBytes);
-					//memcpy(udi, dings, 276);
-					udi->Descriptor.bLength = sizeof(WDU_DEVICE_DESCRIPTOR);
-					udi->Descriptor.bDescriptorType = usb_cable->descriptor.bDescriptorType;
-					udi->Descriptor.bcdUSB = usb_cable->descriptor.bcdUSB;
-					udi->Descriptor.bDeviceClass = usb_cable->descriptor.bDeviceClass;
-					udi->Descriptor.bDeviceSubClass = usb_cable->descriptor.bDeviceSubClass;
-					udi->Descriptor.bDeviceProtocol = usb_cable->descriptor.bDeviceProtocol;
-					udi->Descriptor.bMaxPacketSize0 = usb_cable->descriptor.bMaxPacketSize0;
-					udi->Descriptor.idVendor = usb_cable->descriptor.idVendor;
-					udi->Descriptor.idProduct = usb_cable->descriptor.idProduct;
-					udi->Descriptor.bcdDevice = usb_cable->descriptor.bcdDevice;
-					udi->Descriptor.iManufacturer = usb_cable->descriptor.iManufacturer;
-					udi->Descriptor.iProduct = usb_cable->descriptor.iProduct;
-					udi->Descriptor.iSerialNumber = usb_cable->descriptor.iSerialNumber;
-					udi->Descriptor.bNumConfigurations = usb_cable->descriptor.bNumConfigurations;
-
-					ep = usb_cable->config->interface->altsetting[0].endpoint;
-
-					udi->Pipe0.dwNumber = 0x00;
-					udi->Pipe0.dwMaximumPacketSize = usb_cable->descriptor.bMaxPacketSize0;
-					udi->Pipe0.type = 0;
-					udi->Pipe0.direction = 3;
-					udi->Pipe0.dwInterval = 0;
-
-					udi->cfg.Descriptor.bLength = usb_cable->config->bLength;
-					udi->cfg.Descriptor.bDescriptorType = usb_cable->config->bDescriptorType;
-					udi->cfg.Descriptor.wTotalLength = usb_cable->config->wTotalLength;
-					udi->cfg.Descriptor.bNumInterfaces = usb_cable->config->bNumInterfaces;
-					udi->cfg.Descriptor.bConfigurationValue = usb_cable->config->bConfigurationValue;
-					udi->cfg.Descriptor.iConfiguration = usb_cable->config->iConfiguration;
-					udi->cfg.Descriptor.bmAttributes = usb_cable->config->bmAttributes;
-					udi->cfg.Descriptor.MaxPower = usb_cable->config->MaxPower;
-
-					// ab offset 168 config desc
+					usb_deviceinfo((unsigned char*)ugdd->pBuf);
 				}
 #endif
 				if (pSize) {
diff --git a/usb-driver.h b/usb-driver.h
index f911a8f..9a0329b 100644
--- a/usb-driver.h
+++ b/usb-driver.h
@@ -360,3 +360,16 @@ struct usb_device_info_get {
 	WDU_CONFIGURATION cfg;
 
 };
+
+typedef enum {
+	WDU_DIR_IN     = 1,
+	WDU_DIR_OUT    = 2,
+	WDU_DIR_IN_OUT = 3
+} WDU_DIR;
+
+typedef enum {
+	PIPE_TYPE_CONTROL     = 0,
+	PIPE_TYPE_ISOCHRONOUS = 1,
+	PIPE_TYPE_BULK        = 2,
+	PIPE_TYPE_INTERRUPT   = 3
+} USB_PIPE_TYPE;