libusb1_sys/
lib.rs

1#![allow(non_camel_case_types)]
2
3pub mod constants;
4
5use self::constants::*;
6use libc::{c_char, c_int, c_short, c_uchar, c_uint, c_void, ssize_t, timeval};
7
8#[repr(C)]
9pub struct libusb_context {
10    __private: c_void,
11}
12
13#[repr(C)]
14pub struct libusb_device {
15    __private: c_void,
16}
17
18#[repr(C)]
19pub struct libusb_device_handle {
20    __private: c_void,
21}
22
23#[repr(C)]
24pub 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)]
35pub 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)]
54pub 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)]
69pub 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)]
76pub 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)]
93pub 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)]
107pub 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)]
115pub 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)]
125pub 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)]
134pub 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)]
144pub 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)]
153pub 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)]
166pub 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)]
176pub 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)]
185pub 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)]
202pub struct libusb_pollfd {
203    pub fd: c_int,
204    pub events: c_short,
205}
206
207pub type libusb_hotplug_callback_handle = c_int;
208pub type libusb_hotplug_flag = c_int;
209pub type libusb_hotplug_event = c_int;
210
211pub type libusb_log_cb_mode = c_int;
212
213pub type libusb_transfer_cb_fn = extern "system" fn(*mut libusb_transfer);
214pub type libusb_pollfd_added_cb = extern "system" fn(c_int, c_short, *mut c_void);
215pub type libusb_pollfd_removed_cb = extern "system" fn(c_int, *mut c_void);
216pub 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
223pub type libusb_log_cb = extern "system" fn(context: *mut libusb_context, c_int, *mut c_void);
224
225extern "system" {
226    pub fn libusb_get_version() -> *const libusb_version;
227    pub fn libusb_has_capability(capability: u32) -> c_int;
228    pub fn libusb_error_name(errcode: c_int) -> *const c_char;
229    pub fn libusb_setlocale(locale: *const c_char) -> c_int;
230    pub fn libusb_strerror(errcode: c_int) -> *const c_char;
231
232    pub fn libusb_init(context: *mut *mut libusb_context) -> c_int;
233    pub fn libusb_exit(context: *mut libusb_context);
234    pub fn libusb_set_debug(context: *mut libusb_context, level: c_int);
235    pub fn libusb_set_log_cb(context: *mut libusb_context, cb: Option<libusb_log_cb>, mode: c_int);
236
237    pub fn libusb_get_device_list(
238        context: *mut libusb_context,
239        list: *mut *const *mut libusb_device,
240    ) -> ssize_t;
241    pub fn libusb_free_device_list(list: *const *mut libusb_device, unref_devices: c_int);
242    pub fn libusb_get_parent(dev: *mut libusb_device) -> *mut libusb_device;
243    pub fn libusb_get_device(dev_handle: *mut libusb_device_handle) -> *mut libusb_device;
244
245    pub fn libusb_ref_device(dev: *mut libusb_device) -> *mut libusb_device;
246    pub fn libusb_unref_device(dev: *mut libusb_device);
247
248    pub fn libusb_get_device_descriptor(
249        dev: *const libusb_device,
250        desc: *mut libusb_device_descriptor,
251    ) -> c_int;
252    pub fn libusb_get_config_descriptor(
253        dev: *const libusb_device,
254        index: u8,
255        config: *mut *const libusb_config_descriptor,
256    ) -> c_int;
257    pub fn libusb_get_active_config_descriptor(
258        dev: *const libusb_device,
259        config: *mut *const libusb_config_descriptor,
260    ) -> c_int;
261    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;
266    pub fn libusb_free_config_descriptor(config: *const libusb_config_descriptor);
267
268    pub fn libusb_get_bus_number(dev: *const libusb_device) -> u8;
269    pub fn libusb_get_port_number(dev: *mut libusb_device) -> u8;
270    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;
275    pub fn libusb_get_device_address(dev: *const libusb_device) -> u8;
276    pub fn libusb_get_device_speed(dev: *const libusb_device) -> c_int;
277    pub fn libusb_get_max_packet_size(dev: *const libusb_device, endpoint: c_uchar) -> c_int;
278    pub fn libusb_get_max_iso_packet_size(dev: *const libusb_device, endpoint: c_uchar) -> c_int;
279
280    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;
285    pub fn libusb_open(dev: *const libusb_device, handle: *mut *mut libusb_device_handle) -> c_int;
286    pub fn libusb_close(dev_handle: *mut libusb_device_handle);
287    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;
292    pub fn libusb_reset_device(dev_handle: *mut libusb_device_handle) -> c_int;
293    pub fn libusb_clear_halt(dev_handle: *mut libusb_device_handle, endpoint: c_uchar) -> c_int;
294    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;
300    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;
305    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
312    pub fn libusb_get_configuration(
313        dev_handle: *mut libusb_device_handle,
314        config: *mut c_int,
315    ) -> c_int;
316    pub fn libusb_set_configuration(dev_handle: *mut libusb_device_handle, config: c_int) -> c_int;
317
318    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;
323    pub fn libusb_free_ss_endpoint_companion_descriptor(
324        ep_comp: *mut libusb_ss_endpoint_companion_descriptor,
325    );
326    pub fn libusb_get_bos_descriptor(
327        dev_handle: *mut libusb_device_handle,
328        bos: *mut *const libusb_bos_descriptor,
329    ) -> c_int;
330    pub fn libusb_free_bos_descriptor(bos: *mut libusb_bos_descriptor);
331    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;
336    pub fn libusb_free_usb_2_0_extension_descriptor(
337        usb_2_0_extension: *mut libusb_usb_2_0_extension_descriptor,
338    );
339    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;
344    pub fn libusb_free_ss_usb_device_capability_descriptor(
345        ss_usb_device_cap: *mut libusb_ss_usb_device_capability_descriptor,
346    );
347    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;
352    pub fn libusb_free_container_id_descriptor(container_id: *mut libusb_container_id_descriptor);
353
354    pub fn libusb_set_auto_detach_kernel_driver(
355        dev_handle: *mut libusb_device_handle,
356        enable: c_int,
357    ) -> c_int;
358    pub fn libusb_kernel_driver_active(
359        dev_handle: *mut libusb_device_handle,
360        interface_number: c_int,
361    ) -> c_int;
362    pub fn libusb_detach_kernel_driver(
363        dev_handle: *mut libusb_device_handle,
364        interface_number: c_int,
365    ) -> c_int;
366    pub fn libusb_attach_kernel_driver(
367        dev_handle: *mut libusb_device_handle,
368        interface_number: c_int,
369    ) -> c_int;
370
371    pub fn libusb_claim_interface(
372        dev_handle: *mut libusb_device_handle,
373        interface_number: c_int,
374    ) -> c_int;
375    pub fn libusb_release_interface(
376        dev_handle: *mut libusb_device_handle,
377        interface_number: c_int,
378    ) -> c_int;
379    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
385    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;
393    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;
401    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
412    pub fn libusb_alloc_transfer(iso_packets: c_int) -> *mut libusb_transfer;
413    pub fn libusb_submit_transfer(transfer: *mut libusb_transfer) -> c_int;
414    pub fn libusb_cancel_transfer(transfer: *mut libusb_transfer) -> c_int;
415    pub fn libusb_free_transfer(transfer: *mut libusb_transfer);
416    pub fn libusb_transfer_set_stream_id(transfer: *mut libusb_transfer, stream_id: u32);
417    pub fn libusb_transfer_get_stream_id(transfer: *mut libusb_transfer) -> u32;
418
419    pub fn libusb_handle_events(context: *mut libusb_context) -> c_int;
420    pub fn libusb_handle_events_timeout(context: *mut libusb_context, tv: *const timeval) -> c_int;
421    pub fn libusb_handle_events_completed(
422        context: *mut libusb_context,
423        completed: *mut c_int,
424    ) -> c_int;
425    pub fn libusb_handle_events_timeout_completed(
426        context: *mut libusb_context,
427        tv: *const timeval,
428        completed: *mut c_int,
429    ) -> c_int;
430    pub fn libusb_handle_events_locked(context: *mut libusb_context, tv: *const timeval) -> c_int;
431    pub fn libusb_interrupt_event_handler(context: *mut libusb_context);
432
433    pub fn libusb_try_lock_events(context: *mut libusb_context) -> c_int;
434    pub fn libusb_lock_events(context: *mut libusb_context);
435    pub fn libusb_unlock_events(context: *mut libusb_context);
436    pub fn libusb_event_handling_ok(context: *mut libusb_context) -> c_int;
437    pub fn libusb_event_handler_active(context: *mut libusb_context) -> c_int;
438    pub fn libusb_lock_event_waiters(context: *mut libusb_context);
439    pub fn libusb_unlock_event_waiters(context: *mut libusb_context);
440    pub fn libusb_wait_for_event(context: *mut libusb_context, tv: *const timeval) -> c_int;
441
442    pub fn libusb_pollfds_handle_timeouts(context: *mut libusb_context) -> c_int;
443    pub fn libusb_get_next_timeout(context: *mut libusb_context, tv: *mut timeval) -> c_int;
444    pub fn libusb_get_pollfds(context: *mut libusb_context) -> *const *mut libusb_pollfd;
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    );
451    pub fn libusb_free_pollfds(pollfds: *const *mut libusb_pollfd);
452    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;
463    pub fn libusb_hotplug_deregister_callback(
464        ctx: *mut libusb_context,
465        callback_handle: libusb_hotplug_callback_handle,
466    );
467
468    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
476extern "C" {
477    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]
482pub 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]
503pub 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]
524pub 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]
529pub 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]
537pub 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]
554pub 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]
578pub 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]
599pub 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]
618pub 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]
639pub 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]
662pub 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]
669pub 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]
685pub 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}