def _make_interrupt_transfer(self, endpoint, data, size, actual_length, timeout=2000): """ Read message from USB device :param endpoint: Endpoint address to listen on. :param data: Variable to hold received data. :param size: Size expected to be received. :param actual_length: Actual length received. """ if self.interface is None: raise USBDeviceInterfaceNotClaimedError(self.dev_key) ret = usb.interrupt_transfer( self.__libusb_dev_handle__, # ct.c_char_p endpoint, # ct.ubyte ct.cast(data, ct.POINTER(ct.c_ubyte)), # ct.POINTER(ct.c_ubyte) size, ct.cast(actual_length, ct.POINTER(ct.c_int)), # ct.POINTER(ct.c_int) timeout) # ct.c_uint32 if ret >= 0: _logger.debug(f'Read {size} ' + _('bytes from device').format(size) + f' {self.dev_key}.') return True usb_error(ret, _('Failed to communicate with device') + f' {self.dev_key}.') return False
def do_sync_intr(data): global devh transferred = ct.c_int() r = usb.interrupt_transfer(devh, EP_INTR, data, INTR_LENGTH, ct.byref(transferred), 1000) if r < 0: print("intr error {}".format(r), file=sys.stderr) return r if transferred < INTR_LENGTH: print("short read ({})".format(r), file=sys.stderr) return -1 print("recv interrupt {:04x}".format(ct.cast(data, ct.POINTER(ct.c_uint16))[0])) return 0
def test_hid(handle, endpoint_in): global binary_dump global binary_name #int r; hid_report_descriptor = (ct.c_uint8 * 256)() report_buffer = ct.POINTER(ct.c_uint8) print("\nReading HID Report Descriptors:") descriptor_size = usb.control_transfer(handle, usb.LIBUSB_ENDPOINT_IN | usb.LIBUSB_REQUEST_TYPE_STANDARD | usb.LIBUSB_RECIPIENT_INTERFACE, usb.LIBUSB_REQUEST_GET_DESCRIPTOR, usb.LIBUSB_DT_REPORT << 8, 0, hid_report_descriptor, ct.sizeof(hid_report_descriptor), 1000) if descriptor_size < 0: print(" Failed") return -1 display_buffer_hex(hid_report_descriptor, descriptor_size) if binary_dump: try: fd = open(binary_name, "w") except: pass else: with fd: if fd.fwrite(hid_report_descriptor, descriptor_size) != descriptor_size: print(" Error writing descriptor to file") size = get_hid_record_size(hid_report_descriptor, descriptor_size, HID_REPORT_TYPE_FEATURE) if size <= 0: print("\nSkipping Feature Report readout (None detected)") else: report_buffer = ct.cast(calloc(size, 1), ct.POINTER(ct.c_uint8)) if not report_buffer: return -1 print("\nReading Feature Report (length {})...".format(size)) r = usb.control_transfer(handle, usb.LIBUSB_ENDPOINT_IN | usb.LIBUSB_REQUEST_TYPE_CLASS | usb.LIBUSB_RECIPIENT_INTERFACE, HID_GET_REPORT, (HID_REPORT_TYPE_FEATURE << 8) | 0, 0, report_buffer, ct.c_uint16(size), 5000) if r >= 0: display_buffer_hex(report_buffer, size) else: if r == usb.LIBUSB_ERROR_NOT_FOUND: print(" No Feature Report available for this device") elif r == usb.LIBUSB_ERROR_PIPE: print(" Detected stall - resetting pipe...") usb.clear_halt(handle, 0) else: print(" Error: {}".format(usb.strerror(usb.error(r)))) free(report_buffer) size = get_hid_record_size(hid_report_descriptor, descriptor_size, HID_REPORT_TYPE_INPUT) if size <= 0: print("\nSkipping Input Report readout (None detected)") else: report_buffer = ct.cast(calloc(size, 1), ct.POINTER(ct.c_uint8)) if not report_buffer: return -1 print("\nReading Input Report (length {})...".format(size)) r = usb.control_transfer(handle, usb.LIBUSB_ENDPOINT_IN | usb.LIBUSB_REQUEST_TYPE_CLASS | usb.LIBUSB_RECIPIENT_INTERFACE, HID_GET_REPORT, (HID_REPORT_TYPE_INPUT << 8) | 0x00, 0, report_buffer, ct.c_uint16(size), 5000) if r >= 0: display_buffer_hex(report_buffer, size) else: if r == usb.LIBUSB_ERROR_TIMEOUT: print(" Timeout! Please make sure you act on the device within the 5 seconds allocated...") elif r == usb.LIBUSB_ERROR_PIPE: print(" Detected stall - resetting pipe...") usb.clear_halt(handle, 0) else: print(" Error: {}".format(usb.strerror(usb.error(r)))) # Attempt a bulk read from endpoint 0 (this should just return a raw input report) print("\nTesting interrupt read using endpoint {:02X}...".format(endpoint_in)) r = usb.interrupt_transfer(handle, endpoint_in, report_buffer, size, ct.byref(size), 5000) if r >= 0: display_buffer_hex(report_buffer, size) else: print(" {}".format(usb.strerror(usb.error(r)))) free(report_buffer) return 0