Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions drivers/libusb0.c
Original file line number Diff line number Diff line change
Expand Up @@ -435,8 +435,9 @@ static int libusb_open(usb_dev_handle **udevp,
}

fatalx(EXIT_FAILURE,
"Can't claim USB device [%04x:%04x]@%d/%d: %s",
"Can't claim USB device [%04x:%04x]@%d/%d/%d: %s",
curDevice->VendorID, curDevice->ProductID,
usb_subdriver.usb_config_index,
usb_subdriver.hid_rep_index,
usb_subdriver.hid_desc_index,
usb_strerror());
Expand All @@ -449,8 +450,9 @@ static int libusb_open(usb_dev_handle **udevp,
}

fatalx(EXIT_FAILURE,
"Can't claim USB device [%04x:%04x]@%d/%d: %s",
"Can't claim USB device [%04x:%04x]@%d/%d/%d: %s",
curDevice->VendorID, curDevice->ProductID,
usb_subdriver.usb_config_index,
usb_subdriver.hid_rep_index,
usb_subdriver.hid_desc_index,
usb_strerror());
Expand Down Expand Up @@ -508,10 +510,7 @@ static int libusb_open(usb_dev_handle **udevp,

/* Note: on some broken UPS's (e.g. Tripp Lite Smart1000LCD),
only this second method gives the correct result */

/* for now, we always assume configuration 0, interface 0,
altsetting 0, as above. */
iface = &dev->config[0].interface[usb_subdriver.hid_rep_index].altsetting[0];
iface = &dev->config[usb_subdriver.usb_config_index].interface[usb_subdriver.hid_rep_index].altsetting[0];
for (i=0; i<iface->extralen; i+=iface->extra[i]) {
upsdebugx(4, "i=%d, extra[i]=%02x, extra[i+1]=%02x", i,
iface->extra[i], iface->extra[i+1]);
Expand Down Expand Up @@ -904,6 +903,7 @@ usb_communication_subdriver_t usb_subdriver = {
libusb_set_report,
libusb_get_string,
libusb_get_interrupt,
LIBUSB_DEFAULT_CONF_INDEX,
LIBUSB_DEFAULT_INTERFACE,
LIBUSB_DEFAULT_DESC_INDEX,
LIBUSB_DEFAULT_HID_EP_IN,
Expand Down
17 changes: 12 additions & 5 deletions drivers/libusb1.c
Original file line number Diff line number Diff line change
Expand Up @@ -418,9 +418,10 @@ static int nut_libusb_open(libusb_device_handle **udevp,
* that the device is not what we want. */
upsdebugx(2, "Device matches");

upsdebugx(2, "Reading first configuration descriptor");
upsdebugx(2, "Reading configuration descriptor %d of %d",
usb_subdriver.usb_config_index+1, dev_desc.bNumConfigurations);
ret = libusb_get_config_descriptor(device,
(uint8_t)usb_subdriver.hid_rep_index,
(uint8_t)usb_subdriver.usb_config_index,
&conf_desc);
/*ret = libusb_get_active_config_descriptor(device, &conf_desc);*/
if (ret < 0)
Expand Down Expand Up @@ -497,8 +498,9 @@ static int nut_libusb_open(libusb_device_handle **udevp,
libusb_free_config_descriptor(conf_desc);
libusb_free_device_list(devlist, 1);
fatalx(EXIT_FAILURE,
"Can't claim USB device [%04x:%04x]@%d/%d: %s",
"Can't claim USB device [%04x:%04x]@%d/%d/%d: %s",
curDevice->VendorID, curDevice->ProductID,
usb_subdriver.usb_config_index,
usb_subdriver.hid_rep_index,
usb_subdriver.hid_desc_index,
libusb_strerror((enum libusb_error)ret));
Expand All @@ -513,8 +515,9 @@ static int nut_libusb_open(libusb_device_handle **udevp,
libusb_free_config_descriptor(conf_desc);
libusb_free_device_list(devlist, 1);
fatalx(EXIT_FAILURE,
"Can't claim USB device [%04x:%04x]@%d/%d: %s",
"Can't claim USB device [%04x:%04x]@%d/%d/%d: %s",
curDevice->VendorID, curDevice->ProductID,
usb_subdriver.usb_config_index,
usb_subdriver.hid_rep_index,
usb_subdriver.hid_desc_index,
libusb_strerror((enum libusb_error)ret));
Expand All @@ -533,7 +536,10 @@ static int nut_libusb_open(libusb_device_handle **udevp,
}

if (!conf_desc) { /* ?? this should never happen */
upsdebugx(2, " Couldn't retrieve descriptors");
upsdebugx(2, " Couldn't retrieve config descriptor [%04x:%04x]@%d",
curDevice->VendorID, curDevice->ProductID,
usb_subdriver.usb_config_index
);
goto next_device;
}

Expand Down Expand Up @@ -1025,6 +1031,7 @@ usb_communication_subdriver_t usb_subdriver = {
nut_libusb_set_report,
nut_libusb_get_string,
nut_libusb_get_interrupt,
LIBUSB_DEFAULT_CONF_INDEX,
LIBUSB_DEFAULT_INTERFACE,
LIBUSB_DEFAULT_DESC_INDEX,
LIBUSB_DEFAULT_HID_EP_IN,
Expand Down
10 changes: 10 additions & 0 deletions drivers/nut_libusb.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
* and for libusb headers and 0.1/1.0 mapping */

/* Used in drivers/libusb*.c sources: */
#define LIBUSB_DEFAULT_CONF_INDEX 0
#define LIBUSB_DEFAULT_INTERFACE 0
#define LIBUSB_DEFAULT_DESC_INDEX 0
#define LIBUSB_DEFAULT_HID_EP_IN 1
Expand Down Expand Up @@ -73,6 +74,15 @@ typedef struct usb_communication_subdriver_s {
usb_ctrl_charbuf buf, usb_ctrl_charbufsize bufsize,
usb_ctrl_timeout_msec timeout);

/* Nearly all devices use a single configuration descriptor, index 0.
* But, it is possible for a device have more than one, check bNumConfigration
* on the device descriptor for the total.
*
* In USB, the descriptor heirarchy is
* device -> configuration(s) -> interface(s) -> endpoint(s)
*/
usb_ctrl_cfgindex usb_config_index; /* index of the device config we use. Almost always 0; see comments above */

/* Used for Powervar UPS or similar cases to make sure
* we use the right interface in the Composite device.
* In a few cases our libusb*.c sets the value for specific
Expand Down
8 changes: 8 additions & 0 deletions drivers/usb-common.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,10 @@
#define USB_CTRL_MSGVALUE_MIN 0
#define USB_CTRL_MSGVALUE_MAX UINT16_MAX

typedef uint8_t usb_ctrl_cfgindex;
Comment thread
kellybyrd marked this conversation as resolved.
Outdated
#define USB_CTRL_CFGINDEX_MIN 0
#define USB_CTRL_CFGINDEX_MAX UINT8_MAX

typedef uint16_t usb_ctrl_repindex;
#define USB_CTRL_REPINDEX_MIN 0
#define USB_CTRL_REPINDEX_MAX UINT16_MAX
Expand Down Expand Up @@ -411,6 +415,10 @@
#define USB_CTRL_MSGVALUE_MIN INT_MIN
#define USB_CTRL_MSGVALUE_MAX INT_MAX

typedef uint8_t usb_ctrl_cfgindex;
#define USB_CTRL_CFGINDEX_MIN 0
#define USB_CTRL_CFGINDEX_MAX UINT8_MAX

typedef int usb_ctrl_repindex;
#define USB_CTRL_REPINDEX_MIN INT_MIN
#define USB_CTRL_REPINDEX_MAX INT_MAX
Expand Down