libusb 0.5.1 → 0.6.0

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.
Files changed (155) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +8 -2
  3. data/Gemfile +2 -0
  4. data/History.md +12 -0
  5. data/README.md +25 -14
  6. data/Rakefile +64 -109
  7. data/appveyor.yml +23 -0
  8. data/ext/extconf.rb +10 -12
  9. data/ext/libusb_recipe.rb +29 -0
  10. data/lib/libusb/call.rb +14 -11
  11. data/lib/libusb/compat.rb +9 -9
  12. data/lib/libusb/context.rb +16 -1
  13. data/lib/libusb/dependencies.rb +7 -0
  14. data/lib/libusb/dev_handle.rb +13 -3
  15. data/lib/libusb/eventmachine.rb +4 -4
  16. data/lib/libusb/transfer.rb +71 -10
  17. data/lib/libusb/version_gem.rb +1 -1
  18. data/libusb.gemspec +7 -5
  19. data/ports/archives/libusb-1.0.21.tar.bz2 +0 -0
  20. data/test/test_libusb_bulk_stream_transfer.rb +1 -1
  21. data/test/test_libusb_descriptors.rb +4 -4
  22. data/test/test_libusb_event_machine.rb +7 -7
  23. data/test/test_libusb_hotplug.rb +15 -3
  24. data/test/test_libusb_iso_transfer.rb +1 -1
  25. data/test/test_libusb_mass_storage.rb +19 -19
  26. data/test/test_libusb_mass_storage2.rb +1 -1
  27. data/test/test_libusb_structs.rb +13 -0
  28. data/test/test_libusb_threads.rb +2 -2
  29. data/wireshark-usb-sniffer.png +0 -0
  30. metadata +32 -156
  31. checksums.yaml.gz.sig +0 -0
  32. data.tar.gz.sig +0 -0
  33. data/ext/libusb-1.0.20/AUTHORS +0 -89
  34. data/ext/libusb-1.0.20/COPYING +0 -504
  35. data/ext/libusb-1.0.20/ChangeLog +0 -227
  36. data/ext/libusb-1.0.20/INSTALL +0 -234
  37. data/ext/libusb-1.0.20/Makefile.am +0 -28
  38. data/ext/libusb-1.0.20/Makefile.in +0 -897
  39. data/ext/libusb-1.0.20/NEWS +0 -2
  40. data/ext/libusb-1.0.20/PORTING +0 -94
  41. data/ext/libusb-1.0.20/README +0 -29
  42. data/ext/libusb-1.0.20/TODO +0 -2
  43. data/ext/libusb-1.0.20/Xcode/common.xcconfig +0 -49
  44. data/ext/libusb-1.0.20/Xcode/config.h +0 -28
  45. data/ext/libusb-1.0.20/Xcode/debug.xcconfig +0 -29
  46. data/ext/libusb-1.0.20/Xcode/libusb.xcconfig +0 -21
  47. data/ext/libusb-1.0.20/Xcode/libusb.xcodeproj/project.pbxproj +0 -865
  48. data/ext/libusb-1.0.20/Xcode/libusb_debug.xcconfig +0 -21
  49. data/ext/libusb-1.0.20/Xcode/libusb_release.xcconfig +0 -21
  50. data/ext/libusb-1.0.20/Xcode/release.xcconfig +0 -30
  51. data/ext/libusb-1.0.20/aclocal.m4 +0 -1193
  52. data/ext/libusb-1.0.20/android/README +0 -114
  53. data/ext/libusb-1.0.20/android/config.h +0 -81
  54. data/ext/libusb-1.0.20/android/jni/Android.mk +0 -23
  55. data/ext/libusb-1.0.20/android/jni/Application.mk +0 -24
  56. data/ext/libusb-1.0.20/android/jni/examples.mk +0 -134
  57. data/ext/libusb-1.0.20/android/jni/libusb.mk +0 -54
  58. data/ext/libusb-1.0.20/android/jni/tests.mk +0 -56
  59. data/ext/libusb-1.0.20/compile +0 -347
  60. data/ext/libusb-1.0.20/config.guess +0 -1421
  61. data/ext/libusb-1.0.20/config.h.in +0 -155
  62. data/ext/libusb-1.0.20/config.sub +0 -1807
  63. data/ext/libusb-1.0.20/configure +0 -15466
  64. data/ext/libusb-1.0.20/configure.ac +0 -326
  65. data/ext/libusb-1.0.20/depcomp +0 -791
  66. data/ext/libusb-1.0.20/doc/Makefile.am +0 -9
  67. data/ext/libusb-1.0.20/doc/Makefile.in +0 -456
  68. data/ext/libusb-1.0.20/doc/doxygen.cfg.in +0 -2334
  69. data/ext/libusb-1.0.20/examples/Makefile.am +0 -19
  70. data/ext/libusb-1.0.20/examples/Makefile.in +0 -713
  71. data/ext/libusb-1.0.20/examples/dpfp.c +0 -506
  72. data/ext/libusb-1.0.20/examples/dpfp_threaded.c +0 -549
  73. data/ext/libusb-1.0.20/examples/ezusb.c +0 -831
  74. data/ext/libusb-1.0.20/examples/ezusb.h +0 -120
  75. data/ext/libusb-1.0.20/examples/fxload.c +0 -308
  76. data/ext/libusb-1.0.20/examples/getopt/getopt.c +0 -1060
  77. data/ext/libusb-1.0.20/examples/getopt/getopt.h +0 -180
  78. data/ext/libusb-1.0.20/examples/getopt/getopt1.c +0 -188
  79. data/ext/libusb-1.0.20/examples/hotplugtest.c +0 -122
  80. data/ext/libusb-1.0.20/examples/listdevs.c +0 -71
  81. data/ext/libusb-1.0.20/examples/sam3u_benchmark.c +0 -193
  82. data/ext/libusb-1.0.20/examples/xusb.c +0 -1130
  83. data/ext/libusb-1.0.20/install-sh +0 -501
  84. data/ext/libusb-1.0.20/libusb-1.0.pc.in +0 -11
  85. data/ext/libusb-1.0.20/libusb/Makefile.am +0 -90
  86. data/ext/libusb-1.0.20/libusb/Makefile.in +0 -1053
  87. data/ext/libusb-1.0.20/libusb/core.c +0 -2452
  88. data/ext/libusb-1.0.20/libusb/descriptor.c +0 -1201
  89. data/ext/libusb-1.0.20/libusb/hotplug.c +0 -344
  90. data/ext/libusb-1.0.20/libusb/hotplug.h +0 -90
  91. data/ext/libusb-1.0.20/libusb/io.c +0 -2760
  92. data/ext/libusb-1.0.20/libusb/libusb-1.0.def +0 -168
  93. data/ext/libusb-1.0.20/libusb/libusb-1.0.rc +0 -61
  94. data/ext/libusb-1.0.20/libusb/libusb.h +0 -1999
  95. data/ext/libusb-1.0.20/libusb/libusbi.h +0 -1102
  96. data/ext/libusb-1.0.20/libusb/os/darwin_usb.c +0 -1969
  97. data/ext/libusb-1.0.20/libusb/os/darwin_usb.h +0 -158
  98. data/ext/libusb-1.0.20/libusb/os/haiku/Makefile.am +0 -5
  99. data/ext/libusb-1.0.20/libusb/os/haiku/Makefile.in +0 -810
  100. data/ext/libusb-1.0.20/libusb/os/haiku/aclocal.m4 +0 -1193
  101. data/ext/libusb-1.0.20/libusb/os/haiku/compile +0 -347
  102. data/ext/libusb-1.0.20/libusb/os/haiku/config.guess +0 -1421
  103. data/ext/libusb-1.0.20/libusb/os/haiku/config.sub +0 -1807
  104. data/ext/libusb-1.0.20/libusb/os/haiku/configure +0 -17579
  105. data/ext/libusb-1.0.20/libusb/os/haiku/configure.ac +0 -8
  106. data/ext/libusb-1.0.20/libusb/os/haiku/depcomp +0 -791
  107. data/ext/libusb-1.0.20/libusb/os/haiku/haiku_pollfs.cpp +0 -378
  108. data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb.h +0 -112
  109. data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb_backend.cpp +0 -550
  110. data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb_raw.cpp +0 -255
  111. data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb_raw.h +0 -180
  112. data/ext/libusb-1.0.20/libusb/os/haiku/install-sh +0 -501
  113. data/ext/libusb-1.0.20/libusb/os/haiku/ltmain.sh +0 -9655
  114. data/ext/libusb-1.0.20/libusb/os/haiku/m4/libtool.m4 +0 -7992
  115. data/ext/libusb-1.0.20/libusb/os/haiku/m4/ltoptions.m4 +0 -384
  116. data/ext/libusb-1.0.20/libusb/os/haiku/m4/ltsugar.m4 +0 -123
  117. data/ext/libusb-1.0.20/libusb/os/haiku/m4/ltversion.m4 +0 -23
  118. data/ext/libusb-1.0.20/libusb/os/haiku/m4/lt~obsolete.m4 +0 -98
  119. data/ext/libusb-1.0.20/libusb/os/haiku/missing +0 -215
  120. data/ext/libusb-1.0.20/libusb/os/linux_netlink.c +0 -369
  121. data/ext/libusb-1.0.20/libusb/os/linux_udev.c +0 -306
  122. data/ext/libusb-1.0.20/libusb/os/linux_usbfs.c +0 -2692
  123. data/ext/libusb-1.0.20/libusb/os/linux_usbfs.h +0 -192
  124. data/ext/libusb-1.0.20/libusb/os/netbsd_usb.c +0 -674
  125. data/ext/libusb-1.0.20/libusb/os/openbsd_usb.c +0 -768
  126. data/ext/libusb-1.0.20/libusb/os/poll_posix.c +0 -53
  127. data/ext/libusb-1.0.20/libusb/os/poll_posix.h +0 -11
  128. data/ext/libusb-1.0.20/libusb/os/poll_windows.c +0 -728
  129. data/ext/libusb-1.0.20/libusb/os/poll_windows.h +0 -131
  130. data/ext/libusb-1.0.20/libusb/os/threads_posix.c +0 -82
  131. data/ext/libusb-1.0.20/libusb/os/threads_posix.h +0 -50
  132. data/ext/libusb-1.0.20/libusb/os/threads_windows.c +0 -214
  133. data/ext/libusb-1.0.20/libusb/os/threads_windows.h +0 -87
  134. data/ext/libusb-1.0.20/libusb/os/wince_usb.c +0 -869
  135. data/ext/libusb-1.0.20/libusb/os/wince_usb.h +0 -131
  136. data/ext/libusb-1.0.20/libusb/os/windows_common.h +0 -108
  137. data/ext/libusb-1.0.20/libusb/os/windows_usb.c +0 -4643
  138. data/ext/libusb-1.0.20/libusb/os/windows_usb.h +0 -973
  139. data/ext/libusb-1.0.20/libusb/strerror.c +0 -202
  140. data/ext/libusb-1.0.20/libusb/sync.c +0 -308
  141. data/ext/libusb-1.0.20/libusb/version.h +0 -18
  142. data/ext/libusb-1.0.20/libusb/version_nano.h +0 -1
  143. data/ext/libusb-1.0.20/ltmain.sh +0 -9655
  144. data/ext/libusb-1.0.20/m4/libtool.m4 +0 -7992
  145. data/ext/libusb-1.0.20/m4/ltoptions.m4 +0 -384
  146. data/ext/libusb-1.0.20/m4/ltsugar.m4 +0 -123
  147. data/ext/libusb-1.0.20/m4/ltversion.m4 +0 -23
  148. data/ext/libusb-1.0.20/m4/lt~obsolete.m4 +0 -98
  149. data/ext/libusb-1.0.20/missing +0 -215
  150. data/ext/libusb-1.0.20/tests/Makefile.am +0 -6
  151. data/ext/libusb-1.0.20/tests/Makefile.in +0 -596
  152. data/ext/libusb-1.0.20/tests/libusb_testlib.h +0 -107
  153. data/ext/libusb-1.0.20/tests/stress.c +0 -160
  154. data/ext/libusb-1.0.20/tests/testlib.c +0 -277
  155. metadata.gz.sig +0 -0
