int usbi_sanitize_device(struct libusb_device *dev)
{
int r;
- unsigned char raw_desc[DEVICE_DESC_LENGTH];
uint8_t num_configurations;
- int host_endian;
- r = usbi_backend->get_device_descriptor(dev, raw_desc, &host_endian);
+ r = usbi_device_cache_descriptor(dev);
if (r < 0)
return r;
- num_configurations = raw_desc[DEVICE_DESC_LENGTH - 1];
+ num_configurations = dev->device_descriptor.bNumConfigurations;
if (num_configurations > USB_MAXCONFIG) {
usbi_err(DEVICE_CTX(dev), "too many configurations");
return LIBUSB_ERROR_IO;
return r;
}
+int usbi_device_cache_descriptor(libusb_device *dev)
+{
+ int r, host_endian;
+
+ r = usbi_backend->get_device_descriptor(dev, (unsigned char *) &dev->device_descriptor,
+ &host_endian);
+ if (r < 0)
+ return r;
+
+ if (!host_endian) {
+ dev->device_descriptor.bcdUSB = libusb_le16_to_cpu(dev->device_descriptor.bcdUSB);
+ dev->device_descriptor.idVendor = libusb_le16_to_cpu(dev->device_descriptor.idVendor);
+ dev->device_descriptor.idProduct = libusb_le16_to_cpu(dev->device_descriptor.idProduct);
+ dev->device_descriptor.bcdDevice = libusb_le16_to_cpu(dev->device_descriptor.bcdDevice);
+ }
+
+ return LIBUSB_SUCCESS;
+}
+
/** \ingroup desc
* Get the USB device descriptor for a given device.
*
int API_EXPORTED libusb_get_device_descriptor(libusb_device *dev,
struct libusb_device_descriptor *desc)
{
- unsigned char raw_desc[DEVICE_DESC_LENGTH];
- int host_endian = 0;
- int r;
-
usbi_dbg("");
- r = usbi_backend->get_device_descriptor(dev, raw_desc, &host_endian);
- if (r < 0)
- return r;
-
- memcpy((unsigned char *) desc, raw_desc, sizeof(raw_desc));
- if (!host_endian) {
- desc->bcdUSB = libusb_le16_to_cpu(desc->bcdUSB);
- desc->idVendor = libusb_le16_to_cpu(desc->idVendor);
- desc->idProduct = libusb_le16_to_cpu(desc->idProduct);
- desc->bcdDevice = libusb_le16_to_cpu(desc->bcdDevice);
- }
+ memcpy((unsigned char *) desc, (unsigned char *) &dev->device_descriptor,
+ sizeof (dev->device_descriptor));
return 0;
}
struct list_head list;
unsigned long session_data;
+
+ struct libusb_device_descriptor device_descriptor;
+
unsigned char os_priv[0];
};
int usbi_parse_descriptor(unsigned char *source, const char *descriptor,
void *dest, int host_endian);
+int usbi_device_cache_descriptor(libusb_device *dev);
int usbi_get_config_index_by_value(struct libusb_device *dev,
uint8_t bConfigurationValue, int *idx);
force_hcd_device_descriptor(dev);
}
+ usbi_sanitize_device(dev);
+
usbi_dbg("(bus: %d, addr: %d, depth: %d, port: %d): '%s'",
dev->bus_number, dev->device_address, priv->depth, priv->port, device_id);
-#define LIBUSB_NANO 10649
+#define LIBUSB_NANO 10650