1 #![allow(non_camel_case_types)]
2 
3 pub mod constants;
4 
5 use self::constants::*;
6 use libc::{c_char, c_int, c_short, c_uchar, c_uint, c_void, ssize_t, timeval};
7 
8 #[repr(C)]
9 pub struct libusb_context {
10     __private: c_void,
11 }
12 
13 #[repr(C)]
14 pub struct libusb_device {
15     __private: c_void,
16 }
17 
18 #[repr(C)]
19 pub struct libusb_device_handle {
20     __private: c_void,
21 }
22 
23 #[repr(C)]
24 pub struct libusb_version {
25     pub major: u16,
26     pub minor: u16,
27     pub micro: u16,
28     pub nano: u16,
29     pub rc: *const c_char,
30     pub describe: *const c_char,
31 }
32 
33 #[allow(non_snake_case)]
34 #[repr(C)]
35 pub struct libusb_device_descriptor {
36     pub bLength: u8,
37     pub bDescriptorType: u8,
38     pub bcdUSB: u16,
39     pub bDeviceClass: u8,
40     pub bDeviceSubClass: u8,
41     pub bDeviceProtocol: u8,
42     pub bMaxPacketSize0: u8,
43     pub idVendor: u16,
44     pub idProduct: u16,
45     pub bcdDevice: u16,
46     pub iManufacturer: u8,
47     pub iProduct: u8,
48     pub iSerialNumber: u8,
49     pub bNumConfigurations: u8,
50 }
51 
52 #[allow(non_snake_case)]
53 #[repr(C)]
54 pub struct libusb_config_descriptor {
55     pub bLength: u8,
56     pub bDescriptorType: u8,
57     pub wTotalLength: u16,
58     pub bNumInterfaces: u8,
59     pub bConfigurationValue: u8,
60     pub iConfiguration: u8,
61     pub bmAttributes: u8,
62     pub bMaxPower: u8,
63     pub interface: *const libusb_interface,
64     pub extra: *const c_uchar,
65     pub extra_length: c_int,
66 }
67 
68 #[repr(C)]
69 pub struct libusb_interface {
70     pub altsetting: *const libusb_interface_descriptor,
71     pub num_altsetting: c_int,
72 }
73 
74 #[allow(non_snake_case)]
75 #[repr(C)]
76 pub struct libusb_interface_descriptor {
77     pub bLength: u8,
78     pub bDescriptorType: u8,
79     pub bInterfaceNumber: u8,
80     pub bAlternateSetting: u8,
81     pub bNumEndpoints: u8,
82     pub bInterfaceClass: u8,
83     pub bInterfaceSubClass: u8,
84     pub bInterfaceProtocol: u8,
85     pub iInterface: u8,
86     pub endpoint: *const libusb_endpoint_descriptor,
87     pub extra: *const c_uchar,
88     pub extra_length: c_int,
89 }
90 
91 #[allow(non_snake_case)]
92 #[repr(C)]
93 pub struct libusb_endpoint_descriptor {
94     pub bLength: u8,
95     pub bDescriptorType: u8,
96     pub bEndpointAddress: u8,
97     pub bmAttributes: u8,
98     pub wMaxPacketSize: u16,
99     pub bInterval: u8,
100     pub bRefresh: u8,
101     pub bSynchAddress: u8,
102     pub extra: *const c_uchar,
103     pub extra_length: c_int,
104 }
105 
106 #[repr(C)]
107 pub struct libusb_iso_packet_descriptor {
108     pub length: c_uint,
109     pub actual_length: c_uint,
110     pub status: c_int,
111 }
112 
113 #[allow(non_snake_case)]
114 #[repr(C)]
115 pub struct libusb_ss_endpoint_companion_descriptor {
116     pub bLength: u8,
117     pub bDescriptorType: u8,
118     pub bMaxBurst: u8,
119     pub bmAttributes: u8,
120     pub wBytesPerInterval: u16,
121 }
122 
123 #[allow(non_snake_case)]
124 #[repr(C)]
125 pub struct libusb_bos_dev_capability_descriptor {
126     pub bLength: u8,
127     pub bDescriptorType: u8,
128     pub bDevCapabilityType: u8,
129     pub dev_capability_data: [u8; 0],
130 }
131 
132 #[allow(non_snake_case)]
133 #[repr(C)]
134 pub struct libusb_bos_descriptor {
135     pub bLength: u8,
136     pub bDescriptorType: u8,
137     pub wTotalLength: u16,
138     pub bNumDeviceCaps: u8,
139     pub dev_capability: [libusb_bos_dev_capability_descriptor; 0],
140 }
141 
142 #[allow(non_snake_case)]
143 #[repr(C)]
144 pub struct libusb_usb_2_0_extension_descriptor {
145     pub bLength: u8,
146     pub bDescriptorType: u8,
147     pub bDevCapabilityType: u8,
148     pub bmAttributes: u32,
149 }
150 
151 #[allow(non_snake_case)]
152 #[repr(C)]
153 pub struct libusb_ss_usb_device_capability_descriptor {
154     pub bLength: u8,
155     pub bDescriptorType: u8,
156     pub bDevCapabilityType: u8,
157     pub bmAttributes: u8,
158     pub wSpeedSupported: u16,
159     pub bFunctionalitySupport: u8,
160     pub bU1DevExitLat: u8,
161     pub bU2DevExitLat: u8,
162 }
163 
164 #[allow(non_snake_case)]
165 #[repr(C)]
166 pub struct libusb_container_id_descriptor {
167     pub bLength: u8,
168     pub bDescriptorType: u8,
169     pub bDevCapabilityType: u8,
170     pub bReserved: u8,
171     pub ContainerId: [u8; 16],
172 }
173 
174 #[allow(non_snake_case)]
175 #[repr(C, packed)]
176 pub struct libusb_control_setup {
177     pub bmRequestType: u8,
178     pub bRequest: u8,
179     pub wValue: u16,
180     pub wIndex: u16,
181     pub wLength: u16,
182 }
183 
184 #[repr(C)]
185 pub struct libusb_transfer {
186     pub dev_handle: *mut libusb_device_handle,
187     pub flags: u8,
188     pub endpoint: c_uchar,
189     pub transfer_type: c_uchar,
190     pub timeout: c_uint,
191     pub status: c_int,
192     pub length: c_int,
193     pub actual_length: c_int,
194     pub callback: libusb_transfer_cb_fn,
195     pub user_data: *mut c_void,
196     pub buffer: *mut c_uchar,
197     pub num_iso_packets: c_int,
198     pub iso_packet_desc: [libusb_iso_packet_descriptor; 0],
199 }
200 
201 #[repr(C)]
202 pub struct libusb_pollfd {
203     pub fd: c_int,
204     pub events: c_short,
205 }
206 
207 pub type libusb_hotplug_callback_handle = c_int;
208 pub type libusb_hotplug_flag = c_int;
209 pub type libusb_hotplug_event = c_int;
210 
211 pub type libusb_log_cb_mode = c_int;
212 
213 pub type libusb_transfer_cb_fn = extern "system" fn(*mut libusb_transfer);
214 pub type libusb_pollfd_added_cb = extern "system" fn(c_int, c_short, *mut c_void);
215 pub type libusb_pollfd_removed_cb = extern "system" fn(c_int, *mut c_void);
216 pub type libusb_hotplug_callback_fn = extern "system" fn(
217     ctx: *mut libusb_context,
218     device: *mut libusb_device,
219     event: libusb_hotplug_event,
220     user_data: *mut c_void,
221 ) -> c_int;
222 
223 pub type libusb_log_cb = extern "system" fn(context: *mut libusb_context, c_int, *mut c_void);
224 
225 extern "system" {
libusb_get_version() -> *const libusb_version226     pub fn libusb_get_version() -> *const libusb_version;
libusb_has_capability(capability: u32) -> c_int227     pub fn libusb_has_capability(capability: u32) -> c_int;
libusb_error_name(errcode: c_int) -> *const c_char228     pub fn libusb_error_name(errcode: c_int) -> *const c_char;
libusb_setlocale(locale: *const c_char) -> c_int229     pub fn libusb_setlocale(locale: *const c_char) -> c_int;
libusb_strerror(errcode: c_int) -> *const c_char230     pub fn libusb_strerror(errcode: c_int) -> *const c_char;
231 
libusb_init(context: *mut *mut libusb_context) -> c_int232     pub fn libusb_init(context: *mut *mut libusb_context) -> c_int;
libusb_exit(context: *mut libusb_context)233     pub fn libusb_exit(context: *mut libusb_context);
libusb_set_debug(context: *mut libusb_context, level: c_int)234     pub fn libusb_set_debug(context: *mut libusb_context, level: c_int);
libusb_set_log_cb(context: *mut libusb_context, cb: Option<libusb_log_cb>, mode: c_int)235     pub fn libusb_set_log_cb(context: *mut libusb_context, cb: Option<libusb_log_cb>, mode: c_int);
236 
libusb_get_device_list( context: *mut libusb_context, list: *mut *const *mut libusb_device, ) -> ssize_t237     pub fn libusb_get_device_list(
238         context: *mut libusb_context,
239         list: *mut *const *mut libusb_device,
240     ) -> ssize_t;
libusb_free_device_list(list: *const *mut libusb_device, unref_devices: c_int)241     pub fn libusb_free_device_list(list: *const *mut libusb_device, unref_devices: c_int);
libusb_get_parent(dev: *mut libusb_device) -> *mut libusb_device242     pub fn libusb_get_parent(dev: *mut libusb_device) -> *mut libusb_device;
libusb_get_device(dev_handle: *mut libusb_device_handle) -> *mut libusb_device243     pub fn libusb_get_device(dev_handle: *mut libusb_device_handle) -> *mut libusb_device;
244 
libusb_ref_device(dev: *mut libusb_device) -> *mut libusb_device245     pub fn libusb_ref_device(dev: *mut libusb_device) -> *mut libusb_device;
libusb_unref_device(dev: *mut libusb_device)246     pub fn libusb_unref_device(dev: *mut libusb_device);
247 
libusb_get_device_descriptor( dev: *const libusb_device, desc: *mut libusb_device_descriptor, ) -> c_int248     pub fn libusb_get_device_descriptor(
249         dev: *const libusb_device,
250         desc: *mut libusb_device_descriptor,
251     ) -> c_int;
libusb_get_config_descriptor( dev: *const libusb_device, index: u8, config: *mut *const libusb_config_descriptor, ) -> c_int252     pub fn libusb_get_config_descriptor(
253         dev: *const libusb_device,
254         index: u8,
255         config: *mut *const libusb_config_descriptor,
256     ) -> c_int;
libusb_get_active_config_descriptor( dev: *const libusb_device, config: *mut *const libusb_config_descriptor, ) -> c_int257     pub fn libusb_get_active_config_descriptor(
258         dev: *const libusb_device,
259         config: *mut *const libusb_config_descriptor,
260     ) -> c_int;
libusb_get_config_descriptor_by_value( dev: *const libusb_device, bConfigurationValue: u8, config: *mut *const libusb_config_descriptor, ) -> c_int261     pub fn libusb_get_config_descriptor_by_value(
262         dev: *const libusb_device,
263         bConfigurationValue: u8,
264         config: *mut *const libusb_config_descriptor,
265     ) -> c_int;
libusb_free_config_descriptor(config: *const libusb_config_descriptor)266     pub fn libusb_free_config_descriptor(config: *const libusb_config_descriptor);
267 
libusb_get_bus_number(dev: *const libusb_device) -> u8268     pub fn libusb_get_bus_number(dev: *const libusb_device) -> u8;
libusb_get_port_number(dev: *mut libusb_device) -> u8269     pub fn libusb_get_port_number(dev: *mut libusb_device) -> u8;
libusb_get_port_numbers( dev: *mut libusb_device, port_numbers: *mut u8, port_numbers_len: c_int, ) -> c_int270     pub fn libusb_get_port_numbers(
271         dev: *mut libusb_device,
272         port_numbers: *mut u8,
273         port_numbers_len: c_int,
274     ) -> c_int;
libusb_get_device_address(dev: *const libusb_device) -> u8275     pub fn libusb_get_device_address(dev: *const libusb_device) -> u8;
libusb_get_device_speed(dev: *const libusb_device) -> c_int276     pub fn libusb_get_device_speed(dev: *const libusb_device) -> c_int;
libusb_get_max_packet_size(dev: *const libusb_device, endpoint: c_uchar) -> c_int277     pub fn libusb_get_max_packet_size(dev: *const libusb_device, endpoint: c_uchar) -> c_int;
libusb_get_max_iso_packet_size(dev: *const libusb_device, endpoint: c_uchar) -> c_int278     pub fn libusb_get_max_iso_packet_size(dev: *const libusb_device, endpoint: c_uchar) -> c_int;
279 
libusb_wrap_sys_device( context: *mut libusb_context, sys_dev: *mut c_int, handle: *mut *mut libusb_device_handle, ) -> c_int280     pub fn libusb_wrap_sys_device(
281         context: *mut libusb_context,
282         sys_dev: *mut c_int,
283         handle: *mut *mut libusb_device_handle,
284     ) -> c_int;
libusb_open(dev: *const libusb_device, handle: *mut *mut libusb_device_handle) -> c_int285     pub fn libusb_open(dev: *const libusb_device, handle: *mut *mut libusb_device_handle) -> c_int;
libusb_close(dev_handle: *mut libusb_device_handle)286     pub fn libusb_close(dev_handle: *mut libusb_device_handle);
libusb_open_device_with_vid_pid( context: *mut libusb_context, vendor_id: u16, product_id: u16, ) -> *mut libusb_device_handle287     pub fn libusb_open_device_with_vid_pid(
288         context: *mut libusb_context,
289         vendor_id: u16,
290         product_id: u16,
291     ) -> *mut libusb_device_handle;
libusb_reset_device(dev_handle: *mut libusb_device_handle) -> c_int292     pub fn libusb_reset_device(dev_handle: *mut libusb_device_handle) -> c_int;
libusb_clear_halt(dev_handle: *mut libusb_device_handle, endpoint: c_uchar) -> c_int293     pub fn libusb_clear_halt(dev_handle: *mut libusb_device_handle, endpoint: c_uchar) -> c_int;
libusb_alloc_streams( dev_handle: *mut libusb_device_handle, num_streams: u32, endpoints: *mut c_uchar, num_endpoints: c_int, ) -> c_int294     pub fn libusb_alloc_streams(
295         dev_handle: *mut libusb_device_handle,
296         num_streams: u32,
297         endpoints: *mut c_uchar,
298         num_endpoints: c_int,
299     ) -> c_int;
libusb_free_streams( dev_handle: *mut libusb_device_handle, endpoints: *mut c_uchar, num_endpoints: c_int, ) -> c_int300     pub fn libusb_free_streams(
301         dev_handle: *mut libusb_device_handle,
302         endpoints: *mut c_uchar,
303         num_endpoints: c_int,
304     ) -> c_int;
libusb_get_string_descriptor_ascii( dev_handle: *mut libusb_device_handle, desc_index: u8, data: *mut c_uchar, length: c_int, ) -> c_int305     pub fn libusb_get_string_descriptor_ascii(
306         dev_handle: *mut libusb_device_handle,
307         desc_index: u8,
308         data: *mut c_uchar,
309         length: c_int,
310     ) -> c_int;
311 
libusb_get_configuration( dev_handle: *mut libusb_device_handle, config: *mut c_int, ) -> c_int312     pub fn libusb_get_configuration(
313         dev_handle: *mut libusb_device_handle,
314         config: *mut c_int,
315     ) -> c_int;
libusb_set_configuration(dev_handle: *mut libusb_device_handle, config: c_int) -> c_int316     pub fn libusb_set_configuration(dev_handle: *mut libusb_device_handle, config: c_int) -> c_int;
317 
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_int318     pub fn libusb_get_ss_endpoint_companion_descriptor(
319         context: *mut libusb_context,
320         endpoint: *const libusb_endpoint_descriptor,
321         ep_comp: *mut *const libusb_ss_endpoint_companion_descriptor,
322     ) -> c_int;
libusb_free_ss_endpoint_companion_descriptor( ep_comp: *mut libusb_ss_endpoint_companion_descriptor, )323     pub fn libusb_free_ss_endpoint_companion_descriptor(
324         ep_comp: *mut libusb_ss_endpoint_companion_descriptor,
325     );
libusb_get_bos_descriptor( dev_handle: *mut libusb_device_handle, bos: *mut *const libusb_bos_descriptor, ) -> c_int326     pub fn libusb_get_bos_descriptor(
327         dev_handle: *mut libusb_device_handle,
328         bos: *mut *const libusb_bos_descriptor,
329     ) -> c_int;
libusb_free_bos_descriptor(bos: *mut libusb_bos_descriptor)330     pub fn libusb_free_bos_descriptor(bos: *mut libusb_bos_descriptor);
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_int331     pub fn libusb_get_usb_2_0_extension_descriptor(
332         context: *mut libusb_context,
333         dev_cap: *mut libusb_bos_dev_capability_descriptor,
334         usb_2_0_extension: *mut *const libusb_usb_2_0_extension_descriptor,
335     ) -> c_int;
libusb_free_usb_2_0_extension_descriptor( usb_2_0_extension: *mut libusb_usb_2_0_extension_descriptor, )336     pub fn libusb_free_usb_2_0_extension_descriptor(
337         usb_2_0_extension: *mut libusb_usb_2_0_extension_descriptor,
338     );
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_int339     pub fn libusb_get_ss_usb_device_capability_descriptor(
340         context: *mut libusb_context,
341         dev_cap: *mut libusb_bos_dev_capability_descriptor,
342         ss_usb_device_cap: *mut *const libusb_ss_usb_device_capability_descriptor,
343     ) -> c_int;
libusb_free_ss_usb_device_capability_descriptor( ss_usb_device_cap: *mut libusb_ss_usb_device_capability_descriptor, )344     pub fn libusb_free_ss_usb_device_capability_descriptor(
345         ss_usb_device_cap: *mut libusb_ss_usb_device_capability_descriptor,
346     );
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_int347     pub fn libusb_get_container_id_descriptor(
348         context: *mut libusb_context,
349         dev_cap: *mut libusb_bos_dev_capability_descriptor,
350         container_id: *mut *const libusb_container_id_descriptor,
351     ) -> c_int;
libusb_free_container_id_descriptor(container_id: *mut libusb_container_id_descriptor)352     pub fn libusb_free_container_id_descriptor(container_id: *mut libusb_container_id_descriptor);
353 
libusb_set_auto_detach_kernel_driver( dev_handle: *mut libusb_device_handle, enable: c_int, ) -> c_int354     pub fn libusb_set_auto_detach_kernel_driver(
355         dev_handle: *mut libusb_device_handle,
356         enable: c_int,
357     ) -> c_int;
libusb_kernel_driver_active( dev_handle: *mut libusb_device_handle, interface_number: c_int, ) -> c_int358     pub fn libusb_kernel_driver_active(
359         dev_handle: *mut libusb_device_handle,
360         interface_number: c_int,
361     ) -> c_int;
libusb_detach_kernel_driver( dev_handle: *mut libusb_device_handle, interface_number: c_int, ) -> c_int362     pub fn libusb_detach_kernel_driver(
363         dev_handle: *mut libusb_device_handle,
364         interface_number: c_int,
365     ) -> c_int;
libusb_attach_kernel_driver( dev_handle: *mut libusb_device_handle, interface_number: c_int, ) -> c_int366     pub fn libusb_attach_kernel_driver(
367         dev_handle: *mut libusb_device_handle,
368         interface_number: c_int,
369     ) -> c_int;
370 
libusb_claim_interface( dev_handle: *mut libusb_device_handle, interface_number: c_int, ) -> c_int371     pub fn libusb_claim_interface(
372         dev_handle: *mut libusb_device_handle,
373         interface_number: c_int,
374     ) -> c_int;
libusb_release_interface( dev_handle: *mut libusb_device_handle, interface_number: c_int, ) -> c_int375     pub fn libusb_release_interface(
376         dev_handle: *mut libusb_device_handle,
377         interface_number: c_int,
378     ) -> c_int;
libusb_set_interface_alt_setting( dev_handle: *mut libusb_device_handle, interface_number: c_int, alternate_setting: c_int, ) -> c_int379     pub fn libusb_set_interface_alt_setting(
380         dev_handle: *mut libusb_device_handle,
381         interface_number: c_int,
382         alternate_setting: c_int,
383     ) -> c_int;
384 
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_int385     pub fn libusb_interrupt_transfer(
386         dev_handle: *mut libusb_device_handle,
387         endpoint: c_uchar,
388         data: *mut c_uchar,
389         length: c_int,
390         transferred: *mut c_int,
391         timeout: c_uint,
392     ) -> c_int;
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_int393     pub fn libusb_bulk_transfer(
394         dev_handle: *mut libusb_device_handle,
395         endpoint: c_uchar,
396         data: *mut c_uchar,
397         length: c_int,
398         transferred: *mut c_int,
399         timeout: c_uint,
400     ) -> c_int;
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_int401     pub fn libusb_control_transfer(
402         dev_handle: *mut libusb_device_handle,
403         request_type: u8,
404         request: u8,
405         value: u16,
406         index: u16,
407         data: *mut c_uchar,
408         length: u16,
409         timeout: c_uint,
410     ) -> c_int;
411 
libusb_alloc_transfer(iso_packets: c_int) -> *mut libusb_transfer412     pub fn libusb_alloc_transfer(iso_packets: c_int) -> *mut libusb_transfer;
libusb_submit_transfer(transfer: *mut libusb_transfer) -> c_int413     pub fn libusb_submit_transfer(transfer: *mut libusb_transfer) -> c_int;
libusb_cancel_transfer(transfer: *mut libusb_transfer) -> c_int414     pub fn libusb_cancel_transfer(transfer: *mut libusb_transfer) -> c_int;
libusb_free_transfer(transfer: *mut libusb_transfer)415     pub fn libusb_free_transfer(transfer: *mut libusb_transfer);
libusb_transfer_set_stream_id(transfer: *mut libusb_transfer, stream_id: u32)416     pub fn libusb_transfer_set_stream_id(transfer: *mut libusb_transfer, stream_id: u32);
libusb_transfer_get_stream_id(transfer: *mut libusb_transfer) -> u32417     pub fn libusb_transfer_get_stream_id(transfer: *mut libusb_transfer) -> u32;
418 
libusb_handle_events(context: *mut libusb_context) -> c_int419     pub fn libusb_handle_events(context: *mut libusb_context) -> c_int;
libusb_handle_events_timeout(context: *mut libusb_context, tv: *const timeval) -> c_int420     pub fn libusb_handle_events_timeout(context: *mut libusb_context, tv: *const timeval) -> c_int;
libusb_handle_events_completed( context: *mut libusb_context, completed: *mut c_int, ) -> c_int421     pub fn libusb_handle_events_completed(
422         context: *mut libusb_context,
423         completed: *mut c_int,
424     ) -> c_int;
libusb_handle_events_timeout_completed( context: *mut libusb_context, tv: *const timeval, completed: *mut c_int, ) -> c_int425     pub fn libusb_handle_events_timeout_completed(
426         context: *mut libusb_context,
427         tv: *const timeval,
428         completed: *mut c_int,
429     ) -> c_int;
libusb_handle_events_locked(context: *mut libusb_context, tv: *const timeval) -> c_int430     pub fn libusb_handle_events_locked(context: *mut libusb_context, tv: *const timeval) -> c_int;
libusb_interrupt_event_handler(context: *mut libusb_context)431     pub fn libusb_interrupt_event_handler(context: *mut libusb_context);
432 
libusb_try_lock_events(context: *mut libusb_context) -> c_int433     pub fn libusb_try_lock_events(context: *mut libusb_context) -> c_int;
libusb_lock_events(context: *mut libusb_context)434     pub fn libusb_lock_events(context: *mut libusb_context);
libusb_unlock_events(context: *mut libusb_context)435     pub fn libusb_unlock_events(context: *mut libusb_context);
libusb_event_handling_ok(context: *mut libusb_context) -> c_int436     pub fn libusb_event_handling_ok(context: *mut libusb_context) -> c_int;
libusb_event_handler_active(context: *mut libusb_context) -> c_int437     pub fn libusb_event_handler_active(context: *mut libusb_context) -> c_int;
libusb_lock_event_waiters(context: *mut libusb_context)438     pub fn libusb_lock_event_waiters(context: *mut libusb_context);
libusb_unlock_event_waiters(context: *mut libusb_context)439     pub fn libusb_unlock_event_waiters(context: *mut libusb_context);
libusb_wait_for_event(context: *mut libusb_context, tv: *const timeval) -> c_int440     pub fn libusb_wait_for_event(context: *mut libusb_context, tv: *const timeval) -> c_int;
441 
libusb_pollfds_handle_timeouts(context: *mut libusb_context) -> c_int442     pub fn libusb_pollfds_handle_timeouts(context: *mut libusb_context) -> c_int;
libusb_get_next_timeout(context: *mut libusb_context, tv: *mut timeval) -> c_int443     pub fn libusb_get_next_timeout(context: *mut libusb_context, tv: *mut timeval) -> c_int;
libusb_get_pollfds(context: *mut libusb_context) -> *const *mut libusb_pollfd444     pub fn libusb_get_pollfds(context: *mut libusb_context) -> *const *mut libusb_pollfd;
libusb_set_pollfd_notifiers( context: *mut libusb_context, added_cb: Option<libusb_pollfd_added_cb>, removed_cb: Option<libusb_pollfd_removed_cb>, user_data: *mut c_void, )445     pub fn libusb_set_pollfd_notifiers(
446         context: *mut libusb_context,
447         added_cb: Option<libusb_pollfd_added_cb>,
448         removed_cb: Option<libusb_pollfd_removed_cb>,
449         user_data: *mut c_void,
450     );
libusb_free_pollfds(pollfds: *const *mut libusb_pollfd)451     pub fn libusb_free_pollfds(pollfds: *const *mut libusb_pollfd);
libusb_hotplug_register_callback( ctx: *mut libusb_context, events: c_int, flags: c_int, 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_int452     pub fn libusb_hotplug_register_callback(
453         ctx: *mut libusb_context,
454         events: c_int,
455         flags: c_int,
456         vendor_id: c_int,
457         product_id: c_int,
458         dev_class: c_int,
459         cb_fn: libusb_hotplug_callback_fn,
460         user_data: *mut c_void,
461         callback_handle: *mut libusb_hotplug_callback_handle,
462     ) -> c_int;
libusb_hotplug_deregister_callback( ctx: *mut libusb_context, callback_handle: libusb_hotplug_callback_handle, )463     pub fn libusb_hotplug_deregister_callback(
464         ctx: *mut libusb_context,
465         callback_handle: libusb_hotplug_callback_handle,
466     );
467 
libusb_hotplug_get_user_data( ctx: *mut libusb_context, callback_handle: libusb_hotplug_callback_handle, ) -> *mut c_void468     pub fn libusb_hotplug_get_user_data(
469         ctx: *mut libusb_context,
470         callback_handle: libusb_hotplug_callback_handle,
471     ) -> *mut c_void;
472 }
473 
474 // As libusb_set_option is a variatic function, it must use "C"
475 // calling conventions
476 extern "C" {
libusb_set_option(ctx: *mut libusb_context, option: u32, ...) -> c_int477     pub fn libusb_set_option(ctx: *mut libusb_context, option: u32, ...) -> c_int;
478 }
479 
480 // defined as static inline in libusb.h
481 #[inline]
libusb_get_string_descriptor( dev_handle: *mut libusb_device_handle, desc_index: u8, langid: u16, data: *mut c_uchar, length: c_int, ) -> c_int482 pub unsafe fn libusb_get_string_descriptor(
483     dev_handle: *mut libusb_device_handle,
484     desc_index: u8,
485     langid: u16,
486     data: *mut c_uchar,
487     length: c_int,
488 ) -> c_int {
489     libusb_control_transfer(
490         dev_handle,
491         LIBUSB_ENDPOINT_IN,
492         LIBUSB_REQUEST_GET_DESCRIPTOR,
493         u16::from(LIBUSB_DT_STRING) << 8 | u16::from(desc_index),
494         langid,
495         data,
496         length as u16,
497         1000,
498     )
499 }
500 
501 // defined as static inline in libusb.h
502 #[inline]
libusb_get_descriptor( dev_handle: *mut libusb_device_handle, desc_type: u8, desc_index: u8, langid: u16, data: *mut c_uchar, length: c_int, ) -> c_int503 pub unsafe fn libusb_get_descriptor(
504     dev_handle: *mut libusb_device_handle,
505     desc_type: u8,
506     desc_index: u8,
507     langid: u16,
508     data: *mut c_uchar,
509     length: c_int,
510 ) -> c_int {
511     libusb_control_transfer(
512         dev_handle,
513         LIBUSB_ENDPOINT_IN,
514         LIBUSB_REQUEST_GET_DESCRIPTOR,
515         u16::from(desc_type) << 8 | u16::from(desc_index),
516         langid,
517         data,
518         length as u16,
519         1000,
520     )
521 }
522 
523 #[inline]
libusb_control_transfer_get_data(transfer: *mut libusb_transfer) -> *mut c_uchar524 pub unsafe fn libusb_control_transfer_get_data(transfer: *mut libusb_transfer) -> *mut c_uchar {
525     (*transfer).buffer.add(constants::LIBUSB_CONTROL_SETUP_SIZE)
526 }
527 
528 #[inline]
libusb_control_transfer_get_setup( transfer: *mut libusb_transfer, ) -> *mut libusb_control_setup529 pub unsafe fn libusb_control_transfer_get_setup(
530     transfer: *mut libusb_transfer,
531 ) -> *mut libusb_control_setup {
532     (*transfer).buffer as *mut _
533 }
534 
535 #[allow(non_snake_case)]
536 #[inline]
libusb_fill_control_setup( buffer: *mut c_uchar, bmRequestType: u8, bRequest: u8, wValue: u16, wIndex: u16, wLength: u16, )537 pub unsafe fn libusb_fill_control_setup(
538     buffer: *mut c_uchar,
539     bmRequestType: u8,
540     bRequest: u8,
541     wValue: u16,
542     wIndex: u16,
543     wLength: u16,
544 ) {
545     let setup: *mut libusb_control_setup = buffer as *mut _;
546     (*setup).bmRequestType = bmRequestType;
547     (*setup).bRequest = bRequest;
548     (*setup).wValue = wValue.to_le();
549     (*setup).wIndex = wIndex.to_le();
550     (*setup).wLength = wLength.to_le();
551 }
552 
553 #[inline]
libusb_fill_control_transfer( transfer: *mut libusb_transfer, dev_handle: *mut libusb_device_handle, buffer: *mut u8, callback: libusb_transfer_cb_fn, user_data: *mut c_void, timeout: c_uint, )554 pub unsafe fn libusb_fill_control_transfer(
555     transfer: *mut libusb_transfer,
556     dev_handle: *mut libusb_device_handle,
557     buffer: *mut u8,
558     callback: libusb_transfer_cb_fn,
559     user_data: *mut c_void,
560     timeout: c_uint,
561 ) {
562     let setup: *mut libusb_control_setup = buffer as *mut c_void as *mut libusb_control_setup;
563 
564     (*transfer).dev_handle = dev_handle;
565     (*transfer).endpoint = 0;
566     (*transfer).transfer_type = LIBUSB_TRANSFER_TYPE_CONTROL;
567     (*transfer).timeout = timeout;
568     (*transfer).buffer = buffer;
569     if !buffer.is_null() {
570         (*transfer).length =
571             (constants::LIBUSB_CONTROL_SETUP_SIZE as u16 + u16::from_le((*setup).wLength)).into();
572     }
573     (*transfer).user_data = user_data;
574     (*transfer).callback = callback;
575 }
576 
577 #[inline]
libusb_fill_bulk_transfer( transfer: *mut libusb_transfer, dev_handle: *mut libusb_device_handle, endpoint: u8, buffer: *mut u8, length: c_int, callback: libusb_transfer_cb_fn, user_data: *mut c_void, timeout: c_uint, )578 pub unsafe fn libusb_fill_bulk_transfer(
579     transfer: *mut libusb_transfer,
580     dev_handle: *mut libusb_device_handle,
581     endpoint: u8,
582     buffer: *mut u8,
583     length: c_int,
584     callback: libusb_transfer_cb_fn,
585     user_data: *mut c_void,
586     timeout: c_uint,
587 ) {
588     (*transfer).dev_handle = dev_handle;
589     (*transfer).endpoint = endpoint;
590     (*transfer).transfer_type = LIBUSB_TRANSFER_TYPE_BULK;
591     (*transfer).timeout = timeout;
592     (*transfer).buffer = buffer;
593     (*transfer).length = length;
594     (*transfer).user_data = user_data;
595     (*transfer).callback = callback;
596 }
597 
598 #[inline]
libusb_fill_bulk_stream_transfer( transfer: *mut libusb_transfer, dev_handle: *mut libusb_device_handle, endpoint: u8, stream_id: u32, buffer: *mut u8, length: c_int, callback: libusb_transfer_cb_fn, user_data: *mut c_void, timeout: c_uint, )599 pub unsafe fn libusb_fill_bulk_stream_transfer(
600     transfer: *mut libusb_transfer,
601     dev_handle: *mut libusb_device_handle,
602     endpoint: u8,
603     stream_id: u32,
604     buffer: *mut u8,
605     length: c_int,
606     callback: libusb_transfer_cb_fn,
607     user_data: *mut c_void,
608     timeout: c_uint,
609 ) {
610     libusb_fill_bulk_transfer(
611         transfer, dev_handle, endpoint, buffer, length, callback, user_data, timeout,
612     );
613     (*transfer).transfer_type = LIBUSB_TRANSFER_TYPE_BULK_STREAM;
614     libusb_transfer_set_stream_id(transfer, stream_id);
615 }
616 
617 #[inline]
libusb_fill_interrupt_transfer( transfer: *mut libusb_transfer, dev_handle: *mut libusb_device_handle, endpoint: u8, buffer: *mut u8, length: c_int, callback: libusb_transfer_cb_fn, user_data: *mut c_void, timeout: c_uint, )618 pub unsafe fn libusb_fill_interrupt_transfer(
619     transfer: *mut libusb_transfer,
620     dev_handle: *mut libusb_device_handle,
621     endpoint: u8,
622     buffer: *mut u8,
623     length: c_int,
624     callback: libusb_transfer_cb_fn,
625     user_data: *mut c_void,
626     timeout: c_uint,
627 ) {
628     (*transfer).dev_handle = dev_handle;
629     (*transfer).endpoint = endpoint;
630     (*transfer).transfer_type = LIBUSB_TRANSFER_TYPE_INTERRUPT;
631     (*transfer).timeout = timeout;
632     (*transfer).buffer = buffer;
633     (*transfer).length = length;
634     (*transfer).user_data = user_data;
635     (*transfer).callback = callback;
636 }
637 
638 #[inline]
libusb_fill_iso_transfer( transfer: *mut libusb_transfer, dev_handle: *mut libusb_device_handle, endpoint: u8, buffer: *mut u8, length: c_int, num_iso_packets: c_int, callback: libusb_transfer_cb_fn, user_data: *mut c_void, timeout: c_uint, )639 pub unsafe fn libusb_fill_iso_transfer(
640     transfer: *mut libusb_transfer,
641     dev_handle: *mut libusb_device_handle,
642     endpoint: u8,
643     buffer: *mut u8,
644     length: c_int,
645     num_iso_packets: c_int,
646     callback: libusb_transfer_cb_fn,
647     user_data: *mut c_void,
648     timeout: c_uint,
649 ) {
650     (*transfer).dev_handle = dev_handle;
651     (*transfer).endpoint = endpoint;
652     (*transfer).transfer_type = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS;
653     (*transfer).timeout = timeout;
654     (*transfer).buffer = buffer;
655     (*transfer).length = length;
656     (*transfer).num_iso_packets = num_iso_packets;
657     (*transfer).user_data = user_data;
658     (*transfer).callback = callback;
659 }
660 
661 #[inline]
libusb_set_iso_packet_lengths(transfer: *mut libusb_transfer, length: c_uint)662 pub unsafe fn libusb_set_iso_packet_lengths(transfer: *mut libusb_transfer, length: c_uint) {
663     for i in 0..(*transfer).num_iso_packets {
664         (*(*transfer).iso_packet_desc.as_mut_ptr().add(i as usize)).length = length;
665     }
666 }
667 
668 #[inline]
libusb_get_iso_packet_buffer( transfer: *mut libusb_transfer, packet: c_uint, ) -> *mut c_uchar669 pub unsafe fn libusb_get_iso_packet_buffer(
670     transfer: *mut libusb_transfer,
671     packet: c_uint,
672 ) -> *mut c_uchar {
673     if packet as c_int >= (*transfer).num_iso_packets {
674         return std::ptr::null_mut();
675     }
676     let mut offset = 0;
677     for i in 0..packet {
678         offset += (*(*transfer).iso_packet_desc.as_mut_ptr().add(i as usize)).length;
679     }
680 
681     (*transfer).buffer.add(offset as usize)
682 }
683 
684 #[inline]
libusb_get_iso_packet_buffer_simple( transfer: *mut libusb_transfer, packet: c_uint, ) -> *mut c_uchar685 pub unsafe fn libusb_get_iso_packet_buffer_simple(
686     transfer: *mut libusb_transfer,
687     packet: c_uint,
688 ) -> *mut c_uchar {
689     if packet as c_int >= (*transfer).num_iso_packets {
690         return std::ptr::null_mut();
691     }
692 
693     (*transfer)
694         .buffer
695         .add(((*(*transfer).iso_packet_desc.as_mut_ptr().add(0)).length * packet) as usize)
696 }
697