---
name: "USB::LibUSB::XS"
section: "3pm"
platform: "linux"
package: "libusb-libusb-perl"
version: "0.09-3+b1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/USB::LibUSB::XS"
---

# USB::LibUSB::XS(3pm)

Raw XS bindings to the libusb-1.0 \<http://libusb.info/\> API.

## NAME

USB::LibUSB::XS - Raw XS bindings to the libusb-1.0 \<http://libusb.info/\> API.

## SYNOPSIS

```
  # import all the constants and non-method subroutines
  use USB::LibUSB::XS;
  my ($rv, $ctx) = USB::LibUSB::XS->init();
  $ctx->set_debug(LIBUSB_LOG_LEVEL_WARNING);

  my ($vendor_id, $product_id) = (0x1234, 0x5678);
  my $handle = $ctx->open_device_with_vid_pid($vendor_id, $product_id);
  $rv = $handle->set_auto_detach_kernel_driver(1);
  $rv = $handle->claim_interface($interface);
  $rv = $handle->bulk_transfer_write($endpoint, "some data", $timeout);
  ($rv, my $data) = $handle->bulk_transfer_read($endpoint, $length, $timeout);
```

## DESCRIPTION

USB::LibUSB::XS provides the raw XS access to the libusb-1.0 API, which can then be used by modules like USB::LibUSB, which is a more user frienly interface.

## METHODS/FUNCTIONS

The following API is documented in the excellent libusb documentation \<http://libusb.sourceforge.net/api-1.0/\>.

### Library initialization/deinitialization

Implementation status: complete.

*set\_debug*

```
 $ctx->set_debug(LIBUSB_LOG_LEVEL_DEBUG);
```

*init*

```
 my ($rv, $ctx) = USB::LibUSB::XS->init();
```

*exit*

```
 $ctx->exit();
```

### Device handling and enumeration

Implementation status: complete.

*get\_device\_list*

```
 my ($rv, @device_list) = $ctx->get_device_list();
```

`@device_list` contains USB::LibUSB::XS::Device objects.

*get\_bus\_number*

```
 my $bus_number = $dev->get_bus_number();
```

*get\_port\_number*

```
 my $port_number = $dev->get_port_number();
```

*get\_port\_numbers*

```
 my ($rv, @port_numbers) = $dev->get_port_numbers();
```

*get\_parent*

```
 my $parent_dev = $dev->get_parent();
```

*get\_device\_address*

```
 my $address = $dev->get_device_address();
```

*get\_device\_speed*

```
 my $speed = $dev->get_device_speed();
```

*get\_max\_packet\_size*

```
 my $size = $dev->get_max_packet_size($endpoint);
```

*get\_max\_iso\_packet\_size*

```
 my $size = $dev->get_max_iso_packet_size($endpoint);
```

*ref\_device*

```
 $dev = $dev->ref_device();
```

*unref\_device*

```
 $dev->unref_device();
```

*open*

```
 my ($rv, $handle) = $dev->open();
```

Return a USB::LibUSB::XS::Device::Handle object in `$handle` if `$rv` is 0.

*open\_device\_with\_vid\_pid*

```
 my $handle = $ctx->open_device_with_vid_pid(0x1111, 0x2222);
```

Return undef on error.

*close*

```
 $handle->close();
```

*get\_device*

```
 my $dev = $hanlde->get_device();
```

*get\_configuration*

```
 my $config = $handle->get_configuration();
```

*set\_configuration*

```
 my $rv = $handle->set_configuration($config);
```

*claim\_interface*

```
 my $rv = $handle->claim_interface($interface_number);
```

*release\_interface*

```
 my $rv = $handle->release_interface($interface_number);
```

*set\_interface\_alt\_setting*

```
 my $rv = $handle->set_interface_alt_setting($interface_number, $alternate_setting);
```

*clear\_halt*

```
 my $rv = $handle->clear_halt($endpoint);
```

*reset\_device*

