PERFORCE change 161208 for review

Sylvestre Gallon syl at FreeBSD.org
Mon Apr 27 20:27:56 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=161208

Change 161208 by syl at syl_atuin on 2009/04/27 20:27:13

	Add support for libusb10 descriptors.

Affected files ...

.. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb.h#2 edit
.. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10_desc.c#2 edit

Differences ...

==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb.h#2 (text+ko) ====

@@ -260,7 +260,7 @@
 	uint8_t	bInterval;
 	uint8_t	bRefresh;
 	uint8_t	bSynchAddress;
-	const unsigned char *extra;
+	unsigned char *extra;
 	int	extra_length;
 }	libusb_endpoint_descriptor;
 
@@ -274,13 +274,13 @@
 	uint8_t	bInterfaceSubClass;
 	uint8_t	bInterfaceProtocol;
 	uint8_t	iInterface;
-	const struct libusb_endpoint_descriptor *endpoint;
-	const unsigned char *extra;
+	struct libusb_endpoint_descriptor *endpoint;
+	unsigned char *extra;
 	int	extra_length;
 }	libusb_interface_descriptor;
 
 typedef struct libusb_interface {
-	const struct libusb_interface_descriptor *altsetting;
+	struct libusb_interface_descriptor *altsetting;
 	int	num_altsetting;
 }	libusb_interface;
 
@@ -293,8 +293,8 @@
 	uint8_t	iConfiguration;
 	uint8_t	bmAttributes;
 	uint8_t	MaxPower;
-	const struct libusb_interface *interface;
-	const unsigned char *extra;
+	struct libusb_interface *interface;
+	unsigned char *extra;
 	int	extra_length;
 }	libusb_config_descriptor;
 

==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10_desc.c#2 (text+ko) ====

@@ -39,6 +39,30 @@
 libusb_get_device_descriptor(libusb_device * dev,
     struct libusb_device_descriptor *desc)
 {
+	struct LIBUSB20_DEVICE_DESC_DECODED *pdesc;
+	struct libusb20_device *pdev;
+
+	if ((dev == NULL) || (desc == NULL))
+		return (LIBUSB_ERROR_NO_MEM);
+
+	pdev = dev->os_priv;
+	pdesc = libusb20_dev_get_device_desc(pdev);
+
+	desc->bLength = pdesc->bLength;
+	desc->bDescriptorType = pdesc->bDescriptorType;
+	desc->bcdUSB = pdesc->bcdUSB;
+	desc->bDeviceClass = pdesc->bDeviceClass;
+	desc->bDeviceSubClass = pdesc->bDeviceSubClass;
+	desc->bDeviceProtocol = pdesc->bDeviceProtocol;
+	desc->bMaxPacketSize0 = pdesc->bMaxPacketSize0;
+	desc->idVendor = pdesc->idVendor;
+	desc->idProduct = pdesc->idProduct;
+	desc->bcdDevice = pdesc->bcdDevice;
+	desc->iManufacturer = pdesc->iManufacturer;
+	desc->iProduct = desc->iProduct;
+	desc->iSerialNumber = desc->iSerialNumber;
+	desc->bNumConfigurations = desc->bNumConfigurations;
+
 	return (0);
 }
 
@@ -46,13 +70,101 @@
 libusb_get_active_config_descriptor(libusb_device * dev,
     struct libusb_config_descriptor **config)
 {
-	return (0);
+	struct libusb20_device *pdev;
+	uint8_t idx;
+
+	idx = libusb20_dev_get_config_index(pdev);
+
+	return (libusb_get_config_descriptor(dev, idx, config));
 }
 
