summaryrefslogtreecommitdiff
path: root/libusb/descriptor.c
diff options
context:
space:
mode:
authorDaniel Drake <dsd@gentoo.org>2008-05-10 14:42:43 +0100
committerDaniel Drake <dsd@gentoo.org>2008-05-10 15:36:29 +0100
commitc3844f7aeb2176636ce6e6ef697659fdb0b30048 (patch)
tree8b5f0a9f1d3f07a0de8289f146422cb0e0e01ec8 /libusb/descriptor.c
parentd77052c0d630e33737c38d601fd633155f6b2229 (diff)
downloadlibusb-c3844f7aeb2176636ce6e6ef697659fdb0b30048.tar.gz
Fetch configurations by index (not value)
Otherwise there is no way to know which values to look for.
Diffstat (limited to 'libusb/descriptor.c')
-rw-r--r--libusb/descriptor.c65
1 files changed, 56 insertions, 9 deletions
diff --git a/libusb/descriptor.c b/libusb/descriptor.c
index e07711a..8814ced 100644
--- a/libusb/descriptor.c
+++ b/libusb/descriptor.c
@@ -432,6 +432,7 @@ API_EXPORTED int libusb_get_device_descriptor(libusb_device *dev,
unsigned char raw_desc[DEVICE_DESC_LENGTH];
int r;
+ usbi_dbg("");
r = usbi_backend->get_device_descriptor(dev, raw_desc);
if (r < 0)
return r;
@@ -460,6 +461,7 @@ struct libusb_config_descriptor *libusb_get_active_config_descriptor(
unsigned char *buf = NULL;
int r;
+ usbi_dbg("");
if (!config)
return NULL;
@@ -467,7 +469,7 @@ struct libusb_config_descriptor *libusb_get_active_config_descriptor(
if (r < 0)
goto err;
- usbi_parse_descriptor(tmp, "bbw", &config);
+ usbi_parse_descriptor(tmp, "bbw", config);
buf = malloc(config->wTotalLength);
if (!buf)
goto err;
@@ -495,40 +497,45 @@ err:
}
/** \ingroup desc
- * Get the USB configuration descriptor for the currently active configuration.
+ * Get a USB configuration descriptor based on its index.
* This is a non-blocking function which does not involve any requests being
* sent to the device.
*
* \param dev a device
- * \param bConfigurationValue the bConfigurationValue of the configuration
- * you wish to retreive
+ * \param config_index the index of the configuration you wish to retrieve
* \returns the USB configuration descriptor which must be freed with
* libusb_free_config_descriptor() when done
* \returns NULL on error
* \see libusb_get_active_config_descriptor()
+ * \see libusb_get_config_descriptor_by_value()
*/
API_EXPORTED struct libusb_config_descriptor *libusb_get_config_descriptor(
- libusb_device *dev, uint8_t bConfigurationValue)
+ libusb_device *dev, uint8_t config_index)
{
- struct libusb_config_descriptor *config = malloc(sizeof(*config));
+ struct libusb_config_descriptor *config;
unsigned char tmp[8];
unsigned char *buf = NULL;
int r;
+ usbi_dbg("index %d", config_index);
+ if (config_index >= dev->num_configurations)
+ return NULL;
+
+ config = malloc(sizeof(*config));
if (!config)
return NULL;
- r = usbi_backend->get_config_descriptor(dev, bConfigurationValue, tmp,
+ r = usbi_backend->get_config_descriptor(dev, config_index, tmp,
sizeof(tmp));
if (r < 0)
goto err;
- usbi_parse_descriptor(tmp, "bbw", &config);
+ usbi_parse_descriptor(tmp, "bbw", config);
buf = malloc(config->wTotalLength);
if (!buf)
goto err;
- r = usbi_backend->get_config_descriptor(dev, bConfigurationValue, buf,
+ r = usbi_backend->get_config_descriptor(dev, config_index, buf,
config->wTotalLength);
if (r < 0)
goto err;
@@ -551,6 +558,46 @@ err:
}
/** \ingroup desc
+ * Get a USB configuration descriptor with a specific bConfigurationValue.
+ * This is a non-blocking function which does not involve any requests being
+ * sent to the device.
+ *
+ * \param dev a device
+ * \param bConfigurationValue the bConfigurationValue of the configuration you
+ * wish to retrieve
+ * \returns the USB configuration descriptor which must be freed with
+ * libusb_free_config_descriptor() when done
+ * \returns NULL on error
+ * \see libusb_get_active_config_descriptor()
+ * \see libusb_get_config_descriptor()
+ */
+API_EXPORTED
+struct libusb_config_descriptor *libusb_get_config_descriptor_by_value(
+ libusb_device *dev, uint8_t bConfigurationValue)
+{
+ int i;
+ int r;
+ int found = -1;
+
+ usbi_dbg("value %d", bConfigurationValue);
+ for (i = 0; i < dev->num_configurations; i++) {
+ unsigned char tmp[6];
+ r = usbi_backend->get_config_descriptor(dev, i, tmp, sizeof(tmp));
+ if (r < 0)
+ return NULL;
+ if (tmp[5] == bConfigurationValue) {
+ found = 1;
+ break;
+ }
+ }
+
+ if (!found)
+ return NULL;
+ else
+ return libusb_get_config_descriptor(dev, i);
+}
+
+/** \ingroup desc
* Free a configuration descriptor obtained from
* libusb_get_active_config_descriptor() or libusb_get_config_descriptor().
* It is safe to call this function with a NULL config parameter, in which