diff options
author | Felix Fietkau <nbd@openwrt.org> | 2013-05-30 19:23:25 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2013-05-30 19:23:25 +0200 |
commit | a63255ff23043196fce74f143a6ebc79184fcdf2 (patch) | |
tree | d9c9fe0d520d77eb366a02c8ba9d2760a129d991 | |
parent | ed61a16faf025671d9ff751b827980cc44f9f088 (diff) |
add code for getting the primary interface
-rw-r--r-- | main.c | 27 | ||||
-rw-r--r-- | switch.h | 2 |
2 files changed, 29 insertions, 0 deletions
@@ -187,6 +187,27 @@ find_dev_data(struct usbdev_data *data, struct device *dev) return NULL; } +static void +parse_interface_config(libusb_device *dev, struct usbdev_data *data) +{ + struct libusb_config_descriptor *config; + const struct libusb_interface *iface; + + data->interface = -1; + if (libusb_get_config_descriptor(dev, 0, &config)) + return; + + data->config = config; + if (!config->bNumInterfaces) + return; + + iface = &config->interface[0]; + if (!iface->num_altsetting) + return; + + data->interface = iface->altsetting[0].bInterfaceNumber; +} + static void iterate_devs(cmd_cb_t cb) { struct usbdev_data data; @@ -221,9 +242,15 @@ static void iterate_devs(cmd_cb_t cb) data.devh, data.desc.iSerialNumber, (void *) data.serial, sizeof(data.serial)); + parse_interface_config(usbdevs[i], &data); + data.info = find_dev_data(&data, dev); if (data.info) cb(&data); + + if (data.config) + libusb_free_config_descriptor(data.config); + libusb_close(data.devh); } } @@ -6,8 +6,10 @@ struct usbdev_data { struct libusb_device_descriptor desc; + struct libusb_config_descriptor *config; libusb_device_handle *devh; struct blob_attr *info; + int interface; char idstr[10]; char mfg[128], prod[128], serial[128]; |