libusb.h revision 277847
1224857Snwhitehorn/* $FreeBSD: stable/10/lib/libusb/libusb.h 277847 2015-01-28 19:49:53Z hselasky $ */
2224857Snwhitehorn/*-
3224857Snwhitehorn * Copyright (c) 2009 Sylvestre Gallon. All rights reserved.
4224857Snwhitehorn *
5224857Snwhitehorn * Redistribution and use in source and binary forms, with or without
6224857Snwhitehorn * modification, are permitted provided that the following conditions
7224857Snwhitehorn * are met:
8224857Snwhitehorn * 1. Redistributions of source code must retain the above copyright
9224857Snwhitehorn *    notice, this list of conditions and the following disclaimer.
10224857Snwhitehorn * 2. Redistributions in binary form must reproduce the above copyright
11224857Snwhitehorn *    notice, this list of conditions and the following disclaimer in the
12224857Snwhitehorn *    documentation and/or other materials provided with the distribution.
13224857Snwhitehorn *
14224857Snwhitehorn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15224857Snwhitehorn * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16224857Snwhitehorn * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17224857Snwhitehorn * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18224857Snwhitehorn * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19224857Snwhitehorn * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20224857Snwhitehorn * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21224857Snwhitehorn * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22224857Snwhitehorn * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23224857Snwhitehorn * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24224857Snwhitehorn * SUCH DAMAGE.
25224857Snwhitehorn */
26224857Snwhitehorn
27224857Snwhitehorn#ifndef __LIBUSB_H__
28224857Snwhitehorn#define	__LIBUSB_H__
29224857Snwhitehorn
30224857Snwhitehorn#ifndef LIBUSB_GLOBAL_INCLUDE_FILE
31224857Snwhitehorn#include <stdint.h>
32224857Snwhitehorn#include <sys/time.h>
33224857Snwhitehorn#include <sys/types.h>
34224857Snwhitehorn#endif
35224857Snwhitehorn
36224857Snwhitehorn#define	LIBUSB_CALL
37224857Snwhitehorn
38224857Snwhitehorn#ifdef __cplusplus
39224857Snwhitehornextern	"C" {
40224857Snwhitehorn#endif
41224857Snwhitehorn#if 0
42224857Snwhitehorn}					/* indent fix */
43224857Snwhitehorn
44224857Snwhitehorn#endif
45224857Snwhitehorn
46224857Snwhitehorn/* libusb enums */
47224857Snwhitehorn
48224857Snwhitehornenum libusb_class_code {
49224857Snwhitehorn	LIBUSB_CLASS_PER_INTERFACE = 0,
50224857Snwhitehorn	LIBUSB_CLASS_AUDIO = 1,
51224857Snwhitehorn	LIBUSB_CLASS_COMM = 2,
52224857Snwhitehorn	LIBUSB_CLASS_HID = 3,
53224857Snwhitehorn	LIBUSB_CLASS_PTP = 6,
54224857Snwhitehorn	LIBUSB_CLASS_IMAGE = 6,
55224857Snwhitehorn	LIBUSB_CLASS_PRINTER = 7,
56224857Snwhitehorn	LIBUSB_CLASS_MASS_STORAGE = 8,
57224857Snwhitehorn	LIBUSB_CLASS_HUB = 9,
58224857Snwhitehorn	LIBUSB_CLASS_DATA = 10,
59224857Snwhitehorn	LIBUSB_CLASS_SMART_CARD = 11,
60224857Snwhitehorn	LIBUSB_CLASS_CONTENT_SECURITY = 13,
61224857Snwhitehorn	LIBUSB_CLASS_VIDEO = 14,
62224857Snwhitehorn	LIBUSB_CLASS_PERSONAL_HEALTHCARE = 15,
63224857Snwhitehorn	LIBUSB_CLASS_DIAGNOSTIC_DEVICE = 0xdc,
64224857Snwhitehorn	LIBUSB_CLASS_WIRELESS = 0xe0,
65224857Snwhitehorn	LIBUSB_CLASS_APPLICATION = 0xfe,
66224857Snwhitehorn	LIBUSB_CLASS_VENDOR_SPEC = 0xff,
67224857Snwhitehorn};
68224857Snwhitehorn
69224857Snwhitehornenum libusb_descriptor_type {
70224857Snwhitehorn	LIBUSB_DT_DEVICE = 0x01,
71224857Snwhitehorn	LIBUSB_DT_CONFIG = 0x02,
72224857Snwhitehorn	LIBUSB_DT_STRING = 0x03,
73224857Snwhitehorn	LIBUSB_DT_INTERFACE = 0x04,
74224857Snwhitehorn	LIBUSB_DT_ENDPOINT = 0x05,
75224857Snwhitehorn	LIBUSB_DT_HID = 0x21,
76224857Snwhitehorn	LIBUSB_DT_REPORT = 0x22,
77224857Snwhitehorn	LIBUSB_DT_PHYSICAL = 0x23,
78224857Snwhitehorn	LIBUSB_DT_HUB = 0x29,
79224857Snwhitehorn	LIBUSB_DT_BOS = 0x0f,
80224857Snwhitehorn	LIBUSB_DT_DEVICE_CAPABILITY = 0x10,
81224857Snwhitehorn	LIBUSB_DT_SS_ENDPOINT_COMPANION = 0x30,
82224857Snwhitehorn};
83224857Snwhitehorn
84224857Snwhitehornenum libusb_device_capability_type {
85224857Snwhitehorn	LIBUSB_WIRELESS_USB_DEVICE_CAPABILITY = 0x1,
86224857Snwhitehorn	LIBUSB_USB_2_0_EXTENSION_DEVICE_CAPABILITY = 0x2,
87224857Snwhitehorn	LIBUSB_SS_USB_DEVICE_CAPABILITY = 0x3,
88224857Snwhitehorn	LIBUSB_CONTAINER_ID_DEVICE_CAPABILITY = 0x4,
89224857Snwhitehorn};
90224857Snwhitehorn
91224857Snwhitehorn#define	LIBUSB_DT_DEVICE_SIZE		18
92224857Snwhitehorn#define	LIBUSB_DT_CONFIG_SIZE		9
93224857Snwhitehorn#define	LIBUSB_DT_INTERFACE_SIZE	9
94224857Snwhitehorn#define	LIBUSB_DT_ENDPOINT_SIZE		7
95224857Snwhitehorn#define	LIBUSB_DT_ENDPOINT_AUDIO_SIZE	9
96224857Snwhitehorn#define	LIBUSB_DT_HUB_NONVAR_SIZE	7
97224857Snwhitehorn#define	LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE	6
98224857Snwhitehorn#define	LIBUSB_DT_BOS_SIZE		5
99224857Snwhitehorn#define	LIBUSB_USB_2_0_EXTENSION_DEVICE_CAPABILITY_SIZE	7
100224857Snwhitehorn#define	LIBUSB_SS_USB_DEVICE_CAPABILITY_SIZE	10
101224857Snwhitehorn
102224857Snwhitehorn#define	LIBUSB_ENDPOINT_ADDRESS_MASK	0x0f
103224857Snwhitehorn#define	LIBUSB_ENDPOINT_DIR_MASK	0x80
104224857Snwhitehorn
105224857Snwhitehornenum libusb_endpoint_direction {
106224857Snwhitehorn	LIBUSB_ENDPOINT_IN = 0x80,
107224857Snwhitehorn	LIBUSB_ENDPOINT_OUT = 0x00,
108224857Snwhitehorn};
109224857Snwhitehorn
110224857Snwhitehorn#define	LIBUSB_TRANSFER_TYPE_MASK	0x03
111224857Snwhitehorn
112224857Snwhitehornenum libusb_transfer_type {
113224857Snwhitehorn	LIBUSB_TRANSFER_TYPE_CONTROL = 0,
114224857Snwhitehorn	LIBUSB_TRANSFER_TYPE_ISOCHRONOUS = 1,
115224857Snwhitehorn	LIBUSB_TRANSFER_TYPE_BULK = 2,
116224857Snwhitehorn	LIBUSB_TRANSFER_TYPE_INTERRUPT = 3,
117224857Snwhitehorn};
118224857Snwhitehorn
119224857Snwhitehornenum libusb_standard_request {
120224857Snwhitehorn	LIBUSB_REQUEST_GET_STATUS = 0x00,
121224857Snwhitehorn	LIBUSB_REQUEST_CLEAR_FEATURE = 0x01,
122224857Snwhitehorn	LIBUSB_REQUEST_SET_FEATURE = 0x03,
123224857Snwhitehorn	LIBUSB_REQUEST_SET_ADDRESS = 0x05,
124224857Snwhitehorn	LIBUSB_REQUEST_GET_DESCRIPTOR = 0x06,
125224857Snwhitehorn	LIBUSB_REQUEST_SET_DESCRIPTOR = 0x07,
126224857Snwhitehorn	LIBUSB_REQUEST_GET_CONFIGURATION = 0x08,
127224857Snwhitehorn	LIBUSB_REQUEST_SET_CONFIGURATION = 0x09,
128224857Snwhitehorn	LIBUSB_REQUEST_GET_INTERFACE = 0x0A,
129224857Snwhitehorn	LIBUSB_REQUEST_SET_INTERFACE = 0x0B,
130224857Snwhitehorn	LIBUSB_REQUEST_SYNCH_FRAME = 0x0C,
131224857Snwhitehorn	LIBUSB_REQUEST_SET_SEL = 0x30,
132224857Snwhitehorn	LIBUSB_REQUEST_SET_ISOCH_DELAY = 0x31,
133224857Snwhitehorn};
134224857Snwhitehorn
135224857Snwhitehornenum libusb_request_type {
136224857Snwhitehorn	LIBUSB_REQUEST_TYPE_STANDARD = (0x00 << 5),
137224857Snwhitehorn	LIBUSB_REQUEST_TYPE_CLASS = (0x01 << 5),
138224857Snwhitehorn	LIBUSB_REQUEST_TYPE_VENDOR = (0x02 << 5),
139224857Snwhitehorn	LIBUSB_REQUEST_TYPE_RESERVED = (0x03 << 5),
140224857Snwhitehorn};
141224857Snwhitehorn
142224857Snwhitehornenum libusb_request_recipient {
143224857Snwhitehorn	LIBUSB_RECIPIENT_DEVICE = 0x00,
144224857Snwhitehorn	LIBUSB_RECIPIENT_INTERFACE = 0x01,
145224857Snwhitehorn	LIBUSB_RECIPIENT_ENDPOINT = 0x02,
146224857Snwhitehorn	LIBUSB_RECIPIENT_OTHER = 0x03,
147224857Snwhitehorn};
148224857Snwhitehorn
149224857Snwhitehorn#define	LIBUSB_ISO_SYNC_TYPE_MASK	0x0C
150224857Snwhitehorn
151224857Snwhitehornenum libusb_iso_sync_type {
152224857Snwhitehorn	LIBUSB_ISO_SYNC_TYPE_NONE = 0,
153224857Snwhitehorn	LIBUSB_ISO_SYNC_TYPE_ASYNC = 1,
154224857Snwhitehorn	LIBUSB_ISO_SYNC_TYPE_ADAPTIVE = 2,
155224857Snwhitehorn	LIBUSB_ISO_SYNC_TYPE_SYNC = 3,
156224857Snwhitehorn};
157224857Snwhitehorn
158224857Snwhitehorn#define	LIBUSB_ISO_USAGE_TYPE_MASK 0x30
159224857Snwhitehorn
160224857Snwhitehornenum libusb_iso_usage_type {
161224857Snwhitehorn	LIBUSB_ISO_USAGE_TYPE_DATA = 0,
162224857Snwhitehorn	LIBUSB_ISO_USAGE_TYPE_FEEDBACK = 1,
163224857Snwhitehorn	LIBUSB_ISO_USAGE_TYPE_IMPLICIT = 2,
164224857Snwhitehorn};
165224857Snwhitehorn
166224857Snwhitehornenum libusb_error {
167224857Snwhitehorn	LIBUSB_SUCCESS = 0,
168224857Snwhitehorn	LIBUSB_ERROR_IO = -1,
169224857Snwhitehorn	LIBUSB_ERROR_INVALID_PARAM = -2,
170224857Snwhitehorn	LIBUSB_ERROR_ACCESS = -3,
171224857Snwhitehorn	LIBUSB_ERROR_NO_DEVICE = -4,
172224857Snwhitehorn	LIBUSB_ERROR_NOT_FOUND = -5,
173224857Snwhitehorn	LIBUSB_ERROR_BUSY = -6,
174224857Snwhitehorn	LIBUSB_ERROR_TIMEOUT = -7,
175224857Snwhitehorn	LIBUSB_ERROR_OVERFLOW = -8,
176224857Snwhitehorn	LIBUSB_ERROR_PIPE = -9,
177224857Snwhitehorn	LIBUSB_ERROR_INTERRUPTED = -10,
178224857Snwhitehorn	LIBUSB_ERROR_NO_MEM = -11,
179224857Snwhitehorn	LIBUSB_ERROR_NOT_SUPPORTED = -12,
180224857Snwhitehorn	LIBUSB_ERROR_OTHER = -99,
181224857Snwhitehorn};
182224857Snwhitehorn
183224857Snwhitehornenum libusb_speed {
184224857Snwhitehorn	LIBUSB_SPEED_UNKNOWN = 0,
185224857Snwhitehorn	LIBUSB_SPEED_LOW = 1,
186224857Snwhitehorn	LIBUSB_SPEED_FULL = 2,
187224857Snwhitehorn	LIBUSB_SPEED_HIGH = 3,
188224857Snwhitehorn	LIBUSB_SPEED_SUPER = 4,
189224857Snwhitehorn};
190224857Snwhitehorn
191224857Snwhitehornenum libusb_transfer_status {
192224857Snwhitehorn	LIBUSB_TRANSFER_COMPLETED,
193224857Snwhitehorn	LIBUSB_TRANSFER_ERROR,
194224857Snwhitehorn	LIBUSB_TRANSFER_TIMED_OUT,
195224857Snwhitehorn	LIBUSB_TRANSFER_CANCELLED,
196224857Snwhitehorn	LIBUSB_TRANSFER_STALL,
197224857Snwhitehorn	LIBUSB_TRANSFER_NO_DEVICE,
198224857Snwhitehorn	LIBUSB_TRANSFER_OVERFLOW,
199224857Snwhitehorn};
200224857Snwhitehorn
201224857Snwhitehornenum libusb_transfer_flags {
202224857Snwhitehorn	LIBUSB_TRANSFER_SHORT_NOT_OK = 1 << 0,
203224857Snwhitehorn	LIBUSB_TRANSFER_FREE_BUFFER = 1 << 1,
204224857Snwhitehorn	LIBUSB_TRANSFER_FREE_TRANSFER = 1 << 2,
205224857Snwhitehorn};
206224857Snwhitehorn
207224857Snwhitehornenum libusb_log_level {
208224857Snwhitehorn       LIBUSB_LOG_LEVEL_NONE = 0,
209224857Snwhitehorn       LIBUSB_LOG_LEVEL_ERROR,
210224857Snwhitehorn       LIBUSB_LOG_LEVEL_WARNING,
211224857Snwhitehorn       LIBUSB_LOG_LEVEL_INFO,
212224857Snwhitehorn       LIBUSB_LOG_LEVEL_DEBUG
213224857Snwhitehorn};
214224857Snwhitehorn
215224857Snwhitehorn/* XXX */
216224857Snwhitehorn/* libusb_set_debug should take parameters from libusb_log_level
217224857Snwhitehorn * above according to
218224857Snwhitehorn *   http://libusb.sourceforge.net/api-1.0/group__lib.html
219224857Snwhitehorn */
220224857Snwhitehornenum libusb_debug_level {
221224857Snwhitehorn	LIBUSB_DEBUG_NO=0,
222224857Snwhitehorn	LIBUSB_DEBUG_FUNCTION=1,
223224857Snwhitehorn	LIBUSB_DEBUG_TRANSFER=2,
224224857Snwhitehorn};
225224857Snwhitehorn
226224857Snwhitehorn/* libusb structures */
227224857Snwhitehorn
228224857Snwhitehornstruct libusb_context;
229224857Snwhitehornstruct libusb_device;
230224857Snwhitehornstruct libusb_transfer;
231224857Snwhitehornstruct libusb_device_handle;
232224857Snwhitehorn
233224857Snwhitehornstruct libusb_pollfd {
234224857Snwhitehorn	int	fd;
235224857Snwhitehorn	short	events;
236224857Snwhitehorn};
237224857Snwhitehorn
238224857Snwhitehorntypedef struct libusb_context libusb_context;
239224857Snwhitehorntypedef struct libusb_device libusb_device;
240224857Snwhitehorntypedef struct libusb_device_handle libusb_device_handle;
241224857Snwhitehorntypedef struct libusb_pollfd libusb_pollfd;
242224857Snwhitehorntypedef void (*libusb_pollfd_added_cb) (int fd, short events, void *user_data);
243224857Snwhitehorntypedef void (*libusb_pollfd_removed_cb) (int fd, void *user_data);
244224857Snwhitehorn
245224857Snwhitehorntypedef struct libusb_device_descriptor {
246224857Snwhitehorn	uint8_t	bLength;
247224857Snwhitehorn	uint8_t	bDescriptorType;
248224857Snwhitehorn	uint16_t bcdUSB;
249224857Snwhitehorn	uint8_t	bDeviceClass;
250224857Snwhitehorn	uint8_t	bDeviceSubClass;
251224857Snwhitehorn	uint8_t	bDeviceProtocol;
252224857Snwhitehorn	uint8_t	bMaxPacketSize0;
253224857Snwhitehorn	uint16_t idVendor;
254224857Snwhitehorn	uint16_t idProduct;
255224857Snwhitehorn	uint16_t bcdDevice;
256224857Snwhitehorn	uint8_t	iManufacturer;
257224857Snwhitehorn	uint8_t	iProduct;
258224857Snwhitehorn	uint8_t	iSerialNumber;
259224857Snwhitehorn	uint8_t	bNumConfigurations;
260224857Snwhitehorn}	libusb_device_descriptor;
261224857Snwhitehorn
262224857Snwhitehorntypedef struct libusb_endpoint_descriptor {
263224857Snwhitehorn	uint8_t	bLength;
264224857Snwhitehorn	uint8_t	bDescriptorType;
265224857Snwhitehorn	uint8_t	bEndpointAddress;
266224857Snwhitehorn	uint8_t	bmAttributes;
267224857Snwhitehorn	uint16_t wMaxPacketSize;
268224857Snwhitehorn	uint8_t	bInterval;
269224857Snwhitehorn	uint8_t	bRefresh;
270224857Snwhitehorn	uint8_t	bSynchAddress;
271224857Snwhitehorn	uint8_t *extra;
272224857Snwhitehorn	int	extra_length;
273224857Snwhitehorn}	libusb_endpoint_descriptor __aligned(sizeof(void *));
274224857Snwhitehorn
275224857Snwhitehorntypedef struct libusb_ss_endpoint_companion_descriptor {
276224857Snwhitehorn	uint8_t bLength;
277224857Snwhitehorn	uint8_t bDescriptorType;
278224857Snwhitehorn	uint8_t bMaxBurst;
279224857Snwhitehorn	uint8_t bmAttributes;
280224857Snwhitehorn	uint16_t wBytesPerInterval;
281224857Snwhitehorn}	libusb_ss_endpoint_companion_descriptor __aligned(sizeof(void *));
282224857Snwhitehorn
283224857Snwhitehorntypedef struct libusb_interface_descriptor {
284224857Snwhitehorn	uint8_t	bLength;
285224857Snwhitehorn	uint8_t	bDescriptorType;
286224857Snwhitehorn	uint8_t	bInterfaceNumber;
287224857Snwhitehorn	uint8_t	bAlternateSetting;
288224857Snwhitehorn	uint8_t	bNumEndpoints;
289224857Snwhitehorn	uint8_t	bInterfaceClass;
290224857Snwhitehorn	uint8_t	bInterfaceSubClass;
291224857Snwhitehorn	uint8_t	bInterfaceProtocol;
292224857Snwhitehorn	uint8_t	iInterface;
293224857Snwhitehorn	struct libusb_endpoint_descriptor *endpoint;
294224857Snwhitehorn	uint8_t *extra;
295224857Snwhitehorn	int	extra_length;
296224857Snwhitehorn}	libusb_interface_descriptor __aligned(sizeof(void *));
297224857Snwhitehorn
298224857Snwhitehorntypedef struct libusb_interface {
299224857Snwhitehorn	struct libusb_interface_descriptor *altsetting;
300224857Snwhitehorn	int	num_altsetting;
301224857Snwhitehorn}	libusb_interface __aligned(sizeof(void *));
302224857Snwhitehorn
303224857Snwhitehorntypedef struct libusb_config_descriptor {
304224857Snwhitehorn	uint8_t	bLength;
305224857Snwhitehorn	uint8_t	bDescriptorType;
306224857Snwhitehorn	uint16_t wTotalLength;
307224857Snwhitehorn	uint8_t	bNumInterfaces;
308224857Snwhitehorn	uint8_t	bConfigurationValue;
309224857Snwhitehorn	uint8_t	iConfiguration;
310224857Snwhitehorn	uint8_t	bmAttributes;
311224857Snwhitehorn	uint8_t	MaxPower;
312224857Snwhitehorn	struct libusb_interface *interface;
313224857Snwhitehorn	uint8_t *extra;
314224857Snwhitehorn	int	extra_length;
315224857Snwhitehorn}	libusb_config_descriptor __aligned(sizeof(void *));
316224857Snwhitehorn
317224857Snwhitehorntypedef struct libusb_usb_2_0_device_capability_descriptor {
318224857Snwhitehorn	uint8_t bLength;
319224857Snwhitehorn	uint8_t bDescriptorType;
320224857Snwhitehorn	uint8_t bDevCapabilityType;
321224857Snwhitehorn	uint32_t bmAttributes;
322224857Snwhitehorn#define LIBUSB_USB_2_0_CAPABILITY_LPM_SUPPORT  (1 << 1)
323224857Snwhitehorn}	libusb_usb_2_0_device_capability_descriptor __aligned(sizeof(void *));
324224857Snwhitehorn
325224857Snwhitehorntypedef struct libusb_ss_usb_device_capability_descriptor {
326224857Snwhitehorn	uint8_t bLength;
327224857Snwhitehorn	uint8_t bDescriptorType;
328224857Snwhitehorn	uint8_t bDevCapabilityType;
329224857Snwhitehorn	uint8_t bmAttributes;
330224857Snwhitehorn#define LIBUSB_SS_USB_CAPABILITY_LPM_SUPPORT   (1 << 1)
331224857Snwhitehorn	uint16_t wSpeedSupported;
332224857Snwhitehorn#define LIBUSB_CAPABILITY_LOW_SPEED_OPERATION  (1)
333224857Snwhitehorn#define LIBUSB_CAPABILITY_FULL_SPEED_OPERATION (1 << 1)
334224857Snwhitehorn#define LIBUSB_CAPABILITY_HIGH_SPEED_OPERATION (1 << 2)
335224857Snwhitehorn#define LIBUSB_CAPABILITY_5GBPS_OPERATION      (1 << 3)
336224857Snwhitehorn	uint8_t bFunctionalitySupport;
337224857Snwhitehorn	uint8_t bU1DevExitLat;
338224857Snwhitehorn	uint16_t wU2DevExitLat;
339224857Snwhitehorn}	libusb_ss_usb_device_capability_descriptor __aligned(sizeof(void *));
340224857Snwhitehorn
341224857Snwhitehorntypedef struct libusb_bos_descriptor {
342224857Snwhitehorn	uint8_t bLength;
343224857Snwhitehorn	uint8_t bDescriptorType;
344224857Snwhitehorn	uint16_t wTotalLength;
345224857Snwhitehorn	uint8_t bNumDeviceCapabilities;
346224857Snwhitehorn	struct libusb_usb_2_0_device_capability_descriptor *usb_2_0_ext_cap;
347224857Snwhitehorn	struct libusb_ss_usb_device_capability_descriptor *ss_usb_cap;
348224857Snwhitehorn}	libusb_bos_descriptor __aligned(sizeof(void *));
349224857Snwhitehorn
350224857Snwhitehorntypedef struct libusb_control_setup {
351224857Snwhitehorn	uint8_t	bmRequestType;
352224857Snwhitehorn	uint8_t	bRequest;
353224857Snwhitehorn	uint16_t wValue;
354224857Snwhitehorn	uint16_t wIndex;
355224857Snwhitehorn	uint16_t wLength;
356224857Snwhitehorn}	libusb_control_setup;
357224857Snwhitehorn
358224857Snwhitehorn#define	LIBUSB_CONTROL_SETUP_SIZE	8	/* bytes */
359224857Snwhitehorn
360224857Snwhitehorntypedef struct libusb_iso_packet_descriptor {
361224857Snwhitehorn	uint32_t length;
362224857Snwhitehorn	uint32_t actual_length;
363224857Snwhitehorn	enum libusb_transfer_status status;
364224857Snwhitehorn}	libusb_iso_packet_descriptor __aligned(sizeof(void *));
365224857Snwhitehorn
366224857Snwhitehorntypedef void (*libusb_transfer_cb_fn) (struct libusb_transfer *transfer);
367224857Snwhitehorn
368224857Snwhitehorntypedef struct libusb_transfer {
369224857Snwhitehorn	libusb_device_handle *dev_handle;
370224857Snwhitehorn	uint8_t	flags;
371224857Snwhitehorn	uint8_t endpoint;
372251874Sscottl	uint8_t type;
373251874Sscottl	uint32_t timeout;
374224857Snwhitehorn	enum libusb_transfer_status status;
375224857Snwhitehorn	int	length;
376224857Snwhitehorn	int	actual_length;
377224857Snwhitehorn	libusb_transfer_cb_fn callback;
378224857Snwhitehorn	void   *user_data;
379224857Snwhitehorn	uint8_t *buffer;
380224857Snwhitehorn	int	num_iso_packets;
381224857Snwhitehorn	struct libusb_iso_packet_descriptor iso_packet_desc[0];
382224857Snwhitehorn}	libusb_transfer __aligned(sizeof(void *));
383224857Snwhitehorn
384224857Snwhitehorn/* Library initialisation */
385224857Snwhitehorn
386224857Snwhitehornvoid	libusb_set_debug(libusb_context * ctx, int level);
387224857Snwhitehornconst char *libusb_strerror(int code);
388224857Snwhitehornconst char *libusb_error_name(int code);
389224857Snwhitehornint	libusb_init(libusb_context ** context);
390224857Snwhitehornvoid	libusb_exit(struct libusb_context *ctx);
391224857Snwhitehorn
392224857Snwhitehorn/* Device handling and enumeration */
393224857Snwhitehorn
394224857Snwhitehornssize_t libusb_get_device_list(libusb_context * ctx, libusb_device *** list);
395224857Snwhitehornvoid	libusb_free_device_list(libusb_device ** list, int unref_devices);
396224857Snwhitehornuint8_t	libusb_get_bus_number(libusb_device * dev);
397224857Snwhitehornint	libusb_get_port_numbers(libusb_device *dev, uint8_t *buf, uint8_t bufsize);
398224857Snwhitehornint	libusb_get_port_path(libusb_context *ctx, libusb_device *dev, uint8_t *buf, uint8_t bufsize);
399224857Snwhitehornuint8_t	libusb_get_device_address(libusb_device * dev);
400224857Snwhitehornenum libusb_speed libusb_get_device_speed(libusb_device * dev);
401224857Snwhitehornint	libusb_clear_halt(libusb_device_handle *devh, uint8_t endpoint);
402224857Snwhitehornint	libusb_get_max_packet_size(libusb_device * dev, uint8_t endpoint);
403224857Snwhitehornint	libusb_get_max_iso_packet_size(libusb_device * dev, uint8_t endpoint);
404224857Snwhitehornlibusb_device *libusb_ref_device(libusb_device * dev);
405224857Snwhitehornvoid	libusb_unref_device(libusb_device * dev);
406224857Snwhitehornint	libusb_open(libusb_device * dev, libusb_device_handle ** devh);
407224857Snwhitehornlibusb_device_handle *libusb_open_device_with_vid_pid(libusb_context * ctx, uint16_t vendor_id, uint16_t product_id);
408224857Snwhitehornvoid	libusb_close(libusb_device_handle * devh);
409224857Snwhitehornlibusb_device *libusb_get_device(libusb_device_handle * devh);
410224857Snwhitehornint	libusb_get_configuration(libusb_device_handle * devh, int *config);
411224857Snwhitehornint	libusb_set_configuration(libusb_device_handle * devh, int configuration);
412224857Snwhitehornint	libusb_claim_interface(libusb_device_handle * devh, int interface_number);
413224857Snwhitehornint	libusb_release_interface(libusb_device_handle * devh, int interface_number);
414224857Snwhitehornint	libusb_reset_device(libusb_device_handle * devh);
415224857Snwhitehornint	libusb_check_connected(libusb_device_handle * devh);
416224857Snwhitehornint 	libusb_kernel_driver_active(libusb_device_handle * devh, int interface);
417224857Snwhitehornint	libusb_get_driver_np(libusb_device_handle * devh, int interface, char *name, int namelen);
418224857Snwhitehornint	libusb_get_driver(libusb_device_handle * devh, int interface, char *name, int namelen);
419224857Snwhitehornint 	libusb_detach_kernel_driver_np(libusb_device_handle * devh, int interface);
420224857Snwhitehornint 	libusb_detach_kernel_driver(libusb_device_handle * devh, int interface);
421224857Snwhitehornint 	libusb_attach_kernel_driver(libusb_device_handle * devh, int interface);
422224857Snwhitehornint	libusb_set_interface_alt_setting(libusb_device_handle * devh, int interface_number, int alternate_setting);
423224857Snwhitehorn
424224857Snwhitehorn/* USB Descriptors */
425224857Snwhitehorn
426224857Snwhitehornint	libusb_get_device_descriptor(libusb_device * dev, struct libusb_device_descriptor *desc);
427224857Snwhitehornint	libusb_get_active_config_descriptor(libusb_device * dev, struct libusb_config_descriptor **config);
428224857Snwhitehornint	libusb_get_config_descriptor(libusb_device * dev, uint8_t config_index, struct libusb_config_descriptor **config);
429224857Snwhitehornint	libusb_get_config_descriptor_by_value(libusb_device * dev, uint8_t bConfigurationValue, struct libusb_config_descriptor **config);
430224857Snwhitehornvoid	libusb_free_config_descriptor(struct libusb_config_descriptor *config);
431224857Snwhitehornint	libusb_get_string_descriptor(libusb_device_handle * devh, uint8_t desc_index, uint16_t langid, unsigned char *data, int length);
432224857Snwhitehornint	libusb_get_string_descriptor_ascii(libusb_device_handle * devh, uint8_t desc_index, uint8_t *data, int length);
433224857Snwhitehornint	libusb_get_descriptor(libusb_device_handle * devh, uint8_t desc_type, uint8_t desc_index, uint8_t *data, int length);
434224857Snwhitehornint	libusb_parse_ss_endpoint_comp(const void *buf, int len, struct libusb_ss_endpoint_companion_descriptor **ep_comp);
435224857Snwhitehornvoid	libusb_free_ss_endpoint_comp(struct libusb_ss_endpoint_companion_descriptor *ep_comp);
436224857Snwhitehornint	libusb_parse_bos_descriptor(const void *buf, int len, struct libusb_bos_descriptor **bos);
437224857Snwhitehornvoid	libusb_free_bos_descriptor(struct libusb_bos_descriptor *bos);
438224857Snwhitehorn
439224857Snwhitehorn/* Asynchronous device I/O */
440224857Snwhitehorn
441224857Snwhitehornstruct libusb_transfer *libusb_alloc_transfer(int iso_packets);
442224857Snwhitehornvoid	libusb_free_transfer(struct libusb_transfer *transfer);
443224857Snwhitehornint	libusb_submit_transfer(struct libusb_transfer *transfer);
444224857Snwhitehornint	libusb_cancel_transfer(struct libusb_transfer *transfer);
445224857Snwhitehornuint8_t *libusb_get_iso_packet_buffer(struct libusb_transfer *transfer, uint32_t index);
446224857Snwhitehornuint8_t *libusb_get_iso_packet_buffer_simple(struct libusb_transfer *transfer, uint32_t index);
447224857Snwhitehornvoid	libusb_set_iso_packet_lengths(struct libusb_transfer *transfer, uint32_t length);
448224857Snwhitehornuint8_t *libusb_control_transfer_get_data(struct libusb_transfer *transfer);
449224857Snwhitehornstruct libusb_control_setup *libusb_control_transfer_get_setup(struct libusb_transfer *transfer);
450224857Snwhitehornvoid	libusb_fill_control_setup(uint8_t *buf, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength);
451224857Snwhitehornvoid	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);
452224857Snwhitehornvoid	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);
453224857Snwhitehornvoid	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);
454224857Snwhitehornvoid	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);
455224857Snwhitehorn
456224857Snwhitehorn/* Polling and timing */
457224857Snwhitehorn
458224857Snwhitehornint	libusb_try_lock_events(libusb_context * ctx);
459224857Snwhitehornvoid	libusb_lock_events(libusb_context * ctx);
460224857Snwhitehornvoid	libusb_unlock_events(libusb_context * ctx);
461224857Snwhitehornint	libusb_event_handling_ok(libusb_context * ctx);
462224857Snwhitehornint	libusb_event_handler_active(libusb_context * ctx);
463224857Snwhitehornvoid	libusb_lock_event_waiters(libusb_context * ctx);
464224857Snwhitehornvoid	libusb_unlock_event_waiters(libusb_context * ctx);
465224857Snwhitehornint	libusb_wait_for_event(libusb_context * ctx, struct timeval *tv);
466224857Snwhitehornint	libusb_handle_events_timeout_completed(libusb_context * ctx, struct timeval *tv, int *completed);
467224857Snwhitehornint	libusb_handle_events_completed(libusb_context * ctx, int *completed);
468224857Snwhitehornint	libusb_handle_events_timeout(libusb_context * ctx, struct timeval *tv);
469224857Snwhitehornint	libusb_handle_events(libusb_context * ctx);
470224857Snwhitehornint	libusb_handle_events_locked(libusb_context * ctx, struct timeval *tv);
471224857Snwhitehornint	libusb_get_next_timeout(libusb_context * ctx, struct timeval *tv);
472224857Snwhitehornvoid	libusb_set_pollfd_notifiers(libusb_context * ctx, libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, void *user_data);
473224857Snwhitehornconst struct libusb_pollfd **libusb_get_pollfds(libusb_context * ctx);
474224857Snwhitehorn
475224857Snwhitehorn/* Synchronous device I/O */
476224857Snwhitehorn
477224857Snwhitehornint	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);
478224857Snwhitehornint	libusb_bulk_transfer(libusb_device_handle * devh, uint8_t endpoint, uint8_t *data, int length, int *transferred, uint32_t timeout);
479224857Snwhitehornint	libusb_interrupt_transfer(libusb_device_handle * devh, uint8_t endpoint, uint8_t *data, int length, int *transferred, uint32_t timeout);
480224857Snwhitehorn
481224857Snwhitehorn/* Byte-order */
482224857Snwhitehorn
483224857Snwhitehornuint16_t libusb_cpu_to_le16(uint16_t x);
484224857Snwhitehornuint16_t libusb_le16_to_cpu(uint16_t x);
485224857Snwhitehorn
486224857Snwhitehorn#if 0
487224857Snwhitehorn{					/* indent fix */
488224857Snwhitehorn#endif
489224857Snwhitehorn#ifdef __cplusplus
490224857Snwhitehorn}
491224857Snwhitehorn
492224857Snwhitehorn#endif
493224857Snwhitehorn
494224857Snwhitehorn#endif					/* __LIBUSB_H__ */
495224857Snwhitehorn