void* le_type_punning_IS_fine;
struct {
const char* desc;
- uint8_t recipient;
uint16_t index;
uint16_t header_size;
} os_fd[2] = {
- {"Extended Compat ID", LIBUSB_RECIPIENT_DEVICE, 0x0004, 0x10},
- {"Extended Properties", LIBUSB_RECIPIENT_INTERFACE, 0x0005, 0x0A}
+ {"Extended Compat ID", 0x0004, 0x10},
+ {"Extended Properties", 0x0005, 0x0A}
};
if (iface_number < 0) return;
// Read the header part
r = libusb_control_transfer(handle, (uint8_t)(LIBUSB_ENDPOINT_IN|LIBUSB_REQUEST_TYPE_VENDOR|LIBUSB_RECIPIENT_DEVICE),
- // NB: We should use os_fd[i].recipient instead of LIBUSB_RECIPIENT_DEVICE above, as
- // LIBUSB_RECIPIENT_INTERFACE should be used for the Extended Properties.
- // However, for Interface requests, the WinUSB DLL forces the low byte of wIndex
- // to the interface number, regardless of what you set it to, so we have to
- // fallback to Device and hope the firmware answers both equally.
- // See http://www.lvr.com/forum/index.php?topic=331
bRequest, (uint16_t)(((iface_number)<< 8)|0x00), os_fd[i].index, os_desc, os_fd[i].header_size, 1000);
if (r < os_fd[i].header_size) {
perr(" Failed: %s", (r<0)?libusb_error_name((enum libusb_error)r):"header size is too small");
}
// Read the full feature descriptor
- r = libusb_control_transfer(handle, (uint8_t)(LIBUSB_ENDPOINT_IN|LIBUSB_REQUEST_TYPE_VENDOR|os_fd[i].recipient),
+ r = libusb_control_transfer(handle, (uint8_t)(LIBUSB_ENDPOINT_IN|LIBUSB_REQUEST_TYPE_VENDOR|LIBUSB_RECIPIENT_DEVICE),
bRequest, (uint16_t)(((iface_number)<< 8)|0x00), os_fd[i].index, os_desc, (uint16_t)length, 1000);
if (r < 0) {
perr(" Failed: %s", libusb_error_name((enum libusb_error)r));