+
+/*
+ * Need rework, this function is pretty ugly now ...
+ */
 int
 libusb_get_config_descriptor(libusb_device * dev, uint8_t config_index,
     struct libusb_config_descriptor **config)
 {
+	struct LIBUSB20_CONFIG_DESC_DECODED *pdesc;
+	struct LIBUSB20_INTERFACE_DESC_DECODED *pint;
+	struct LIBUSB20_ENDPOINT_DESC_DECODED *pend;
+	libusb_config_descriptor *conf;
+	libusb_interface_descriptor *ifdesc;
+	libusb_endpoint_descriptor *enddesc;
+	const char *rawdesc;
+	struct libusb20_device *pdev;
+	int i, j;
+
+	if ((dev == NULL) || (config == NULL))
+		return (LIBUSB_ERROR_NO_MEM);
+	
+	*config = conf = malloc(sizeof(struct libusb_config_descriptor));
+	if (conf == NULL)
+		return (LIBUSB_ERROR_NO_MEM);
+
+	if (config_index > dev->num_configurations)
+		return (LIBUSB_ERROR_NOT_FOUND);
+
+	pdev = dev->os_priv;
+	rawdesc = libusb20_dev_get_desc(pdev);
+
+	j = 0x12;
+	for (i = 0 ; i < dev->num_configurations && i != config_index ; i++) {
+		pdesc = (struct LIBUSB20_CONFIG_DESC_DECODED *) 
+	   	     &rawdesc[j];
+		j += pdesc->wTotalLength;
+	}
+	
+	conf->bLength = pdesc->bLength;
+	conf->bDescriptorType = pdesc->bDescriptorType;
+	conf->wTotalLength = pdesc->wTotalLength;
+	conf->bNumInterfaces = pdesc->bNumInterfaces;
+	conf->bConfigurationValue = pdesc->bConfigurationValue;
+	conf->iConfiguration = pdesc->iConfiguration;
+	conf->bmAttributes = pdesc->bmAttributes;
+	conf->MaxPower = pdesc->bMaxPower;
+
+	conf->interface = malloc(pdesc->bNumInterfaces * sizeof(*(conf->interface)));
+	pint = (struct LIBUSB20_INTERFACE_DESC_DECODED *)
+	    ((uint32_t)pdesc + (uint32_t)pdesc->bLength);
+
+	for (i = 0 ; i < conf->bNumInterfaces ; i++) {
+		conf->interface[i].num_altsetting = pdesc->bNumInterfaces;
+		ifdesc = malloc(sizeof(*(conf->interface[i].altsetting)));
+		conf->interface[i].altsetting = ifdesc; 
+
+		ifdesc->bLength = (uint8_t)pint->bLength;
+		ifdesc->bDescriptorType = pint->bDescriptorType;
+		ifdesc->bInterfaceNumber = pint->bInterfaceNumber;
+		ifdesc->bAlternateSetting = pint->bAlternateSetting;
+		ifdesc->bNumEndpoints = pint->bNumEndpoints;
+		ifdesc->bInterfaceClass = pint->bInterfaceClass;
+		ifdesc->bInterfaceSubClass = pint->bInterfaceSubClass;
+		ifdesc->bInterfaceProtocol = pint->bInterfaceProtocol;
+		ifdesc->iInterface = pint->iInterface;
+
+		ifdesc->endpoint = malloc(pint->bNumEndpoints * 
+		    sizeof(struct libusb_endpoint_descriptor));
+		pend = (struct LIBUSB20_ENDPOINT_DESC_DECODED *)
+		    ((uint32_t)pint + (uint32_t)ifdesc->bLength);
+
+		for (j = 0 ; j < pint->bNumEndpoints ; j++) {
+			enddesc = &(ifdesc->endpoint[j]);
+			enddesc->bLength = pend->bLength;
+			enddesc->bDescriptorType = pend->bDescriptorType;
+			enddesc->bEndpointAddress = pend->bEndpointAddress;
+			enddesc->bmAttributes = pend->bmAttributes;
+			enddesc->wMaxPacketSize = pend->wMaxPacketSize;
+			enddesc->bInterval = pend->bInterval;
+			enddesc->bRefresh = pend->bRefresh;
+			enddesc->bSynchAddress = pend->bSynchAddress;
+			pend = (struct LIBUSB20_ENDPOINT_DESC_DECODED *)
+			    ((uint32_t)pend + (uint32_t)pend->bLength);
+		}
+		pint = (struct LIBUSB20_INTERFACE_DESC_DECODED*)pend;
+		/* XXX need Check on libusb10 for extra field */
+	}
 	return (0);
 }
 
@@ -60,32 +172,62 @@
 libusb_get_config_descriptor_by_value(libusb_device * dev,
     uint8_t bConfigurationValue, struct libusb_config_descriptor **config)
 {
-	return (0);
+	struct LIBUSB20_CONFIG_DESC_DECODED *pdesc;
+	struct libusb20_device *pdev;
+	const char *rawdesc;
+	int i, j;
+
+	if (dev == NULL || config == NULL)
+		return (LIBUSB_ERROR_NO_MEM);
+	
+	pdev = dev->os_priv;
+	rawdesc = libusb20_dev_get_desc(pdev);
+
+	j = 0x12;
+	for (i = 0 ; i < dev->num_configurations ; i++) {
+		pdesc = (struct LIBUSB20_CONFIG_DESC_DECODED *) 
+	   	     &rawdesc[j];
+		j += pdesc->wTotalLength;
+		if (pdesc->bConfigurationValue == bConfigurationValue)
+			return (libusb_get_config_descriptor(dev, i, config));
+	}
+
+	return (LIBUSB_ERROR_NOT_FOUND);
 }
 
 void
 libusb_free_config_descriptor(struct libusb_config_descriptor *config)
 {
-	return;
+	int i, j;
+
+	for (i = 0 ; i < config->bNumInterfaces ; i++) {
+		for (j = 0 ; j < config->interface[i].altsetting->bNumEndpoints ; j++) {
+			free((void *)config->interface[i].altsetting->endpoint[j].extra);
+		}
+		free((void *)config->interface[i].altsetting->endpoint);
+		free((void *)config->interface[i].altsetting->extra);
+		free((void *)config->interface[i].altsetting);
+	}
+	free((void *)config->interface);
+	free(config);
 }
 
+/* 
+ * Perhaps need a fix, because this function need to return
+ * the size of string on success and not 0
+ */
+
 int
 libusb_get_string_descriptor_ascii(libusb_device_handle * dev,
     uint8_t desc_index, unsigned char *data, int length)
 {
-	return (0);
-}
+	struct libusb20_device *pdev;
+	int ret;
 
-static int
-libusb_get_descriptor(libusb_device_handle * dev, uint8_t desc_type,
-    uint8_t desc_index, unsigned char *data, int length)
-{
-	return (0);
-}
+	if (dev == NULL || data == NULL)
+		return (LIBUSB20_ERROR_NO_MEM);
 
-static int
-libusb_get_string_descriptor(libusb_device_handle * dev, uint8_t desc_index,
-    uint16_t langid, unsigned char *data, int length)
-{
-	return (0);
+	pdev = dev->os_priv;
+	return (libusb20_dev_req_string_simple_sync(pdev, desc_index, 
+	    data, length));
 }


More information about the p4-projects mailing list