Skip to content

Commit

Permalink
Merge pull request #2148 from kellybyrd/krb/usb_config_index
Browse files Browse the repository at this point in the history
Add usb_config_index to usb_communication_subdriver_s, default to 0.
  • Loading branch information
jimklimov committed Nov 6, 2023
2 parents d102b6c + e1fc248 commit e451a97
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 11 deletions.
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;
#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

0 comments on commit e451a97

Please sign in to comment.