```
 my $rv = $handle->reset_device();
```

*kernel\_driver\_active*

```
 my $is_active = $handle->kernelt_driver_active($interface_number);
```

*detach\_kernel\_driver*

```
 my $rv = $handle->detach_kernel_driver($interface_number);
```

*attach\_kernel\_driver*

```
 my $rv = $handle->attach_kernel_driver($interface_number);
```

*set\_auto\_detach\_kernel\_driver*

```
 my $rv = $handle->set_auto_detach_kernel_driver($enable);
```

### Miscellaneous

Implementation status: complete.

*libusb\_has\_capability*

```
 my $has_cap = libusb_has_capability($capability);
```

*libusb\_error\_name*

```
 my $error_name = libusb_error_name($error_code);
```

*libusb\_get\_version*

```
 my $version_hash = libusb_get_version();
 my $major = $version_hash->{major};
```

*libusb\_setlocale*

```
 my $rv = libusb_setlocale($locale);
```

*libusb\_strerror*

```
 my $strerror = libusb_strerror($error_code);
```

### USB descriptors

Implementation status: complete.

All descriptors are returned as hash references.

*get\_device\_descriptor*

```
 my ($rv, $desc) = $dev->get_device_descriptor();
 my $iSerialNumber = $desc->{iSerialNumber};
```

*get\_active\_config\_descriptor*

```
 my ($rv, $config) = $dev->get_active_config_descriptor($ctx);
 my $iConfiguration = $config->{iConfiguration};
```

*get\_config\_descriptor*

```
 my ($rv, $config) = $dev->get_config_descriptor($ctx, $config_index);
```

*get\_config\_descriptor\_by\_value*

```
 my ($rv, $config) = $dev->get_config_descriptor_by_value($ctx, $bConfigurationValue);
```

*get\_bos\_descriptor*

```
 my ($rv, $bos) = $handle->get_bos_descriptor($ctx);
```

*get\_string\_descriptor\_ascii*

```
 my ($rv, $data) = $handle->get_string_descriptor_ascii($desc_index, $length);
```

*get\_descriptor*

```
 my ($rv, $data) = $handle->get_descriptor($desc_type, $desc_index, $length);
```

*get\_string\_descriptor*

```
 my ($rv, $data) = $handle->get_string_descriptor($desc_index, $langid, $length);
```

### Device hotplug event notification

Implementation status: To be implemented.

### Asynchronous device I/O

Implementation status: To be implemented.

### Polling and timing

Implementation status: To be implemented.

### Synchronous device I/O

Implementation status: complete.

Timeouts are given in milliseconds.

*control\_transfer\_write*

```
 my $rv = $handle->control_transfer_write($bmRequestType, $bRequest, $wValue, $wIndex, $data, $timeout);
```

*control\_transfer\_read*

```
 my ($rv, $data) = $handle->control_transfer_read($bmRequestType, $bRequest, $wValue, $wIndex, $length, $timeout);
```

*bulk\_tranfer\_write*

```
 my $rv = $handle->bulk_transfer_write($endpoint, $data, $timeout);
```

*bulk\_transfer\_read*

```
 my ($rv, $data) = $handle->bulk_transfer_read($endpoint, $length, $timeout);
```

*interrupt\_transfer\_write*

```
 my $rv = $handle->interrupt_transfer_write($endpoint, $data, $timeout);
```

*interrupt\_transfer\_read*

```
 my ($rv, $data) = $handle->interrupt_transfer_read($endpoint, $length, $timeout);
```

## REPORTING BUGS

Please report bugs at \<https://github.com/lab-measurement/USB-LibUSB/issues\>.

## CONTACT

Feel free to contact us at the #labmeasurement channel on Freenode IRC.

## AUTHOR

Simon Reinhardt, \<simon.reinhardt@physik.uni-r.de\>

## COPYRIGHT AND LICENSE

Copyright (C) 2017 by Simon Reinhardt

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.
