.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "USB::LibUSB 3pm" .TH USB::LibUSB 3pm "2020-11-09" "perl v5.32.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" USB::LibUSB \- Perl interface to the libusb\-1.0 API. .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 1 \& use USB::LibUSB; \& \& # \& # simple program to list all devices on the USB \& # \& \& my $ctx = USB::LibUSB\->init(); \& my @devices = $ctx\->get_device_list(); \& \& for my $dev (@devices) { \& my $bus_number = $dev\->get_bus_number(); \& my $device_address = $dev\->get_device_address(); \& my $desc = $dev\->get_device_descriptor(); \& my $idVendor = $desc\->{idVendor}; \& my $idProduct = $desc\->{idProduct}; \& \& printf("Bus %03d Device %03d: ID %04x:%04x\en", $bus_number, \& $device_address, $idVendor, $idProduct); \& } \& \& # \& # Synchronous bulk transfers \& # \& \& my $ctx = USB::LibUSB\->init(); \& my $handle = $ctx\->open_device_with_vid_pid(0x1111, 0x2222); \& \& $handle\->set_auto_detach_kernel_driver(1); # Linux only \& \& # We want to use interface 0 \& $handle\->claim_interface(0); \& \& $handle\->bulk_transfer_write($endpoint, $data, $timeout); \& my $data = $handle\->bulk_transfer_read($endpoint, $length, $timeout); .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" This module provides a Perl interface to the libusb\-1.0 \s-1API.\s0 It provides access to most basic libusb functionality including read-out of device descriptors and synchronous device I/O. .PP Staying as close as possible to the libusb\-1.0 \s-1API,\s0 this module adds convenient error handling and additional high-level functionality (e.g. device discovery with vid, pid and serial number). Easy to build more functionality without knowing about \s-1XS.\s0 .SH "INSTALLATION" .IX Header "INSTALLATION" .SS "Prerequisites" .IX Subsection "Prerequisites" \fILinux/UNIX\fR .IX Subsection "Linux/UNIX" .PP This requires libusb (>= 1.0.17) development files and pkg-config installed. .PP On Debian like \fBLinux\fR: .PP .Vb 1 \& $ apt\-get install libusb\-1.0\-0\-dev pkg\-config .Ve .PP On Cygwin you need the pkg-config, libusb1.0\-devel and libcrypt-devel packages. .PP \fIWindows\fR .IX Subsection "Windows" .PP On Windows you have to manually download the libusb binaries from and extract them somewhere. .PP Assuming that the location of the extracted libusb folder is \&\fIC:\eUsers\esimon\elibusb\-1.0\fR, you need to set the \&\f(CW\*(C`USB_LIBUSB_INCLUDE\*(C'\fR and \f(CW\*(C`USB_LIBUSB_LIB\*(C'\fR environment variables as follows: .PP .Vb 2 \& > SET USB_LIBUSB_INCLUDE=\-IC:\eUsers\esimon\elibusb\-1.0\einclude\elibusb\-1.0 \& > SET USB_LIBUSB_LIB=\-lC:\eUsers\esimon\elibusb\-1.0\eMinGW64\edll\elibusb\-1.0.dll.a .Ve .PP You will also need to add .PP .Vb 1 \& C:\eUsers\esimon\elibusb\-1.0\eMinGW64\edll .Ve .PP to the \fBPath\fR environment variable. .PP For StrawberryPerl, version 5.26 or newer is required (see ). .PP Driver Installation .IX Subsection "Driver Installation" .PP On Windows you need an additional driver to use a device with libusb. See the Windows section in the libusb wiki. .SS "Building USB::LibUSB" .IX Subsection "Building USB::LibUSB" The rest of the installation can be done by a \s-1CPAN\s0 client like cpanm: .PP .Vb 1 \& $ cpanm USB::LibUSB .Ve .SH "METHODS/FUNCTIONS" .IX Header "METHODS/FUNCTIONS" .SS "Library initialization/deinitialization" .IX Subsection "Library initialization/deinitialization" \fIset_debug\fR .IX Subsection "set_debug" .PP .Vb 1 \& $ctx\->set_debug(LIBUSB_LOG_LEVEL_DEBUG); .Ve .PP \fIinit\fR .IX Subsection "init" .PP .Vb 1 \& my $ctx = USB::LibUSB\->init(); .Ve .PP \fIexit\fR .IX Subsection "exit" .PP .Vb 1 \& $ctx\->exit(); .Ve .PP \fIlast_retval\fR .IX Subsection "last_retval" .PP .Vb 1 \& my $retval = $ctx\->last_retval(); .Ve .PP Get return value of last called libusb function. .SS "Device handling and enumeration" .IX Subsection "Device handling and enumeration" \fIget_device_list\fR .IX Subsection "get_device_list" .PP .Vb 1 \& my @device_list = $ctx\->get_device_list(); .Ve .PP Returned elements are USB::LibUSB::Device objects. .PP \fIget_bus_number\fR .IX Subsection "get_bus_number" .PP .Vb 1 \& my $bus_number = $dev\->get_bus_number(); .Ve .PP \fIget_port_number\fR .IX Subsection "get_port_number" .PP .Vb 1 \& my $port_number = $dev\->get_port_number(); .Ve .PP \fIget_port_numbers\fR .IX Subsection "get_port_numbers" .PP .Vb 1 \& my @port_numbers = $dev\->get_port_numbers(); .Ve .PP \fIget_parent\fR .IX Subsection "get_parent" .PP .Vb 1 \& my $parent_dev = $dev\->get_parent(); .Ve .PP \fIget_device_address\fR .IX Subsection "get_device_address" .PP .Vb 1 \& my $address = $dev\->get_device_address(); .Ve .PP \fIget_device_speed\fR .IX Subsection "get_device_speed" .PP .Vb 1 \& my $speed = $dev\->get_device_speed(); .Ve .PP \fIget_max_packet_size\fR .IX Subsection "get_max_packet_size" .PP .Vb 1 \& my $size = $dev\->get_max_packet_size($endpoint); .Ve .PP \fIget_max_iso_packet_size\fR .IX Subsection "get_max_iso_packet_size" .PP .Vb 1 \& my $size = $dev\->get_max_iso_packet_size($endpoint); .Ve .PP \fIref_device\fR .IX Subsection "ref_device" .PP .Vb 1 \& $dev\->ref_device(); .Ve .PP \fIunref_device\fR .IX Subsection "unref_device" .PP .Vb 1 \& $dev\->unref_device(); .Ve .PP \fIopen\fR .IX Subsection "open" .PP .Vb 1 \& my $handle = $dev\->open(); .Ve .PP Return a USB::LibUSB::Device::Handle object. .PP \fIopen_device_with_vid_pid\fR .IX Subsection "open_device_with_vid_pid" .PP .Vb 1 \& my $handle = $ctx\->open_device_with_vid_pid(0x1111, 0x2222); .Ve .PP Return a USB::LibUSB::Device::Handle object. If the vid:pid combination is not unique, return the first device which is found. .PP \fIopen_device_with_vid_pid_unique\fR .IX Subsection "open_device_with_vid_pid_unique" .PP .Vb 1 \& my $handle = $ctx\->open_device_with_vid_pid_unique(0x1111, 0x2222); .Ve .PP Like \f(CW\*(C`open_device_with_vid_pid\*(C'\fR, but croak in case of multiple devices with this vid:pid combination. .PP \fIopen_device_with_vid_pid_serial\fR .IX Subsection "open_device_with_vid_pid_serial" .PP .Vb 1 \& my $handle = $ctx\->open_device_with_vid_pid_serial(0x0957, 0x0607, "MY47000419"); .Ve .PP Like \f(CW\*(C`open_device_with_vid_pid\*(C'\fR, but also requires a serial number. .PP \fIclose\fR .IX Subsection "close" .PP .Vb 1 \& $handle\->close(); .Ve .PP \fIget_device\fR .IX Subsection "get_device" .PP .Vb 1 \& my $dev = $handle\->get_device(); .Ve .PP \fIget_configuration\fR .IX Subsection "get_configuration" .PP .Vb 1 \& my $config = $handle\->get_configuration(); .Ve .PP \fIset_configuration\fR .IX Subsection "set_configuration" .PP .Vb 1 \& $handle\->set_configuration($config); .Ve .PP \fIclaim_interface\fR .IX Subsection "claim_interface" .PP .Vb 1 \& $handle\->claim_interface($interface_number); .Ve .PP \fIrelease_interface\fR .IX Subsection "release_interface" .PP .Vb 1 \& $handle\->release_interface($interface_number); .Ve .PP \fIset_interface_alt_setting\fR .IX Subsection "set_interface_alt_setting" .PP .Vb 1 \& $handle\->set_interface_alt_setting($interface_number, $alternate_setting); .Ve .PP \fIclear_halt\fR .IX Subsection "clear_halt" .PP .Vb 1 \& $handle\->clear_halt($endpoint); .Ve .PP \fIreset_device\fR .IX Subsection "reset_device" .PP .Vb 1 \& $handle\->reset_device(); .Ve .PP \fIkernel_driver_active\fR .IX Subsection "kernel_driver_active" .PP .Vb 1 \& my $is_active = $handle\->kernelt_driver_active($interface_number); .Ve .PP \fIdetach_kernel_driver\fR .IX Subsection "detach_kernel_driver" .PP .Vb 1 \& $handle\->detach_kernel_driver($interface_number); .Ve .PP \fIattach_kernel_driver\fR .IX Subsection "attach_kernel_driver" .PP .Vb 1 \& $handle\->attach_kernel_driver($interface_number); .Ve .PP \fIset_auto_detach_kernel_driver\fR .IX Subsection "set_auto_detach_kernel_driver" .PP .Vb 1 \& $handle\->set_auto_detach_kernel_driver($enable); .Ve .PP Throws exception on Windows and Darwin. .SS "Miscellaneous" .IX Subsection "Miscellaneous" \fIlibusb_has_capability\fR .IX Subsection "libusb_has_capability" .PP .Vb 1 \& my $has_cap = libusb_has_capability($capability); .Ve .PP \fIlibusb_error_name\fR .IX Subsection "libusb_error_name" .PP .Vb 1 \& my $error_name = libusb_error_name($error_code); .Ve .PP \fIlibusb_get_version\fR .IX Subsection "libusb_get_version" .PP .Vb 1 \& my $version_hash = libusb_get_version(); .Ve .PP Return hashref \f(CW$version_hash\fR with the following keys: .IP "major" 4 .IX Item "major" .PD 0 .IP "minor" 4 .IX Item "minor" .IP "micro" 4 .IX Item "micro" .IP "nano" 4 .IX Item "nano" .IP "rc" 4 .IX Item "rc" .PD .PP \fIlibusb_setlocale\fR .IX Subsection "libusb_setlocale" .PP .Vb 1 \& my $rv = libusb_setlocale($locale); .Ve .PP \fIlibusb_strerror\fR .IX Subsection "libusb_strerror" .PP .Vb 1 \& my $strerror = libusb_strerror($error_code); .Ve .SS "\s-1USB\s0 descriptors" .IX Subsection "USB descriptors" All descriptors are returned as hash references. .PP \fIget_device_descriptor\fR .IX Subsection "get_device_descriptor" .PP .Vb 1 \& my $desc = $dev\->get_device_descriptor(); .Ve .PP Return hashref \f(CW$desc\fR with the following keys .IP "bLength" 4 .IX Item "bLength" .PD 0 .IP "bDescriptorType" 4 .IX Item "bDescriptorType" .IP "bcdUSB" 4 .IX Item "bcdUSB" .IP "bDeviceClass" 4 .IX Item "bDeviceClass" .IP "bDeviceSubClass" 4 .IX Item "bDeviceSubClass" .IP "bDeviceProtocol" 4 .IX Item "bDeviceProtocol" .IP "bMaxPacketSize0" 4 .IX Item "bMaxPacketSize0" .IP "idVendor" 4 .IX Item "idVendor" .IP "idProduct" 4 .IX Item "idProduct" .IP "bcdDevice" 4 .IX Item "bcdDevice" .IP "iManufacturer" 4 .IX Item "iManufacturer" .IP "iProduct" 4 .IX Item "iProduct" .IP "iSerialNumber" 4 .IX Item "iSerialNumber" .IP "bNumConfigurations" 4 .IX Item "bNumConfigurations" .PD .PP All keys hold a scalar value. .PP \fIget_active_config_descriptor\fR .IX Subsection "get_active_config_descriptor" .PP .Vb 1 \& my $config = $dev\->get_active_config_descriptor(); .Ve .PP Return hashref \f(CW$config\fR with the following keys: .IP "bLength" 4 .IX Item "bLength" .PD 0 .IP "bDescriptorType" 4 .IX Item "bDescriptorType" .IP "wTotalLength" 4 .IX Item "wTotalLength" .IP "bNumInterfaces" 4 .IX Item "bNumInterfaces" .IP "bConfigurationValue" 4 .IX Item "bConfigurationValue" .IP "iConfiguration" 4 .IX Item "iConfiguration" .IP "bmAttributes" 4 .IX Item "bmAttributes" .IP "MaxPower" 4 .IX Item "MaxPower" .IP "interface" 4 .IX Item "interface" .IP "extra" 4 .IX Item "extra" .PD .PP With the exception of \fBinterface\fR, all values are scalars. \&\fBinterface\fR holds an arrayref of bNumInterfaces interface descriptors. Each interface consists of an array of alternate settings. These are hashrefs with the following keys: .IP "bLength" 4 .IX Item "bLength" .PD 0 .IP "bDescriptorType" 4 .IX Item "bDescriptorType" .IP "bInterfaceNumber" 4 .IX Item "bInterfaceNumber" .IP "bAlternateSetting" 4 .IX Item "bAlternateSetting" .IP "bNumEndpoints" 4 .IX Item "bNumEndpoints" .IP "bInterfaceClass" 4 .IX Item "bInterfaceClass" .IP "bInterfaceSubClass" 4 .IX Item "bInterfaceSubClass" .IP "bInterfaceProtocol" 4 .IX Item "bInterfaceProtocol" .IP "iInterface" 4 .IX Item "iInterface" .IP "endpoint" 4 .IX Item "endpoint" .IP "extra" 4 .IX Item "extra" .PD .PP With the exception of \fBendpoint\fR, all values are scalars. \&\fBendpoint\fR holds an arrayref of endpoint descriptors. These are hashrefs with the following keys: .IP "bLength" 4 .IX Item "bLength" .PD 0 .IP "bDescriptorType" 4 .IX Item "bDescriptorType" .IP "bEndpointAddress" 4 .IX Item "bEndpointAddress" .IP "bmAttributes" 4 .IX Item "bmAttributes" .IP "wMaxPacketSize" 4 .IX Item "wMaxPacketSize" .IP "bInterval" 4 .IX Item "bInterval" .IP "bRefresh" 4 .IX Item "bRefresh" .IP "bSynchAddress" 4 .IX Item "bSynchAddress" .IP "extra" 4 .IX Item "extra" .PD .PP All values are scalars. If the endpoint supports \s-1USB 3.0\s0 SuperSpeed, the hashref will contain an additional key \f(CW\*(C`superspeed\*(C'\fR which holds a SuperSpeed Endpoint Companion descriptor with the following keys: .IP "bLength" 4 .IX Item "bLength" .PD 0 .IP "bDescriptorType" 4 .IX Item "bDescriptorType" .IP "bMaxBurst" 4 .IX Item "bMaxBurst" .IP "bmAttributes" 4 .IX Item "bmAttributes" .IP "wBytesPerInterval" 4 .IX Item "wBytesPerInterval" .PD .PP Example .IX Subsection "Example" .PP Dump \f(CW$config\fR with \s-1YAML::XS\s0: .PP .Vb 2 \& use YAML::XS; \& print Dump($config); .Ve .PP For a \fBLinux Foundation 3.0 root hub\fR: .PP .Vb 10 \& \-\-\- \& MaxPower: 0 \& bConfigurationValue: 1 \& bDescriptorType: 2 \& bLength: 9 \& bNumInterfaces: 1 \& bmAttributes: 224 \& extra: ~ \& iConfiguration: 0 \& interface: \& \- \- bAlternateSetting: 0 \& bDescriptorType: 4 \& bInterfaceClass: 9 \& bInterfaceNumber: 0 \& bInterfaceProtocol: 0 \& bInterfaceSubClass: 0 \& bLength: 9 \& bNumEndpoints: 1 \& endpoint: \& \- bDescriptorType: 5 \& bEndpointAddress: 129 \& bInterval: 12 \& bLength: 7 \& bRefresh: 0 \& bSynchAddress: 0 \& bmAttributes: 3 \& extra: "\ex060\e0\e0\ex02\e0" \& ss_endpoint_companion: \& bDescriptorType: 48 \& bLength: 6 \& bMaxBurst: 0 \& bmAttributes: 0 \& wBytesPerInterval: 2 \& wMaxPacketSize: 4 \& extra: ~ \& iInterface: 0 \& wTotalLength: 31 .Ve .PP \fIget_config_descriptor\fR .IX Subsection "get_config_descriptor" .PP .Vb 1 \& my $config = $dev\->get_config_descriptor($config_index); .Ve .PP Return config descriptor as hashref. .PP \fIget_config_descriptor_by_value\fR .IX Subsection "get_config_descriptor_by_value" .PP .Vb 1 \& my $config = $dev\->get_config_descriptor_by_value($bConfigurationValue); .Ve .PP Return config descriptor as hashref. .PP \fIget_bos_descriptor\fR .IX Subsection "get_bos_descriptor" .PP .Vb 1 \& my $bos = $handle\->get_bos_descriptor(); .Ve .PP Return \s-1BOS\s0 descriptor as hashref with the following keys: .IP "bLength" 4 .IX Item "bLength" .PD 0 .IP "bDescriptorType" 4 .IX Item "bDescriptorType" .IP "wTotalLength" 4 .IX Item "wTotalLength" .IP "bNumDeviceCaps" 4 .IX Item "bNumDeviceCaps" .IP "dev_capability" 4 .IX Item "dev_capability" .PD .PP \&\f(CW\*(C`dev_capability\*(C'\fR holds an arrayref of \s-1BOS\s0 Device Capability descriptors. They have the following keys: .IP "bLength" 4 .IX Item "bLength" .PD 0 .IP "bDescriptorType" 4 .IX Item "bDescriptorType" .IP "bDevCapabilityType" 4 .IX Item "bDevCapabilityType" .IP "dev_capability_data" 4 .IX Item "dev_capability_data" .PD .PP Additional parsing of the capability data is performed if \f(CW\*(C`bDevCapabilityType\*(C'\fR has one of the following values: .IP "\s-1LIBUSB_BT_USB_2_0_EXTENSION\s0" 4 .IX Item "LIBUSB_BT_USB_2_0_EXTENSION" The hashref will contain a key \f(CW\*(C`usb_2_0_extension\*(C'\fR. .IP "\s-1LIBUSB_BT_SS_USB_DEVICE_CAPABILITY\s0" 4 .IX Item "LIBUSB_BT_SS_USB_DEVICE_CAPABILITY" The hashref will contain a key \f(CW\*(C`ss_usb_device_capability\*(C'\fR. .IP "\s-1LIBUSB_BT_CONTAINER_ID\s0" 4 .IX Item "LIBUSB_BT_CONTAINER_ID" The hashref will contain a key \f(CW\*(C`container_id\*(C'\fR. .PP Example .IX Subsection "Example" .PP Dump \f(CW$bos\fR with \s-1YAML::XS\s0: .PP .Vb 2 \& use YAML::XS; \& print Dump($bos); .Ve .PP For a \fBLinux Foundation 3.0 root hub\fR: .PP .Vb 10 \& bDescriptorType: 15 \& bLength: 5 \& bNumDeviceCaps: 1 \& dev_capability: \& \- bDescriptorType: 16 \& bDevCapabilityType: 3 \& bLength: 10 \& dev_capability_data: "\ex02\eb\e0\ex03\e0\e0\e0" \& ss_usb_device_capability: \& bDescriptorType: 16 \& bDevCapabilityType: 3 \& bFunctionalitySupport: 3 \& bLength: 10 \& bU1DevExitLat: 0 \& bU2DevExitLat: 0 \& bmAttributes: 2 \& wSpeedSupported: 8 \& wTotalLength: 15 .Ve .PP \fIget_string_descriptor_ascii\fR .IX Subsection "get_string_descriptor_ascii" .PP .Vb 1 \& my $data = $handle\->get_string_descriptor_ascii($desc_index, $length); .Ve .PP \fIget_descriptor\fR .IX Subsection "get_descriptor" .PP .Vb 1 \& my $data = $handle\->get_descriptor($desc_type, $desc_index, $length); .Ve .PP \fIget_string_descriptor\fR .IX Subsection "get_string_descriptor" .PP .Vb 1 \& my $data = $handle\->get_string_descriptor($desc_index, $langid, $length); .Ve .SS "Device hotplug event notification" .IX Subsection "Device hotplug event notification" To be implemented. .SS "Asynchronous device I/O" .IX Subsection "Asynchronous device I/O" To be implemented. .SS "Polling and timing" .IX Subsection "Polling and timing" To be implemented. .SS "Synchronous device I/O" .IX Subsection "Synchronous device I/O" \fIcontrol_transfer_write\fR .IX Subsection "control_transfer_write" .PP .Vb 1 \& $handle\->control_transfer_write($bmRequestType, $bRequest, $wValue, $wIndex, $data, $timeout); .Ve .PP \fIcontrol_transfer_read\fR .IX Subsection "control_transfer_read" .PP .Vb 1 \& my $data = $handle\->control_transfer_read($bmRequestType, $bRequest, $wValue, $wIndex, $length, $timeout); .Ve .PP \fIbulk_tranfer_write\fR .IX Subsection "bulk_tranfer_write" .PP .Vb 1 \& my $transferred = $handle\->bulk_transfer_write($endpoint, $data, $timeout); .Ve .PP \fIbulk_transfer_read\fR .IX Subsection "bulk_transfer_read" .PP .Vb 1 \& my $data = $handle\->bulk_transfer_read($endpoint, $length, $timeout); .Ve .PP \fIinterrupt_transfer_write\fR .IX Subsection "interrupt_transfer_write" .PP .Vb 1 \& my $transferred = $handle\->interrupt_transfer_write($endpoint, $data, $timeout); .Ve .PP \fIinterrupt_transfer_read\fR .IX Subsection "interrupt_transfer_read" .PP .Vb 1 \& my $data = $handle\->interrupt_transfer_read($endpoint, $length, $timeout); .Ve .SH "REPORTING BUGS" .IX Header "REPORTING BUGS" Please report bugs at . .SH "CONTACT" .IX Header "CONTACT" Feel free to contact us at the #labmeasurement channel on Freenode \s-1IRC.\s0 .SH "AUTHOR" .IX Header "AUTHOR" Simon Reinhardt, .SH "COPYRIGHT AND LICENSE" .IX Header "COPYRIGHT AND LICENSE" Copyright (C) 2017 by Simon Reinhardt .PP This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.24.0 or, at your option, any later version of Perl 5 you may have available.