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
474extern "C" {
477 pub fn libusb_set_option(ctx: *mut libusb_context, option: u32, ...) -> c_int;
478}
479
480#[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#[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}