libusb_sys_wishbone_tool/
lib.rs

1#![allow(non_camel_case_types)]
2
3extern crate libc;
4
5use libc::{
6    c_void, c_int, c_uint, c_char, c_uchar, c_short, intptr_t,
7    size_t, ssize_t, timeval,
8};
9
10
11#[repr(C)]
12pub struct libusb_context {
13    __private: c_void
14}
15
16#[repr(C)]
17pub struct libusb_device {
18    __private: c_void
19}
20
21#[repr(C)]
22pub struct libusb_device_handle {
23    __private: c_void
24}
25
26#[repr(C)]
27pub struct libusb_version {
28    pub major: u16,
29    pub minor: u16,
30    pub micro: u16,
31    pub nano: u16,
32    pub rc: *const c_char,
33    pub describe: *const c_char,
34}
35
36#[allow(non_snake_case)]
37#[repr(C)]
38pub struct libusb_device_descriptor {
39    pub bLength: u8,
40    pub bDescriptorType: u8,
41    pub bcdUSB: u16,
42    pub bDeviceClass: u8,
43    pub bDeviceSubClass: u8,
44    pub bDeviceProtocol: u8,
45    pub bMaxPacketSize0: u8,
46    pub idVendor: u16,
47    pub idProduct: u16,
48    pub bcdDevice: u16,
49    pub iManufacturer: u8,
50    pub iProduct: u8,
51    pub iSerialNumber: u8,
52    pub bNumConfigurations: u8,
53}
54
55#[allow(non_snake_case)]
56#[repr(C)]
57pub struct libusb_config_descriptor {
58    pub bLength: u8,
59    pub bDescriptorType: u8,
60    pub wTotalLength: u16,
61    pub bNumInterfaces: u8,
62    pub bConfigurationValue: u8,
63    pub iConfiguration: u8,
64    pub bmAttributes: u8,
65    pub bMaxPower: u8,
66    pub interface: *const libusb_interface,
67    pub extra: *const c_uchar,
68    pub extra_length: c_int,
69}
70
71#[repr(C)]
72pub struct libusb_interface {
73    pub altsetting: *const libusb_interface_descriptor,
74    pub num_altsetting: c_int,
75}
76
77#[allow(non_snake_case)]
78#[repr(C)]
79pub struct libusb_interface_descriptor {
80    pub bLength: u8,
81    pub bDescriptorType: u8,
82    pub bInterfaceNumber: u8,
83    pub bAlternateSetting: u8,
84    pub bNumEndpoints: u8,
85    pub bInterfaceClass: u8,
86    pub bInterfaceSubClass: u8,
87    pub bInterfaceProtocol: u8,
88    pub iInterface: u8,
89    pub endpoint: *const libusb_endpoint_descriptor,
90    pub extra: *const c_uchar,
91    pub extra_length: c_int,
92}
93
94#[allow(non_snake_case)]
95#[repr(C)]
96pub struct libusb_endpoint_descriptor {
97    pub bLength: u8,
98    pub bDescriptorType: u8,
99    pub bEndpointAddress: u8,
100    pub bmAttributes: u8,
101    pub wMaxPacketSize: u16,
102    pub bInterval: u8,
103    pub bRefresh: u8,
104    pub bSynchAddress: u8,
105    pub extra: *const c_uchar,
106    pub extra_length: c_int,
107}
108
109#[repr(C)]
110pub struct libusb_iso_packet_descriptor {
111    pub length: c_uint,
112    pub actual_length: c_uint,
113    pub status: c_int,
114}
115
116#[allow(non_snake_case)]
117#[repr(C)]
118pub struct libusb_ss_endpoint_companion_descriptor {
119    pub bLength: u8,
120    pub bDescriptorType: u8,
121    pub bMaxBurst: u8,
122    pub bmAttributes: u8,
123    pub wBytesPerInterval: u16,
124}
125
126#[allow(non_snake_case)]
127#[repr(C)]
128pub struct libusb_bos_dev_capability_descriptor {
129    pub bLength: u8,
130    pub bDescriptorType: u8,
131    pub bDevCapabilityType: u8,
132}
133
134#[allow(non_snake_case)]
135#[repr(C)]
136pub struct libusb_bos_descriptor {
137    pub bLength: u8,
138    pub bDescriptorType: u8,
139    pub wTotalLength: u16,
140    pub bNumDeviceCaps: u8,
141}
142
143#[allow(non_snake_case)]
144#[repr(C)]
145pub struct libusb_usb_2_0_extension_descriptor {
146    pub bLength: u8,
147    pub bDescriptorType: u8,
148    pub bDevCapabilityType: u8,
149    pub bmAttributes: u32,
150}
151
152#[allow(non_snake_case)]
153#[repr(C)]
154pub struct libusb_ss_usb_device_capability_descriptor {
155    pub bLength: u8,
156    pub bDescriptorType: u8,
157    pub bDevCapabilityType: u8,
158    pub bmAttributes: u8,
159    pub wSpeedSupported: u16,
160    pub bFunctionalitySupport: u8,
161    pub bU1DevExitLat: u8,
162    pub bU2DevExitLat: u8,
163}
164
165#[allow(non_snake_case)]
166#[repr(C)]
167pub struct libusb_container_id_descriptor {
168    pub bLength: u8,
169    pub bDescriptorType: u8,
170    pub bDevCapabilityType: u8,
171    pub bReserved: u8,
172    pub ContainerId: [u8; 16],
173}
174
175#[repr(C)]
176pub struct libusb_transfer {
177    pub dev_handle: *mut libusb_device_handle,
178    pub flags: u8,
179    pub endpoint: c_uchar,
180    pub transfer_type: c_uchar,
181    pub timeout: c_uint,
182    pub status: c_int,
183    pub length: c_int,
184    pub actual_length: c_int,
185    pub callback: libusb_transfer_cb_fn,
186    pub user_data: *mut c_void,
187    pub buffer: *mut c_uchar,
188    pub num_iso_packets: c_int,
189    pub iso_packet_desc: [libusb_iso_packet_descriptor; 0],
190}
191
192#[repr(C)]
193pub struct libusb_pollfd {
194    pub fd: c_int,
195    pub events: c_short,
196}
197
198pub type libusb_transfer_cb_fn = extern "C" fn(*mut libusb_transfer);
199pub type libusb_pollfd_added_cb = extern "C" fn(c_int, c_short, *mut c_void);
200pub type libusb_pollfd_removed_cb = extern "C" fn(c_int, *mut c_void);
201
202// libusb_error
203pub const LIBUSB_SUCCESS:             c_int = 0;
204pub const LIBUSB_ERROR_IO:            c_int = -1;
205pub const LIBUSB_ERROR_INVALID_PARAM: c_int = -2;
206pub const LIBUSB_ERROR_ACCESS:        c_int = -3;
207pub const LIBUSB_ERROR_NO_DEVICE:     c_int = -4;
208pub const LIBUSB_ERROR_NOT_FOUND:     c_int = -5;
209pub const LIBUSB_ERROR_BUSY:          c_int = -6;
210pub const LIBUSB_ERROR_TIMEOUT:       c_int = -7;
211pub const LIBUSB_ERROR_OVERFLOW:      c_int = -8;
212pub const LIBUSB_ERROR_PIPE:          c_int = -9;
213pub const LIBUSB_ERROR_INTERRUPTED:   c_int = -10;
214pub const LIBUSB_ERROR_NO_MEM:        c_int = -11;
215pub const LIBUSB_ERROR_NOT_SUPPORTED: c_int = -12;
216pub const LIBUSB_ERROR_OTHER:         c_int = -99;
217
218// libusb_transfer_status
219pub const LIBUSB_TRANSFER_COMPLETED:  c_int = 0;
220pub const LIBUSB_TRANSFER_ERROR:      c_int = 1;
221pub const LIBUSB_TRANSFER_TIMED_OUT:  c_int = 2;
222pub const LIBUSB_TRANSFER_CANCELLED:  c_int = 3;
223pub const LIBUSB_TRANSFER_STALL:      c_int = 4;
224pub const LIBUSB_TRANSFER_NO_DEVICE:  c_int = 5;
225pub const LIBUSB_TRANSFER_OVERFLOW:   c_int = 6;
226
227pub const LIBUSB_TRANSFER_SHORT_NOT_OK:    u8 = 1;
228pub const LIBUSB_TRANSFER_FREE_BUFFER :    u8 = 1<<1;
229pub const LIBUSB_TRANSFER_FREE_TRANSFER :  u8 = 1<<2;
230pub const LIBUSB_TRANSFER_ADD_ZERO_PACKET: u8 = 1<<3;
231
232// libusb_capability
233pub const LIBUSB_CAP_HAS_CAPABILITY:                u32 = 0x0000;
234pub const LIBUSB_CAP_HAS_HOTPLUG:                   u32 = 0x0001;
235pub const LIBUSB_CAP_HAS_HID_ACCESS:                u32 = 0x0100;
236pub const LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER: u32 = 0x0101;
237
238
239//// libusb_log_level
240pub const LIBUSB_LOG_LEVEL_NONE:    c_int = 0;
241pub const LIBUSB_LOG_LEVEL_ERROR:   c_int = 1;
242pub const LIBUSB_LOG_LEVEL_WARNING: c_int = 2;
243pub const LIBUSB_LOG_LEVEL_INFO:    c_int = 3;
244pub const LIBUSB_LOG_LEVEL_DEBUG:   c_int = 4;
245
246//// libusb_log_cb_mode
247pub const LIBUSB_LOG_CG_GLOBAL:    u8 = 1;
248pub const LIBUSB_LOG_CG_CONTEXT:   u8 = 1 << 1;
249
250
251// libusb_class_code
252pub const LIBUSB_CLASS_PER_INTERFACE:       u8 = 0;
253pub const LIBUSB_CLASS_AUDIO:               u8 = 1;
254pub const LIBUSB_CLASS_COMM:                u8 = 2;
255pub const LIBUSB_CLASS_HID:                 u8 = 3;
256pub const LIBUSB_CLASS_PHYSICAL:            u8 = 5;
257pub const LIBUSB_CLASS_PRINTER:             u8 = 7;
258pub const LIBUSB_CLASS_IMAGE:               u8 = 6;
259pub const LIBUSB_CLASS_MASS_STORAGE:        u8 = 8;
260pub const LIBUSB_CLASS_HUB:                 u8 = 9;
261pub const LIBUSB_CLASS_DATA:                u8 = 10;
262pub const LIBUSB_CLASS_SMART_CARD:          u8 = 0x0B;
263pub const LIBUSB_CLASS_CONTENT_SECURITY:    u8 = 0x0D;
264pub const LIBUSB_CLASS_VIDEO:               u8 = 0x0E;
265pub const LIBUSB_CLASS_PERSONAL_HEALTHCARE: u8 = 0x0F;
266pub const LIBUSB_CLASS_DIAGNOSTIC_DEVICE:   u8 = 0xDC;
267pub const LIBUSB_CLASS_WIRELESS:            u8 = 0xE0;
268pub const LIBUSB_CLASS_APPLICATION:         u8 = 0xFE;
269pub const LIBUSB_CLASS_VENDOR_SPEC:         u8 = 0xFF;
270
271
272// libusb_speed
273pub const LIBUSB_SPEED_UNKNOWN:      c_int = 0;
274pub const LIBUSB_SPEED_LOW:          c_int = 1;
275pub const LIBUSB_SPEED_FULL:         c_int = 2;
276pub const LIBUSB_SPEED_HIGH:         c_int = 3;
277pub const LIBUSB_SPEED_SUPER:        c_int = 4;
278pub const LIBUSB_SPEED_SUPER_PLUS:   c_int = 5;
279
280
281// libusb_descriptor_type
282pub const LIBUSB_DT_DEVICE:                u8 = 0x01;
283pub const LIBUSB_DT_CONFIG:                u8 = 0x02;
284pub const LIBUSB_DT_STRING:                u8 = 0x03;
285pub const LIBUSB_DT_INTERFACE:             u8 = 0x04;
286pub const LIBUSB_DT_ENDPOINT:              u8 = 0x05;
287pub const LIBUSB_DT_BOS:                   u8 = 0x0F;
288pub const LIBUSB_DT_DEVICE_CAPABILITY:     u8 = 0x10;
289pub const LIBUSB_DT_HID:                   u8 = 0x21;
290pub const LIBUSB_DT_REPORT:                u8 = 0x22;
291pub const LIBUSB_DT_PHYSICAL:              u8 = 0x23;
292pub const LIBUSB_DT_HUB:                   u8 = 0x29;
293pub const LIBUSB_DT_SUPERSPEED_HUB:        u8 = 0x2A;
294pub const LIBUSB_DT_SS_ENDPOINT_COMPANION: u8 = 0x30;
295
296
297// libusb_endpoint_direction
298pub const LIBUSB_ENDPOINT_ADDRESS_MASK: u8 = 0x0F;
299pub const LIBUSB_ENDPOINT_DIR_MASK:     u8 = 0x80;
300pub const LIBUSB_ENDPOINT_IN:           u8 = 0x80;
301pub const LIBUSB_ENDPOINT_OUT:          u8 = 0x00;
302
303
304// libusb_transfer_type
305pub const LIBUSB_TRANSFER_TYPE_MASK:        u8 = 0x03;
306pub const LIBUSB_TRANSFER_TYPE_CONTROL:     u8 = 0;
307pub const LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: u8 = 1;
308pub const LIBUSB_TRANSFER_TYPE_BULK:        u8 = 2;
309pub const LIBUSB_TRANSFER_TYPE_INTERRUPT:   u8 = 3;
310pub const LIBUSB_TRANSFER_TYPE_BULK_STREAM: u8 = 4;
311
312
313// libusb_iso_sync_type
314pub const LIBUSB_ISO_SYNC_TYPE_MASK:     u8 = 0x0C;
315pub const LIBUSB_ISO_SYNC_TYPE_NONE:     u8 = 0;
316pub const LIBUSB_ISO_SYNC_TYPE_ASYNC:    u8 = 1;
317pub const LIBUSB_ISO_SYNC_TYPE_ADAPTIVE: u8 = 2;
318pub const LIBUSB_ISO_SYNC_TYPE_SYNC:     u8 = 3;
319
320
321// libusb_iso_usage_type
322pub const LIBUSB_ISO_USAGE_TYPE_MASK:     u8 = 0x30;
323pub const LIBUSB_ISO_USAGE_TYPE_DATA:     u8 = 0;
324pub const LIBUSB_ISO_USAGE_TYPE_FEEDBACK: u8 = 1;
325pub const LIBUSB_ISO_USAGE_TYPE_IMPLICIT: u8 = 2;
326
327
328// libusb_request_type
329pub const LIBUSB_REQUEST_TYPE_STANDARD: u8 = 0x00 << 5;
330pub const LIBUSB_REQUEST_TYPE_CLASS:    u8 = 0x01 << 5;
331pub const LIBUSB_REQUEST_TYPE_VENDOR:   u8 = 0x02 << 5;
332pub const LIBUSB_REQUEST_TYPE_RESERVED: u8 = 0x03 << 5;
333
334
335// libusb_request_recipient
336pub const LIBUSB_RECIPIENT_DEVICE:    u8 = 0x00;
337pub const LIBUSB_RECIPIENT_INTERFACE: u8 = 0x01;
338pub const LIBUSB_RECIPIENT_ENDPOINT:  u8 = 0x02;
339pub const LIBUSB_RECIPIENT_OTHER:     u8 = 0x03;
340
341
342// libusb_standard_request
343pub const LIBUSB_REQUEST_GET_STATUS:        u8 = 0x00;
344pub const LIBUSB_REQUEST_CLEAR_FEATURE:     u8 = 0x01;
345pub const LIBUSB_REQUEST_SET_FEATURE:       u8 = 0x03;
346pub const LIBUSB_REQUEST_SET_ADDRESS:       u8 = 0x05;
347pub const LIBUSB_REQUEST_GET_DESCRIPTOR:    u8 = 0x06;
348pub const LIBUSB_REQUEST_SET_DESCRIPTOR:    u8 = 0x07;
349pub const LIBUSB_REQUEST_GET_CONFIGURATION: u8 = 0x08;
350pub const LIBUSB_REQUEST_SET_CONFIGURATION: u8 = 0x09;
351pub const LIBUSB_REQUEST_GET_INTERFACE:     u8 = 0x0A;
352pub const LIBUSB_REQUEST_SET_INTERFACE:     u8 = 0x0B;
353pub const LIBUSB_REQUEST_SYNCH_FRAME:       u8 = 0x0C;
354pub const LIBUSB_REQUEST_SET_SEL:           u8 = 0x30;
355pub const LIBUSB_SET_ISOCH_DELAY:           u8 = 0x31;
356
357pub type libusb_hotplug_callback_handle = c_int;
358pub type libusb_hotplug_callback_fn = extern "C" fn(ctx: *mut libusb_context, device: *mut libusb_device, event: libusb_hotplug_event, user_data: *mut c_void) -> c_int;
359
360pub type libusb_hotplug_flag = c_int;
361pub const LIBUSB_HOTPLUG_NO_FLAGS: libusb_hotplug_flag = 0;
362pub const LIBUSB_HOTPLUG_ENUMERATE: libusb_hotplug_flag = 1;
363
364pub type libusb_hotplug_event = c_int;
365pub const LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED: libusb_hotplug_event = 0x01;
366pub const LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT: libusb_hotplug_event    = 0x02;
367
368pub const LIBUSB_HOTPLUG_MATCH_ANY: c_int = -1;
369
370pub type libusb_option = c_int;
371pub const LIBUSB_OPTION_LOG_LEVEL: libusb_option = 0;
372pub const LIBUSB_OPTION_USE_USBDK: libusb_option = 1;
373
374pub type libusb_log_cb = extern "C" fn(ctx: *mut libusb_context, log_level: c_int, msg: *const c_char) -> c_int;
375
376
377extern "C" {
378    pub fn libusb_get_version() -> *const libusb_version;
379    pub fn libusb_has_capability(capability: u32) -> c_int;
380    pub fn libusb_error_name(errcode: c_int) -> *const c_char;
381    pub fn libusb_setlocale(locale: *const c_char) -> c_int;
382    pub fn libusb_strerror(errcode: c_int) -> *const c_char;
383
384    pub fn libusb_init(context: *mut *mut libusb_context) -> c_int;
385    pub fn libusb_exit(context: *mut libusb_context);
386    pub fn libusb_set_debug(context: *mut libusb_context, level: c_int);
387    pub fn libusb_set_option(context: *mut libusb_context, option: libusb_option, level: c_int) -> c_int;
388    pub fn libusb_set_log_cb(context: *mut libusb_context, cb: libusb_log_cb, mode: c_int);
389
390    pub fn libusb_get_device_list(context: *mut libusb_context, list: *mut *const *mut libusb_device) -> ssize_t;
391    pub fn libusb_free_device_list(list: *const *mut libusb_device, unref_devices: c_int);
392    pub fn libusb_get_parent(dev: *mut libusb_device) -> *mut libusb_device;
393    pub fn libusb_get_device(dev_handle: *mut libusb_device_handle) -> *mut libusb_device;
394
395    pub fn libusb_ref_device(dev: *mut libusb_device) -> *mut libusb_device;
396    pub fn libusb_unref_device(dev: *mut libusb_device);
397
398    pub fn libusb_get_device_descriptor(dev: *const libusb_device, desc: *mut libusb_device_descriptor) -> c_int;
399    pub fn libusb_get_config_descriptor(dev: *const libusb_device, index: u8, config: *mut *const libusb_config_descriptor) -> c_int;
400    pub fn libusb_get_active_config_descriptor(dev: *const libusb_device, config: *mut *const libusb_config_descriptor) -> c_int;
401    pub fn libusb_get_config_descriptor_by_value(dev: *const libusb_device, bConfigurationValue: u8, config: *mut *const libusb_config_descriptor) -> c_int;
402    pub fn libusb_free_config_descriptor(config: *const libusb_config_descriptor);
403
404    pub fn libusb_get_bus_number(dev: *const libusb_device) -> u8;
405    pub fn libusb_get_port_number(dev: *mut libusb_device) -> u8;
406    pub fn libusb_get_port_numbers(dev: *mut libusb_device, port_numbers: *mut u8, port_numbers_len: c_int) -> c_int;
407    pub fn libusb_get_device_address(dev: *const libusb_device) -> u8;
408    pub fn libusb_get_device_speed(dev: *const libusb_device) -> c_int;
409    pub fn libusb_get_max_packet_size(dev: *const libusb_device, endpoint: c_uchar) -> c_int;
410    pub fn libusb_get_max_iso_packet_size(dev: *const libusb_device, endpoint: c_uchar) -> c_int;
411
412    pub fn libusb_wrap_sys_device(context: *mut libusb_context, sys_dev: intptr_t, handle: *mut *mut libusb_device_handle) -> c_int;
413    pub fn libusb_open(dev: *const libusb_device, handle: *mut *mut libusb_device_handle) -> c_int;
414    pub fn libusb_close(dev_handle: *mut libusb_device_handle);
415    pub fn libusb_open_device_with_vid_pid(context: *mut libusb_context, vendor_id: u16, product_id: u16) -> *mut libusb_device_handle;
416    pub fn libusb_reset_device(dev_handle: *mut libusb_device_handle) -> c_int;
417    pub fn libusb_clear_halt(dev_handle: *mut libusb_device_handle, endpoint: c_uchar) -> c_int;
418    pub fn libusb_alloc_streams(dev_handle: *mut libusb_device_handle, num_streams: u32, endpoints: *mut c_uchar, num_endpoints: c_int) -> c_int;
419    pub fn libusb_free_streams(dev_handle: *mut libusb_device_handle, endpoints: *mut c_uchar, num_endpoints: c_int) -> c_int;
420    pub fn libusb_dev_mem_alloc(dev_handle: *mut libusb_device_handle, length: size_t) -> *mut c_uchar;
421    pub fn libusb_dev_mem_free(dev_handle: *mut libusb_device_handle, buffer: *mut c_uchar, length: size_t) -> c_int;
422    pub fn libusb_get_string_descriptor_ascii(dev_handle: *mut libusb_device_handle, desc_index: u8, data: *mut c_uchar, length: c_int) -> c_int;
423
424    pub fn libusb_get_configuration(dev_handle: *mut libusb_device_handle, config: *mut c_int) -> c_int;
425    pub fn libusb_set_configuration(dev_handle: *mut libusb_device_handle, config: c_int) -> c_int;
426
427    pub fn libusb_get_ss_endpoint_companion_descriptor(context: *mut libusb_context, endpoint: *const libusb_endpoint_descriptor, ep_comp: *mut *const libusb_ss_endpoint_companion_descriptor) -> c_int;
428    pub fn libusb_free_ss_endpoint_companion_descriptor(ep_comp: *mut libusb_ss_endpoint_companion_descriptor);
429    pub fn libusb_get_bos_descriptor(dev_handle: *mut libusb_device_handle, bos: *mut *const libusb_bos_descriptor) -> c_int;
430    pub fn libusb_free_bos_descriptor(bos: *mut libusb_bos_descriptor);
431    pub fn libusb_get_usb_2_0_extension_descriptor(context: *mut libusb_context, dev_cap: *mut libusb_bos_dev_capability_descriptor, usb_2_0_extension: *mut *const libusb_usb_2_0_extension_descriptor) -> c_int;
432    pub fn libusb_free_usb_2_0_extension_descriptor(usb_2_0_extension: *mut libusb_usb_2_0_extension_descriptor);
433    pub fn libusb_get_ss_usb_device_capability_descriptor(context: *mut libusb_context, dev_cap: *mut libusb_bos_dev_capability_descriptor, ss_usb_device_cap: *mut *const libusb_ss_usb_device_capability_descriptor) -> c_int;
434    pub fn libusb_free_ss_usb_device_capability_descriptor(ss_usb_device_cap: *mut libusb_ss_usb_device_capability_descriptor);
435    pub fn libusb_get_container_id_descriptor(context: *mut libusb_context, dev_cap: *mut libusb_bos_dev_capability_descriptor, container_id: *mut *const libusb_container_id_descriptor) -> c_int;
436    pub fn libusb_free_container_id_descriptor(container_id: *mut libusb_container_id_descriptor);
437
438    pub fn libusb_set_auto_detach_kernel_driver(dev_handle: *mut libusb_device_handle, enable: c_int) -> c_int;
439    pub fn libusb_kernel_driver_active(dev_handle: *mut libusb_device_handle, interface_number: c_int) -> c_int;
440    pub fn libusb_detach_kernel_driver(dev_handle: *mut libusb_device_handle, interface_number: c_int) -> c_int;
441    pub fn libusb_attach_kernel_driver(dev_handle: *mut libusb_device_handle, interface_number: c_int) -> c_int;
442
443    pub fn libusb_claim_interface(dev_handle: *mut libusb_device_handle, interface_number: c_int) -> c_int;
444    pub fn libusb_release_interface(dev_handle: *mut libusb_device_handle, interface_number: c_int) -> c_int;
445    pub fn libusb_set_interface_alt_setting(dev_handle: *mut libusb_device_handle, interface_number: c_int, alternate_setting: c_int) -> c_int;
446
447    pub fn libusb_interrupt_transfer(dev_handle: *mut libusb_device_handle, endpoint: c_uchar, data: *mut c_uchar, length: c_int, transferred: *mut c_int, timeout: c_uint) -> c_int;
448    pub fn libusb_bulk_transfer(dev_handle: *mut libusb_device_handle, endpoint: c_uchar, data: *mut c_uchar, length: c_int, transferred: *mut c_int, timeout: c_uint) -> c_int;
449    pub fn libusb_control_transfer(dev_handle: *mut libusb_device_handle, request_type: u8, request: u8, value: u16, index: u16, data: *mut c_uchar, length: u16, timeout: c_uint) -> c_int;
450
451    pub fn libusb_alloc_transfer(iso_packets: c_int) -> *mut libusb_transfer;
452    pub fn libusb_submit_transfer(transfer: *mut libusb_transfer) -> c_int;
453    pub fn libusb_cancel_transfer(transfer: *mut libusb_transfer) -> c_int;
454    pub fn libusb_free_transfer(transfer: *mut libusb_transfer);
455    pub fn libusb_transfer_set_stream_id(transfer: *mut libusb_transfer, stream_id: u32);
456    pub fn libusb_transfer_get_stream_id(transfer: *mut libusb_transfer) -> u32;
457
458    pub fn libusb_handle_events(context: *mut libusb_context) -> c_int;
459    pub fn libusb_handle_events_timeout(context: *mut libusb_context, tv: *const timeval) -> c_int;
460    pub fn libusb_handle_events_completed(context: *mut libusb_context, completed: *mut c_int) -> c_int;
461    pub fn libusb_handle_events_timeout_completed(context: *mut libusb_context, tv: *const timeval, completed: *mut c_int) -> c_int;
462    pub fn libusb_handle_events_locked(context: *mut libusb_context, tv: *const timeval) -> c_int;
463
464    pub fn libusb_try_lock_events(context: *mut libusb_context) -> c_int;
465    pub fn libusb_lock_events(context: *mut libusb_context);
466    pub fn libusb_unlock_events(context: *mut libusb_context);
467    pub fn libusb_event_handling_ok(context: *mut libusb_context) -> c_int;
468    pub fn libusb_event_handler_active(context: *mut libusb_context) -> c_int;
469    pub fn libusb_interrupt_event_handler(context: *mut libusb_context);
470    pub fn libusb_lock_event_waiters(context: *mut libusb_context);
471    pub fn libusb_unlock_event_waiters(context: *mut libusb_context);
472    pub fn libusb_wait_for_event(context: *mut libusb_context, tv: *const timeval) -> c_int;
473
474    pub fn libusb_pollfds_handle_timeouts(context: *mut libusb_context) -> c_int;
475    pub fn libusb_get_next_timeout(context: *mut libusb_context, tv: *mut timeval) -> c_int;
476    pub fn libusb_get_pollfds(context: *mut libusb_context) -> *const *mut libusb_pollfd;
477    pub fn libusb_free_pollfd(pollfds: *const *mut libusb_pollfd);
478    pub fn libusb_set_pollfd_notifiers(context: *mut libusb_context, added_cb: libusb_pollfd_added_cb, removed_cb: libusb_pollfd_removed_cb, user_data: *mut c_void);
479    pub fn libusb_hotplug_register_callback(ctx: *mut libusb_context, events: libusb_hotplug_event, flags: libusb_hotplug_flag, vendor_id: c_int, product_id: c_int, dev_class: c_int, cb_fn: libusb_hotplug_callback_fn, user_data: *mut c_void, callback_handle: *mut libusb_hotplug_callback_handle) -> c_int;
480    pub fn libusb_hotplug_deregister_callback(ctx: *mut libusb_context, callback_handle: libusb_hotplug_callback_handle);}
481
482
483/// # Safety
484///
485/// This is a raw C call, and care should be taken that `libusb_device_handle` is valid before calling.
486pub unsafe fn libusb_get_string_descriptor(dev_handle: *mut libusb_device_handle, desc_index: u8, langid: u16, data: *mut c_uchar, length: c_int) -> c_int
487{
488    libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_IN, LIBUSB_REQUEST_GET_DESCRIPTOR, (LIBUSB_DT_STRING as u16) << 8 | desc_index as u16, langid, data, length as u16, 1000)
489}