libusb 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.travis.yml +1 -0
- data/History.md +8 -0
- data/README.md +5 -15
- data/Rakefile +8 -1
- data/ext/extconf.rb +49 -12
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/AUTHORS +12 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/COPYING +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/ChangeLog +18 -2
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/INSTALL +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Makefile.am +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Makefile.in +31 -18
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/NEWS +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/PORTING +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/README +5 -3
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/TODO +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/common.xcconfig +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/config.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/debug.xcconfig +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/libusb.xcconfig +0 -0
- data/ext/libusb-1.0.20/Xcode/libusb.xcodeproj/project.pbxproj +865 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/libusb_debug.xcconfig +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/libusb_release.xcconfig +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/release.xcconfig +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/aclocal.m4 +35 -32
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/README +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/config.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/Android.mk +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/Application.mk +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/examples.mk +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/libusb.mk +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/tests.mk +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/compile +1 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/config.guess +13 -160
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/config.h.in +6 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/config.sub +26 -12
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/configure +244 -20
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/configure.ac +27 -4
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/depcomp +1 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/doc/Makefile.am +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/doc/Makefile.in +19 -6
- data/ext/libusb-1.0.20/doc/doxygen.cfg.in +2334 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/Makefile.am +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/Makefile.in +19 -6
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/dpfp.c +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/dpfp_threaded.c +15 -10
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/ezusb.c +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/ezusb.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/fxload.c +28 -7
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/getopt/getopt.c +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/getopt/getopt.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/getopt/getopt1.c +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/hotplugtest.c +21 -3
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/listdevs.c +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/sam3u_benchmark.c +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/xusb.c +2 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/install-sh +170 -196
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb-1.0.pc.in +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/Makefile.am +15 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/Makefile.in +192 -53
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/core.c +218 -100
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/descriptor.c +3 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/hotplug.c +26 -9
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/hotplug.h +8 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/io.c +432 -290
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusb-1.0.def +2 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusb-1.0.rc +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusb.h +11 -10
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusbi.h +106 -29
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/darwin_usb.c +27 -67
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/darwin_usb.h +3 -7
- data/ext/libusb-1.0.20/libusb/os/haiku/Makefile.am +5 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/Makefile.in +810 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/aclocal.m4 +1193 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/compile +347 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/config.guess +1421 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/config.sub +1807 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/configure +17579 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/configure.ac +8 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/depcomp +791 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/haiku_pollfs.cpp +378 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb.h +112 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb_backend.cpp +550 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb_raw.cpp +255 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb_raw.h +180 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/install-sh +501 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/ltmain.sh +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/libtool.m4 +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/ltoptions.m4 +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/ltsugar.m4 +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/ltversion.m4 +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/lt~obsolete.m4 +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/missing +1 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_netlink.c +4 -4
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_udev.c +1 -2
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_usbfs.c +46 -49
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_usbfs.h +1 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/netbsd_usb.c +9 -73
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/openbsd_usb.c +9 -73
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_posix.c +2 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_posix.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_windows.c +3 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_windows.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_posix.c +3 -3
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_posix.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_windows.c +3 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_windows.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/wince_usb.c +87 -250
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/wince_usb.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/windows_common.h +1 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/windows_usb.c +267 -181
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/windows_usb.h +22 -7
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/strerror.c +5 -2
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/sync.c +2 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/version.h +1 -1
- data/ext/libusb-1.0.20/libusb/version_nano.h +1 -0
- data/ext/libusb-1.0.20/ltmain.sh +9655 -0
- data/ext/libusb-1.0.20/m4/libtool.m4 +7992 -0
- data/ext/libusb-1.0.20/m4/ltoptions.m4 +384 -0
- data/ext/libusb-1.0.20/m4/ltsugar.m4 +123 -0
- data/ext/libusb-1.0.20/m4/ltversion.m4 +23 -0
- data/ext/libusb-1.0.20/m4/lt~obsolete.m4 +98 -0
- data/ext/libusb-1.0.20/missing +215 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/Makefile.am +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/Makefile.in +19 -6
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/libusb_testlib.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/stress.c +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/testlib.c +0 -0
- data/lib/libusb.rb +1 -0
- data/lib/libusb/call.rb +1 -0
- data/lib/libusb/context.rb +5 -2
- data/lib/libusb/stdio.rb +25 -0
- data/lib/libusb/version_gem.rb +1 -1
- data/libusb.gemspec +2 -1
- metadata +152 -115
- metadata.gz.sig +0 -0
- data/ext/libusb-1.0.19/Xcode/libusb.xcodeproj/project.pbxproj +0 -1
- data/ext/libusb-1.0.19/doc/doxygen.cfg.in +0 -1288
- data/ext/libusb-1.0.19/libusb/version_nano.h +0 -1
|
@@ -56,6 +56,8 @@ const struct usbi_os_backend * const usbi_backend = &netbsd_backend;
|
|
|
56
56
|
const struct usbi_os_backend * const usbi_backend = &windows_backend;
|
|
57
57
|
#elif defined(OS_WINCE)
|
|
58
58
|
const struct usbi_os_backend * const usbi_backend = &wince_backend;
|
|
59
|
+
#elif defined(OS_HAIKU)
|
|
60
|
+
const struct usbi_os_backend * const usbi_backend = &haiku_usb_raw_backend;
|
|
59
61
|
#else
|
|
60
62
|
#error "Unsupported OS"
|
|
61
63
|
#endif
|
|
@@ -92,6 +94,10 @@ struct list_head active_contexts_list;
|
|
|
92
94
|
* Specification</a> which is available for free download. You can probably
|
|
93
95
|
* find less verbose introductions by searching the web.
|
|
94
96
|
*
|
|
97
|
+
* \section API Application Programming Interface (API)
|
|
98
|
+
*
|
|
99
|
+
* See the \ref api page for a complete list of the libusb functions.
|
|
100
|
+
*
|
|
95
101
|
* \section features Library features
|
|
96
102
|
*
|
|
97
103
|
* - All transfer types supported (control/bulk/interrupt/isochronous)
|
|
@@ -217,9 +223,6 @@ struct list_head active_contexts_list;
|
|
|
217
223
|
* -# If the device is already in the desired configuration, calling
|
|
218
224
|
* libusb_set_configuration() using the same configuration value will cause
|
|
219
225
|
* a lightweight device reset. This may not be desirable behaviour.
|
|
220
|
-
* -# libusb will be unable to change configuration if the device is in
|
|
221
|
-
* another configuration and other programs or drivers have claimed
|
|
222
|
-
* interfaces under that configuration.
|
|
223
226
|
* -# In the case where the desired configuration is already active, libusb
|
|
224
227
|
* may not even be able to perform a lightweight device reset. For example,
|
|
225
228
|
* take my USB keyboard with fingerprint reader: I'm interested in driving
|
|
@@ -228,12 +231,17 @@ struct list_head active_contexts_list;
|
|
|
228
231
|
* Because the kernel has claimed an interface, it is not even possible to
|
|
229
232
|
* perform the lightweight device reset, so libusb_set_configuration() will
|
|
230
233
|
* fail. (Luckily the device in question only has a single configuration.)
|
|
234
|
+
* -# libusb will be unable to set a configuration if other programs or
|
|
235
|
+
* drivers have claimed interfaces. In particular, this means that kernel
|
|
236
|
+
* drivers must be detached from all the interfaces before
|
|
237
|
+
* libusb_set_configuration() may succeed.
|
|
231
238
|
*
|
|
232
239
|
* One solution to some of the above problems is to consider the currently
|
|
233
240
|
* active configuration. If the configuration we want is already active, then
|
|
234
241
|
* we don't have to select any configuration:
|
|
235
242
|
\code
|
|
236
|
-
cfg =
|
|
243
|
+
cfg = -1;
|
|
244
|
+
libusb_get_configuration(dev, &cfg);
|
|
237
245
|
if (cfg != desired)
|
|
238
246
|
libusb_set_configuration(dev, desired);
|
|
239
247
|
\endcode
|
|
@@ -323,6 +331,151 @@ if (cfg != desired)
|
|
|
323
331
|
* can infer the context from those objects.
|
|
324
332
|
*/
|
|
325
333
|
|
|
334
|
+
/**
|
|
335
|
+
* \page api Application Programming Interface
|
|
336
|
+
*
|
|
337
|
+
* This is the complete list of libusb functions, structures and
|
|
338
|
+
* enumerations in alphabetical order.
|
|
339
|
+
*
|
|
340
|
+
* \section Functions
|
|
341
|
+
* - libusb_alloc_streams()
|
|
342
|
+
* - libusb_alloc_transfer()
|
|
343
|
+
* - libusb_attach_kernel_driver()
|
|
344
|
+
* - libusb_bulk_transfer()
|
|
345
|
+
* - libusb_cancel_transfer()
|
|
346
|
+
* - libusb_claim_interface()
|
|
347
|
+
* - libusb_clear_halt()
|
|
348
|
+
* - libusb_close()
|
|
349
|
+
* - libusb_control_transfer()
|
|
350
|
+
* - libusb_control_transfer_get_data()
|
|
351
|
+
* - libusb_control_transfer_get_setup()
|
|
352
|
+
* - libusb_cpu_to_le16()
|
|
353
|
+
* - libusb_detach_kernel_driver()
|
|
354
|
+
* - libusb_error_name()
|
|
355
|
+
* - libusb_event_handler_active()
|
|
356
|
+
* - libusb_event_handling_ok()
|
|
357
|
+
* - libusb_exit()
|
|
358
|
+
* - libusb_fill_bulk_stream_transfer()
|
|
359
|
+
* - libusb_fill_bulk_transfer()
|
|
360
|
+
* - libusb_fill_control_setup()
|
|
361
|
+
* - libusb_fill_control_transfer()
|
|
362
|
+
* - libusb_fill_interrupt_transfer()
|
|
363
|
+
* - libusb_fill_iso_transfer()
|
|
364
|
+
* - libusb_free_bos_descriptor()
|
|
365
|
+
* - libusb_free_config_descriptor()
|
|
366
|
+
* - libusb_free_container_id_descriptor()
|
|
367
|
+
* - libusb_free_device_list()
|
|
368
|
+
* - libusb_free_ss_endpoint_companion_descriptor()
|
|
369
|
+
* - libusb_free_ss_usb_device_capability_descriptor()
|
|
370
|
+
* - libusb_free_streams()
|
|
371
|
+
* - libusb_free_transfer()
|
|
372
|
+
* - libusb_free_usb_2_0_extension_descriptor()
|
|
373
|
+
* - libusb_get_active_config_descriptor()
|
|
374
|
+
* - libusb_get_bos_descriptor()
|
|
375
|
+
* - libusb_get_bus_number()
|
|
376
|
+
* - libusb_get_config_descriptor()
|
|
377
|
+
* - libusb_get_config_descriptor_by_value()
|
|
378
|
+
* - libusb_get_configuration()
|
|
379
|
+
* - libusb_get_container_id_descriptor()
|
|
380
|
+
* - libusb_get_descriptor()
|
|
381
|
+
* - libusb_get_device()
|
|
382
|
+
* - libusb_get_device_address()
|
|
383
|
+
* - libusb_get_device_descriptor()
|
|
384
|
+
* - libusb_get_device_list()
|
|
385
|
+
* - libusb_get_device_speed()
|
|
386
|
+
* - libusb_get_iso_packet_buffer()
|
|
387
|
+
* - libusb_get_iso_packet_buffer_simple()
|
|
388
|
+
* - libusb_get_max_iso_packet_size()
|
|
389
|
+
* - libusb_get_max_packet_size()
|
|
390
|
+
* - libusb_get_next_timeout()
|
|
391
|
+
* - libusb_get_parent()
|
|
392
|
+
* - libusb_get_port_number()
|
|
393
|
+
* - libusb_get_port_numbers()
|
|
394
|
+
* - libusb_get_ss_endpoint_companion_descriptor()
|
|
395
|
+
* - libusb_get_ss_usb_device_capability_descriptor()
|
|
396
|
+
* - libusb_get_string_descriptor()
|
|
397
|
+
* - libusb_get_string_descriptor_ascii()
|
|
398
|
+
* - libusb_get_usb_2_0_extension_descriptor()
|
|
399
|
+
* - libusb_get_version()
|
|
400
|
+
* - libusb_handle_events()
|
|
401
|
+
* - libusb_handle_events_completed()
|
|
402
|
+
* - libusb_handle_events_locked()
|
|
403
|
+
* - libusb_handle_events_timeout()
|
|
404
|
+
* - libusb_handle_events_timeout_completed()
|
|
405
|
+
* - libusb_has_capability()
|
|
406
|
+
* - libusb_hotplug_deregister_callback()
|
|
407
|
+
* - libusb_hotplug_register_callback()
|
|
408
|
+
* - libusb_init()
|
|
409
|
+
* - libusb_interrupt_transfer()
|
|
410
|
+
* - libusb_kernel_driver_active()
|
|
411
|
+
* - libusb_lock_events()
|
|
412
|
+
* - libusb_lock_event_waiters()
|
|
413
|
+
* - libusb_open()
|
|
414
|
+
* - libusb_open_device_with_vid_pid()
|
|
415
|
+
* - libusb_pollfds_handle_timeouts()
|
|
416
|
+
* - libusb_ref_device()
|
|
417
|
+
* - libusb_release_interface()
|
|
418
|
+
* - libusb_reset_device()
|
|
419
|
+
* - libusb_set_auto_detach_kernel_driver()
|
|
420
|
+
* - libusb_set_configuration()
|
|
421
|
+
* - libusb_set_debug()
|
|
422
|
+
* - libusb_set_interface_alt_setting()
|
|
423
|
+
* - libusb_set_iso_packet_lengths()
|
|
424
|
+
* - libusb_setlocale()
|
|
425
|
+
* - libusb_set_pollfd_notifiers()
|
|
426
|
+
* - libusb_strerror()
|
|
427
|
+
* - libusb_submit_transfer()
|
|
428
|
+
* - libusb_transfer_get_stream_id()
|
|
429
|
+
* - libusb_transfer_set_stream_id()
|
|
430
|
+
* - libusb_try_lock_events()
|
|
431
|
+
* - libusb_unlock_events()
|
|
432
|
+
* - libusb_unlock_event_waiters()
|
|
433
|
+
* - libusb_unref_device()
|
|
434
|
+
* - libusb_wait_for_event()
|
|
435
|
+
*
|
|
436
|
+
* \section Structures
|
|
437
|
+
* - libusb_bos_descriptor
|
|
438
|
+
* - libusb_bos_dev_capability_descriptor
|
|
439
|
+
* - libusb_config_descriptor
|
|
440
|
+
* - libusb_container_id_descriptor
|
|
441
|
+
* - \ref libusb_context
|
|
442
|
+
* - libusb_control_setup
|
|
443
|
+
* - \ref libusb_device
|
|
444
|
+
* - libusb_device_descriptor
|
|
445
|
+
* - \ref libusb_device_handle
|
|
446
|
+
* - libusb_endpoint_descriptor
|
|
447
|
+
* - libusb_interface
|
|
448
|
+
* - libusb_interface_descriptor
|
|
449
|
+
* - libusb_iso_packet_descriptor
|
|
450
|
+
* - libusb_pollfd
|
|
451
|
+
* - libusb_ss_endpoint_companion_descriptor
|
|
452
|
+
* - libusb_ss_usb_device_capability_descriptor
|
|
453
|
+
* - libusb_transfer
|
|
454
|
+
* - libusb_usb_2_0_extension_descriptor
|
|
455
|
+
* - libusb_version
|
|
456
|
+
*
|
|
457
|
+
* \section Enums
|
|
458
|
+
* - \ref libusb_bos_type
|
|
459
|
+
* - \ref libusb_capability
|
|
460
|
+
* - \ref libusb_class_code
|
|
461
|
+
* - \ref libusb_descriptor_type
|
|
462
|
+
* - \ref libusb_endpoint_direction
|
|
463
|
+
* - \ref libusb_error
|
|
464
|
+
* - \ref libusb_iso_sync_type
|
|
465
|
+
* - \ref libusb_iso_usage_type
|
|
466
|
+
* - \ref libusb_log_level
|
|
467
|
+
* - \ref libusb_request_recipient
|
|
468
|
+
* - \ref libusb_request_type
|
|
469
|
+
* - \ref libusb_speed
|
|
470
|
+
* - \ref libusb_ss_usb_device_capability_attributes
|
|
471
|
+
* - \ref libusb_standard_request
|
|
472
|
+
* - \ref libusb_supported_speed
|
|
473
|
+
* - \ref libusb_transfer_flags
|
|
474
|
+
* - \ref libusb_transfer_status
|
|
475
|
+
* - \ref libusb_transfer_type
|
|
476
|
+
* - \ref libusb_usb_2_0_extension_attributes
|
|
477
|
+
*/
|
|
478
|
+
|
|
326
479
|
/**
|
|
327
480
|
* @defgroup lib Library initialization/deinitialization
|
|
328
481
|
* This page details how to initialize and deinitialize libusb. Initialization
|
|
@@ -533,12 +686,8 @@ struct libusb_device *usbi_alloc_device(struct libusb_context *ctx,
|
|
|
533
686
|
|
|
534
687
|
void usbi_connect_device(struct libusb_device *dev)
|
|
535
688
|
{
|
|
536
|
-
|
|
537
|
-
ssize_t ret;
|
|
689
|
+
struct libusb_context *ctx = DEVICE_CTX(dev);
|
|
538
690
|
|
|
539
|
-
memset(&message, 0, sizeof(message));
|
|
540
|
-
message.event = LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED;
|
|
541
|
-
message.device = dev;
|
|
542
691
|
dev->attached = 1;
|
|
543
692
|
|
|
544
693
|
usbi_mutex_lock(&dev->ctx->usb_devs_lock);
|
|
@@ -546,25 +695,17 @@ void usbi_connect_device(struct libusb_device *dev)
|
|
|
546
695
|
usbi_mutex_unlock(&dev->ctx->usb_devs_lock);
|
|
547
696
|
|
|
548
697
|
/* Signal that an event has occurred for this device if we support hotplug AND
|
|
549
|
-
* the hotplug
|
|
550
|
-
* initial enumeration. */
|
|
551
|
-
if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->
|
|
552
|
-
|
|
553
|
-
if (sizeof (message) != ret) {
|
|
554
|
-
usbi_err(DEVICE_CTX(dev), "error writing hotplug message");
|
|
555
|
-
}
|
|
698
|
+
* the hotplug message list is ready. This prevents an event from getting raised
|
|
699
|
+
* during initial enumeration. */
|
|
700
|
+
if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->hotplug_msgs.next) {
|
|
701
|
+
usbi_hotplug_notification(ctx, dev, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED);
|
|
556
702
|
}
|
|
557
703
|
}
|
|
558
704
|
|
|
559
705
|
void usbi_disconnect_device(struct libusb_device *dev)
|
|
560
706
|
{
|
|
561
|
-
|
|
562
|
-
struct libusb_context *ctx = dev->ctx;
|
|
563
|
-
ssize_t ret;
|
|
707
|
+
struct libusb_context *ctx = DEVICE_CTX(dev);
|
|
564
708
|
|
|
565
|
-
memset(&message, 0, sizeof(message));
|
|
566
|
-
message.event = LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT;
|
|
567
|
-
message.device = dev;
|
|
568
709
|
usbi_mutex_lock(&dev->lock);
|
|
569
710
|
dev->attached = 0;
|
|
570
711
|
usbi_mutex_unlock(&dev->lock);
|
|
@@ -574,14 +715,11 @@ void usbi_disconnect_device(struct libusb_device *dev)
|
|
|
574
715
|
usbi_mutex_unlock(&ctx->usb_devs_lock);
|
|
575
716
|
|
|
576
717
|
/* Signal that an event has occurred for this device if we support hotplug AND
|
|
577
|
-
* the hotplug
|
|
578
|
-
* initial enumeration. libusb_handle_events will take care of dereferencing
|
|
579
|
-
* device. */
|
|
580
|
-
if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->
|
|
581
|
-
|
|
582
|
-
if (sizeof(message) != ret) {
|
|
583
|
-
usbi_err(DEVICE_CTX(dev), "error writing hotplug message");
|
|
584
|
-
}
|
|
718
|
+
* the hotplug message list is ready. This prevents an event from getting raised
|
|
719
|
+
* during initial enumeration. libusb_handle_events will take care of dereferencing
|
|
720
|
+
* the device. */
|
|
721
|
+
if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->hotplug_msgs.next) {
|
|
722
|
+
usbi_hotplug_notification(ctx, dev, LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT);
|
|
585
723
|
}
|
|
586
724
|
}
|
|
587
725
|
|
|
@@ -1021,47 +1159,41 @@ void API_EXPORTED libusb_unref_device(libusb_device *dev)
|
|
|
1021
1159
|
}
|
|
1022
1160
|
|
|
1023
1161
|
/*
|
|
1024
|
-
*
|
|
1025
|
-
*
|
|
1162
|
+
* Signal the event pipe so that the event handling thread will be
|
|
1163
|
+
* interrupted to process an internal event.
|
|
1026
1164
|
*/
|
|
1027
|
-
|
|
1165
|
+
int usbi_signal_event(struct libusb_context *ctx)
|
|
1028
1166
|
{
|
|
1029
1167
|
unsigned char dummy = 1;
|
|
1030
1168
|
ssize_t r;
|
|
1031
1169
|
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
/* record that we are messing with poll fds */
|
|
1036
|
-
usbi_mutex_lock(&ctx->pollfd_modify_lock);
|
|
1037
|
-
ctx->pollfd_modify++;
|
|
1038
|
-
usbi_mutex_unlock(&ctx->pollfd_modify_lock);
|
|
1039
|
-
|
|
1040
|
-
/* write some data on control pipe to interrupt event handlers */
|
|
1041
|
-
r = usbi_write(ctx->ctrl_pipe[1], &dummy, sizeof(dummy));
|
|
1042
|
-
if (r <= 0) {
|
|
1170
|
+
/* write some data on event pipe to interrupt event handlers */
|
|
1171
|
+
r = usbi_write(ctx->event_pipe[1], &dummy, sizeof(dummy));
|
|
1172
|
+
if (r != sizeof(dummy)) {
|
|
1043
1173
|
usbi_warn(ctx, "internal signalling write failed");
|
|
1044
|
-
|
|
1045
|
-
ctx->pollfd_modify--;
|
|
1046
|
-
usbi_mutex_unlock(&ctx->pollfd_modify_lock);
|
|
1047
|
-
return;
|
|
1174
|
+
return LIBUSB_ERROR_IO;
|
|
1048
1175
|
}
|
|
1049
1176
|
|
|
1050
|
-
|
|
1051
|
-
|
|
1177
|
+
return 0;
|
|
1178
|
+
}
|
|
1052
1179
|
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1180
|
+
/*
|
|
1181
|
+
* Clear the event pipe so that the event handling will no longer be
|
|
1182
|
+
* interrupted.
|
|
1183
|
+
*/
|
|
1184
|
+
int usbi_clear_event(struct libusb_context *ctx)
|
|
1185
|
+
{
|
|
1186
|
+
unsigned char dummy;
|
|
1187
|
+
ssize_t r;
|
|
1057
1188
|
|
|
1058
|
-
/*
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1189
|
+
/* read some data on event pipe to clear it */
|
|
1190
|
+
r = usbi_read(ctx->event_pipe[0], &dummy, sizeof(dummy));
|
|
1191
|
+
if (r != sizeof(dummy)) {
|
|
1192
|
+
usbi_warn(ctx, "internal signalling read failed");
|
|
1193
|
+
return LIBUSB_ERROR_IO;
|
|
1194
|
+
}
|
|
1062
1195
|
|
|
1063
|
-
|
|
1064
|
-
libusb_unlock_events(ctx);
|
|
1196
|
+
return 0;
|
|
1065
1197
|
}
|
|
1066
1198
|
|
|
1067
1199
|
/** \ingroup dev
|
|
@@ -1125,14 +1257,6 @@ int API_EXPORTED libusb_open(libusb_device *dev,
|
|
|
1125
1257
|
usbi_mutex_unlock(&ctx->open_devs_lock);
|
|
1126
1258
|
*handle = _handle;
|
|
1127
1259
|
|
|
1128
|
-
/* At this point, we want to interrupt any existing event handlers so
|
|
1129
|
-
* that they realise the addition of the new device's poll fd. One
|
|
1130
|
-
* example when this is desirable is if the user is running a separate
|
|
1131
|
-
* dedicated libusb events handling thread, which is running with a long
|
|
1132
|
-
* or infinite timeout. We want to interrupt that iteration of the loop,
|
|
1133
|
-
* so that it picks up the new fd, and then continues. */
|
|
1134
|
-
usbi_fd_notification(ctx);
|
|
1135
|
-
|
|
1136
1260
|
return 0;
|
|
1137
1261
|
}
|
|
1138
1262
|
|
|
@@ -1260,8 +1384,7 @@ static void do_close(struct libusb_context *ctx,
|
|
|
1260
1384
|
void API_EXPORTED libusb_close(libusb_device_handle *dev_handle)
|
|
1261
1385
|
{
|
|
1262
1386
|
struct libusb_context *ctx;
|
|
1263
|
-
|
|
1264
|
-
ssize_t r;
|
|
1387
|
+
int pending_events;
|
|
1265
1388
|
|
|
1266
1389
|
if (!dev_handle)
|
|
1267
1390
|
return;
|
|
@@ -1275,37 +1398,29 @@ void API_EXPORTED libusb_close(libusb_device_handle *dev_handle)
|
|
|
1275
1398
|
* thread from doing event handling) because we will be removing a file
|
|
1276
1399
|
* descriptor from the polling loop. */
|
|
1277
1400
|
|
|
1278
|
-
/*
|
|
1279
|
-
|
|
1280
|
-
ctx->
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
usbi_warn(ctx, "internal signalling write failed, closing anyway");
|
|
1287
|
-
do_close(ctx, dev_handle);
|
|
1288
|
-
usbi_mutex_lock(&ctx->pollfd_modify_lock);
|
|
1289
|
-
ctx->pollfd_modify--;
|
|
1290
|
-
usbi_mutex_unlock(&ctx->pollfd_modify_lock);
|
|
1291
|
-
return;
|
|
1292
|
-
}
|
|
1401
|
+
/* Record that we are closing a device.
|
|
1402
|
+
* Only signal an event if there are no prior pending events. */
|
|
1403
|
+
usbi_mutex_lock(&ctx->event_data_lock);
|
|
1404
|
+
pending_events = usbi_pending_events(ctx);
|
|
1405
|
+
ctx->device_close++;
|
|
1406
|
+
if (!pending_events)
|
|
1407
|
+
usbi_signal_event(ctx);
|
|
1408
|
+
usbi_mutex_unlock(&ctx->event_data_lock);
|
|
1293
1409
|
|
|
1294
1410
|
/* take event handling lock */
|
|
1295
1411
|
libusb_lock_events(ctx);
|
|
1296
1412
|
|
|
1297
|
-
/* read the dummy data */
|
|
1298
|
-
r = usbi_read(ctx->ctrl_pipe[0], &dummy, sizeof(dummy));
|
|
1299
|
-
if (r <= 0)
|
|
1300
|
-
usbi_warn(ctx, "internal signalling read failed, closing anyway");
|
|
1301
|
-
|
|
1302
1413
|
/* Close the device */
|
|
1303
1414
|
do_close(ctx, dev_handle);
|
|
1304
1415
|
|
|
1305
|
-
/*
|
|
1306
|
-
|
|
1307
|
-
ctx->
|
|
1308
|
-
|
|
1416
|
+
/* We're done with closing this device.
|
|
1417
|
+
* Clear the event pipe if there are no further pending events. */
|
|
1418
|
+
usbi_mutex_lock(&ctx->event_data_lock);
|
|
1419
|
+
ctx->device_close--;
|
|
1420
|
+
pending_events = usbi_pending_events(ctx);
|
|
1421
|
+
if (!pending_events)
|
|
1422
|
+
usbi_clear_event(ctx);
|
|
1423
|
+
usbi_mutex_unlock(&ctx->event_data_lock);
|
|
1309
1424
|
|
|
1310
1425
|
/* Release event handling lock and wake up event waiters */
|
|
1311
1426
|
libusb_unlock_events(ctx);
|
|
@@ -1413,7 +1528,8 @@ int API_EXPORTED libusb_get_configuration(libusb_device_handle *dev,
|
|
|
1413
1528
|
*
|
|
1414
1529
|
* \param dev a device handle
|
|
1415
1530
|
* \param configuration the bConfigurationValue of the configuration you
|
|
1416
|
-
* wish to activate, or -1 if you wish to put the device in unconfigured
|
|
1531
|
+
* wish to activate, or -1 if you wish to put the device in an unconfigured
|
|
1532
|
+
* state
|
|
1417
1533
|
* \returns 0 on success
|
|
1418
1534
|
* \returns LIBUSB_ERROR_NOT_FOUND if the requested configuration does not exist
|
|
1419
1535
|
* \returns LIBUSB_ERROR_BUSY if interfaces are currently claimed
|
|
@@ -1907,8 +2023,8 @@ int API_EXPORTED libusb_init(libusb_context **context)
|
|
|
1907
2023
|
usbi_dbg("created default context");
|
|
1908
2024
|
}
|
|
1909
2025
|
|
|
1910
|
-
usbi_dbg("libusb v%
|
|
1911
|
-
libusb_version_internal.micro, libusb_version_internal.nano);
|
|
2026
|
+
usbi_dbg("libusb v%u.%u.%u.%u%s", libusb_version_internal.major, libusb_version_internal.minor,
|
|
2027
|
+
libusb_version_internal.micro, libusb_version_internal.nano, libusb_version_internal.rc);
|
|
1912
2028
|
|
|
1913
2029
|
usbi_mutex_init(&ctx->usb_devs_lock, NULL);
|
|
1914
2030
|
usbi_mutex_init(&ctx->open_devs_lock, NULL);
|
|
@@ -1946,8 +2062,10 @@ err_backend_exit:
|
|
|
1946
2062
|
if (usbi_backend->exit)
|
|
1947
2063
|
usbi_backend->exit();
|
|
1948
2064
|
err_free_ctx:
|
|
1949
|
-
if (ctx == usbi_default_context)
|
|
2065
|
+
if (ctx == usbi_default_context) {
|
|
1950
2066
|
usbi_default_context = NULL;
|
|
2067
|
+
default_context_refcnt--;
|
|
2068
|
+
}
|
|
1951
2069
|
|
|
1952
2070
|
usbi_mutex_static_lock(&active_contexts_lock);
|
|
1953
2071
|
list_del (&ctx->list);
|
|
@@ -2191,8 +2309,8 @@ void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level,
|
|
|
2191
2309
|
usbi_gettimeofday(&now, NULL);
|
|
2192
2310
|
if ((global_debug) && (!has_debug_header_been_displayed)) {
|
|
2193
2311
|
has_debug_header_been_displayed = 1;
|
|
2194
|
-
usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "[timestamp] [threadID] facility level [function call] <message
|
|
2195
|
-
usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "
|
|
2312
|
+
usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "[timestamp] [threadID] facility level [function call] <message>" USBI_LOG_LINE_END);
|
|
2313
|
+
usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "--------------------------------------------------------------------------------" USBI_LOG_LINE_END);
|
|
2196
2314
|
}
|
|
2197
2315
|
if (now.tv_usec < timestamp_origin.tv_usec) {
|
|
2198
2316
|
now.tv_sec--;
|