@@ -1,1969 +0,0 @@
1
- /* -*- Mode: C; indent-tabs-mode:nil -*- */
2
- /*
3
- * darwin backend for libusb 1.0
4
- * Copyright © 2008-2014 Nathan Hjelm <hjelmn@users.sourceforge.net>
5
- *
6
- * This library is free software; you can redistribute it and/or
7
- * modify it under the terms of the GNU Lesser General Public
8
- * License as published by the Free Software Foundation; either
9
- * version 2.1 of the License, or (at your option) any later version.
10
- *
11
- * This library is distributed in the hope that it will be useful,
12
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
- * Lesser General Public License for more details.
15
- *
16
- * You should have received a copy of the GNU Lesser General Public
17
- * License along with this library; if not, write to the Free Software
18
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
- */
20
-
21
- #include "config.h"
22
- #include <ctype.h>
23
- #include <errno.h>
24
- #include <pthread.h>
25
- #include <stdio.h>
26
- #include <stdlib.h>
27
- #include <string.h>
28
- #include <sys/types.h>
29
- #include <unistd.h>
30
- #include <fcntl.h>
31
- #include <libkern/OSAtomic.h>
32
-
33
- #include <mach/clock.h>
34
- #include <mach/clock_types.h>
35
- #include <mach/mach_host.h>
36
- #include <mach/mach_port.h>
37
-
38
- #include <AvailabilityMacros.h>
39
- #if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
40
- #include <objc/objc-auto.h>
41
- #endif
42
-
43
- #include "darwin_usb.h"
44
-
45
- /* async event thread */
46
- static pthread_mutex_t libusb_darwin_at_mutex = PTHREAD_MUTEX_INITIALIZER;
47
- static pthread_cond_t libusb_darwin_at_cond = PTHREAD_COND_INITIALIZER;
48
-
49
- static clock_serv_t clock_realtime;
50
- static clock_serv_t clock_monotonic;
51
-
52
- static CFRunLoopRef libusb_darwin_acfl = NULL; /* event cf loop */
53
- static volatile int32_t initCount = 0;
54
-
55
- static usbi_mutex_t darwin_cached_devices_lock = PTHREAD_MUTEX_INITIALIZER;
56
- static struct list_head darwin_cached_devices = {&darwin_cached_devices, &darwin_cached_devices};
57
-
58
- #define DARWIN_CACHED_DEVICE(a) ((struct darwin_cached_device *) (((struct darwin_device_priv *)((a)->os_priv))->dev))
59
-
60
- /* async event thread */
61
- static pthread_t libusb_darwin_at;
62
-
63
- static int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian);
64
- static int darwin_claim_interface(struct libusb_device_handle *dev_handle, int iface);
65
- static int darwin_release_interface(struct libusb_device_handle *dev_handle, int iface);
66
- static int darwin_reset_device(struct libusb_device_handle *dev_handle);
67
- static void darwin_async_io_callback (void *refcon, IOReturn result, void *arg0);
68
-
69
- static int darwin_scan_devices(struct libusb_context *ctx);
70
- static int process_new_device (struct libusb_context *ctx, io_service_t service);
71
-
72
- #if defined(ENABLE_LOGGING)
73
- static const char *darwin_error_str (int result) {
74
- static char string_buffer[50];
75
- switch (result) {
76
- case kIOReturnSuccess:
77
- return "no error";
78
- case kIOReturnNotOpen:
79
- return "device not opened for exclusive access";
80
- case kIOReturnNoDevice:
81
- return "no connection to an IOService";
82
- case kIOUSBNoAsyncPortErr:
83
- return "no async port has been opened for interface";
84
- case kIOReturnExclusiveAccess:
85
- return "another process has device opened for exclusive access";
86
- case kIOUSBPipeStalled:
87
- return "pipe is stalled";
88
- case kIOReturnError:
89
- return "could not establish a connection to the Darwin kernel";
90
- case kIOUSBTransactionTimeout:
91
- return "transaction timed out";
92
- case kIOReturnBadArgument:
93
- return "invalid argument";
94
- case kIOReturnAborted:
95
- return "transaction aborted";
96
- case kIOReturnNotResponding:
97
- return "device not responding";
98
- case kIOReturnOverrun:
99
- return "data overrun";
100
- case kIOReturnCannotWire:
101
- return "physical memory can not be wired down";
102
- case kIOReturnNoResources:
103
- return "out of resources";
104
- case kIOUSBHighSpeedSplitError:
105
- return "high speed split error";
106
- default:
107
- snprintf(string_buffer, sizeof(string_buffer), "unknown error (0x%x)", result);
108
- return string_buffer;
109
- }
110
- }
111
- #endif
112
-
113
- static int darwin_to_libusb (int result) {
114
- switch (result) {
115
- case kIOReturnUnderrun:
116
- case kIOReturnSuccess:
117
- return LIBUSB_SUCCESS;
118
- case kIOReturnNotOpen:
119
- case kIOReturnNoDevice:
120
- return LIBUSB_ERROR_NO_DEVICE;
121
- case kIOReturnExclusiveAccess:
122
- return LIBUSB_ERROR_ACCESS;
123
- case kIOUSBPipeStalled:
124
- return LIBUSB_ERROR_PIPE;
125
- case kIOReturnBadArgument:
126
- return LIBUSB_ERROR_INVALID_PARAM;
127
- case kIOUSBTransactionTimeout:
128
- return LIBUSB_ERROR_TIMEOUT;
129
- case kIOReturnNotResponding:
130
- case kIOReturnAborted:
131
- case kIOReturnError:
132
- case kIOUSBNoAsyncPortErr:
133
- default:
134
- return LIBUSB_ERROR_OTHER;
135
- }
136
- }
137
-
138
- /* this function must be called with the darwin_cached_devices_lock held */
139
- static void darwin_deref_cached_device(struct darwin_cached_device *cached_dev) {
140
- cached_dev->refcount--;
141
- /* free the device and remove it from the cache */
142
- if (0 == cached_dev->refcount) {
143
- list_del(&cached_dev->list);
144
-
145
- (*(cached_dev->device))->Release(cached_dev->device);
146
- free (cached_dev);
147
- }
148
- }
149
-
150
- static void darwin_ref_cached_device(struct darwin_cached_device *cached_dev) {
151
- cached_dev->refcount++;
152
- }
153
-
154
- static int ep_to_pipeRef(struct libusb_device_handle *dev_handle, uint8_t ep, uint8_t *pipep, uint8_t *ifcp, struct darwin_interface **interface_out) {
155
- struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv;
156
-
157
- /* current interface */
158
- struct darwin_interface *cInterface;
159
-
160
- int8_t i, iface;
161
-
162
- usbi_dbg ("converting ep address 0x%02x to pipeRef and interface", ep);
163
-
164
- for (iface = 0 ; iface < USB_MAXINTERFACES ; iface++) {
165
- cInterface = &priv->interfaces[iface];
166
-
167
- if (dev_handle->claimed_interfaces & (1 << iface)) {
168
- for (i = 0 ; i < cInterface->num_endpoints ; i++) {
169
- if (cInterface->endpoint_addrs[i] == ep) {
170
- *pipep = i + 1;
171
-
172
- if (ifcp)
173
- *ifcp = iface;
174
-
175
- if (interface_out)
176
- *interface_out = cInterface;
177
-
178
- usbi_dbg ("pipe %d on interface %d matches", *pipep, iface);
179
- return 0;
180
- }
181
- }
182
- }
183
- }
184
-
185
- /* No pipe found with the correct endpoint address */
186
- usbi_warn (HANDLE_CTX(dev_handle), "no pipeRef found with endpoint address 0x%02x.", ep);
187
-
188
- return LIBUSB_ERROR_NOT_FOUND;
189
- }
190
-
191
- static int usb_setup_device_iterator (io_iterator_t *deviceIterator, UInt32 location) {
192
- CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOUSBDeviceClassName);
193
-
194
- if (!matchingDict)
195
- return kIOReturnError;
196
-
197
- if (location) {
198
- CFMutableDictionaryRef propertyMatchDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
199
- &kCFTypeDictionaryKeyCallBacks,
200
- &kCFTypeDictionaryValueCallBacks);
201
-
202
- if (propertyMatchDict) {
203
- /* there are no unsigned CFNumber types so treat the value as signed. the os seems to do this
204
- internally (CFNumberType of locationID is 3) */
205
- CFTypeRef locationCF = CFNumberCreate (NULL, kCFNumberSInt32Type, &location);
206
-
207
- CFDictionarySetValue (propertyMatchDict, CFSTR(kUSBDevicePropertyLocationID), locationCF);
208
- /* release our reference to the CFNumber (CFDictionarySetValue retains it) */
209
- CFRelease (locationCF);
210
-
211
- CFDictionarySetValue (matchingDict, CFSTR(kIOPropertyMatchKey), propertyMatchDict);
212
- /* release out reference to the CFMutableDictionaryRef (CFDictionarySetValue retains it) */
213
- CFRelease (propertyMatchDict);
214
- }
215
- /* else we can still proceed as long as the caller accounts for the possibility of other devices in the iterator */
216
- }
217
-
218
- return IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, deviceIterator);
219
- }
220
-
221
- /* Returns 1 on success, 0 on failure. */
222
- static int get_ioregistry_value_number (io_service_t service, CFStringRef property, CFNumberType type, void *p) {
223
- CFTypeRef cfNumber = IORegistryEntryCreateCFProperty (service, property, kCFAllocatorDefault, 0);
224
- int ret = 0;
225
-
226
- if (cfNumber) {
227
- if (CFGetTypeID(cfNumber) == CFNumberGetTypeID()) {
228
- ret = CFNumberGetValue(cfNumber, type, p);
229
- }
230
-
231
- CFRelease (cfNumber);
232
- }
233
-
234
- return ret;
235
- }
236
-
237
- static usb_device_t **darwin_device_from_service (io_service_t service)
238
- {
239
- io_cf_plugin_ref_t *plugInInterface = NULL;
240
- usb_device_t **device;
241
- kern_return_t result;
242
- SInt32 score;
243
-
244
- result = IOCreatePlugInInterfaceForService(service, kIOUSBDeviceUserClientTypeID,
245
- kIOCFPlugInInterfaceID, &plugInInterface,
246
- &score);
247
-
248
- if (kIOReturnSuccess != result || !plugInInterface) {
249
- usbi_dbg ("could not set up plugin for service: %s", darwin_error_str (result));
250
- return NULL;
251
- }
252
-
253
- (void)(*plugInInterface)->QueryInterface(plugInInterface, CFUUIDGetUUIDBytes(DeviceInterfaceID),
254
- (LPVOID)&device);
255
- /* Use release instead of IODestroyPlugInInterface to avoid stopping IOServices associated with this device */
256
- (*plugInInterface)->Release (plugInInterface);
257
-
258
- return device;
259
- }
260
-
261
- static void darwin_devices_attached (void *ptr, io_iterator_t add_devices) {
262
- struct libusb_context *ctx;
263
- io_service_t service;
264
-
265
- usbi_mutex_lock(&active_contexts_lock);
266
-
267
- while ((service = IOIteratorNext(add_devices))) {
268
- /* add this device to each active context's device list */
269
- list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) {
270
- process_new_device (ctx, service);;
271
- }
272
-
273
- IOObjectRelease(service);
274
- }
275
-
276
- usbi_mutex_unlock(&active_contexts_lock);
277
- }
278
-
279
- static void darwin_devices_detached (void *ptr, io_iterator_t rem_devices) {
280
- struct libusb_device *dev = NULL;
281
- struct libusb_context *ctx;
282
- struct darwin_cached_device *old_device;
283
-
284
- io_service_t device;
285
- UInt64 session;
286
- int ret;
287
-
288
- usbi_mutex_lock(&active_contexts_lock);
289
-
290
- while ((device = IOIteratorNext (rem_devices)) != 0) {
291
- /* get the location from the i/o registry */
292
- ret = get_ioregistry_value_number (device, CFSTR("sessionID"), kCFNumberSInt64Type, &session);
293
- IOObjectRelease (device);
294
- if (!ret)
295
- continue;
296
-
297
- /* we need to match darwin_ref_cached_device call made in darwin_get_cached_device function
298
- otherwise no cached device will ever get freed */
299
- usbi_mutex_lock(&darwin_cached_devices_lock);
300
- list_for_each_entry(old_device, &darwin_cached_devices, list, struct darwin_cached_device) {
301
- if (old_device->session == session) {
302
- darwin_deref_cached_device (old_device);
303
- break;
304
- }
305
- }
306
- usbi_mutex_unlock(&darwin_cached_devices_lock);
307
-
308
- list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) {
309
- usbi_dbg ("notifying context %p of device disconnect", ctx);
310
-
311
- dev = usbi_get_device_by_session_id(ctx, (unsigned long) session);
312
- if (dev) {
313
- /* signal the core that this device has been disconnected. the core will tear down this device
314
- when the reference count reaches 0 */
315
- usbi_disconnect_device(dev);
316
- libusb_unref_device(dev);
317
- }
318
- }
319
- }
320
-
321
- usbi_mutex_unlock(&active_contexts_lock);
322
- }
323
-
324
- static void darwin_hotplug_poll (void)
325
- {
326
- /* not sure if 5 seconds will be too long/short but it should work ok */
327
- mach_timespec_t timeout = {.tv_sec = 5, .tv_nsec = 0};
328
-
329
- /* since a kernel thread may nodify the IOInterators used for
330
- * hotplug notidication we can't just clear the iterators.
331
- * instead just wait until all IOService providers are quiet */
332
- (void) IOKitWaitQuiet (kIOMasterPortDefault, &timeout);
333
- }
334
-
335
- static void darwin_clear_iterator (io_iterator_t iter) {
336
- io_service_t device;
337
-
338
- while ((device = IOIteratorNext (iter)) != 0)
339
- IOObjectRelease (device);
340
- }
341
-
342
- static void *darwin_event_thread_main (void *arg0) {
343
- IOReturn kresult;
344
- struct libusb_context *ctx = (struct libusb_context *)arg0;
345
- CFRunLoopRef runloop;
346
-
347
- /* Set this thread's name, so it can be seen in the debugger
348
- and crash reports. */
349
- #if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
350
- pthread_setname_np ("org.libusb.device-hotplug");
351
-
352
- /* Tell the Objective-C garbage collector about this thread.
353
- This is required because, unlike NSThreads, pthreads are
354
- not automatically registered. Although we don't use
355
- Objective-C, we use CoreFoundation, which does. */
356
- objc_registerThreadWithCollector();
357
- #endif
358
-
359
- /* hotplug (device arrival/removal) sources */
360
- CFRunLoopSourceRef libusb_notification_cfsource;
361
- io_notification_port_t libusb_notification_port;
362
- io_iterator_t libusb_rem_device_iterator;
363
- io_iterator_t libusb_add_device_iterator;
364
-
365
- usbi_dbg ("creating hotplug event source");
366
-
367
- runloop = CFRunLoopGetCurrent ();
368
- CFRetain (runloop);
369
-
370
- /* add the notification port to the run loop */
371
- libusb_notification_port = IONotificationPortCreate (kIOMasterPortDefault);
372
- libusb_notification_cfsource = IONotificationPortGetRunLoopSource (libusb_notification_port);
373
- CFRunLoopAddSource(runloop, libusb_notification_cfsource, kCFRunLoopDefaultMode);
374
-
375
- /* create notifications for removed devices */
376
- kresult = IOServiceAddMatchingNotification (libusb_notification_port, kIOTerminatedNotification,
377
- IOServiceMatching(kIOUSBDeviceClassName),
378
- darwin_devices_detached,
379
- ctx, &libusb_rem_device_iterator);
380
-
381
- if (kresult != kIOReturnSuccess) {
382
- usbi_err (ctx, "could not add hotplug event source: %s", darwin_error_str (kresult));
383
-
384
- pthread_exit (NULL);
385
- }
386
-
387
- /* create notifications for attached devices */
388
- kresult = IOServiceAddMatchingNotification(libusb_notification_port, kIOFirstMatchNotification,
389
- IOServiceMatching(kIOUSBDeviceClassName),
390
- darwin_devices_attached,
391
- ctx, &libusb_add_device_iterator);
392
-
393
- if (kresult != kIOReturnSuccess) {
394
- usbi_err (ctx, "could not add hotplug event source: %s", darwin_error_str (kresult));
395
-
396
- pthread_exit (NULL);
397
- }
398
-
399
- /* arm notifiers */
400
- darwin_clear_iterator (libusb_rem_device_iterator);
401
- darwin_clear_iterator (libusb_add_device_iterator);
402
-
403
- usbi_dbg ("darwin event thread ready to receive events");
404
-
405
- /* signal the main thread that the hotplug runloop has been created. */
406
- pthread_mutex_lock (&libusb_darwin_at_mutex);
407
- libusb_darwin_acfl = runloop;
408
- pthread_cond_signal (&libusb_darwin_at_cond);
409
- pthread_mutex_unlock (&libusb_darwin_at_mutex);
410
-
411
- /* run the runloop */
412
- CFRunLoopRun();
413
-
414
- usbi_dbg ("darwin event thread exiting");
415
-
416
- /* remove the notification cfsource */
417
- CFRunLoopRemoveSource(runloop, libusb_notification_cfsource, kCFRunLoopDefaultMode);
418
-
419
- /* delete notification port */
420
- IONotificationPortDestroy (libusb_notification_port);
421
-
422
- /* delete iterators */
423
- IOObjectRelease (libusb_rem_device_iterator);
424
- IOObjectRelease (libusb_add_device_iterator);
425
-
426
- CFRelease (runloop);
427
-
428
- libusb_darwin_acfl = NULL;
429
-
430
- pthread_exit (NULL);
431
- }
432
-
433
- /* cleanup function to destroy cached devices */
434
- static void __attribute__((destructor)) _darwin_finalize(void) {
435
- struct darwin_cached_device *dev, *next;
436
-
437
- usbi_mutex_lock(&darwin_cached_devices_lock);
438
- list_for_each_entry_safe(dev, next, &darwin_cached_devices, list, struct darwin_cached_device) {
439
- darwin_deref_cached_device(dev);
440
- }
441
- usbi_mutex_unlock(&darwin_cached_devices_lock);
442
- }
443
-
444
- static int darwin_init(struct libusb_context *ctx) {
445
- host_name_port_t host_self;
446
- int rc;
447
-
448
- rc = darwin_scan_devices (ctx);
449
- if (LIBUSB_SUCCESS != rc) {
450
- return rc;
451
- }
452
-
453
- if (OSAtomicIncrement32Barrier(&initCount) == 1) {
454
- /* create the clocks that will be used */
455
-
456
- host_self = mach_host_self();
457
- host_get_clock_service(host_self, CALENDAR_CLOCK, &clock_realtime);
458
- host_get_clock_service(host_self, SYSTEM_CLOCK, &clock_monotonic);
459
- mach_port_deallocate(mach_task_self(), host_self);
460
-
461
- pthread_create (&libusb_darwin_at, NULL, darwin_event_thread_main, ctx);
462
-
463
- pthread_mutex_lock (&libusb_darwin_at_mutex);
464
- while (!libusb_darwin_acfl)
465
- pthread_cond_wait (&libusb_darwin_at_cond, &libusb_darwin_at_mutex);
466
- pthread_mutex_unlock (&libusb_darwin_at_mutex);
467
- }
468
-
469
- return rc;
470
- }
471
-
472
- static void darwin_exit (void) {
473
- if (OSAtomicDecrement32Barrier(&initCount) == 0) {
474
- mach_port_deallocate(mach_task_self(), clock_realtime);
475
- mach_port_deallocate(mach_task_self(), clock_monotonic);
476
-
477
- /* stop the event runloop and wait for the thread to terminate. */
478
- CFRunLoopStop (libusb_darwin_acfl);
479
- pthread_join (libusb_darwin_at, NULL);
480
- }
481
- }
482
-
483
- static int darwin_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian) {
484
- struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev);
485
-
486
- /* return cached copy */
487
- memmove (buffer, &(priv->dev_descriptor), DEVICE_DESC_LENGTH);
488
-
489
- *host_endian = 0;
490
-
491
- return 0;
492
- }
493
-
494
- static int get_configuration_index (struct libusb_device *dev, int config_value) {
495
- struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev);
496
- UInt8 i, numConfig;
497
- IOUSBConfigurationDescriptorPtr desc;
498
- IOReturn kresult;
499
-
500
- /* is there a simpler way to determine the index? */
501
- kresult = (*(priv->device))->GetNumberOfConfigurations (priv->device, &numConfig);
502
- if (kresult != kIOReturnSuccess)
503
- return darwin_to_libusb (kresult);
504
-
505
- for (i = 0 ; i < numConfig ; i++) {
506
- (*(priv->device))->GetConfigurationDescriptorPtr (priv->device, i, &desc);
507
-
508
- if (desc->bConfigurationValue == config_value)
509
- return i;
510
- }
511
-
512
- /* configuration not found */
513
- return LIBUSB_ERROR_NOT_FOUND;
514
- }
515
-
516
- static int darwin_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian) {
517
- struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev);
518
- int config_index;
519
-
520
- if (0 == priv->active_config)
521
- return LIBUSB_ERROR_NOT_FOUND;
522
-
523
- config_index = get_configuration_index (dev, priv->active_config);
524
- if (config_index < 0)
525
- return config_index;
526
-
527
- return darwin_get_config_descriptor (dev, config_index, buffer, len, host_endian);
528
- }
529
-
530
- static int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) {
531
- struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev);
532
- IOUSBConfigurationDescriptorPtr desc;
533
- IOReturn kresult;
534
- int ret;
535
-
536
- if (!priv || !priv->device)
537
- return LIBUSB_ERROR_OTHER;
538
-
539
- kresult = (*priv->device)->GetConfigurationDescriptorPtr (priv->device, config_index, &desc);
540
- if (kresult == kIOReturnSuccess) {
541
- /* copy descriptor */
542
- if (libusb_le16_to_cpu(desc->wTotalLength) < len)
543
- len = libusb_le16_to_cpu(desc->wTotalLength);
544
-
545
- memmove (buffer, desc, len);
546
-
547
- /* GetConfigurationDescriptorPtr returns the descriptor in USB bus order */
548
- *host_endian = 0;
549
- }
550
-
551
- ret = darwin_to_libusb (kresult);
552
- if (ret != LIBUSB_SUCCESS)
553
- return ret;
554
-
555
- return (int) len;
556
- }
557
-
558
- /* check whether the os has configured the device */
559
- static int darwin_check_configuration (struct libusb_context *ctx, struct darwin_cached_device *dev) {
560
- usb_device_t **darwin_device = dev->device;
561
-
562
- IOUSBConfigurationDescriptorPtr configDesc;
563
- IOUSBFindInterfaceRequest request;
564
- kern_return_t kresult;
565
- io_iterator_t interface_iterator;
566
- io_service_t firstInterface;
567
-
568
- if (dev->dev_descriptor.bNumConfigurations < 1) {
569
- usbi_err (ctx, "device has no configurations");
570
- return LIBUSB_ERROR_OTHER; /* no configurations at this speed so we can't use it */
571
- }
572
-
573
- /* find the first configuration */
574
- kresult = (*darwin_device)->GetConfigurationDescriptorPtr (darwin_device, 0, &configDesc);
575
- dev->first_config = (kIOReturnSuccess == kresult) ? configDesc->bConfigurationValue : 1;
576
-
577
- /* check if the device is already configured. there is probably a better way than iterating over the
578
- to accomplish this (the trick is we need to avoid a call to GetConfigurations since buggy devices
579
- might lock up on the device request) */
580
-
581
- /* Setup the Interface Request */
582
- request.bInterfaceClass = kIOUSBFindInterfaceDontCare;
583
- request.bInterfaceSubClass = kIOUSBFindInterfaceDontCare;
584
- request.bInterfaceProtocol = kIOUSBFindInterfaceDontCare;
585
- request.bAlternateSetting = kIOUSBFindInterfaceDontCare;
586
-
587
- kresult = (*(darwin_device))->CreateInterfaceIterator(darwin_device, &request, &interface_iterator);
588
- if (kresult)
589
- return darwin_to_libusb (kresult);
590
-
591
- /* iterate once */
592
- firstInterface = IOIteratorNext(interface_iterator);
593
-
594
- /* done with the interface iterator */
595
- IOObjectRelease(interface_iterator);
596
-
597
- if (firstInterface) {
598
- IOObjectRelease (firstInterface);
599
-
600
- /* device is configured */
601
- if (dev->dev_descriptor.bNumConfigurations == 1)
602
- /* to avoid problems with some devices get the configurations value from the configuration descriptor */
603
- dev->active_config = dev->first_config;
604
- else
605
- /* devices with more than one configuration should work with GetConfiguration */
606
- (*darwin_device)->GetConfiguration (darwin_device, &dev->active_config);
607
- } else
608
- /* not configured */
609
- dev->active_config = 0;
610
-
611
- usbi_dbg ("active config: %u, first config: %u", dev->active_config, dev->first_config);
612
-
613
- return 0;
614
- }
615
-
616
- static int darwin_request_descriptor (usb_device_t **device, UInt8 desc, UInt8 desc_index, void *buffer, size_t buffer_size) {
617
- IOUSBDevRequestTO req;
618
-
619
- memset (buffer, 0, buffer_size);
620
-
621
- /* Set up request for descriptor/ */
622
- req.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice);
623
- req.bRequest = kUSBRqGetDescriptor;
624
- req.wValue = desc << 8;
625
- req.wIndex = desc_index;
626
- req.wLength = buffer_size;
627
- req.pData = buffer;
628
- req.noDataTimeout = 20;
629
- req.completionTimeout = 100;
630
-
631
- return (*device)->DeviceRequestTO (device, &req);
632
- }
633
-
634
- static int darwin_cache_device_descriptor (struct libusb_context *ctx, struct darwin_cached_device *dev) {
635
- usb_device_t **device = dev->device;
636
- int retries = 1, delay = 30000;
637
- int unsuspended = 0, try_unsuspend = 1, try_reconfigure = 1;
638
- int is_open = 0;
639
- int ret = 0, ret2;
640
- UInt8 bDeviceClass;
641
- UInt16 idProduct, idVendor;
642
-
643
- dev->can_enumerate = 0;
644
-
645
- (*device)->GetDeviceClass (device, &bDeviceClass);
646
- (*device)->GetDeviceProduct (device, &idProduct);
647
- (*device)->GetDeviceVendor (device, &idVendor);
648
-
649
- /* According to Apple's documentation the device must be open for DeviceRequest but we may not be able to open some
650
- * devices and Apple's USB Prober doesn't bother to open the device before issuing a descriptor request. Still,
651
- * to follow the spec as closely as possible, try opening the device */
652
- is_open = ((*device)->USBDeviceOpenSeize(device) == kIOReturnSuccess);
653
-
654
- do {
655
- /**** retrieve device descriptor ****/
656
- ret = darwin_request_descriptor (device, kUSBDeviceDesc, 0, &dev->dev_descriptor, sizeof(dev->dev_descriptor));
657
-
658
- if (kIOReturnOverrun == ret && kUSBDeviceDesc == dev->dev_descriptor.bDescriptorType)
659
- /* received an overrun error but we still received a device descriptor */
660
- ret = kIOReturnSuccess;
661
-
662
- if (kIOUSBVendorIDAppleComputer == idVendor) {
663
- /* NTH: don't bother retrying or unsuspending Apple devices */
664
- break;
665
- }
666
-
667
- if (kIOReturnSuccess == ret && (0 == dev->dev_descriptor.bNumConfigurations ||
668
- 0 == dev->dev_descriptor.bcdUSB)) {
669
- /* work around for incorrectly configured devices */
670
- if (try_reconfigure && is_open) {
671
- usbi_dbg("descriptor appears to be invalid. resetting configuration before trying again...");
672
-
673
- /* set the first configuration */
674
- (*device)->SetConfiguration(device, 1);
675
-
676
- /* don't try to reconfigure again */
677
- try_reconfigure = 0;
678
- }
679
-
680
- ret = kIOUSBPipeStalled;
681
- }
682
-
683
- if (kIOReturnSuccess != ret && is_open && try_unsuspend) {
684
- /* device may be suspended. unsuspend it and try again */
685
- #if DeviceVersion >= 320
686
- UInt32 info = 0;
687
-
688
- /* IOUSBFamily 320+ provides a way to detect device suspension but earlier versions do not */
689
- (void)(*device)->GetUSBDeviceInformation (device, &info);
690
-
691
- /* note that the device was suspended */
692
- if (info & (1 << kUSBInformationDeviceIsSuspendedBit) || 0 == info)
693
- try_unsuspend = 1;
694
- #endif
695
-
696
- if (try_unsuspend) {
697
- /* try to unsuspend the device */
698
- ret2 = (*device)->USBDeviceSuspend (device, 0);
699
- if (kIOReturnSuccess != ret2) {
700
- /* prevent log spew from poorly behaving devices. this indicates the
701
- os actually had trouble communicating with the device */
702
- usbi_dbg("could not retrieve device descriptor. failed to unsuspend: %s",darwin_error_str(ret2));
703
- } else
704
- unsuspended = 1;
705
-
706
- try_unsuspend = 0;
707
- }
708
- }
709
-
710
- if (kIOReturnSuccess != ret) {
711
- usbi_dbg("kernel responded with code: 0x%08x. sleeping for %d ms before trying again", ret, delay/1000);
712
- /* sleep for a little while before trying again */
713
- usleep (delay);
714
- }
715
- } while (kIOReturnSuccess != ret && retries--);
716
-
717
- if (unsuspended)
718
- /* resuspend the device */
719
- (void)(*device)->USBDeviceSuspend (device, 1);
720
-
721
- if (is_open)
722
- (void) (*device)->USBDeviceClose (device);
723
-
724
- if (ret != kIOReturnSuccess) {
725
- /* a debug message was already printed out for this error */
726
- if (LIBUSB_CLASS_HUB == bDeviceClass)
727
- usbi_dbg ("could not retrieve device descriptor %.4x:%.4x: %s (%x). skipping device",
728
- idVendor, idProduct, darwin_error_str (ret), ret);
729
- else
730
- usbi_warn (ctx, "could not retrieve device descriptor %.4x:%.4x: %s (%x). skipping device",
731
- idVendor, idProduct, darwin_error_str (ret), ret);
732
- return darwin_to_libusb (ret);
733
- }
734
-
735
- /* catch buggy hubs (which appear to be virtual). Apple's own USB prober has problems with these devices. */
736
- if (libusb_le16_to_cpu (dev->dev_descriptor.idProduct) != idProduct) {
737
- /* not a valid device */
738
- usbi_warn (ctx, "idProduct from iokit (%04x) does not match idProduct in descriptor (%04x). skipping device",
739
- idProduct, libusb_le16_to_cpu (dev->dev_descriptor.idProduct));
740
- return LIBUSB_ERROR_NO_DEVICE;
741
- }
742
-
743
- usbi_dbg ("cached device descriptor:");
744
- usbi_dbg (" bDescriptorType: 0x%02x", dev->dev_descriptor.bDescriptorType);
745
- usbi_dbg (" bcdUSB: 0x%04x", dev->dev_descriptor.bcdUSB);
746
- usbi_dbg (" bDeviceClass: 0x%02x", dev->dev_descriptor.bDeviceClass);
747
- usbi_dbg (" bDeviceSubClass: 0x%02x", dev->dev_descriptor.bDeviceSubClass);
748
- usbi_dbg (" bDeviceProtocol: 0x%02x", dev->dev_descriptor.bDeviceProtocol);
749
- usbi_dbg (" bMaxPacketSize0: 0x%02x", dev->dev_descriptor.bMaxPacketSize0);
750
- usbi_dbg (" idVendor: 0x%04x", dev->dev_descriptor.idVendor);
751
- usbi_dbg (" idProduct: 0x%04x", dev->dev_descriptor.idProduct);
752
- usbi_dbg (" bcdDevice: 0x%04x", dev->dev_descriptor.bcdDevice);
753
- usbi_dbg (" iManufacturer: 0x%02x", dev->dev_descriptor.iManufacturer);
754
- usbi_dbg (" iProduct: 0x%02x", dev->dev_descriptor.iProduct);
755
- usbi_dbg (" iSerialNumber: 0x%02x", dev->dev_descriptor.iSerialNumber);
756
- usbi_dbg (" bNumConfigurations: 0x%02x", dev->dev_descriptor.bNumConfigurations);
757
-
758
- dev->can_enumerate = 1;
759
-
760
- return LIBUSB_SUCCESS;
761
- }
762
-
763
- static int darwin_get_cached_device(struct libusb_context *ctx, io_service_t service,
764
- struct darwin_cached_device **cached_out) {
765
- struct darwin_cached_device *new_device;
766
- UInt64 sessionID = 0, parent_sessionID = 0;
767
- int ret = LIBUSB_SUCCESS;
768
- usb_device_t **device;
769
- io_service_t parent;
770
- kern_return_t result;
771
- UInt8 port = 0;
772
-
773
- /* get some info from the io registry */
774
- (void) get_ioregistry_value_number (service, CFSTR("sessionID"), kCFNumberSInt64Type, &sessionID);
775
- (void) get_ioregistry_value_number (service, CFSTR("PortNum"), kCFNumberSInt8Type, &port);
776
-
777
- usbi_dbg("finding cached device for sessionID 0x%" PRIx64, sessionID);
778
-
779
- result = IORegistryEntryGetParentEntry (service, kIOUSBPlane, &parent);
780
-
781
- if (kIOReturnSuccess == result) {
782
- (void) get_ioregistry_value_number (parent, CFSTR("sessionID"), kCFNumberSInt64Type, &parent_sessionID);
783
- IOObjectRelease(parent);
784
- }
785
-
786
- usbi_mutex_lock(&darwin_cached_devices_lock);
787
- do {
788
- *cached_out = NULL;
789
-
790
- list_for_each_entry(new_device, &darwin_cached_devices, list, struct darwin_cached_device) {
791
- usbi_dbg("matching sessionID 0x%" PRIx64 " against cached device with sessionID 0x%" PRIx64, sessionID, new_device->session);
792
- if (new_device->session == sessionID) {
793
- usbi_dbg("using cached device for device");
794
- *cached_out = new_device;
795
- break;
796
- }
797
- }
798
-
799
- if (*cached_out)
800
- break;
801
-
802
- usbi_dbg("caching new device with sessionID 0x%" PRIx64, sessionID);
803
-
804
- device = darwin_device_from_service (service);
805
- if (!device) {
806
- ret = LIBUSB_ERROR_NO_DEVICE;
807
- break;
808
- }
809
-
810
- new_device = calloc (1, sizeof (*new_device));
811
- if (!new_device) {
812
- ret = LIBUSB_ERROR_NO_MEM;
813
- break;
814
- }
815
-
816
- /* add this device to the cached device list */
817
- list_add(&new_device->list, &darwin_cached_devices);
818
-
819
- (*device)->GetDeviceAddress (device, (USBDeviceAddress *)&new_device->address);
820
-
821
- /* keep a reference to this device */
822
- darwin_ref_cached_device(new_device);
823
-
824
- new_device->device = device;
825
- new_device->session = sessionID;
826
- (*device)->GetLocationID (device, &new_device->location);
827
- new_device->port = port;
828
- new_device->parent_session = parent_sessionID;
829
-
830
- /* cache the device descriptor */
831
- ret = darwin_cache_device_descriptor(ctx, new_device);
832
- if (ret)
833
- break;
834
-
835
- if (new_device->can_enumerate) {
836
- snprintf(new_device->sys_path, 20, "%03i-%04x-%04x-%02x-%02x", new_device->address,
837
- new_device->dev_descriptor.idVendor, new_device->dev_descriptor.idProduct,
838
- new_device->dev_descriptor.bDeviceClass, new_device->dev_descriptor.bDeviceSubClass);
839
- }
840
- } while (0);
841
-
842
- usbi_mutex_unlock(&darwin_cached_devices_lock);
843
-
844
- /* keep track of devices regardless of if we successfully enumerate them to
845
- prevent them from being enumerated multiple times */
846
-
847
- *cached_out = new_device;
848
-
849
- return ret;
850
- }
851
-
852
- static int process_new_device (struct libusb_context *ctx, io_service_t service) {
853
- struct darwin_device_priv *priv;
854
- struct libusb_device *dev = NULL;
855
- struct darwin_cached_device *cached_device;
856
- UInt8 devSpeed;
857
- int ret = 0;
858
-
859
- do {
860
- ret = darwin_get_cached_device (ctx, service, &cached_device);
861
-
862
- if (ret < 0 || !cached_device->can_enumerate) {
863
- return ret;
864
- }
865
-
866
- /* check current active configuration (and cache the first configuration value--
867
- which may be used by claim_interface) */
868
- ret = darwin_check_configuration (ctx, cached_device);
869
- if (ret)
870
- break;
871
-
872
- usbi_dbg ("allocating new device in context %p for with session 0x%" PRIx64,
873
- ctx, cached_device->session);
874
-
875
- dev = usbi_alloc_device(ctx, (unsigned long) cached_device->session);
876
- if (!dev) {
877
- return LIBUSB_ERROR_NO_MEM;
878
- }
879
-
880
- priv = (struct darwin_device_priv *)dev->os_priv;
881
-
882
- priv->dev = cached_device;
883
- darwin_ref_cached_device (priv->dev);
884
-
885
- if (cached_device->parent_session > 0) {
886
- dev->parent_dev = usbi_get_device_by_session_id (ctx, (unsigned long) cached_device->parent_session);
887
- } else {
888
- dev->parent_dev = NULL;
889
- }
890
- dev->port_number = cached_device->port;
891
- dev->bus_number = cached_device->location >> 24;
892
- dev->device_address = cached_device->address;
893
-
894
- (*(priv->dev->device))->GetDeviceSpeed (priv->dev->device, &devSpeed);
895
-
896
- switch (devSpeed) {
897
- case kUSBDeviceSpeedLow: dev->speed = LIBUSB_SPEED_LOW; break;
898
- case kUSBDeviceSpeedFull: dev->speed = LIBUSB_SPEED_FULL; break;
899
- case kUSBDeviceSpeedHigh: dev->speed = LIBUSB_SPEED_HIGH; break;
900
- #if DeviceVersion >= 500
901
- case kUSBDeviceSpeedSuper: dev->speed = LIBUSB_SPEED_SUPER; break;
902
- #endif
903
- default:
904
- usbi_warn (ctx, "Got unknown device speed %d", devSpeed);
905
- }
906
-
907
- ret = usbi_sanitize_device (dev);
908
- if (ret < 0)
909
- break;
910
-
911
- usbi_dbg ("found device with address %d port = %d parent = %p at %p", dev->device_address,
912
- dev->port_number, (void *) dev->parent_dev, priv->dev->sys_path);
913
- } while (0);
914
-
915
- if (0 == ret) {
916
- usbi_connect_device (dev);
917
- } else {
918
- libusb_unref_device (dev);
919
- }
920
-
921
- return ret;
922
- }
923
-
924
- static int darwin_scan_devices(struct libusb_context *ctx) {
925
- io_iterator_t deviceIterator;
926
- io_service_t service;
927
- kern_return_t kresult;
928
-
929
- kresult = usb_setup_device_iterator (&deviceIterator, 0);
930
- if (kresult != kIOReturnSuccess)
931
- return darwin_to_libusb (kresult);
932
-
933
- while ((service = IOIteratorNext (deviceIterator))) {
934
- (void) process_new_device (ctx, service);
935
-
936
- IOObjectRelease(service);
937
- }
938
-
939
- IOObjectRelease(deviceIterator);
940
-
941
- return 0;
942
- }
943
-
944
- static int darwin_open (struct libusb_device_handle *dev_handle) {
945
- struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv;
946
- struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev);
947
- IOReturn kresult;
948
-
949
- if (0 == dpriv->open_count) {
950
- /* try to open the device */
951
- kresult = (*(dpriv->device))->USBDeviceOpenSeize (dpriv->device);
952
- if (kresult != kIOReturnSuccess) {
953
- usbi_warn (HANDLE_CTX (dev_handle), "USBDeviceOpen: %s", darwin_error_str(kresult));
954
-
955
- if (kIOReturnExclusiveAccess != kresult) {
956
- return darwin_to_libusb (kresult);
957
- }
958
-
959
- /* it is possible to perform some actions on a device that is not open so do not return an error */
960
- priv->is_open = 0;
961
- } else {
962
- priv->is_open = 1;
963
- }
964
-
965
- /* create async event source */
966
- kresult = (*(dpriv->device))->CreateDeviceAsyncEventSource (dpriv->device, &priv->cfSource);
967
- if (kresult != kIOReturnSuccess) {
968
- usbi_err (HANDLE_CTX (dev_handle), "CreateDeviceAsyncEventSource: %s", darwin_error_str(kresult));
969
-
970
- if (priv->is_open) {
971
- (*(dpriv->device))->USBDeviceClose (dpriv->device);
972
- }
973
-
974
- priv->is_open = 0;
975
-
976
- return darwin_to_libusb (kresult);
977
- }
978
-
979
- CFRetain (libusb_darwin_acfl);
980
-
981
- /* add the cfSource to the aync run loop */
982
- CFRunLoopAddSource(libusb_darwin_acfl, priv->cfSource, kCFRunLoopCommonModes);
983
- }
984
-
985
- /* device opened successfully */
986
- dpriv->open_count++;
987
-
988
- usbi_dbg ("device open for access");
989
-
990
- return 0;
991
- }
992
-
993
- static void darwin_close (struct libusb_device_handle *dev_handle) {
994
- struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv;
995
- struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev);
996
- IOReturn kresult;
997
- int i;
998
-
999
- if (dpriv->open_count == 0) {
1000
- /* something is probably very wrong if this is the case */
1001
- usbi_err (HANDLE_CTX (dev_handle), "Close called on a device that was not open!");
1002
- return;
1003
- }
1004
-
1005
- dpriv->open_count--;
1006
-
1007
- /* make sure all interfaces are released */
1008
- for (i = 0 ; i < USB_MAXINTERFACES ; i++)
1009
- if (dev_handle->claimed_interfaces & (1 << i))
1010
- libusb_release_interface (dev_handle, i);
1011
-
1012
- if (0 == dpriv->open_count) {
1013
- /* delete the device's async event source */
1014
- if (priv->cfSource) {
1015
- CFRunLoopRemoveSource (libusb_darwin_acfl, priv->cfSource, kCFRunLoopDefaultMode);
1016
- CFRelease (priv->cfSource);
1017
- priv->cfSource = NULL;
1018
- CFRelease (libusb_darwin_acfl);
1019
- }
1020
-
1021
- if (priv->is_open) {
1022
- /* close the device */
1023
- kresult = (*(dpriv->device))->USBDeviceClose(dpriv->device);
1024
- if (kresult) {
1025
- /* Log the fact that we had a problem closing the file, however failing a
1026
- * close isn't really an error, so return success anyway */
1027
- usbi_warn (HANDLE_CTX (dev_handle), "USBDeviceClose: %s", darwin_error_str(kresult));
1028
- }
1029
- }
1030
- }
1031
- }
1032
-
1033
- static int darwin_get_configuration(struct libusb_device_handle *dev_handle, int *config) {
1034
- struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev);
1035
-
1036
- *config = (int) dpriv->active_config;
1037
-
1038
- return 0;
1039
- }
1040
-
1041
- static int darwin_set_configuration(struct libusb_device_handle *dev_handle, int config) {
1042
- struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev);
1043
- IOReturn kresult;
1044
- int i;
1045
-
1046
- /* Setting configuration will invalidate the interface, so we need
1047
- to reclaim it. First, dispose of existing interfaces, if any. */
1048
- for (i = 0 ; i < USB_MAXINTERFACES ; i++)
1049
- if (dev_handle->claimed_interfaces & (1 << i))
1050
- darwin_release_interface (dev_handle, i);
1051
-
1052
- kresult = (*(dpriv->device))->SetConfiguration (dpriv->device, config);
1053
- if (kresult != kIOReturnSuccess)
1054
- return darwin_to_libusb (kresult);
1055
-
1056
- /* Reclaim any interfaces. */
1057
- for (i = 0 ; i < USB_MAXINTERFACES ; i++)
1058
- if (dev_handle->claimed_interfaces & (1 << i))
1059
- darwin_claim_interface (dev_handle, i);
1060
-
1061
- dpriv->active_config = config;
1062
-
1063
- return 0;
1064
- }
1065
-
1066
- static int darwin_get_interface (usb_device_t **darwin_device, uint8_t ifc, io_service_t *usbInterfacep) {
1067
- IOUSBFindInterfaceRequest request;
1068
- kern_return_t kresult;
1069
- io_iterator_t interface_iterator;
1070
- UInt8 bInterfaceNumber;
1071
- int ret;
1072
-
1073
- *usbInterfacep = IO_OBJECT_NULL;
1074
-
1075
- /* Setup the Interface Request */
1076
- request.bInterfaceClass = kIOUSBFindInterfaceDontCare;
1077
- request.bInterfaceSubClass = kIOUSBFindInterfaceDontCare;
1078
- request.bInterfaceProtocol = kIOUSBFindInterfaceDontCare;
1079
- request.bAlternateSetting = kIOUSBFindInterfaceDontCare;
1080
-
1081
- kresult = (*(darwin_device))->CreateInterfaceIterator(darwin_device, &request, &interface_iterator);
1082
- if (kresult)
1083
- return kresult;
1084
-
1085
- while ((*usbInterfacep = IOIteratorNext(interface_iterator))) {
1086
- /* find the interface number */
1087
- ret = get_ioregistry_value_number (*usbInterfacep, CFSTR("bInterfaceNumber"), kCFNumberSInt8Type,
1088
- &bInterfaceNumber);
1089
-
1090
- if (ret && bInterfaceNumber == ifc) {
1091
- break;
1092
- }
1093
-
1094
- (void) IOObjectRelease (*usbInterfacep);
1095
- }
1096
-
1097
- /* done with the interface iterator */
1098
- IOObjectRelease(interface_iterator);
1099
-
1100
- return 0;
1101
- }
1102
-
1103
- static int get_endpoints (struct libusb_device_handle *dev_handle, int iface) {
1104
- struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv;
1105
-
1106
- /* current interface */
1107
- struct darwin_interface *cInterface = &priv->interfaces[iface];
1108
-
1109
- kern_return_t kresult;
1110
-
1111
- u_int8_t numep, direction, number;
1112
- u_int8_t dont_care1, dont_care3;
1113
- u_int16_t dont_care2;
1114
- int i;
1115
-
1116
- usbi_dbg ("building table of endpoints.");
1117
-
1118
- /* retrieve the total number of endpoints on this interface */
1119
- kresult = (*(cInterface->interface))->GetNumEndpoints(cInterface->interface, &numep);
1120
- if (kresult) {
1121
- usbi_err (HANDLE_CTX (dev_handle), "can't get number of endpoints for interface: %s", darwin_error_str(kresult));
1122
- return darwin_to_libusb (kresult);
1123
- }
1124
-
1125
- /* iterate through pipe references */
1126
- for (i = 1 ; i <= numep ; i++) {
1127
- kresult = (*(cInterface->interface))->GetPipeProperties(cInterface->interface, i, &direction, &number, &dont_care1,
1128
- &dont_care2, &dont_care3);
1129
-
1130
- if (kresult != kIOReturnSuccess) {
1131
- usbi_err (HANDLE_CTX (dev_handle), "error getting pipe information for pipe %d: %s", i, darwin_error_str(kresult));
1132
-
1133
- return darwin_to_libusb (kresult);
1134
- }
1135
-
1136
- usbi_dbg ("interface: %i pipe %i: dir: %i number: %i", iface, i, direction, number);
1137
-
1138
- cInterface->endpoint_addrs[i - 1] = (((kUSBIn == direction) << kUSBRqDirnShift) | (number & LIBUSB_ENDPOINT_ADDRESS_MASK));
1139
- }
1140
-
1141
- cInterface->num_endpoints = numep;
1142
-
1143
- return 0;
1144
- }
1145
-
1146
- static int darwin_claim_interface(struct libusb_device_handle *dev_handle, int iface) {
1147
- struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev);
1148
- struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv;
1149
- io_service_t usbInterface = IO_OBJECT_NULL;
1150
- IOReturn kresult;
1151
- IOCFPlugInInterface **plugInInterface = NULL;
1152
- SInt32 score;
1153
-
1154
- /* current interface */
1155
- struct darwin_interface *cInterface = &priv->interfaces[iface];
1156
-
1157
- kresult = darwin_get_interface (dpriv->device, iface, &usbInterface);
1158
- if (kresult != kIOReturnSuccess)
1159
- return darwin_to_libusb (kresult);
1160
-
1161
- /* make sure we have an interface */
1162
- if (!usbInterface && dpriv->first_config != 0) {
1163
- usbi_info (HANDLE_CTX (dev_handle), "no interface found; setting configuration: %d", dpriv->first_config);
1164
-
1165
- /* set the configuration */
1166
- kresult = darwin_set_configuration (dev_handle, dpriv->first_config);
1167
- if (kresult != LIBUSB_SUCCESS) {
1168
- usbi_err (HANDLE_CTX (dev_handle), "could not set configuration");
1169
- return kresult;
1170
- }
1171
-
1172
- kresult = darwin_get_interface (dpriv->device, iface, &usbInterface);
1173
- if (kresult) {
1174
- usbi_err (HANDLE_CTX (dev_handle), "darwin_get_interface: %s", darwin_error_str(kresult));
1175
- return darwin_to_libusb (kresult);
1176
- }
1177
- }
1178
-
1179
- if (!usbInterface) {
1180
- usbi_err (HANDLE_CTX (dev_handle), "interface not found");
1181
- return LIBUSB_ERROR_NOT_FOUND;
1182
- }
1183
-
1184
- /* get an interface to the device's interface */
1185
- kresult = IOCreatePlugInInterfaceForService (usbInterface, kIOUSBInterfaceUserClientTypeID,
1186
- kIOCFPlugInInterfaceID, &plugInInterface, &score);
1187
-
1188
- /* ignore release error */
1189
- (void)IOObjectRelease (usbInterface);
1190
-
1191
- if (kresult) {
1192
- usbi_err (HANDLE_CTX (dev_handle), "IOCreatePlugInInterfaceForService: %s", darwin_error_str(kresult));
1193
- return darwin_to_libusb (kresult);
1194
- }
1195
-
1196
- if (!plugInInterface) {
1197
- usbi_err (HANDLE_CTX (dev_handle), "plugin interface not found");
1198
- return LIBUSB_ERROR_NOT_FOUND;
1199
- }
1200
-
1201
- /* Do the actual claim */
1202
- kresult = (*plugInInterface)->QueryInterface(plugInInterface,
1203
- CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID),
1204
- (LPVOID)&cInterface->interface);
1205
- /* We no longer need the intermediate plug-in */
1206
- /* Use release instead of IODestroyPlugInInterface to avoid stopping IOServices associated with this device */
1207
- (*plugInInterface)->Release (plugInInterface);
1208
- if (kresult || !cInterface->interface) {
1209
- usbi_err (HANDLE_CTX (dev_handle), "QueryInterface: %s", darwin_error_str(kresult));
1210
- return darwin_to_libusb (kresult);
1211
- }
1212
-
1213
- /* claim the interface */
1214
- kresult = (*(cInterface->interface))->USBInterfaceOpen(cInterface->interface);
1215
- if (kresult) {
1216
- usbi_err (HANDLE_CTX (dev_handle), "USBInterfaceOpen: %s", darwin_error_str(kresult));
1217
- return darwin_to_libusb (kresult);
1218
- }
1219
-
1220
- /* update list of endpoints */
1221
- kresult = get_endpoints (dev_handle, iface);
1222
- if (kresult) {
1223
- /* this should not happen */
1224
- darwin_release_interface (dev_handle, iface);
1225
- usbi_err (HANDLE_CTX (dev_handle), "could not build endpoint table");
1226
- return kresult;
1227
- }
1228
-
1229
- cInterface->cfSource = NULL;
1230
-
1231
- /* create async event source */
1232
- kresult = (*(cInterface->interface))->CreateInterfaceAsyncEventSource (cInterface->interface, &cInterface->cfSource);
1233
- if (kresult != kIOReturnSuccess) {
1234
- usbi_err (HANDLE_CTX (dev_handle), "could not create async event source");
1235
-
1236
- /* can't continue without an async event source */
1237
- (void)darwin_release_interface (dev_handle, iface);
1238
-
1239
- return darwin_to_libusb (kresult);
1240
- }
1241
-
1242
- /* add the cfSource to the async thread's run loop */
1243
- CFRunLoopAddSource(libusb_darwin_acfl, cInterface->cfSource, kCFRunLoopDefaultMode);
1244
-
1245
- usbi_dbg ("interface opened");
1246
-
1247
- return 0;
1248
- }
1249
-
1250
- static int darwin_release_interface(struct libusb_device_handle *dev_handle, int iface) {
1251
- struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv;
1252
- IOReturn kresult;
1253
-
1254
- /* current interface */
1255
- struct darwin_interface *cInterface = &priv->interfaces[iface];
1256
-
1257
- /* Check to see if an interface is open */
1258
- if (!cInterface->interface)
1259
- return LIBUSB_SUCCESS;
1260
-
1261
- /* clean up endpoint data */
1262
- cInterface->num_endpoints = 0;
1263
-
1264
- /* delete the interface's async event source */
1265
- if (cInterface->cfSource) {
1266
- CFRunLoopRemoveSource (libusb_darwin_acfl, cInterface->cfSource, kCFRunLoopDefaultMode);
1267
- CFRelease (cInterface->cfSource);
1268
- }
1269
-
1270
- kresult = (*(cInterface->interface))->USBInterfaceClose(cInterface->interface);
1271
- if (kresult)
1272
- usbi_warn (HANDLE_CTX (dev_handle), "USBInterfaceClose: %s", darwin_error_str(kresult));
1273
-
1274
- kresult = (*(cInterface->interface))->Release(cInterface->interface);
1275
- if (kresult != kIOReturnSuccess)
1276
- usbi_warn (HANDLE_CTX (dev_handle), "Release: %s", darwin_error_str(kresult));
1277
-
1278
- cInterface->interface = IO_OBJECT_NULL;
1279
-
1280
- return darwin_to_libusb (kresult);
1281
- }
1282
-
1283
- static int darwin_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) {
1284
- struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv;
1285
- IOReturn kresult;
1286
-
1287
- /* current interface */
1288
- struct darwin_interface *cInterface = &priv->interfaces[iface];
1289
-
1290
- if (!cInterface->interface)
1291
- return LIBUSB_ERROR_NO_DEVICE;
1292
-
1293
- kresult = (*(cInterface->interface))->SetAlternateInterface (cInterface->interface, altsetting);
1294
- if (kresult != kIOReturnSuccess)
1295
- darwin_reset_device (dev_handle);
1296
-
1297
- /* update list of endpoints */
1298
- kresult = get_endpoints (dev_handle, iface);
1299
- if (kresult) {
1300
- /* this should not happen */
1301
- darwin_release_interface (dev_handle, iface);
1302
- usbi_err (HANDLE_CTX (dev_handle), "could not build endpoint table");
1303
- return kresult;
1304
- }
1305
-
1306
- return darwin_to_libusb (kresult);
1307
- }
1308
-
1309
- static int darwin_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) {
1310
- /* current interface */
1311
- struct darwin_interface *cInterface;
1312
- IOReturn kresult;
1313
- uint8_t pipeRef;
1314
-
1315
- /* determine the interface/endpoint to use */
1316
- if (ep_to_pipeRef (dev_handle, endpoint, &pipeRef, NULL, &cInterface) != 0) {
1317
- usbi_err (HANDLE_CTX (dev_handle), "endpoint not found on any open interface");
1318
-
1319
- return LIBUSB_ERROR_NOT_FOUND;
1320
- }
1321
-
1322
- /* newer versions of darwin support clearing additional bits on the device's endpoint */
1323
- kresult = (*(cInterface->interface))->ClearPipeStallBothEnds(cInterface->interface, pipeRef);
1324
- if (kresult)
1325
- usbi_warn (HANDLE_CTX (dev_handle), "ClearPipeStall: %s", darwin_error_str (kresult));
1326
-
1327
- return darwin_to_libusb (kresult);
1328
- }
1329
-
1330
- static int darwin_reset_device(struct libusb_device_handle *dev_handle) {
1331
- struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev);
1332
- IOUSBDeviceDescriptor descriptor;
1333
- IOUSBConfigurationDescriptorPtr cached_configuration;
1334
- IOUSBConfigurationDescriptor configuration;
1335
- bool reenumerate = false;
1336
- IOReturn kresult;
1337
- int i;
1338
-
1339
- kresult = (*(dpriv->device))->ResetDevice (dpriv->device);
1340
- if (kresult) {
1341
- usbi_err (HANDLE_CTX (dev_handle), "ResetDevice: %s", darwin_error_str (kresult));
1342
- return darwin_to_libusb (kresult);
1343
- }
1344
-
1345
- do {
1346
- usbi_dbg ("darwin/reset_device: checking if device descriptor changed");
1347
-
1348
- /* ignore return code. if we can't get a descriptor it might be worthwhile re-enumerating anway */
1349
- (void) darwin_request_descriptor (dpriv->device, kUSBDeviceDesc, 0, &descriptor, sizeof (descriptor));
1350
-
1351
- /* check if the device descriptor has changed */
1352
- if (0 != memcmp (&dpriv->dev_descriptor, &descriptor, sizeof (descriptor))) {
1353
- reenumerate = true;
1354
- break;
1355
- }
1356
-
1357
- /* check if any configuration descriptor has changed */
1358
- for (i = 0 ; i < descriptor.bNumConfigurations ; ++i) {
1359
- usbi_dbg ("darwin/reset_device: checking if configuration descriptor %d changed", i);
1360
-
1361
- (void) darwin_request_descriptor (dpriv->device, kUSBConfDesc, i, &configuration, sizeof (configuration));
1362
- (*(dpriv->device))->GetConfigurationDescriptorPtr (dpriv->device, i, &cached_configuration);
1363
-
1364
- if (!cached_configuration || 0 != memcmp (cached_configuration, &configuration, sizeof (configuration))) {
1365
- reenumerate = true;
1366
- break;
1367
- }
1368
- }
1369
- } while (0);
1370
-
1371
- if (reenumerate) {
1372
- usbi_dbg ("darwin/reset_device: device requires reenumeration");
1373
- (void) (*(dpriv->device))->USBDeviceReEnumerate (dpriv->device, 0);
1374
- return LIBUSB_ERROR_NOT_FOUND;
1375
- }
1376
-
1377
- usbi_dbg ("darwin/reset_device: device reset complete");
1378
-
1379
- return LIBUSB_SUCCESS;
1380
- }
1381
-
1382
- static int darwin_kernel_driver_active(struct libusb_device_handle *dev_handle, int interface) {
1383
- struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev);
1384
- io_service_t usbInterface;
1385
- CFTypeRef driver;
1386
- IOReturn kresult;
1387
-
1388
- kresult = darwin_get_interface (dpriv->device, interface, &usbInterface);
1389
- if (kresult) {
1390
- usbi_err (HANDLE_CTX (dev_handle), "darwin_get_interface: %s", darwin_error_str(kresult));
1391
-
1392
- return darwin_to_libusb (kresult);
1393
- }
1394
-
1395
- driver = IORegistryEntryCreateCFProperty (usbInterface, kIOBundleIdentifierKey, kCFAllocatorDefault, 0);
1396
- IOObjectRelease (usbInterface);
1397
-
1398
- if (driver) {
1399
- CFRelease (driver);
1400
-
1401
- return 1;
1402
- }
1403
-
1404
- /* no driver */
1405
- return 0;
1406
- }
1407
-
1408
- /* attaching/detaching kernel drivers is not currently supported (maybe in the future?) */
1409
- static int darwin_attach_kernel_driver (struct libusb_device_handle *dev_handle, int interface) {
1410
- (void)dev_handle;
1411
- (void)interface;
1412
- return LIBUSB_ERROR_NOT_SUPPORTED;
1413
- }
1414
-
1415
- static int darwin_detach_kernel_driver (struct libusb_device_handle *dev_handle, int interface) {
1416
- (void)dev_handle;
1417
- (void)interface;
1418
- return LIBUSB_ERROR_NOT_SUPPORTED;
1419
- }
1420
-
1421
- static void darwin_destroy_device(struct libusb_device *dev) {
1422
- struct darwin_device_priv *dpriv = (struct darwin_device_priv *) dev->os_priv;
1423
-
1424
- if (dpriv->dev) {
1425
- /* need to hold the lock in case this is the last reference to the device */
1426
- usbi_mutex_lock(&darwin_cached_devices_lock);
1427
- darwin_deref_cached_device (dpriv->dev);
1428
- dpriv->dev = NULL;
1429
- usbi_mutex_unlock(&darwin_cached_devices_lock);
1430
- }
1431
- }
1432
-
1433
- static int submit_bulk_transfer(struct usbi_transfer *itransfer) {
1434
- struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
1435
-
1436
- IOReturn ret;
1437
- uint8_t transferType;
1438
- /* None of the values below are used in libusbx for bulk transfers */
1439
- uint8_t direction, number, interval, pipeRef;
1440
- uint16_t maxPacketSize;
1441
-
1442
- struct darwin_interface *cInterface;
1443
-
1444
- if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) {
1445
- usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface");
1446
-
1447
- return LIBUSB_ERROR_NOT_FOUND;
1448
- }
1449
-
1450
- ret = (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number,
1451
- &transferType, &maxPacketSize, &interval);
1452
-
1453
- if (ret) {
1454
- usbi_err (TRANSFER_CTX (transfer), "bulk transfer failed (dir = %s): %s (code = 0x%08x)", IS_XFERIN(transfer) ? "In" : "Out",
1455
- darwin_error_str(ret), ret);
1456
- return darwin_to_libusb (ret);
1457
- }
1458
-
1459
- if (0 != (transfer->length % maxPacketSize)) {
1460
- /* do not need a zero packet */
1461
- transfer->flags &= ~LIBUSB_TRANSFER_ADD_ZERO_PACKET;
1462
- }
1463
-
1464
- /* submit the request */
1465
- /* timeouts are unavailable on interrupt endpoints */
1466
- if (transferType == kUSBInterrupt) {
1467
- if (IS_XFERIN(transfer))
1468
- ret = (*(cInterface->interface))->ReadPipeAsync(cInterface->interface, pipeRef, transfer->buffer,
1469
- transfer->length, darwin_async_io_callback, itransfer);
1470
- else
1471
- ret = (*(cInterface->interface))->WritePipeAsync(cInterface->interface, pipeRef, transfer->buffer,
1472
- transfer->length, darwin_async_io_callback, itransfer);
1473
- } else {
1474
- itransfer->flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT;
1475
-
1476
- if (IS_XFERIN(transfer))
1477
- ret = (*(cInterface->interface))->ReadPipeAsyncTO(cInterface->interface, pipeRef, transfer->buffer,
1478
- transfer->length, transfer->timeout, transfer->timeout,
1479
- darwin_async_io_callback, (void *)itransfer);
1480
- else
1481
- ret = (*(cInterface->interface))->WritePipeAsyncTO(cInterface->interface, pipeRef, transfer->buffer,
1482
- transfer->length, transfer->timeout, transfer->timeout,
1483
- darwin_async_io_callback, (void *)itransfer);
1484
- }
1485
-
1486
- if (ret)
1487
- usbi_err (TRANSFER_CTX (transfer), "bulk transfer failed (dir = %s): %s (code = 0x%08x)", IS_XFERIN(transfer) ? "In" : "Out",
1488
- darwin_error_str(ret), ret);
1489
-
1490
- return darwin_to_libusb (ret);
1491
- }
1492
-
1493
- #if InterfaceVersion >= 550
1494
- static int submit_stream_transfer(struct usbi_transfer *itransfer) {
1495
- struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
1496
- struct darwin_interface *cInterface;
1497
- uint8_t pipeRef;
1498
- IOReturn ret;
1499
-
1500
- if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) {
1501
- usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface");
1502
-
1503
- return LIBUSB_ERROR_NOT_FOUND;
1504
- }
1505
-
1506
- itransfer->flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT;
1507
-
1508
- if (IS_XFERIN(transfer))
1509
- ret = (*(cInterface->interface))->ReadStreamsPipeAsyncTO(cInterface->interface, pipeRef, itransfer->stream_id,
1510
- transfer->buffer, transfer->length, transfer->timeout,
1511
- transfer->timeout, darwin_async_io_callback, (void *)itransfer);
1512
- else
1513
- ret = (*(cInterface->interface))->WriteStreamsPipeAsyncTO(cInterface->interface, pipeRef, itransfer->stream_id,
1514
- transfer->buffer, transfer->length, transfer->timeout,
1515
- transfer->timeout, darwin_async_io_callback, (void *)itransfer);
1516
-
1517
- if (ret)
1518
- usbi_err (TRANSFER_CTX (transfer), "bulk stream transfer failed (dir = %s): %s (code = 0x%08x)", IS_XFERIN(transfer) ? "In" : "Out",
1519
- darwin_error_str(ret), ret);
1520
-
1521
- return darwin_to_libusb (ret);
1522
- }
1523
- #endif
1524
-
1525
- static int submit_iso_transfer(struct usbi_transfer *itransfer) {
1526
- struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
1527
- struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);
1528
-
1529
- IOReturn kresult;
1530
- uint8_t direction, number, interval, pipeRef, transferType;
1531
- uint16_t maxPacketSize;
1532
- UInt64 frame;
1533
- AbsoluteTime atTime;
1534
- int i;
1535
-
1536
- struct darwin_interface *cInterface;
1537
-
1538
- /* construct an array of IOUSBIsocFrames, reuse the old one if possible */
1539
- if (tpriv->isoc_framelist && tpriv->num_iso_packets != transfer->num_iso_packets) {
1540
- free(tpriv->isoc_framelist);
1541
- tpriv->isoc_framelist = NULL;
1542
- }
1543
-
1544
- if (!tpriv->isoc_framelist) {
1545
- tpriv->num_iso_packets = transfer->num_iso_packets;
1546
- tpriv->isoc_framelist = (IOUSBIsocFrame*) calloc (transfer->num_iso_packets, sizeof(IOUSBIsocFrame));
1547
- if (!tpriv->isoc_framelist)
1548
- return LIBUSB_ERROR_NO_MEM;
1549
- }
1550
-
1551
- /* copy the frame list from the libusb descriptor (the structures differ only is member order) */
1552
- for (i = 0 ; i < transfer->num_iso_packets ; i++)
1553
- tpriv->isoc_framelist[i].frReqCount = transfer->iso_packet_desc[i].length;
1554
-
1555
- /* determine the interface/endpoint to use */
1556
- if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) {
1557
- usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface");
1558
-
1559
- return LIBUSB_ERROR_NOT_FOUND;
1560
- }
1561
-
1562
- /* determine the properties of this endpoint and the speed of the device */
1563
- (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number,
1564
- &transferType, &maxPacketSize, &interval);
1565
-
1566
- /* Last but not least we need the bus frame number */
1567
- kresult = (*(cInterface->interface))->GetBusFrameNumber(cInterface->interface, &frame, &atTime);
1568
- if (kresult) {
1569
- usbi_err (TRANSFER_CTX (transfer), "failed to get bus frame number: %d", kresult);
1570
- free(tpriv->isoc_framelist);
1571
- tpriv->isoc_framelist = NULL;
1572
-
1573
- return darwin_to_libusb (kresult);
1574
- }
1575
-
1576
- (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number,
1577
- &transferType, &maxPacketSize, &interval);
1578
-
1579
- /* schedule for a frame a little in the future */
1580
- frame += 4;
1581
-
1582
- if (cInterface->frames[transfer->endpoint] && frame < cInterface->frames[transfer->endpoint])
1583
- frame = cInterface->frames[transfer->endpoint];
1584
-
1585
- /* submit the request */
1586
- if (IS_XFERIN(transfer))
1587
- kresult = (*(cInterface->interface))->ReadIsochPipeAsync(cInterface->interface, pipeRef, transfer->buffer, frame,
1588
- transfer->num_iso_packets, tpriv->isoc_framelist, darwin_async_io_callback,
1589
- itransfer);
1590
- else
1591
- kresult = (*(cInterface->interface))->WriteIsochPipeAsync(cInterface->interface, pipeRef, transfer->buffer, frame,
1592
- transfer->num_iso_packets, tpriv->isoc_framelist, darwin_async_io_callback,
1593
- itransfer);
1594
-
1595
- if (LIBUSB_SPEED_FULL == transfer->dev_handle->dev->speed)
1596
- /* Full speed */
1597
- cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets * (1 << (interval - 1));
1598
- else
1599
- /* High/super speed */
1600
- cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets * (1 << (interval - 1)) / 8;
1601
-
1602
- if (kresult != kIOReturnSuccess) {
1603
- usbi_err (TRANSFER_CTX (transfer), "isochronous transfer failed (dir: %s): %s", IS_XFERIN(transfer) ? "In" : "Out",
1604
- darwin_error_str(kresult));
1605
- free (tpriv->isoc_framelist);
1606
- tpriv->isoc_framelist = NULL;
1607
- }
1608
-
1609
- return darwin_to_libusb (kresult);
1610
- }
1611
-
1612
- static int submit_control_transfer(struct usbi_transfer *itransfer) {
1613
- struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
1614
- struct libusb_control_setup *setup = (struct libusb_control_setup *) transfer->buffer;
1615
- struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(transfer->dev_handle->dev);
1616
- struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);
1617
-
1618
- IOReturn kresult;
1619
-
1620
- bzero(&tpriv->req, sizeof(tpriv->req));
1621
-
1622
- /* IOUSBDeviceInterface expects the request in cpu endianess */
1623
- tpriv->req.bmRequestType = setup->bmRequestType;
1624
- tpriv->req.bRequest = setup->bRequest;
1625
- /* these values should be in bus order from libusb_fill_control_setup */
1626
- tpriv->req.wValue = OSSwapLittleToHostInt16 (setup->wValue);
1627
- tpriv->req.wIndex = OSSwapLittleToHostInt16 (setup->wIndex);
1628
- tpriv->req.wLength = OSSwapLittleToHostInt16 (setup->wLength);
1629
- /* data is stored after the libusb control block */
1630
- tpriv->req.pData = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE;
1631
- tpriv->req.completionTimeout = transfer->timeout;
1632
- tpriv->req.noDataTimeout = transfer->timeout;
1633
-
1634
- itransfer->flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT;
1635
-
1636
- /* all transfers in libusb-1.0 are async */
1637
-
1638
- if (transfer->endpoint) {
1639
- struct darwin_interface *cInterface;
1640
- uint8_t pipeRef;
1641
-
1642
- if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) {
1643
- usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface");
1644
-
1645
- return LIBUSB_ERROR_NOT_FOUND;
1646
- }
1647
-
1648
- kresult = (*(cInterface->interface))->ControlRequestAsyncTO (cInterface->interface, pipeRef, &(tpriv->req), darwin_async_io_callback, itransfer);
1649
- } else
1650
- /* control request on endpoint 0 */
1651
- kresult = (*(dpriv->device))->DeviceRequestAsyncTO(dpriv->device, &(tpriv->req), darwin_async_io_callback, itransfer);
1652
-
1653
- if (kresult != kIOReturnSuccess)
1654
- usbi_err (TRANSFER_CTX (transfer), "control request failed: %s", darwin_error_str(kresult));
1655
-
1656
- return darwin_to_libusb (kresult);
1657
- }
1658
-
1659
- static int darwin_submit_transfer(struct usbi_transfer *itransfer) {
1660
- struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
1661
-
1662
- switch (transfer->type) {
1663
- case LIBUSB_TRANSFER_TYPE_CONTROL:
1664
- return submit_control_transfer(itransfer);
1665
- case LIBUSB_TRANSFER_TYPE_BULK:
1666
- case LIBUSB_TRANSFER_TYPE_INTERRUPT:
1667
- return submit_bulk_transfer(itransfer);
1668
- case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
1669
- return submit_iso_transfer(itransfer);
1670
- case LIBUSB_TRANSFER_TYPE_BULK_STREAM:
1671
- #if InterfaceVersion >= 550
1672
- return submit_stream_transfer(itransfer);
1673
- #else
1674
- usbi_err (TRANSFER_CTX(transfer), "IOUSBFamily version does not support bulk stream transfers");
1675
- return LIBUSB_ERROR_NOT_SUPPORTED;
1676
- #endif
1677
- default:
1678
- usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type);
1679
- return LIBUSB_ERROR_INVALID_PARAM;
1680
- }
1681
- }
1682
-
1683
- static int cancel_control_transfer(struct usbi_transfer *itransfer) {
1684
- struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
1685
- struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(transfer->dev_handle->dev);
1686
- IOReturn kresult;
1687
-
1688
- usbi_warn (ITRANSFER_CTX (itransfer), "aborting all transactions control pipe");
1689
-
1690
- if (!dpriv->device)
1691
- return LIBUSB_ERROR_NO_DEVICE;
1692
-
1693
- kresult = (*(dpriv->device))->USBDeviceAbortPipeZero (dpriv->device);
1694
-
1695
- return darwin_to_libusb (kresult);
1696
- }
1697
-
1698
- static int darwin_abort_transfers (struct usbi_transfer *itransfer) {
1699
- struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
1700
- struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(transfer->dev_handle->dev);
1701
- struct darwin_interface *cInterface;
1702
- uint8_t pipeRef, iface;
1703
- IOReturn kresult;
1704
-
1705
- if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, &iface, &cInterface) != 0) {
1706
- usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface");
1707
-
1708
- return LIBUSB_ERROR_NOT_FOUND;
1709
- }
1710
-
1711
- if (!dpriv->device)
1712
- return LIBUSB_ERROR_NO_DEVICE;
1713
-
1714
- usbi_warn (ITRANSFER_CTX (itransfer), "aborting all transactions on interface %d pipe %d", iface, pipeRef);
1715
-
1716
- /* abort transactions */
1717
- #if InterfaceVersion >= 550
1718
- if (LIBUSB_TRANSFER_TYPE_BULK_STREAM == transfer->type)
1719
- (*(cInterface->interface))->AbortStreamsPipe (cInterface->interface, pipeRef, itransfer->stream_id);
1720
- else
1721
- #endif
1722
- (*(cInterface->interface))->AbortPipe (cInterface->interface, pipeRef);
1723
-
1724
- usbi_dbg ("calling clear pipe stall to clear the data toggle bit");
1725
-
1726
- /* newer versions of darwin support clearing additional bits on the device's endpoint */
1727
- kresult = (*(cInterface->interface))->ClearPipeStallBothEnds(cInterface->interface, pipeRef);
1728
-
1729
- return darwin_to_libusb (kresult);
1730
- }
1731
-
1732
- static int darwin_cancel_transfer(struct usbi_transfer *itransfer) {
1733
- struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
1734
-
1735
- switch (transfer->type) {
1736
- case LIBUSB_TRANSFER_TYPE_CONTROL:
1737
- return cancel_control_transfer(itransfer);
1738
- case LIBUSB_TRANSFER_TYPE_BULK:
1739
- case LIBUSB_TRANSFER_TYPE_INTERRUPT:
1740
- case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
1741
- return darwin_abort_transfers (itransfer);
1742
- default:
1743
- usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type);
1744
- return LIBUSB_ERROR_INVALID_PARAM;
1745
- }
1746
- }
1747
-
1748
- static void darwin_clear_transfer_priv (struct usbi_transfer *itransfer) {
1749
- struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
1750
- struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);
1751
-
1752
- if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS && tpriv->isoc_framelist) {
1753
- free (tpriv->isoc_framelist);
1754
- tpriv->isoc_framelist = NULL;
1755
- }
1756
- }
1757
-
1758
- static void darwin_async_io_callback (void *refcon, IOReturn result, void *arg0) {
1759
- struct usbi_transfer *itransfer = (struct usbi_transfer *)refcon;
1760
- struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
1761
- struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);
1762
-
1763
- usbi_dbg ("an async io operation has completed");
1764
-
1765
- /* if requested write a zero packet */
1766
- if (kIOReturnSuccess == result && IS_XFEROUT(transfer) && transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) {
1767
- struct darwin_interface *cInterface;
1768
- uint8_t pipeRef;
1769
-
1770
- (void) ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface);
1771
-
1772
- (*(cInterface->interface))->WritePipe (cInterface->interface, pipeRef, transfer->buffer, 0);
1773
- }
1774
-
1775
- tpriv->result = result;
1776
- tpriv->size = (UInt32) (uintptr_t) arg0;
1777
-
1778
- /* signal the core that this transfer is complete */
1779
- usbi_signal_transfer_completion(itransfer);
1780
- }
1781
-
1782
- static int darwin_transfer_status (struct usbi_transfer *itransfer, kern_return_t result) {
1783
- if (itransfer->flags & USBI_TRANSFER_TIMED_OUT)
1784
- result = kIOUSBTransactionTimeout;
1785
-
1786
- switch (result) {
1787
- case kIOReturnUnderrun:
1788
- case kIOReturnSuccess:
1789
- return LIBUSB_TRANSFER_COMPLETED;
1790
- case kIOReturnAborted:
1791
- return LIBUSB_TRANSFER_CANCELLED;
1792
- case kIOUSBPipeStalled:
1793
- usbi_dbg ("transfer error: pipe is stalled");
1794
- return LIBUSB_TRANSFER_STALL;
1795
- case kIOReturnOverrun:
1796
- usbi_warn (ITRANSFER_CTX (itransfer), "transfer error: data overrun");
1797
- return LIBUSB_TRANSFER_OVERFLOW;
1798
- case kIOUSBTransactionTimeout:
1799
- usbi_warn (ITRANSFER_CTX (itransfer), "transfer error: timed out");
1800
- itransfer->flags |= USBI_TRANSFER_TIMED_OUT;
1801
- return LIBUSB_TRANSFER_TIMED_OUT;
1802
- default:
1803
- usbi_warn (ITRANSFER_CTX (itransfer), "transfer error: %s (value = 0x%08x)", darwin_error_str (result), result);
1804
- return LIBUSB_TRANSFER_ERROR;
1805
- }
1806
- }
1807
-
1808
- static int darwin_handle_transfer_completion (struct usbi_transfer *itransfer) {
1809
- struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
1810
- struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);
1811
- int isIsoc = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS == transfer->type;
1812
- int isBulk = LIBUSB_TRANSFER_TYPE_BULK == transfer->type;
1813
- int isControl = LIBUSB_TRANSFER_TYPE_CONTROL == transfer->type;
1814
- int isInterrupt = LIBUSB_TRANSFER_TYPE_INTERRUPT == transfer->type;
1815
- int i;
1816
-
1817
- if (!isIsoc && !isBulk && !isControl && !isInterrupt) {
1818
- usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type);
1819
- return LIBUSB_ERROR_INVALID_PARAM;
1820
- }
1821
-
1822
- usbi_dbg ("handling %s completion with kernel status %d",
1823
- isControl ? "control" : isBulk ? "bulk" : isIsoc ? "isoc" : "interrupt", tpriv->result);
1824
-
1825
- if (kIOReturnSuccess == tpriv->result || kIOReturnUnderrun == tpriv->result) {
1826
- if (isIsoc && tpriv->isoc_framelist) {
1827
- /* copy isochronous results back */
1828
-
1829
- for (i = 0; i < transfer->num_iso_packets ; i++) {
1830
- struct libusb_iso_packet_descriptor *lib_desc = &transfer->iso_packet_desc[i];
1831
- lib_desc->status = darwin_to_libusb (tpriv->isoc_framelist[i].frStatus);
1832
- lib_desc->actual_length = tpriv->isoc_framelist[i].frActCount;
1833
- }
1834
- } else if (!isIsoc)
1835
- itransfer->transferred += tpriv->size;
1836
- }
1837
-
1838
- /* it is ok to handle cancelled transfers without calling usbi_handle_transfer_cancellation (we catch timeout transfers) */
1839
- return usbi_handle_transfer_completion (itransfer, darwin_transfer_status (itransfer, tpriv->result));
1840
- }
1841
-
1842
- static int darwin_clock_gettime(int clk_id, struct timespec *tp) {
1843
- mach_timespec_t sys_time;
1844
- clock_serv_t clock_ref;
1845
-
1846
- switch (clk_id) {
1847
- case USBI_CLOCK_REALTIME:
1848
- /* CLOCK_REALTIME represents time since the epoch */
1849
- clock_ref = clock_realtime;
1850
- break;
1851
- case USBI_CLOCK_MONOTONIC:
1852
- /* use system boot time as reference for the monotonic clock */
1853
- clock_ref = clock_monotonic;
1854
- break;
1855
- default:
1856
- return LIBUSB_ERROR_INVALID_PARAM;
1857
- }
1858
-
1859
- clock_get_time (clock_ref, &sys_time);
1860
-
1861
- tp->tv_sec = sys_time.tv_sec;
1862
- tp->tv_nsec = sys_time.tv_nsec;
1863
-
1864
- return 0;
1865
- }
1866
-
1867
- #if InterfaceVersion >= 550
1868
- static int darwin_alloc_streams (struct libusb_device_handle *dev_handle, uint32_t num_streams, unsigned char *endpoints,
1869
- int num_endpoints) {
1870
- struct darwin_interface *cInterface;
1871
- UInt32 supportsStreams;
1872
- uint8_t pipeRef;
1873
- int rc, i;
1874
-
1875
- /* find the mimimum number of supported streams on the endpoint list */
1876
- for (i = 0 ; i < num_endpoints ; ++i) {
1877
- if (0 != (rc = ep_to_pipeRef (dev_handle, endpoints[i], &pipeRef, NULL, &cInterface))) {
1878
- return rc;
1879
- }
1880
-
1881
- (*(cInterface->interface))->SupportsStreams (cInterface->interface, pipeRef, &supportsStreams);
1882
- if (num_streams > supportsStreams)
1883
- num_streams = supportsStreams;
1884
- }
1885
-
1886
- /* it is an error if any endpoint in endpoints does not support streams */
1887
- if (0 == num_streams)
1888
- return LIBUSB_ERROR_INVALID_PARAM;
1889
-
1890
- /* create the streams */
1891
- for (i = 0 ; i < num_endpoints ; ++i) {
1892
- (void) ep_to_pipeRef (dev_handle, endpoints[i], &pipeRef, NULL, &cInterface);
1893
-
1894
- rc = (*(cInterface->interface))->CreateStreams (cInterface->interface, pipeRef, num_streams);
1895
- if (kIOReturnSuccess != rc)
1896
- return darwin_to_libusb(rc);
1897
- }
1898
-
1899
- return num_streams;
1900
- }
1901
-
1902
- static int darwin_free_streams (struct libusb_device_handle *dev_handle, unsigned char *endpoints, int num_endpoints) {
1903
- struct darwin_interface *cInterface;
1904
- UInt32 supportsStreams;
1905
- uint8_t pipeRef;
1906
- int rc;
1907
-
1908
- for (int i = 0 ; i < num_endpoints ; ++i) {
1909
- if (0 != (rc = ep_to_pipeRef (dev_handle, endpoints[i], &pipeRef, NULL, &cInterface)))
1910
- return rc;
1911
-
1912
- (*(cInterface->interface))->SupportsStreams (cInterface->interface, pipeRef, &supportsStreams);
1913
- if (0 == supportsStreams)
1914
- return LIBUSB_ERROR_INVALID_PARAM;
1915
-
1916
- rc = (*(cInterface->interface))->CreateStreams (cInterface->interface, pipeRef, 0);
1917
- if (kIOReturnSuccess != rc)
1918
- return darwin_to_libusb(rc);
1919
- }
1920
-
1921
- return LIBUSB_SUCCESS;
1922
- }
1923
- #endif
1924
-
1925
- const struct usbi_os_backend darwin_backend = {
1926
- .name = "Darwin",
1927
- .caps = 0,
1928
- .init = darwin_init,
1929
- .exit = darwin_exit,
1930
- .get_device_list = NULL, /* not needed */
1931
- .get_device_descriptor = darwin_get_device_descriptor,
1932
- .get_active_config_descriptor = darwin_get_active_config_descriptor,
1933
- .get_config_descriptor = darwin_get_config_descriptor,
1934
- .hotplug_poll = darwin_hotplug_poll,
1935
-
1936
- .open = darwin_open,
1937
- .close = darwin_close,
1938
- .get_configuration = darwin_get_configuration,
1939
- .set_configuration = darwin_set_configuration,
1940
- .claim_interface = darwin_claim_interface,
1941
- .release_interface = darwin_release_interface,
1942
-
1943
- .set_interface_altsetting = darwin_set_interface_altsetting,
1944
- .clear_halt = darwin_clear_halt,
1945
- .reset_device = darwin_reset_device,
1946
-
1947
- #if InterfaceVersion >= 550
1948
- .alloc_streams = darwin_alloc_streams,
1949
- .free_streams = darwin_free_streams,
1950
- #endif
1951
-
1952
- .kernel_driver_active = darwin_kernel_driver_active,
1953
- .detach_kernel_driver = darwin_detach_kernel_driver,
1954
- .attach_kernel_driver = darwin_attach_kernel_driver,
1955
-
1956
- .destroy_device = darwin_destroy_device,
1957
-
1958
- .submit_transfer = darwin_submit_transfer,
1959
- .cancel_transfer = darwin_cancel_transfer,
1960
- .clear_transfer_priv = darwin_clear_transfer_priv,
1961
-
1962
- .handle_transfer_completion = darwin_handle_transfer_completion,
1963
-
1964
- .clock_gettime = darwin_clock_gettime,
1965
-
1966
- .device_priv_size = sizeof(struct darwin_device_priv),
1967
- .device_handle_priv_size = sizeof(struct darwin_device_handle_priv),
1968
- .transfer_priv_size = sizeof(struct darwin_transfer_priv),
1969
- };