libusb.h revision 261482
160484Sobrien/* $FreeBSD: stable/10/lib/libusb/libusb.h 261482 2014-02-04 10:18:29Z hselasky $ */
277298Sobrien/*-
360484Sobrien * Copyright (c) 2009 Sylvestre Gallon. All rights reserved.
460484Sobrien *
560484Sobrien * Redistribution and use in source and binary forms, with or without
660484Sobrien * modification, are permitted provided that the following conditions
760484Sobrien * are met:
860484Sobrien * 1. Redistributions of source code must retain the above copyright
960484Sobrien *    notice, this list of conditions and the following disclaimer.
1060484Sobrien * 2. Redistributions in binary form must reproduce the above copyright
1160484Sobrien *    notice, this list of conditions and the following disclaimer in the
1260484Sobrien *    documentation and/or other materials provided with the distribution.
1360484Sobrien *
1460484Sobrien * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1560484Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1660484Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1760484Sobrien * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1860484Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1960484Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2060484Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2160484Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2260484Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2360484Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2460484Sobrien * SUCH DAMAGE.
2560484Sobrien */
2660484Sobrien
2760484Sobrien#ifndef __LIBUSB_H__
2860484Sobrien#define	__LIBUSB_H__
2960484Sobrien
3060484Sobrien#ifndef LIBUSB_GLOBAL_INCLUDE_FILE
3160484Sobrien#include <stdint.h>
3260484Sobrien#include <sys/time.h>
3360484Sobrien#include <sys/types.h>
3460484Sobrien#endif
3560484Sobrien
3660484Sobrien#ifdef __cplusplus
3760484Sobrienextern	"C" {
3860484Sobrien#endif
3960484Sobrien#if 0
4060484Sobrien}					/* indent fix */
4160484Sobrien
4260484Sobrien#endif
4360484Sobrien
4460484Sobrien/* libusb enums */
4560484Sobrien
4660484Sobrienenum libusb_class_code {
4760484Sobrien	LIBUSB_CLASS_PER_INTERFACE = 0,
4860484Sobrien	LIBUSB_CLASS_AUDIO = 1,
4960484Sobrien	LIBUSB_CLASS_COMM = 2,
5060484Sobrien	LIBUSB_CLASS_HID = 3,
5160484Sobrien	LIBUSB_CLASS_PTP = 6,
5260484Sobrien	LIBUSB_CLASS_PRINTER = 7,
5360484Sobrien	LIBUSB_CLASS_MASS_STORAGE = 8,
5460484Sobrien	LIBUSB_CLASS_HUB = 9,
5560484Sobrien	LIBUSB_CLASS_DATA = 10,
5660484Sobrien	LIBUSB_CLASS_VENDOR_SPEC = 0xff,
5760484Sobrien};
5860484Sobrien
5960484Sobrienenum libusb_descriptor_type {
6060484Sobrien	LIBUSB_DT_DEVICE = 0x01,
6160484Sobrien	LIBUSB_DT_CONFIG = 0x02,
6260484Sobrien	LIBUSB_DT_STRING = 0x03,
6360484Sobrien	LIBUSB_DT_INTERFACE = 0x04,
6460484Sobrien	LIBUSB_DT_ENDPOINT = 0x05,
6560484Sobrien	LIBUSB_DT_HID = 0x21,
6660484Sobrien	LIBUSB_DT_REPORT = 0x22,
6760484Sobrien	LIBUSB_DT_PHYSICAL = 0x23,
6860484Sobrien	LIBUSB_DT_HUB = 0x29,
6960484Sobrien	LIBUSB_DT_BOS = 0x0f,
7060484Sobrien	LIBUSB_DT_DEVICE_CAPABILITY = 0x10,
7160484Sobrien	LIBUSB_DT_SS_ENDPOINT_COMPANION = 0x30,
7260484Sobrien};
7377298Sobrien
7477298Sobrienenum libusb_device_capability_type {
7577298Sobrien	LIBUSB_WIRELESS_USB_DEVICE_CAPABILITY = 0x1,
7677298Sobrien	LIBUSB_USB_2_0_EXTENSION_DEVICE_CAPABILITY = 0x2,
7760484Sobrien	LIBUSB_SS_USB_DEVICE_CAPABILITY = 0x3,
7860484Sobrien	LIBUSB_CONTAINER_ID_DEVICE_CAPABILITY = 0x4,
7960484Sobrien};
8060484Sobrien
8160484Sobrien#define	LIBUSB_DT_DEVICE_SIZE		18
8260484Sobrien#define	LIBUSB_DT_CONFIG_SIZE		9
8360484Sobrien#define	LIBUSB_DT_INTERFACE_SIZE	9
8460484Sobrien#define	LIBUSB_DT_ENDPOINT_SIZE		7
8560484Sobrien#define	LIBUSB_DT_ENDPOINT_AUDIO_SIZE	9
8660484Sobrien#define	LIBUSB_DT_HUB_NONVAR_SIZE	7
8760484Sobrien#define	LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE	6
8877298Sobrien#define	LIBUSB_DT_BOS_SIZE		5
8960484Sobrien#define	LIBUSB_USB_2_0_EXTENSION_DEVICE_CAPABILITY_SIZE	7
9060484Sobrien#define	LIBUSB_SS_USB_DEVICE_CAPABILITY_SIZE	10
9160484Sobrien
9260484Sobrien#define	LIBUSB_ENDPOINT_ADDRESS_MASK	0x0f
9360484Sobrien#define	LIBUSB_ENDPOINT_DIR_MASK	0x80
9460484Sobrien
9560484Sobrienenum libusb_endpoint_direction {
9660484Sobrien	LIBUSB_ENDPOINT_IN = 0x80,
9760484Sobrien	LIBUSB_ENDPOINT_OUT = 0x00,
9860484Sobrien};
9960484Sobrien
10060484Sobrien#define	LIBUSB_TRANSFER_TYPE_MASK	0x03
10160484Sobrien
10260484Sobrienenum libusb_transfer_type {
10360484Sobrien	LIBUSB_TRANSFER_TYPE_CONTROL = 0,
10460484Sobrien	LIBUSB_TRANSFER_TYPE_ISOCHRONOUS = 1,
10560484Sobrien	LIBUSB_TRANSFER_TYPE_BULK = 2,
10660484Sobrien	LIBUSB_TRANSFER_TYPE_INTERRUPT = 3,
10760484Sobrien};
10860484Sobrien
10960484Sobrienenum libusb_standard_request {
11060484Sobrien	LIBUSB_REQUEST_GET_STATUS = 0x00,
11160484Sobrien	LIBUSB_REQUEST_CLEAR_FEATURE = 0x01,
11260484Sobrien	LIBUSB_REQUEST_SET_FEATURE = 0x03,
11360484Sobrien	LIBUSB_REQUEST_SET_ADDRESS = 0x05,
11460484Sobrien	LIBUSB_REQUEST_GET_DESCRIPTOR = 0x06,
11560484Sobrien	LIBUSB_REQUEST_SET_DESCRIPTOR = 0x07,
11660484Sobrien	LIBUSB_REQUEST_GET_CONFIGURATION = 0x08,
11760484Sobrien	LIBUSB_REQUEST_SET_CONFIGURATION = 0x09,
11877298Sobrien	LIBUSB_REQUEST_GET_INTERFACE = 0x0A,
11960484Sobrien	LIBUSB_REQUEST_SET_INTERFACE = 0x0B,
12060484Sobrien	LIBUSB_REQUEST_SYNCH_FRAME = 0x0C,
12160484Sobrien};
12260484Sobrien
12360484Sobrienenum libusb_request_type {
12460484Sobrien	LIBUSB_REQUEST_TYPE_STANDARD = (0x00 << 5),
12560484Sobrien	LIBUSB_REQUEST_TYPE_CLASS = (0x01 << 5),
12660484Sobrien	LIBUSB_REQUEST_TYPE_VENDOR = (0x02 << 5),
12760484Sobrien	LIBUSB_REQUEST_TYPE_RESERVED = (0x03 << 5),
12860484Sobrien};
12960484Sobrien
13060484Sobrienenum libusb_request_recipient {
13160484Sobrien	LIBUSB_RECIPIENT_DEVICE = 0x00,
13260484Sobrien	LIBUSB_RECIPIENT_INTERFACE = 0x01,
13360484Sobrien	LIBUSB_RECIPIENT_ENDPOINT = 0x02,
13460484Sobrien	LIBUSB_RECIPIENT_OTHER = 0x03,
13560484Sobrien};
13660484Sobrien
13760484Sobrien#define	LIBUSB_ISO_SYNC_TYPE_MASK	0x0C
13860484Sobrien
13960484Sobrienenum libusb_iso_sync_type {
14060484Sobrien	LIBUSB_ISO_SYNC_TYPE_NONE = 0,
14160484Sobrien	LIBUSB_ISO_SYNC_TYPE_ASYNC = 1,
14260484Sobrien	LIBUSB_ISO_SYNC_TYPE_ADAPTIVE = 2,
14360484Sobrien	LIBUSB_ISO_SYNC_TYPE_SYNC = 3,
14460484Sobrien};
14560484Sobrien
14660484Sobrien#define	LIBUSB_ISO_USAGE_TYPE_MASK 0x30
14760484Sobrien
14860484Sobrienenum libusb_iso_usage_type {
14960484Sobrien	LIBUSB_ISO_USAGE_TYPE_DATA = 0,
15060484Sobrien	LIBUSB_ISO_USAGE_TYPE_FEEDBACK = 1,
15160484Sobrien	LIBUSB_ISO_USAGE_TYPE_IMPLICIT = 2,
15260484Sobrien};
15360484Sobrien
15460484Sobrienenum libusb_error {
15560484Sobrien	LIBUSB_SUCCESS = 0,
15677298Sobrien	LIBUSB_ERROR_IO = -1,
15760484Sobrien	LIBUSB_ERROR_INVALID_PARAM = -2,
15860484Sobrien	LIBUSB_ERROR_ACCESS = -3,
15960484Sobrien	LIBUSB_ERROR_NO_DEVICE = -4,
16060484Sobrien	LIBUSB_ERROR_NOT_FOUND = -5,
16160484Sobrien	LIBUSB_ERROR_BUSY = -6,
16260484Sobrien	LIBUSB_ERROR_TIMEOUT = -7,
16360484Sobrien	LIBUSB_ERROR_OVERFLOW = -8,
16460484Sobrien	LIBUSB_ERROR_PIPE = -9,
16560484Sobrien	LIBUSB_ERROR_INTERRUPTED = -10,
16660484Sobrien	LIBUSB_ERROR_NO_MEM = -11,
16760484Sobrien	LIBUSB_ERROR_NOT_SUPPORTED = -12,
16860484Sobrien	LIBUSB_ERROR_OTHER = -99,
16960484Sobrien};
17060484Sobrien
17160484Sobrienenum libusb_speed {
17260484Sobrien	LIBUSB_SPEED_UNKNOWN = 0,
17360484Sobrien	LIBUSB_SPEED_LOW = 1,
17460484Sobrien	LIBUSB_SPEED_FULL = 2,
17560484Sobrien	LIBUSB_SPEED_HIGH = 3,
17660484Sobrien	LIBUSB_SPEED_SUPER = 4,
17760484Sobrien};
17860484Sobrien
17960484Sobrienenum libusb_transfer_status {
18060484Sobrien	LIBUSB_TRANSFER_COMPLETED,
18160484Sobrien	LIBUSB_TRANSFER_ERROR,
18260484Sobrien	LIBUSB_TRANSFER_TIMED_OUT,
18360484Sobrien	LIBUSB_TRANSFER_CANCELLED,
18460484Sobrien	LIBUSB_TRANSFER_STALL,
18560484Sobrien	LIBUSB_TRANSFER_NO_DEVICE,
18660484Sobrien	LIBUSB_TRANSFER_OVERFLOW,
18760484Sobrien};
18860484Sobrien
18960484Sobrienenum libusb_transfer_flags {
19060484Sobrien	LIBUSB_TRANSFER_SHORT_NOT_OK = 1 << 0,
19160484Sobrien	LIBUSB_TRANSFER_FREE_BUFFER = 1 << 1,
19260484Sobrien	LIBUSB_TRANSFER_FREE_TRANSFER = 1 << 2,
19360484Sobrien};
19460484Sobrien
19560484Sobrienenum libusb_debug_level {
19660484Sobrien	LIBUSB_DEBUG_NO=0,
19760484Sobrien	LIBUSB_DEBUG_FUNCTION=1,
19860484Sobrien	LIBUSB_DEBUG_TRANSFER=2,
19960484Sobrien};
20060484Sobrien
20160484Sobrien/* libusb structures */
20260484Sobrien
20377298Sobrienstruct libusb_context;
20460484Sobrienstruct libusb_device;
20560484Sobrienstruct libusb_transfer;
20660484Sobrienstruct libusb_device_handle;
20760484Sobrien
20860484Sobrienstruct libusb_pollfd {
20960484Sobrien	int	fd;
21060484Sobrien	short	events;
21160484Sobrien};
21260484Sobrien
21360484Sobrientypedef struct libusb_context libusb_context;
21477298Sobrientypedef struct libusb_device libusb_device;
21560484Sobrientypedef struct libusb_device_handle libusb_device_handle;
21677298Sobrientypedef struct libusb_pollfd libusb_pollfd;
21760484Sobrientypedef void (*libusb_pollfd_added_cb) (int fd, short events, void *user_data);
21860484Sobrientypedef void (*libusb_pollfd_removed_cb) (int fd, void *user_data);
21960484Sobrien
22060484Sobrientypedef struct libusb_device_descriptor {
22160484Sobrien	uint8_t	bLength;
22260484Sobrien	uint8_t	bDescriptorType;
22360484Sobrien	uint16_t bcdUSB;
22460484Sobrien	uint8_t	bDeviceClass;
22560484Sobrien	uint8_t	bDeviceSubClass;
22660484Sobrien	uint8_t	bDeviceProtocol;
22760484Sobrien	uint8_t	bMaxPacketSize0;
22860484Sobrien	uint16_t idVendor;
22960484Sobrien	uint16_t idProduct;
23060484Sobrien	uint16_t bcdDevice;
23160484Sobrien	uint8_t	iManufacturer;
23260484Sobrien	uint8_t	iProduct;
23360484Sobrien	uint8_t	iSerialNumber;
23460484Sobrien	uint8_t	bNumConfigurations;
23560484Sobrien}	libusb_device_descriptor;
23677298Sobrien
23777298Sobrientypedef struct libusb_endpoint_descriptor {
23877298Sobrien	uint8_t	bLength;
23960484Sobrien	uint8_t	bDescriptorType;
24060484Sobrien	uint8_t	bEndpointAddress;
24160484Sobrien	uint8_t	bmAttributes;
24260484Sobrien	uint16_t wMaxPacketSize;
24360484Sobrien	uint8_t	bInterval;
24460484Sobrien	uint8_t	bRefresh;
24560484Sobrien	uint8_t	bSynchAddress;
24660484Sobrien	uint8_t *extra;
24760484Sobrien	int	extra_length;
24860484Sobrien}	libusb_endpoint_descriptor __aligned(sizeof(void *));
24960484Sobrien
25060484Sobrientypedef struct libusb_ss_endpoint_companion_descriptor {
25160484Sobrien	uint8_t bLength;
25260484Sobrien	uint8_t bDescriptorType;
25360484Sobrien	uint8_t bMaxBurst;
25460484Sobrien	uint8_t bmAttributes;
25560484Sobrien	uint16_t wBytesPerInterval;
25660484Sobrien}	libusb_ss_endpoint_companion_descriptor __aligned(sizeof(void *));
25760484Sobrien
25860484Sobrientypedef struct libusb_interface_descriptor {
25960484Sobrien	uint8_t	bLength;
26060484Sobrien	uint8_t	bDescriptorType;
26160484Sobrien	uint8_t	bInterfaceNumber;
26260484Sobrien	uint8_t	bAlternateSetting;
26360484Sobrien	uint8_t	bNumEndpoints;
26460484Sobrien	uint8_t	bInterfaceClass;
26560484Sobrien	uint8_t	bInterfaceSubClass;
26660484Sobrien	uint8_t	bInterfaceProtocol;
26760484Sobrien	uint8_t	iInterface;
26860484Sobrien	struct libusb_endpoint_descriptor *endpoint;
26960484Sobrien	uint8_t *extra;
27060484Sobrien	int	extra_length;
27160484Sobrien}	libusb_interface_descriptor __aligned(sizeof(void *));
27260484Sobrien
27360484Sobrientypedef struct libusb_interface {
27460484Sobrien	struct libusb_interface_descriptor *altsetting;
27560484Sobrien	int	num_altsetting;
27660484Sobrien}	libusb_interface __aligned(sizeof(void *));
27760484Sobrien
27860484Sobrientypedef struct libusb_config_descriptor {
27960484Sobrien	uint8_t	bLength;
28060484Sobrien	uint8_t	bDescriptorType;
28160484Sobrien	uint16_t wTotalLength;
28260484Sobrien	uint8_t	bNumInterfaces;
28360484Sobrien	uint8_t	bConfigurationValue;
28460484Sobrien	uint8_t	iConfiguration;
28560484Sobrien	uint8_t	bmAttributes;
28660484Sobrien	uint8_t	MaxPower;
28760484Sobrien	struct libusb_interface *interface;
28860484Sobrien	uint8_t *extra;
28960484Sobrien	int	extra_length;
29060484Sobrien}	libusb_config_descriptor __aligned(sizeof(void *));
29160484Sobrien
29260484Sobrientypedef struct libusb_usb_2_0_device_capability_descriptor {
29360484Sobrien	uint8_t bLength;
29460484Sobrien	uint8_t bDescriptorType;
29560484Sobrien	uint8_t bDevCapabilityType;
29660484Sobrien	uint32_t bmAttributes;
29760484Sobrien#define LIBUSB_USB_2_0_CAPABILITY_LPM_SUPPORT  (1 << 1)
29860484Sobrien}	libusb_usb_2_0_device_capability_descriptor __aligned(sizeof(void *));
29960484Sobrien
30060484Sobrientypedef struct libusb_ss_usb_device_capability_descriptor {
30160484Sobrien	uint8_t bLength;
30260484Sobrien	uint8_t bDescriptorType;
30360484Sobrien	uint8_t bDevCapabilityType;
30460484Sobrien	uint8_t bmAttributes;
30560484Sobrien#define LIBUSB_SS_USB_CAPABILITY_LPM_SUPPORT   (1 << 1)
30660484Sobrien	uint16_t wSpeedSupported;
30760484Sobrien#define LIBUSB_CAPABILITY_LOW_SPEED_OPERATION  (1)
30860484Sobrien#define LIBUSB_CAPABILITY_FULL_SPEED_OPERATION (1 << 1)
30960484Sobrien#define LIBUSB_CAPABILITY_HIGH_SPEED_OPERATION (1 << 2)
31060484Sobrien#define LIBUSB_CAPABILITY_5GBPS_OPERATION      (1 << 3)
31160484Sobrien	uint8_t bFunctionalitySupport;
31260484Sobrien	uint8_t bU1DevExitLat;
31360484Sobrien	uint16_t wU2DevExitLat;
31460484Sobrien}	libusb_ss_usb_device_capability_descriptor __aligned(sizeof(void *));
31560484Sobrien
31660484Sobrientypedef struct libusb_bos_descriptor {
31760484Sobrien	uint8_t bLength;
31860484Sobrien	uint8_t bDescriptorType;
31960484Sobrien	uint16_t wTotalLength;
32060484Sobrien	uint8_t bNumDeviceCapabilities;
32160484Sobrien	struct libusb_usb_2_0_device_capability_descriptor *usb_2_0_ext_cap;
32260484Sobrien	struct libusb_ss_usb_device_capability_descriptor *ss_usb_cap;
32360484Sobrien}	libusb_bos_descriptor __aligned(sizeof(void *));
32460484Sobrien
32560484Sobrientypedef struct libusb_control_setup {
32660484Sobrien	uint8_t	bmRequestType;
32760484Sobrien	uint8_t	bRequest;
32860484Sobrien	uint16_t wValue;
32960484Sobrien	uint16_t wIndex;
33060484Sobrien	uint16_t wLength;
33160484Sobrien}	libusb_control_setup;
33260484Sobrien
33360484Sobrien#define	LIBUSB_CONTROL_SETUP_SIZE	8	/* bytes */
33460484Sobrien
33560484Sobrientypedef struct libusb_iso_packet_descriptor {
33660484Sobrien	uint32_t length;
33760484Sobrien	uint32_t actual_length;
33860484Sobrien	enum libusb_transfer_status status;
33960484Sobrien}	libusb_iso_packet_descriptor __aligned(sizeof(void *));
34060484Sobrien
34160484Sobrientypedef void (*libusb_transfer_cb_fn) (struct libusb_transfer *transfer);
34260484Sobrien
34360484Sobrientypedef struct libusb_transfer {
34460484Sobrien	libusb_device_handle *dev_handle;
34560484Sobrien	uint8_t	flags;
34660484Sobrien	uint8_t endpoint;
34760484Sobrien	uint8_t type;
34860484Sobrien	uint32_t timeout;
34960484Sobrien	enum libusb_transfer_status status;
35060484Sobrien	int	length;
35160484Sobrien	int	actual_length;
35260484Sobrien	libusb_transfer_cb_fn callback;
35360484Sobrien	void   *user_data;
35460484Sobrien	uint8_t *buffer;
35560484Sobrien	int	num_iso_packets;
35660484Sobrien	struct libusb_iso_packet_descriptor iso_packet_desc[0];
35760484Sobrien}	libusb_transfer __aligned(sizeof(void *));
35860484Sobrien
35960484Sobrien/* Library initialisation */
36060484Sobrien
36160484Sobrienvoid	libusb_set_debug(libusb_context * ctx, int level);
36260484Sobrienconst char *libusb_strerror(int code);
36360484Sobrienconst char *libusb_error_name(int code);
36460484Sobrienint	libusb_init(libusb_context ** context);
36560484Sobrienvoid	libusb_exit(struct libusb_context *ctx);
36660484Sobrien
36760484Sobrien/* Device handling and enumeration */
36860484Sobrien
36960484Sobrienssize_t libusb_get_device_list(libusb_context * ctx, libusb_device *** list);
37060484Sobrienvoid	libusb_free_device_list(libusb_device ** list, int unref_devices);
37160484Sobrienuint8_t	libusb_get_bus_number(libusb_device * dev);
37260484Sobrienint	libusb_get_port_numbers(libusb_device *dev, uint8_t *buf, uint8_t bufsize);
37360484Sobrienint	libusb_get_port_path(libusb_context *ctx, libusb_device *dev, uint8_t *buf, uint8_t bufsize);
37460484Sobrienuint8_t	libusb_get_device_address(libusb_device * dev);
37560484Sobrienenum libusb_speed libusb_get_device_speed(libusb_device * dev);
37660484Sobrienint	libusb_clear_halt(libusb_device_handle *devh, uint8_t endpoint);
37760484Sobrienint	libusb_get_max_packet_size(libusb_device * dev, uint8_t endpoint);
37860484Sobrienint	libusb_get_max_iso_packet_size(libusb_device * dev, uint8_t endpoint);
37960484Sobrienlibusb_device *libusb_ref_device(libusb_device * dev);
38060484Sobrienvoid	libusb_unref_device(libusb_device * dev);
38160484Sobrienint	libusb_open(libusb_device * dev, libusb_device_handle ** devh);
38260484Sobrienlibusb_device_handle *libusb_open_device_with_vid_pid(libusb_context * ctx, uint16_t vendor_id, uint16_t product_id);
38360484Sobrienvoid	libusb_close(libusb_device_handle * devh);
38460484Sobrienlibusb_device *libusb_get_device(libusb_device_handle * devh);
38560484Sobrienint	libusb_get_configuration(libusb_device_handle * devh, int *config);
38660484Sobrienint	libusb_set_configuration(libusb_device_handle * devh, int configuration);
38760484Sobrienint	libusb_claim_interface(libusb_device_handle * devh, int interface_number);
38860484Sobrienint	libusb_release_interface(libusb_device_handle * devh, int interface_number);
38960484Sobrienint	libusb_reset_device(libusb_device_handle * devh);
39060484Sobrienint	libusb_check_connected(libusb_device_handle * devh);
39160484Sobrienint 	libusb_kernel_driver_active(libusb_device_handle * devh, int interface);
39260484Sobrienint	libusb_get_driver_np(libusb_device_handle * devh, int interface, char *name, int namelen);
39360484Sobrienint	libusb_get_driver(libusb_device_handle * devh, int interface, char *name, int namelen);
39460484Sobrienint 	libusb_detach_kernel_driver_np(libusb_device_handle * devh, int interface);
39560484Sobrienint 	libusb_detach_kernel_driver(libusb_device_handle * devh, int interface);
39660484Sobrienint 	libusb_attach_kernel_driver(libusb_device_handle * devh, int interface);
39760484Sobrienint	libusb_set_interface_alt_setting(libusb_device_handle * devh, int interface_number, int alternate_setting);
39860484Sobrien
39960484Sobrien/* USB Descriptors */
40060484Sobrien
40160484Sobrienint	libusb_get_device_descriptor(libusb_device * dev, struct libusb_device_descriptor *desc);
40260484Sobrienint	libusb_get_active_config_descriptor(libusb_device * dev, struct libusb_config_descriptor **config);
40360484Sobrienint	libusb_get_config_descriptor(libusb_device * dev, uint8_t config_index, struct libusb_config_descriptor **config);
40460484Sobrienint	libusb_get_config_descriptor_by_value(libusb_device * dev, uint8_t bConfigurationValue, struct libusb_config_descriptor **config);
40560484Sobrienvoid	libusb_free_config_descriptor(struct libusb_config_descriptor *config);
40660484Sobrienint	libusb_get_string_descriptor(libusb_device_handle * devh, uint8_t desc_index, uint16_t langid, unsigned char *data, int length);
40760484Sobrienint	libusb_get_string_descriptor_ascii(libusb_device_handle * devh, uint8_t desc_index, uint8_t *data, int length);
40860484Sobrienint	libusb_get_descriptor(libusb_device_handle * devh, uint8_t desc_type, uint8_t desc_index, uint8_t *data, int length);
40960484Sobrienint	libusb_parse_ss_endpoint_comp(const void *buf, int len, struct libusb_ss_endpoint_companion_descriptor **ep_comp);
41060484Sobrienvoid	libusb_free_ss_endpoint_comp(struct libusb_ss_endpoint_companion_descriptor *ep_comp);
41160484Sobrienint	libusb_parse_bos_descriptor(const void *buf, int len, struct libusb_bos_descriptor **bos);
41260484Sobrienvoid	libusb_free_bos_descriptor(struct libusb_bos_descriptor *bos);
41360484Sobrien
41460484Sobrien/* Asynchronous device I/O */
41560484Sobrien
41660484Sobrienstruct libusb_transfer *libusb_alloc_transfer(int iso_packets);
41760484Sobrienvoid	libusb_free_transfer(struct libusb_transfer *transfer);
41860484Sobrienint	libusb_submit_transfer(struct libusb_transfer *transfer);
41960484Sobrienint	libusb_cancel_transfer(struct libusb_transfer *transfer);
42060484Sobrienuint8_t *libusb_get_iso_packet_buffer(struct libusb_transfer *transfer, uint32_t index);
42160484Sobrienuint8_t *libusb_get_iso_packet_buffer_simple(struct libusb_transfer *transfer, uint32_t index);
42260484Sobrienvoid	libusb_set_iso_packet_lengths(struct libusb_transfer *transfer, uint32_t length);
42360484Sobrienuint8_t *libusb_control_transfer_get_data(struct libusb_transfer *transfer);
42460484Sobrienstruct libusb_control_setup *libusb_control_transfer_get_setup(struct libusb_transfer *transfer);
42560484Sobrienvoid	libusb_fill_control_setup(uint8_t *buf, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength);
42660484Sobrienvoid	libusb_fill_control_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t *buf, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout);
42760484Sobrienvoid	libusb_fill_bulk_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf, int length, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout);
42860484Sobrienvoid	libusb_fill_interrupt_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf, int length, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout);
42960484Sobrienvoid	libusb_fill_iso_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf, int length, int npacket, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout);
43060484Sobrien
43160484Sobrien/* Polling and timing */
43277298Sobrien
43360484Sobrienint	libusb_try_lock_events(libusb_context * ctx);
43460484Sobrienvoid	libusb_lock_events(libusb_context * ctx);
43560484Sobrienvoid	libusb_unlock_events(libusb_context * ctx);
43677298Sobrienint	libusb_event_handling_ok(libusb_context * ctx);
43760484Sobrienint	libusb_event_handler_active(libusb_context * ctx);
43860484Sobrienvoid	libusb_lock_event_waiters(libusb_context * ctx);
43960484Sobrienvoid	libusb_unlock_event_waiters(libusb_context * ctx);
44077298Sobrienint	libusb_wait_for_event(libusb_context * ctx, struct timeval *tv);
44160484Sobrienint	libusb_handle_events_timeout_completed(libusb_context * ctx, struct timeval *tv, int *completed);
44260484Sobrienint	libusb_handle_events_completed(libusb_context * ctx, int *completed);
44360484Sobrienint	libusb_handle_events_timeout(libusb_context * ctx, struct timeval *tv);
44460484Sobrienint	libusb_handle_events(libusb_context * ctx);
44560484Sobrienint	libusb_handle_events_locked(libusb_context * ctx, struct timeval *tv);
44660484Sobrienint	libusb_get_next_timeout(libusb_context * ctx, struct timeval *tv);
44760484Sobrienvoid	libusb_set_pollfd_notifiers(libusb_context * ctx, libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, void *user_data);
44860484Sobrienconst struct libusb_pollfd **libusb_get_pollfds(libusb_context * ctx);
44960484Sobrien
45060484Sobrien/* Synchronous device I/O */
45160484Sobrien
45260484Sobrienint	libusb_control_transfer(libusb_device_handle * devh, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *data, uint16_t wLength, uint32_t timeout);
45360484Sobrienint	libusb_bulk_transfer(libusb_device_handle * devh, uint8_t endpoint, uint8_t *data, int length, int *transferred, uint32_t timeout);
45460484Sobrienint	libusb_interrupt_transfer(libusb_device_handle * devh, uint8_t endpoint, uint8_t *data, int length, int *transferred, uint32_t timeout);
45560484Sobrien
45660484Sobrien/* Byte-order */
45760484Sobrien
45860484Sobrienuint16_t libusb_cpu_to_le16(uint16_t x);
45960484Sobrienuint16_t libusb_le16_to_cpu(uint16_t x);
46060484Sobrien
46177298Sobrien#if 0
46260484Sobrien{					/* indent fix */
46360484Sobrien#endif
46460484Sobrien#ifdef __cplusplus
46560484Sobrien}
46660484Sobrien
46760484Sobrien#endif
46860484Sobrien
46960484Sobrien#endif					/* __LIBUSB_H__ */
47060484Sobrien