libusb 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +2 -0
- data.tar.gz.sig +0 -0
- data/.travis.yml +3 -3
- data/History.md +8 -0
- data/README.md +1 -0
- data/Rakefile +14 -14
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/AUTHORS +6 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/COPYING +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/ChangeLog +9 -2
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/INSTALL +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/Makefile.am +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/Makefile.in +188 -156
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/NEWS +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/PORTING +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/README +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/TODO +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/Xcode/common.xcconfig +10 -1
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/Xcode/config.h +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/Xcode/debug.xcconfig +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/Xcode/libusb.xcconfig +1 -1
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/Xcode/libusb.xcodeproj/project.pbxproj +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/Xcode/libusb_debug.xcconfig +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/Xcode/libusb_release.xcconfig +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/Xcode/release.xcconfig +1 -0
- data/ext/libusb-1.0.19/aclocal.m4 +1190 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/android/README +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/android/config.h +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/android/jni/Android.mk +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/android/jni/Application.mk +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/android/jni/examples.mk +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/android/jni/libusb.mk +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/android/jni/tests.mk +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/compile +7 -3
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/config.guess +116 -78
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/config.h.in +0 -3
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/config.sub +66 -46
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/configure +265 -208
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/configure.ac +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/depcomp +269 -186
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/doc/Makefile.am +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/doc/Makefile.in +72 -35
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/doc/doxygen.cfg.in +1 -1
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/examples/Makefile.am +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/examples/Makefile.in +134 -70
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/examples/dpfp.c +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/examples/dpfp_threaded.c +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/examples/ezusb.c +9 -5
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/examples/ezusb.h +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/examples/fxload.c +1 -1
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/examples/getopt/getopt.c +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/examples/getopt/getopt.h +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/examples/getopt/getopt1.c +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/examples/hotplugtest.c +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/examples/listdevs.c +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/examples/sam3u_benchmark.c +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/examples/xusb.c +22 -2
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/install-sh +7 -7
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb-1.0.pc.in +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/Makefile.am +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/Makefile.in +133 -93
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/core.c +86 -15
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/descriptor.c +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/hotplug.c +6 -1
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/hotplug.h +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/io.c +54 -17
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/libusb-1.0.def +8 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/libusb-1.0.rc +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/libusb.h +42 -2
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/libusbi.h +10 -1
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/darwin_usb.c +156 -53
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/darwin_usb.h +1 -1
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/linux_netlink.c +26 -2
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/linux_udev.c +2 -1
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/linux_usbfs.c +93 -6
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/linux_usbfs.h +12 -1
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/netbsd_usb.c +6 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/openbsd_usb.c +6 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/poll_posix.c +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/poll_posix.h +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/poll_windows.c +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/poll_windows.h +12 -6
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/threads_posix.c +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/threads_posix.h +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/threads_windows.c +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/threads_windows.h +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/wince_usb.c +8 -1
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/wince_usb.h +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/windows_common.h +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/windows_usb.c +175 -42
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/os/windows_usb.h +35 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/strerror.c +17 -2
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/sync.c +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/libusb/version.h +1 -1
- data/ext/libusb-1.0.19/libusb/version_nano.h +1 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/ltmain.sh +3 -3
- data/ext/{libusb-1.0.18/aclocal.m4 → libusb-1.0.19/m4/libtool.m4} +36 -1734
- data/ext/libusb-1.0.19/m4/ltoptions.m4 +384 -0
- data/ext/libusb-1.0.19/m4/ltsugar.m4 +123 -0
- data/ext/libusb-1.0.19/m4/ltversion.m4 +23 -0
- data/ext/libusb-1.0.19/m4/lt~obsolete.m4 +98 -0
- data/ext/libusb-1.0.19/missing +215 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/tests/Makefile.am +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/tests/Makefile.in +128 -70
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/tests/libusb_testlib.h +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/tests/stress.c +0 -0
- data/ext/{libusb-1.0.18 → libusb-1.0.19}/tests/testlib.c +0 -0
- data/lib/libusb.rb +3 -1
- data/lib/libusb/bos.rb +306 -0
- data/lib/libusb/call.rb +84 -0
- data/lib/libusb/constants.rb +4 -0
- data/lib/libusb/dev_handle.rb +77 -0
- data/lib/libusb/endpoint.rb +20 -0
- data/lib/libusb/ss_companion.rb +69 -0
- data/lib/libusb/transfer.rb +34 -0
- data/lib/libusb/version_gem.rb +1 -1
- data/libusb.gemspec +1 -0
- data/test/test_libusb_bos.rb +118 -0
- data/test/test_libusb_bulk_stream_transfer.rb +50 -0
- data/test/test_libusb_descriptors.rb +29 -0
- data/test/test_libusb_hotplug.rb +1 -1
- data/test/test_libusb_threads.rb +1 -1
- metadata +146 -124
- metadata.gz.sig +0 -0
- data/ext/libusb-1.0.18/libusb/version_nano.h +0 -1
- data/ext/libusb-1.0.18/missing +0 -331
@@ -775,22 +775,22 @@ int API_EXPORTED libusb_get_port_numbers(libusb_device *dev,
|
|
775
775
|
uint8_t* port_numbers, int port_numbers_len)
|
776
776
|
{
|
777
777
|
int i = port_numbers_len;
|
778
|
+
struct libusb_context *ctx = DEVICE_CTX(dev);
|
778
779
|
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
i
|
785
|
-
|
786
|
-
usbi_warn(DEVICE_CTX(dev),
|
787
|
-
"port numbers array too small");
|
780
|
+
if (port_numbers_len <= 0)
|
781
|
+
return LIBUSB_ERROR_INVALID_PARAM;
|
782
|
+
|
783
|
+
// HCDs can be listed as devices with port #0
|
784
|
+
while((dev) && (dev->port_number != 0)) {
|
785
|
+
if (--i < 0) {
|
786
|
+
usbi_warn(ctx, "port numbers array is too small");
|
788
787
|
return LIBUSB_ERROR_OVERFLOW;
|
789
788
|
}
|
790
789
|
port_numbers[i] = dev->port_number;
|
791
790
|
dev = dev->parent_dev;
|
792
791
|
}
|
793
|
-
|
792
|
+
if (i < port_numbers_len)
|
793
|
+
memmove(port_numbers, &port_numbers[i], port_numbers_len - i);
|
794
794
|
return port_numbers_len - i;
|
795
795
|
}
|
796
796
|
|
@@ -899,10 +899,14 @@ int API_EXPORTED libusb_get_max_packet_size(libusb_device *dev,
|
|
899
899
|
}
|
900
900
|
|
901
901
|
ep = find_endpoint(config, endpoint);
|
902
|
-
if (!ep)
|
903
|
-
|
902
|
+
if (!ep) {
|
903
|
+
r = LIBUSB_ERROR_NOT_FOUND;
|
904
|
+
goto out;
|
905
|
+
}
|
904
906
|
|
905
907
|
r = ep->wMaxPacketSize;
|
908
|
+
|
909
|
+
out:
|
906
910
|
libusb_free_config_descriptor(config);
|
907
911
|
return r;
|
908
912
|
}
|
@@ -950,17 +954,21 @@ int API_EXPORTED libusb_get_max_iso_packet_size(libusb_device *dev,
|
|
950
954
|
}
|
951
955
|
|
952
956
|
ep = find_endpoint(config, endpoint);
|
953
|
-
if (!ep)
|
954
|
-
|
957
|
+
if (!ep) {
|
958
|
+
r = LIBUSB_ERROR_NOT_FOUND;
|
959
|
+
goto out;
|
960
|
+
}
|
955
961
|
|
956
962
|
val = ep->wMaxPacketSize;
|
957
963
|
ep_type = (enum libusb_transfer_type) (ep->bmAttributes & 0x3);
|
958
|
-
libusb_free_config_descriptor(config);
|
959
964
|
|
960
965
|
r = val & 0x07ff;
|
961
966
|
if (ep_type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS
|
962
967
|
|| ep_type == LIBUSB_TRANSFER_TYPE_INTERRUPT)
|
963
968
|
r *= (1 + ((val >> 11) & 3));
|
969
|
+
|
970
|
+
out:
|
971
|
+
libusb_free_config_descriptor(config);
|
964
972
|
return r;
|
965
973
|
}
|
966
974
|
|
@@ -1615,6 +1623,69 @@ int API_EXPORTED libusb_reset_device(libusb_device_handle *dev)
|
|
1615
1623
|
return usbi_backend->reset_device(dev);
|
1616
1624
|
}
|
1617
1625
|
|
1626
|
+
/** \ingroup asyncio
|
1627
|
+
* Allocate up to num_streams usb bulk streams on the specified endpoints. This
|
1628
|
+
* function takes an array of endpoints rather then a single endpoint because
|
1629
|
+
* some protocols require that endpoints are setup with similar stream ids.
|
1630
|
+
* All endpoints passed in must belong to the same interface.
|
1631
|
+
*
|
1632
|
+
* Note this function may return less streams then requested. Also note that the
|
1633
|
+
* same number of streams are allocated for each endpoint in the endpoint array.
|
1634
|
+
*
|
1635
|
+
* Stream id 0 is reserved, and should not be used to communicate with devices.
|
1636
|
+
* If libusb_alloc_streams() returns with a value of N, you may use stream ids
|
1637
|
+
* 1 to N.
|
1638
|
+
*
|
1639
|
+
* Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103
|
1640
|
+
*
|
1641
|
+
* \param dev a device handle
|
1642
|
+
* \param num_streams number of streams to try to allocate
|
1643
|
+
* \param endpoints array of endpoints to allocate streams on
|
1644
|
+
* \param num_endpoints length of the endpoints array
|
1645
|
+
* \returns number of streams allocated, or a LIBUSB_ERROR code on failure
|
1646
|
+
*/
|
1647
|
+
int API_EXPORTED libusb_alloc_streams(libusb_device_handle *dev,
|
1648
|
+
uint32_t num_streams, unsigned char *endpoints, int num_endpoints)
|
1649
|
+
{
|
1650
|
+
usbi_dbg("streams %u eps %d", (unsigned) num_streams, num_endpoints);
|
1651
|
+
|
1652
|
+
if (!dev->dev->attached)
|
1653
|
+
return LIBUSB_ERROR_NO_DEVICE;
|
1654
|
+
|
1655
|
+
if (usbi_backend->alloc_streams)
|
1656
|
+
return usbi_backend->alloc_streams(dev, num_streams, endpoints,
|
1657
|
+
num_endpoints);
|
1658
|
+
else
|
1659
|
+
return LIBUSB_ERROR_NOT_SUPPORTED;
|
1660
|
+
}
|
1661
|
+
|
1662
|
+
/** \ingroup asyncio
|
1663
|
+
* Free usb bulk streams allocated with libusb_alloc_streams().
|
1664
|
+
*
|
1665
|
+
* Note streams are automatically free-ed when releasing an interface.
|
1666
|
+
*
|
1667
|
+
* Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103
|
1668
|
+
*
|
1669
|
+
* \param dev a device handle
|
1670
|
+
* \param endpoints array of endpoints to free streams on
|
1671
|
+
* \param num_endpoints length of the endpoints array
|
1672
|
+
* \returns LIBUSB_SUCCESS, or a LIBUSB_ERROR code on failure
|
1673
|
+
*/
|
1674
|
+
int API_EXPORTED libusb_free_streams(libusb_device_handle *dev,
|
1675
|
+
unsigned char *endpoints, int num_endpoints)
|
1676
|
+
{
|
1677
|
+
usbi_dbg("eps %d", num_endpoints);
|
1678
|
+
|
1679
|
+
if (!dev->dev->attached)
|
1680
|
+
return LIBUSB_ERROR_NO_DEVICE;
|
1681
|
+
|
1682
|
+
if (usbi_backend->free_streams)
|
1683
|
+
return usbi_backend->free_streams(dev, endpoints,
|
1684
|
+
num_endpoints);
|
1685
|
+
else
|
1686
|
+
return LIBUSB_ERROR_NOT_SUPPORTED;
|
1687
|
+
}
|
1688
|
+
|
1618
1689
|
/** \ingroup dev
|
1619
1690
|
* Determine if a kernel driver is active on an interface. If a kernel driver
|
1620
1691
|
* is active, you cannot claim the interface, and libusb will be unable to
|
File without changes
|
@@ -86,6 +86,10 @@
|
|
86
86
|
*
|
87
87
|
* The following code provides an example of the usage of the hotplug interface:
|
88
88
|
\code
|
89
|
+
#include <stdio.h>
|
90
|
+
#include <stdlib.h>
|
91
|
+
#include <libusb.h>
|
92
|
+
|
89
93
|
static int count = 0;
|
90
94
|
|
91
95
|
int hotplug_callback(struct libusb_context *ctx, struct libusb_device *dev,
|
@@ -131,10 +135,11 @@ int main (void) {
|
|
131
135
|
}
|
132
136
|
|
133
137
|
while (count < 2) {
|
138
|
+
libusb_handle_events_completed(NULL, NULL);
|
134
139
|
usleep(10000);
|
135
140
|
}
|
136
141
|
|
137
|
-
libusb_hotplug_deregister_callback(handle);
|
142
|
+
libusb_hotplug_deregister_callback(NULL, handle);
|
138
143
|
libusb_exit(NULL);
|
139
144
|
|
140
145
|
return 0;
|
File without changes
|
@@ -1439,6 +1439,7 @@ int API_EXPORTED libusb_submit_transfer(struct libusb_transfer *transfer)
|
|
1439
1439
|
int r;
|
1440
1440
|
int updated_fds;
|
1441
1441
|
|
1442
|
+
usbi_mutex_lock(&ctx->flying_transfers_lock);
|
1442
1443
|
usbi_mutex_lock(&itransfer->lock);
|
1443
1444
|
itransfer->transferred = 0;
|
1444
1445
|
itransfer->flags = 0;
|
@@ -1448,7 +1449,6 @@ int API_EXPORTED libusb_submit_transfer(struct libusb_transfer *transfer)
|
|
1448
1449
|
goto out;
|
1449
1450
|
}
|
1450
1451
|
|
1451
|
-
usbi_mutex_lock(&ctx->flying_transfers_lock);
|
1452
1452
|
r = add_to_flying_list(itransfer);
|
1453
1453
|
if (r == LIBUSB_SUCCESS) {
|
1454
1454
|
r = usbi_backend->submit_transfer(itransfer);
|
@@ -1456,14 +1456,14 @@ int API_EXPORTED libusb_submit_transfer(struct libusb_transfer *transfer)
|
|
1456
1456
|
if (r != LIBUSB_SUCCESS) {
|
1457
1457
|
list_del(&itransfer->list);
|
1458
1458
|
arm_timerfd_for_next_timeout(ctx);
|
1459
|
+
} else {
|
1460
|
+
/* keep a reference to this device */
|
1461
|
+
libusb_ref_device(transfer->dev_handle->dev);
|
1459
1462
|
}
|
1460
|
-
usbi_mutex_unlock(&ctx->flying_transfers_lock);
|
1461
|
-
|
1462
|
-
/* keep a reference to this device */
|
1463
|
-
libusb_ref_device(transfer->dev_handle->dev);
|
1464
1463
|
out:
|
1465
1464
|
updated_fds = (itransfer->flags & USBI_TRANSFER_UPDATED_FDS);
|
1466
1465
|
usbi_mutex_unlock(&itransfer->lock);
|
1466
|
+
usbi_mutex_unlock(&ctx->flying_transfers_lock);
|
1467
1467
|
if (updated_fds)
|
1468
1468
|
usbi_fd_notification(ctx);
|
1469
1469
|
return r;
|
@@ -1510,6 +1510,43 @@ int API_EXPORTED libusb_cancel_transfer(struct libusb_transfer *transfer)
|
|
1510
1510
|
return r;
|
1511
1511
|
}
|
1512
1512
|
|
1513
|
+
/** \ingroup asyncio
|
1514
|
+
* Set a transfers bulk stream id. Note users are advised to use
|
1515
|
+
* libusb_fill_bulk_stream_transfer() instead of calling this function
|
1516
|
+
* directly.
|
1517
|
+
*
|
1518
|
+
* Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103
|
1519
|
+
*
|
1520
|
+
* \param transfer the transfer to set the stream id for
|
1521
|
+
* \param stream_id the stream id to set
|
1522
|
+
* \see libusb_alloc_streams()
|
1523
|
+
*/
|
1524
|
+
void API_EXPORTED libusb_transfer_set_stream_id(
|
1525
|
+
struct libusb_transfer *transfer, uint32_t stream_id)
|
1526
|
+
{
|
1527
|
+
struct usbi_transfer *itransfer =
|
1528
|
+
LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer);
|
1529
|
+
|
1530
|
+
itransfer->stream_id = stream_id;
|
1531
|
+
}
|
1532
|
+
|
1533
|
+
/** \ingroup asyncio
|
1534
|
+
* Get a transfers bulk stream id.
|
1535
|
+
*
|
1536
|
+
* Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103
|
1537
|
+
*
|
1538
|
+
* \param transfer the transfer to get the stream id for
|
1539
|
+
* \returns the stream id for the transfer
|
1540
|
+
*/
|
1541
|
+
uint32_t API_EXPORTED libusb_transfer_get_stream_id(
|
1542
|
+
struct libusb_transfer *transfer)
|
1543
|
+
{
|
1544
|
+
struct usbi_transfer *itransfer =
|
1545
|
+
LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer);
|
1546
|
+
|
1547
|
+
return itransfer->stream_id;
|
1548
|
+
}
|
1549
|
+
|
1513
1550
|
/* Handle completion of a transfer (completion might be an error condition).
|
1514
1551
|
* This will invoke the user-supplied callback function, which may end up
|
1515
1552
|
* freeing the transfer. Therefore you cannot use the transfer structure
|
@@ -1604,7 +1641,7 @@ int usbi_handle_transfer_cancellation(struct usbi_transfer *transfer)
|
|
1604
1641
|
* \param ctx the context to operate on, or NULL for the default context
|
1605
1642
|
* \returns 0 if the lock was obtained successfully
|
1606
1643
|
* \returns 1 if the lock was not obtained (i.e. another thread holds the lock)
|
1607
|
-
* \
|
1644
|
+
* \ref mtasync
|
1608
1645
|
*/
|
1609
1646
|
int API_EXPORTED libusb_try_lock_events(libusb_context *ctx)
|
1610
1647
|
{
|
@@ -1646,7 +1683,7 @@ int API_EXPORTED libusb_try_lock_events(libusb_context *ctx)
|
|
1646
1683
|
* as soon as possible.
|
1647
1684
|
*
|
1648
1685
|
* \param ctx the context to operate on, or NULL for the default context
|
1649
|
-
* \
|
1686
|
+
* \ref mtasync
|
1650
1687
|
*/
|
1651
1688
|
void API_EXPORTED libusb_lock_events(libusb_context *ctx)
|
1652
1689
|
{
|
@@ -1661,7 +1698,7 @@ void API_EXPORTED libusb_lock_events(libusb_context *ctx)
|
|
1661
1698
|
* on libusb_wait_for_event().
|
1662
1699
|
*
|
1663
1700
|
* \param ctx the context to operate on, or NULL for the default context
|
1664
|
-
* \
|
1701
|
+
* \ref mtasync
|
1665
1702
|
*/
|
1666
1703
|
void API_EXPORTED libusb_unlock_events(libusb_context *ctx)
|
1667
1704
|
{
|
@@ -1696,7 +1733,7 @@ void API_EXPORTED libusb_unlock_events(libusb_context *ctx)
|
|
1696
1733
|
* \param ctx the context to operate on, or NULL for the default context
|
1697
1734
|
* \returns 1 if event handling can start or continue
|
1698
1735
|
* \returns 0 if this thread must give up the events lock
|
1699
|
-
* \
|
1736
|
+
* \ref fullstory "Multi-threaded I/O: the full story"
|
1700
1737
|
*/
|
1701
1738
|
int API_EXPORTED libusb_event_handling_ok(libusb_context *ctx)
|
1702
1739
|
{
|
@@ -1724,7 +1761,7 @@ int API_EXPORTED libusb_event_handling_ok(libusb_context *ctx)
|
|
1724
1761
|
* \param ctx the context to operate on, or NULL for the default context
|
1725
1762
|
* \returns 1 if a thread is handling events
|
1726
1763
|
* \returns 0 if there are no threads currently handling events
|
1727
|
-
* \
|
1764
|
+
* \ref mtasync
|
1728
1765
|
*/
|
1729
1766
|
int API_EXPORTED libusb_event_handler_active(libusb_context *ctx)
|
1730
1767
|
{
|
@@ -1761,7 +1798,7 @@ int API_EXPORTED libusb_event_handler_active(libusb_context *ctx)
|
|
1761
1798
|
* locking.
|
1762
1799
|
*
|
1763
1800
|
* \param ctx the context to operate on, or NULL for the default context
|
1764
|
-
* \
|
1801
|
+
* \ref mtasync
|
1765
1802
|
*/
|
1766
1803
|
void API_EXPORTED libusb_lock_event_waiters(libusb_context *ctx)
|
1767
1804
|
{
|
@@ -1772,7 +1809,7 @@ void API_EXPORTED libusb_lock_event_waiters(libusb_context *ctx)
|
|
1772
1809
|
/** \ingroup poll
|
1773
1810
|
* Release the event waiters lock.
|
1774
1811
|
* \param ctx the context to operate on, or NULL for the default context
|
1775
|
-
* \
|
1812
|
+
* \ref mtasync
|
1776
1813
|
*/
|
1777
1814
|
void API_EXPORTED libusb_unlock_event_waiters(libusb_context *ctx)
|
1778
1815
|
{
|
@@ -1803,7 +1840,7 @@ void API_EXPORTED libusb_unlock_event_waiters(libusb_context *ctx)
|
|
1803
1840
|
* indicates unlimited timeout.
|
1804
1841
|
* \returns 0 after a transfer completes or another thread stops event handling
|
1805
1842
|
* \returns 1 if the timeout expired
|
1806
|
-
* \
|
1843
|
+
* \ref mtasync
|
1807
1844
|
*/
|
1808
1845
|
int API_EXPORTED libusb_wait_for_event(libusb_context *ctx, struct timeval *tv)
|
1809
1846
|
{
|
@@ -2114,7 +2151,7 @@ static int get_next_timeout(libusb_context *ctx, struct timeval *tv,
|
|
2114
2151
|
* timeval struct for non-blocking mode
|
2115
2152
|
* \param completed pointer to completion integer to check, or NULL
|
2116
2153
|
* \returns 0 on success, or a LIBUSB_ERROR code on failure
|
2117
|
-
* \
|
2154
|
+
* \ref mtasync
|
2118
2155
|
*/
|
2119
2156
|
int API_EXPORTED libusb_handle_events_timeout_completed(libusb_context *ctx,
|
2120
2157
|
struct timeval *tv, int *completed)
|
@@ -2225,7 +2262,7 @@ int API_EXPORTED libusb_handle_events(libusb_context *ctx)
|
|
2225
2262
|
* \param ctx the context to operate on, or NULL for the default context
|
2226
2263
|
* \param completed pointer to completion integer to check, or NULL
|
2227
2264
|
* \returns 0 on success, or a LIBUSB_ERROR code on failure
|
2228
|
-
* \
|
2265
|
+
* \ref mtasync
|
2229
2266
|
*/
|
2230
2267
|
int API_EXPORTED libusb_handle_events_completed(libusb_context *ctx,
|
2231
2268
|
int *completed)
|
@@ -2251,7 +2288,7 @@ int API_EXPORTED libusb_handle_events_completed(libusb_context *ctx,
|
|
2251
2288
|
* \param tv the maximum time to block waiting for events, or zero for
|
2252
2289
|
* non-blocking mode
|
2253
2290
|
* \returns 0 on success, or a LIBUSB_ERROR code on failure
|
2254
|
-
* \
|
2291
|
+
* \ref mtasync
|
2255
2292
|
*/
|
2256
2293
|
int API_EXPORTED libusb_handle_events_locked(libusb_context *ctx,
|
2257
2294
|
struct timeval *tv)
|
@@ -2295,7 +2332,7 @@ int API_EXPORTED libusb_handle_events_locked(libusb_context *ctx,
|
|
2295
2332
|
* \returns 0 if you must call into libusb at times determined by
|
2296
2333
|
* libusb_get_next_timeout(), or 1 if all timeout events are handled internally
|
2297
2334
|
* or through regular activity on the file descriptors.
|
2298
|
-
* \
|
2335
|
+
* \ref pollmain "Polling libusb file descriptors for event handling"
|
2299
2336
|
*/
|
2300
2337
|
int API_EXPORTED libusb_pollfds_handle_timeouts(libusb_context *ctx)
|
2301
2338
|
{
|
@@ -1,5 +1,7 @@
|
|
1
1
|
LIBRARY "libusb-1.0.dll"
|
2
2
|
EXPORTS
|
3
|
+
libusb_alloc_streams
|
4
|
+
libusb_alloc_streams@16 = libusb_alloc_streams
|
3
5
|
libusb_alloc_transfer
|
4
6
|
libusb_alloc_transfer@4 = libusb_alloc_transfer
|
5
7
|
libusb_attach_kernel_driver
|
@@ -38,6 +40,8 @@ EXPORTS
|
|
38
40
|
libusb_free_ss_endpoint_companion_descriptor@4 = libusb_free_ss_endpoint_companion_descriptor
|
39
41
|
libusb_free_ss_usb_device_capability_descriptor
|
40
42
|
libusb_free_ss_usb_device_capability_descriptor@4 = libusb_free_ss_usb_device_capability_descriptor
|
43
|
+
libusb_free_streams
|
44
|
+
libusb_free_streams@12 = libusb_free_streams
|
41
45
|
libusb_free_transfer
|
42
46
|
libusb_free_transfer@4 = libusb_free_transfer
|
43
47
|
libusb_free_usb_2_0_extension_descriptor
|
@@ -146,6 +150,10 @@ EXPORTS
|
|
146
150
|
libusb_strerror@4 = libusb_strerror
|
147
151
|
libusb_submit_transfer
|
148
152
|
libusb_submit_transfer@4 = libusb_submit_transfer
|
153
|
+
libusb_transfer_get_stream_id
|
154
|
+
libusb_transfer_get_stream_id@4 = libusb_transfer_get_stream_id
|
155
|
+
libusb_transfer_set_stream_id
|
156
|
+
libusb_transfer_set_stream_id@8 = libusb_transfer_set_stream_id
|
149
157
|
libusb_try_lock_events
|
150
158
|
libusb_try_lock_events@4 = libusb_try_lock_events
|
151
159
|
libusb_unlock_event_waiters
|
File without changes
|
@@ -144,7 +144,7 @@ typedef unsigned __int32 uint32_t;
|
|
144
144
|
* Internally, LIBUSB_API_VERSION is defined as follows:
|
145
145
|
* (libusb major << 24) | (libusb minor << 16) | (16 bit incremental)
|
146
146
|
*/
|
147
|
-
#define LIBUSB_API_VERSION
|
147
|
+
#define LIBUSB_API_VERSION 0x01000103
|
148
148
|
|
149
149
|
/* The following is kept for compatibility, but will be deprecated in the future */
|
150
150
|
#define LIBUSBX_API_VERSION LIBUSB_API_VERSION
|
@@ -343,7 +343,10 @@ enum libusb_transfer_type {
|
|
343
343
|
LIBUSB_TRANSFER_TYPE_BULK = 2,
|
344
344
|
|
345
345
|
/** Interrupt endpoint */
|
346
|
-
LIBUSB_TRANSFER_TYPE_INTERRUPT = 3
|
346
|
+
LIBUSB_TRANSFER_TYPE_INTERRUPT = 3,
|
347
|
+
|
348
|
+
/** Stream endpoint */
|
349
|
+
LIBUSB_TRANSFER_TYPE_BULK_STREAM = 4,
|
347
350
|
};
|
348
351
|
|
349
352
|
/** \ingroup misc
|
@@ -1387,6 +1390,11 @@ int LIBUSB_CALL libusb_clear_halt(libusb_device_handle *dev,
|
|
1387
1390
|
unsigned char endpoint);
|
1388
1391
|
int LIBUSB_CALL libusb_reset_device(libusb_device_handle *dev);
|
1389
1392
|
|
1393
|
+
int LIBUSB_CALL libusb_alloc_streams(libusb_device_handle *dev,
|
1394
|
+
uint32_t num_streams, unsigned char *endpoints, int num_endpoints);
|
1395
|
+
int LIBUSB_CALL libusb_free_streams(libusb_device_handle *dev,
|
1396
|
+
unsigned char *endpoints, int num_endpoints);
|
1397
|
+
|
1390
1398
|
int LIBUSB_CALL libusb_kernel_driver_active(libusb_device_handle *dev,
|
1391
1399
|
int interface_number);
|
1392
1400
|
int LIBUSB_CALL libusb_detach_kernel_driver(libusb_device_handle *dev,
|
@@ -1473,6 +1481,10 @@ struct libusb_transfer * LIBUSB_CALL libusb_alloc_transfer(int iso_packets);
|
|
1473
1481
|
int LIBUSB_CALL libusb_submit_transfer(struct libusb_transfer *transfer);
|
1474
1482
|
int LIBUSB_CALL libusb_cancel_transfer(struct libusb_transfer *transfer);
|
1475
1483
|
void LIBUSB_CALL libusb_free_transfer(struct libusb_transfer *transfer);
|
1484
|
+
void LIBUSB_CALL libusb_transfer_set_stream_id(
|
1485
|
+
struct libusb_transfer *transfer, uint32_t stream_id);
|
1486
|
+
uint32_t LIBUSB_CALL libusb_transfer_get_stream_id(
|
1487
|
+
struct libusb_transfer *transfer);
|
1476
1488
|
|
1477
1489
|
/** \ingroup asyncio
|
1478
1490
|
* Helper function to populate the required \ref libusb_transfer fields
|
@@ -1548,6 +1560,34 @@ static inline void libusb_fill_bulk_transfer(struct libusb_transfer *transfer,
|
|
1548
1560
|
transfer->callback = callback;
|
1549
1561
|
}
|
1550
1562
|
|
1563
|
+
/** \ingroup asyncio
|
1564
|
+
* Helper function to populate the required \ref libusb_transfer fields
|
1565
|
+
* for a bulk transfer using bulk streams.
|
1566
|
+
*
|
1567
|
+
* Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103
|
1568
|
+
*
|
1569
|
+
* \param transfer the transfer to populate
|
1570
|
+
* \param dev_handle handle of the device that will handle the transfer
|
1571
|
+
* \param endpoint address of the endpoint where this transfer will be sent
|
1572
|
+
* \param stream_id bulk stream id for this transfer
|
1573
|
+
* \param buffer data buffer
|
1574
|
+
* \param length length of data buffer
|
1575
|
+
* \param callback callback function to be invoked on transfer completion
|
1576
|
+
* \param user_data user data to pass to callback function
|
1577
|
+
* \param timeout timeout for the transfer in milliseconds
|
1578
|
+
*/
|
1579
|
+
static inline void libusb_fill_bulk_stream_transfer(
|
1580
|
+
struct libusb_transfer *transfer, libusb_device_handle *dev_handle,
|
1581
|
+
unsigned char endpoint, uint32_t stream_id,
|
1582
|
+
unsigned char *buffer, int length, libusb_transfer_cb_fn callback,
|
1583
|
+
void *user_data, unsigned int timeout)
|
1584
|
+
{
|
1585
|
+
libusb_fill_bulk_transfer(transfer, dev_handle, endpoint, buffer,
|
1586
|
+
length, callback, user_data, timeout);
|
1587
|
+
transfer->type = LIBUSB_TRANSFER_TYPE_BULK_STREAM;
|
1588
|
+
libusb_transfer_set_stream_id(transfer, stream_id);
|
1589
|
+
}
|
1590
|
+
|
1551
1591
|
/** \ingroup asyncio
|
1552
1592
|
* Helper function to populate the required \ref libusb_transfer fields
|
1553
1593
|
* for an interrupt transfer.
|