libusb 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +8 -0
- data/.travis.yml +10 -0
- data/.yardopts +6 -1
- data/Gemfile +16 -0
- data/{History.txt → History.md} +28 -16
- data/README.md +144 -0
- data/Rakefile +28 -24
- data/ext/extconf.rb +33 -0
- data/ext/libusbx-1.0.14/AUTHORS +50 -0
- data/ext/libusbx-1.0.14/COPYING +504 -0
- data/ext/libusbx-1.0.14/ChangeLog +139 -0
- data/ext/libusbx-1.0.14/INSTALL +234 -0
- data/ext/libusbx-1.0.14/Makefile.am +23 -0
- data/ext/libusbx-1.0.14/Makefile.in +803 -0
- data/ext/libusbx-1.0.14/NEWS +2 -0
- data/ext/libusbx-1.0.14/PORTING +94 -0
- data/ext/libusbx-1.0.14/README +28 -0
- data/ext/libusbx-1.0.14/THANKS +7 -0
- data/ext/libusbx-1.0.14/TODO +2 -0
- data/ext/libusbx-1.0.14/aclocal.m4 +9480 -0
- data/ext/libusbx-1.0.14/compile +143 -0
- data/ext/libusbx-1.0.14/config.guess +1501 -0
- data/ext/libusbx-1.0.14/config.h.in +116 -0
- data/ext/libusbx-1.0.14/config.sub +1705 -0
- data/ext/libusbx-1.0.14/configure +14818 -0
- data/ext/libusbx-1.0.14/configure.ac +230 -0
- data/ext/libusbx-1.0.14/depcomp +630 -0
- data/ext/libusbx-1.0.14/doc/Makefile.am +9 -0
- data/ext/libusbx-1.0.14/doc/Makefile.in +380 -0
- data/ext/libusbx-1.0.14/doc/doxygen.cfg.in +1288 -0
- data/ext/libusbx-1.0.14/examples/Makefile.am +18 -0
- data/ext/libusbx-1.0.14/examples/Makefile.in +596 -0
- data/ext/libusbx-1.0.14/examples/dpfp.c +506 -0
- data/ext/libusbx-1.0.14/examples/dpfp_threaded.c +544 -0
- data/ext/libusbx-1.0.14/examples/ezusb.c +616 -0
- data/ext/libusbx-1.0.14/examples/ezusb.h +107 -0
- data/ext/libusbx-1.0.14/examples/fxload.c +261 -0
- data/ext/libusbx-1.0.14/examples/getopt/getopt.c +1060 -0
- data/ext/libusbx-1.0.14/examples/getopt/getopt.h +180 -0
- data/ext/libusbx-1.0.14/examples/getopt/getopt1.c +188 -0
- data/ext/libusbx-1.0.14/examples/listdevs.c +63 -0
- data/ext/libusbx-1.0.14/examples/xusb.c +1036 -0
- data/ext/libusbx-1.0.14/install-sh +520 -0
- data/ext/libusbx-1.0.14/libusb-1.0.pc.in +11 -0
- data/ext/libusbx-1.0.14/libusb/Makefile.am +56 -0
- data/ext/libusbx-1.0.14/libusb/Makefile.in +721 -0
- data/ext/libusbx-1.0.14/libusb/core.c +1951 -0
- data/ext/libusbx-1.0.14/libusb/descriptor.c +731 -0
- data/ext/libusbx-1.0.14/libusb/io.c +2450 -0
- data/ext/libusbx-1.0.14/libusb/libusb-1.0.def +126 -0
- data/ext/libusbx-1.0.14/libusb/libusb-1.0.rc +59 -0
- data/ext/libusbx-1.0.14/libusb/libusb.h +1506 -0
- data/ext/libusbx-1.0.14/libusb/libusbi.h +910 -0
- data/ext/libusbx-1.0.14/libusb/os/darwin_usb.c +1807 -0
- data/ext/libusbx-1.0.14/libusb/os/darwin_usb.h +169 -0
- data/ext/libusbx-1.0.14/libusb/os/linux_usbfs.c +2569 -0
- data/ext/libusbx-1.0.14/libusb/os/linux_usbfs.h +149 -0
- data/ext/libusbx-1.0.14/libusb/os/openbsd_usb.c +727 -0
- data/ext/libusbx-1.0.14/libusb/os/poll_posix.h +10 -0
- data/ext/libusbx-1.0.14/libusb/os/poll_windows.c +747 -0
- data/ext/libusbx-1.0.14/libusb/os/poll_windows.h +114 -0
- data/ext/libusbx-1.0.14/libusb/os/threads_posix.c +80 -0
- data/ext/libusbx-1.0.14/libusb/os/threads_posix.h +50 -0
- data/ext/libusbx-1.0.14/libusb/os/threads_windows.c +211 -0
- data/ext/libusbx-1.0.14/libusb/os/threads_windows.h +87 -0
- data/ext/libusbx-1.0.14/libusb/os/windows_usb.c +4369 -0
- data/ext/libusbx-1.0.14/libusb/os/windows_usb.h +979 -0
- data/ext/libusbx-1.0.14/libusb/sync.c +321 -0
- data/ext/libusbx-1.0.14/libusb/version.h +18 -0
- data/ext/libusbx-1.0.14/libusb/version_nano.h +1 -0
- data/ext/libusbx-1.0.14/ltmain.sh +9636 -0
- data/ext/libusbx-1.0.14/missing +376 -0
- data/lib/libusb.rb +2 -3
- data/lib/libusb/call.rb +49 -7
- data/lib/libusb/compat.rb +15 -9
- data/lib/libusb/configuration.rb +15 -3
- data/lib/libusb/constants.rb +19 -6
- data/lib/libusb/context.rb +181 -3
- data/lib/libusb/dev_handle.rb +91 -40
- data/lib/libusb/endpoint.rb +41 -14
- data/lib/libusb/eventmachine.rb +183 -0
- data/lib/libusb/transfer.rb +21 -8
- data/lib/libusb/version_gem.rb +19 -0
- data/lib/libusb/{version.rb → version_struct.rb} +0 -0
- data/libusb.gemspec +31 -0
- data/test/test_libusb_compat.rb +1 -1
- data/test/test_libusb_compat_mass_storage.rb +2 -2
- data/test/test_libusb_descriptors.rb +1 -1
- data/test/test_libusb_event_machine.rb +118 -0
- data/test/test_libusb_iso_transfer.rb +6 -1
- data/test/test_libusb_mass_storage.rb +9 -3
- data/test/test_libusb_mass_storage2.rb +1 -1
- data/test/test_libusb_structs.rb +45 -0
- data/test/test_libusb_threads.rb +89 -0
- data/test/test_libusb_version.rb +4 -0
- metadata +109 -44
- data/.autotest +0 -23
- data/.gemtest +0 -0
- data/Manifest.txt +0 -3
- data/README.rdoc +0 -115
- data/test/test_libusb_keyboard.rb +0 -50
@@ -0,0 +1,910 @@
|
|
1
|
+
/*
|
2
|
+
* Internal header for libusbx
|
3
|
+
* Copyright © 2007-2009 Daniel Drake <dsd@gentoo.org>
|
4
|
+
* Copyright © 2001 Johannes Erdfelt <johannes@erdfelt.com>
|
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
|
+
#ifndef LIBUSBI_H
|
22
|
+
#define LIBUSBI_H
|
23
|
+
|
24
|
+
#include <config.h>
|
25
|
+
|
26
|
+
#include <stddef.h>
|
27
|
+
#include <stdint.h>
|
28
|
+
#include <time.h>
|
29
|
+
#include <stdarg.h>
|
30
|
+
#ifdef HAVE_POLL_H
|
31
|
+
#include <poll.h>
|
32
|
+
#endif
|
33
|
+
|
34
|
+
#include <libusb.h>
|
35
|
+
#include "version.h"
|
36
|
+
|
37
|
+
/* Inside the libusbx code, mark all public functions as follows:
|
38
|
+
* return_type API_EXPORTED function_name(params) { ... }
|
39
|
+
* But if the function returns a pointer, mark it as follows:
|
40
|
+
* DEFAULT_VISIBILITY return_type * LIBUSB_CALL function_name(params) { ... }
|
41
|
+
* In the libusbx public header, mark all declarations as:
|
42
|
+
* return_type LIBUSB_CALL function_name(params);
|
43
|
+
*/
|
44
|
+
#define API_EXPORTED LIBUSB_CALL DEFAULT_VISIBILITY
|
45
|
+
|
46
|
+
#define DEVICE_DESC_LENGTH 18
|
47
|
+
|
48
|
+
#define USB_MAXENDPOINTS 32
|
49
|
+
#define USB_MAXINTERFACES 32
|
50
|
+
#define USB_MAXCONFIG 8
|
51
|
+
|
52
|
+
/* The following is used to silence warnings for unused variables */
|
53
|
+
#define UNUSED(var) (void)(var)
|
54
|
+
|
55
|
+
struct list_head {
|
56
|
+
struct list_head *prev, *next;
|
57
|
+
};
|
58
|
+
|
59
|
+
/* Get an entry from the list
|
60
|
+
* ptr - the address of this list_head element in "type"
|
61
|
+
* type - the data type that contains "member"
|
62
|
+
* member - the list_head element in "type"
|
63
|
+
*/
|
64
|
+
#define list_entry(ptr, type, member) \
|
65
|
+
((type *)((uintptr_t)(ptr) - (uintptr_t)(&((type *)0L)->member)))
|
66
|
+
|
67
|
+
/* Get each entry from a list
|
68
|
+
* pos - A structure pointer has a "member" element
|
69
|
+
* head - list head
|
70
|
+
* member - the list_head element in "pos"
|
71
|
+
* type - the type of the first parameter
|
72
|
+
*/
|
73
|
+
#define list_for_each_entry(pos, head, member, type) \
|
74
|
+
for (pos = list_entry((head)->next, type, member); \
|
75
|
+
&pos->member != (head); \
|
76
|
+
pos = list_entry(pos->member.next, type, member))
|
77
|
+
|
78
|
+
#define list_for_each_entry_safe(pos, n, head, member, type) \
|
79
|
+
for (pos = list_entry((head)->next, type, member), \
|
80
|
+
n = list_entry(pos->member.next, type, member); \
|
81
|
+
&pos->member != (head); \
|
82
|
+
pos = n, n = list_entry(n->member.next, type, member))
|
83
|
+
|
84
|
+
#define list_empty(entry) ((entry)->next == (entry))
|
85
|
+
|
86
|
+
static inline void list_init(struct list_head *entry)
|
87
|
+
{
|
88
|
+
entry->prev = entry->next = entry;
|
89
|
+
}
|
90
|
+
|
91
|
+
static inline void list_add(struct list_head *entry, struct list_head *head)
|
92
|
+
{
|
93
|
+
entry->next = head->next;
|
94
|
+
entry->prev = head;
|
95
|
+
|
96
|
+
head->next->prev = entry;
|
97
|
+
head->next = entry;
|
98
|
+
}
|
99
|
+
|
100
|
+
static inline void list_add_tail(struct list_head *entry,
|
101
|
+
struct list_head *head)
|
102
|
+
{
|
103
|
+
entry->next = head;
|
104
|
+
entry->prev = head->prev;
|
105
|
+
|
106
|
+
head->prev->next = entry;
|
107
|
+
head->prev = entry;
|
108
|
+
}
|
109
|
+
|
110
|
+
static inline void list_del(struct list_head *entry)
|
111
|
+
{
|
112
|
+
entry->next->prev = entry->prev;
|
113
|
+
entry->prev->next = entry->next;
|
114
|
+
entry->next = entry->prev = NULL;
|
115
|
+
}
|
116
|
+
|
117
|
+
static inline void *usbi_reallocf(void *ptr, size_t size)
|
118
|
+
{
|
119
|
+
void *ret = realloc(ptr, size);
|
120
|
+
if (!ret)
|
121
|
+
free(ptr);
|
122
|
+
return ret;
|
123
|
+
}
|
124
|
+
|
125
|
+
#define container_of(ptr, type, member) ({ \
|
126
|
+
const typeof( ((type *)0)->member ) *mptr = (ptr); \
|
127
|
+
(type *)( (char *)mptr - offsetof(type,member) );})
|
128
|
+
|
129
|
+
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
130
|
+
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
131
|
+
|
132
|
+
#define TIMESPEC_IS_SET(ts) ((ts)->tv_sec != 0 || (ts)->tv_nsec != 0)
|
133
|
+
|
134
|
+
void usbi_log(struct libusb_context *ctx, enum libusb_log_level level,
|
135
|
+
const char *function, const char *format, ...);
|
136
|
+
|
137
|
+
void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level,
|
138
|
+
const char *function, const char *format, va_list args);
|
139
|
+
|
140
|
+
#if !defined(_MSC_VER) || _MSC_VER >= 1400
|
141
|
+
|
142
|
+
#ifdef ENABLE_LOGGING
|
143
|
+
#define _usbi_log(ctx, level, ...) usbi_log(ctx, level, __FUNCTION__, __VA_ARGS__)
|
144
|
+
#define usbi_dbg(...) _usbi_log(NULL, LIBUSB_LOG_LEVEL_DEBUG, __VA_ARGS__)
|
145
|
+
#else
|
146
|
+
#define _usbi_log(ctx, level, ...) do { (void)(ctx); } while(0)
|
147
|
+
#define usbi_dbg(...) do {} while(0)
|
148
|
+
#endif
|
149
|
+
|
150
|
+
#define usbi_info(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_INFO, __VA_ARGS__)
|
151
|
+
#define usbi_warn(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_WARNING, __VA_ARGS__)
|
152
|
+
#define usbi_err(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_ERROR, __VA_ARGS__)
|
153
|
+
|
154
|
+
#else /* !defined(_MSC_VER) || _MSC_VER >= 1400 */
|
155
|
+
|
156
|
+
#ifdef ENABLE_LOGGING
|
157
|
+
#define LOG_BODY(ctxt, level) \
|
158
|
+
{ \
|
159
|
+
va_list args; \
|
160
|
+
va_start (args, format); \
|
161
|
+
usbi_log_v(ctxt, level, "", format, args); \
|
162
|
+
va_end(args); \
|
163
|
+
}
|
164
|
+
#else
|
165
|
+
#define LOG_BODY(ctxt, level) do { (void)(ctxt); } while(0)
|
166
|
+
#endif
|
167
|
+
|
168
|
+
static inline void usbi_info(struct libusb_context *ctx, const char *format,
|
169
|
+
...)
|
170
|
+
LOG_BODY(ctx,LIBUSB_LOG_LEVEL_INFO)
|
171
|
+
static inline void usbi_warn(struct libusb_context *ctx, const char *format,
|
172
|
+
...)
|
173
|
+
LOG_BODY(ctx,LIBUSB_LOG_LEVEL_WARNING)
|
174
|
+
static inline void usbi_err( struct libusb_context *ctx, const char *format,
|
175
|
+
...)
|
176
|
+
LOG_BODY(ctx,LIBUSB_LOG_LEVEL_ERROR)
|
177
|
+
|
178
|
+
static inline void usbi_dbg(const char *format, ...)
|
179
|
+
LOG_BODY(NULL,LIBUSB_LOG_LEVEL_DEBUG)
|
180
|
+
|
181
|
+
#endif /* !defined(_MSC_VER) || _MSC_VER >= 1400 */
|
182
|
+
|
183
|
+
#define USBI_GET_CONTEXT(ctx) if (!(ctx)) (ctx) = usbi_default_context
|
184
|
+
#define DEVICE_CTX(dev) ((dev)->ctx)
|
185
|
+
#define HANDLE_CTX(handle) (DEVICE_CTX((handle)->dev))
|
186
|
+
#define TRANSFER_CTX(transfer) (HANDLE_CTX((transfer)->dev_handle))
|
187
|
+
#define ITRANSFER_CTX(transfer) \
|
188
|
+
(TRANSFER_CTX(USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)))
|
189
|
+
|
190
|
+
#define IS_EPIN(ep) (0 != ((ep) & LIBUSB_ENDPOINT_IN))
|
191
|
+
#define IS_EPOUT(ep) (!IS_EPIN(ep))
|
192
|
+
#define IS_XFERIN(xfer) (0 != ((xfer)->endpoint & LIBUSB_ENDPOINT_IN))
|
193
|
+
#define IS_XFEROUT(xfer) (!IS_XFERIN(xfer))
|
194
|
+
|
195
|
+
/* Internal abstractions for thread synchronization and poll */
|
196
|
+
#if defined(THREADS_POSIX)
|
197
|
+
#include <os/threads_posix.h>
|
198
|
+
#elif defined(OS_WINDOWS)
|
199
|
+
#include <os/threads_windows.h>
|
200
|
+
#endif
|
201
|
+
|
202
|
+
#if defined(OS_LINUX) || defined(OS_DARWIN) || defined(OS_OPENBSD)
|
203
|
+
#include <unistd.h>
|
204
|
+
#include <os/poll_posix.h>
|
205
|
+
#elif defined(OS_WINDOWS)
|
206
|
+
#include <os/poll_windows.h>
|
207
|
+
#endif
|
208
|
+
|
209
|
+
#if defined(OS_WINDOWS) && !defined(__GCC__)
|
210
|
+
#undef HAVE_GETTIMEOFDAY
|
211
|
+
int usbi_gettimeofday(struct timeval *tp, void *tzp);
|
212
|
+
#define LIBUSB_GETTIMEOFDAY_WIN32
|
213
|
+
#define HAVE_USBI_GETTIMEOFDAY
|
214
|
+
#else
|
215
|
+
#ifdef HAVE_GETTIMEOFDAY
|
216
|
+
#define usbi_gettimeofday(tv, tz) gettimeofday((tv), (tz))
|
217
|
+
#define HAVE_USBI_GETTIMEOFDAY
|
218
|
+
#endif
|
219
|
+
#endif
|
220
|
+
|
221
|
+
extern struct libusb_context *usbi_default_context;
|
222
|
+
|
223
|
+
struct libusb_context {
|
224
|
+
int debug;
|
225
|
+
int debug_fixed;
|
226
|
+
|
227
|
+
/* internal control pipe, used for interrupting event handling when
|
228
|
+
* something needs to modify poll fds. */
|
229
|
+
int ctrl_pipe[2];
|
230
|
+
|
231
|
+
struct list_head usb_devs;
|
232
|
+
usbi_mutex_t usb_devs_lock;
|
233
|
+
|
234
|
+
/* A list of open handles. Backends are free to traverse this if required.
|
235
|
+
*/
|
236
|
+
struct list_head open_devs;
|
237
|
+
usbi_mutex_t open_devs_lock;
|
238
|
+
|
239
|
+
/* this is a list of in-flight transfer handles, sorted by timeout
|
240
|
+
* expiration. URBs to timeout the soonest are placed at the beginning of
|
241
|
+
* the list, URBs that will time out later are placed after, and urbs with
|
242
|
+
* infinite timeout are always placed at the very end. */
|
243
|
+
struct list_head flying_transfers;
|
244
|
+
usbi_mutex_t flying_transfers_lock;
|
245
|
+
|
246
|
+
/* list of poll fds */
|
247
|
+
struct list_head pollfds;
|
248
|
+
usbi_mutex_t pollfds_lock;
|
249
|
+
|
250
|
+
/* a counter that is set when we want to interrupt event handling, in order
|
251
|
+
* to modify the poll fd set. and a lock to protect it. */
|
252
|
+
unsigned int pollfd_modify;
|
253
|
+
usbi_mutex_t pollfd_modify_lock;
|
254
|
+
|
255
|
+
/* user callbacks for pollfd changes */
|
256
|
+
libusb_pollfd_added_cb fd_added_cb;
|
257
|
+
libusb_pollfd_removed_cb fd_removed_cb;
|
258
|
+
void *fd_cb_user_data;
|
259
|
+
|
260
|
+
/* ensures that only one thread is handling events at any one time */
|
261
|
+
usbi_mutex_t events_lock;
|
262
|
+
|
263
|
+
/* used to see if there is an active thread doing event handling */
|
264
|
+
int event_handler_active;
|
265
|
+
|
266
|
+
/* used to wait for event completion in threads other than the one that is
|
267
|
+
* event handling */
|
268
|
+
usbi_mutex_t event_waiters_lock;
|
269
|
+
usbi_cond_t event_waiters_cond;
|
270
|
+
|
271
|
+
#ifdef USBI_TIMERFD_AVAILABLE
|
272
|
+
/* used for timeout handling, if supported by OS.
|
273
|
+
* this timerfd is maintained to trigger on the next pending timeout */
|
274
|
+
int timerfd;
|
275
|
+
#endif
|
276
|
+
};
|
277
|
+
|
278
|
+
#ifdef USBI_TIMERFD_AVAILABLE
|
279
|
+
#define usbi_using_timerfd(ctx) ((ctx)->timerfd >= 0)
|
280
|
+
#else
|
281
|
+
#define usbi_using_timerfd(ctx) (0)
|
282
|
+
#endif
|
283
|
+
|
284
|
+
struct libusb_device {
|
285
|
+
/* lock protects refcnt, everything else is finalized at initialization
|
286
|
+
* time */
|
287
|
+
usbi_mutex_t lock;
|
288
|
+
int refcnt;
|
289
|
+
|
290
|
+
struct libusb_context *ctx;
|
291
|
+
|
292
|
+
uint8_t bus_number;
|
293
|
+
uint8_t port_number;
|
294
|
+
struct libusb_device* parent_dev;
|
295
|
+
uint8_t device_address;
|
296
|
+
uint8_t num_configurations;
|
297
|
+
enum libusb_speed speed;
|
298
|
+
|
299
|
+
struct list_head list;
|
300
|
+
unsigned long session_data;
|
301
|
+
unsigned char os_priv[0];
|
302
|
+
};
|
303
|
+
|
304
|
+
struct libusb_device_handle {
|
305
|
+
/* lock protects claimed_interfaces */
|
306
|
+
usbi_mutex_t lock;
|
307
|
+
unsigned long claimed_interfaces;
|
308
|
+
|
309
|
+
struct list_head list;
|
310
|
+
struct libusb_device *dev;
|
311
|
+
unsigned char os_priv[0];
|
312
|
+
};
|
313
|
+
|
314
|
+
enum {
|
315
|
+
USBI_CLOCK_MONOTONIC,
|
316
|
+
USBI_CLOCK_REALTIME
|
317
|
+
};
|
318
|
+
|
319
|
+
/* in-memory transfer layout:
|
320
|
+
*
|
321
|
+
* 1. struct usbi_transfer
|
322
|
+
* 2. struct libusb_transfer (which includes iso packets) [variable size]
|
323
|
+
* 3. os private data [variable size]
|
324
|
+
*
|
325
|
+
* from a libusb_transfer, you can get the usbi_transfer by rewinding the
|
326
|
+
* appropriate number of bytes.
|
327
|
+
* the usbi_transfer includes the number of allocated packets, so you can
|
328
|
+
* determine the size of the transfer and hence the start and length of the
|
329
|
+
* OS-private data.
|
330
|
+
*/
|
331
|
+
|
332
|
+
struct usbi_transfer {
|
333
|
+
int num_iso_packets;
|
334
|
+
struct list_head list;
|
335
|
+
struct timeval timeout;
|
336
|
+
int transferred;
|
337
|
+
uint8_t flags;
|
338
|
+
|
339
|
+
/* this lock is held during libusb_submit_transfer() and
|
340
|
+
* libusb_cancel_transfer() (allowing the OS backend to prevent duplicate
|
341
|
+
* cancellation, submission-during-cancellation, etc). the OS backend
|
342
|
+
* should also take this lock in the handle_events path, to prevent the user
|
343
|
+
* cancelling the transfer from another thread while you are processing
|
344
|
+
* its completion (presumably there would be races within your OS backend
|
345
|
+
* if this were possible). */
|
346
|
+
usbi_mutex_t lock;
|
347
|
+
};
|
348
|
+
|
349
|
+
enum usbi_transfer_flags {
|
350
|
+
/* The transfer has timed out */
|
351
|
+
USBI_TRANSFER_TIMED_OUT = 1 << 0,
|
352
|
+
|
353
|
+
/* Set by backend submit_transfer() if the OS handles timeout */
|
354
|
+
USBI_TRANSFER_OS_HANDLES_TIMEOUT = 1 << 1,
|
355
|
+
|
356
|
+
/* Cancellation was requested via libusb_cancel_transfer() */
|
357
|
+
USBI_TRANSFER_CANCELLING = 1 << 2,
|
358
|
+
|
359
|
+
/* Operation on the transfer failed because the device disappeared */
|
360
|
+
USBI_TRANSFER_DEVICE_DISAPPEARED = 1 << 3,
|
361
|
+
|
362
|
+
/* Set by backend submit_transfer() if the fds in use have been updated */
|
363
|
+
USBI_TRANSFER_UPDATED_FDS = 1 << 4,
|
364
|
+
};
|
365
|
+
|
366
|
+
#define USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer) \
|
367
|
+
((struct libusb_transfer *)(((unsigned char *)(transfer)) \
|
368
|
+
+ sizeof(struct usbi_transfer)))
|
369
|
+
#define LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer) \
|
370
|
+
((struct usbi_transfer *)(((unsigned char *)(transfer)) \
|
371
|
+
- sizeof(struct usbi_transfer)))
|
372
|
+
|
373
|
+
static inline void *usbi_transfer_get_os_priv(struct usbi_transfer *transfer)
|
374
|
+
{
|
375
|
+
return ((unsigned char *)transfer) + sizeof(struct usbi_transfer)
|
376
|
+
+ sizeof(struct libusb_transfer)
|
377
|
+
+ (transfer->num_iso_packets
|
378
|
+
* sizeof(struct libusb_iso_packet_descriptor));
|
379
|
+
}
|
380
|
+
|
381
|
+
/* bus structures */
|
382
|
+
|
383
|
+
/* All standard descriptors have these 2 fields in common */
|
384
|
+
struct usb_descriptor_header {
|
385
|
+
uint8_t bLength;
|
386
|
+
uint8_t bDescriptorType;
|
387
|
+
};
|
388
|
+
|
389
|
+
/* shared data and functions */
|
390
|
+
|
391
|
+
int usbi_io_init(struct libusb_context *ctx);
|
392
|
+
void usbi_io_exit(struct libusb_context *ctx);
|
393
|
+
|
394
|
+
struct libusb_device *usbi_alloc_device(struct libusb_context *ctx,
|
395
|
+
unsigned long session_id);
|
396
|
+
struct libusb_device *usbi_get_device_by_session_id(struct libusb_context *ctx,
|
397
|
+
unsigned long session_id);
|
398
|
+
int usbi_sanitize_device(struct libusb_device *dev);
|
399
|
+
void usbi_handle_disconnect(struct libusb_device_handle *handle);
|
400
|
+
|
401
|
+
int usbi_handle_transfer_completion(struct usbi_transfer *itransfer,
|
402
|
+
enum libusb_transfer_status status);
|
403
|
+
int usbi_handle_transfer_cancellation(struct usbi_transfer *transfer);
|
404
|
+
|
405
|
+
int usbi_parse_descriptor(unsigned char *source, const char *descriptor,
|
406
|
+
void *dest, int host_endian);
|
407
|
+
int usbi_get_config_index_by_value(struct libusb_device *dev,
|
408
|
+
uint8_t bConfigurationValue, int *idx);
|
409
|
+
|
410
|
+
/* polling */
|
411
|
+
|
412
|
+
struct usbi_pollfd {
|
413
|
+
/* must come first */
|
414
|
+
struct libusb_pollfd pollfd;
|
415
|
+
|
416
|
+
struct list_head list;
|
417
|
+
};
|
418
|
+
|
419
|
+
int usbi_add_pollfd(struct libusb_context *ctx, int fd, short events);
|
420
|
+
void usbi_remove_pollfd(struct libusb_context *ctx, int fd);
|
421
|
+
void usbi_fd_notification(struct libusb_context *ctx);
|
422
|
+
|
423
|
+
/* device discovery */
|
424
|
+
|
425
|
+
/* we traverse usbfs without knowing how many devices we are going to find.
|
426
|
+
* so we create this discovered_devs model which is similar to a linked-list
|
427
|
+
* which grows when required. it can be freed once discovery has completed,
|
428
|
+
* eliminating the need for a list node in the libusb_device structure
|
429
|
+
* itself. */
|
430
|
+
struct discovered_devs {
|
431
|
+
size_t len;
|
432
|
+
size_t capacity;
|
433
|
+
struct libusb_device *devices[0];
|
434
|
+
};
|
435
|
+
|
436
|
+
struct discovered_devs *discovered_devs_append(
|
437
|
+
struct discovered_devs *discdevs, struct libusb_device *dev);
|
438
|
+
|
439
|
+
/* OS abstraction */
|
440
|
+
|
441
|
+
/* This is the interface that OS backends need to implement.
|
442
|
+
* All fields are mandatory, except ones explicitly noted as optional. */
|
443
|
+
struct usbi_os_backend {
|
444
|
+
/* A human-readable name for your backend, e.g. "Linux usbfs" */
|
445
|
+
const char *name;
|
446
|
+
|
447
|
+
/* Perform initialization of your backend. You might use this function
|
448
|
+
* to determine specific capabilities of the system, allocate required
|
449
|
+
* data structures for later, etc.
|
450
|
+
*
|
451
|
+
* This function is called when a libusbx user initializes the library
|
452
|
+
* prior to use.
|
453
|
+
*
|
454
|
+
* Return 0 on success, or a LIBUSB_ERROR code on failure.
|
455
|
+
*/
|
456
|
+
int (*init)(struct libusb_context *ctx);
|
457
|
+
|
458
|
+
/* Deinitialization. Optional. This function should destroy anything
|
459
|
+
* that was set up by init.
|
460
|
+
*
|
461
|
+
* This function is called when the user deinitializes the library.
|
462
|
+
*/
|
463
|
+
void (*exit)(void);
|
464
|
+
|
465
|
+
/* Enumerate all the USB devices on the system, returning them in a list
|
466
|
+
* of discovered devices.
|
467
|
+
*
|
468
|
+
* Your implementation should enumerate all devices on the system,
|
469
|
+
* regardless of whether they have been seen before or not.
|
470
|
+
*
|
471
|
+
* When you have found a device, compute a session ID for it. The session
|
472
|
+
* ID should uniquely represent that particular device for that particular
|
473
|
+
* connection session since boot (i.e. if you disconnect and reconnect a
|
474
|
+
* device immediately after, it should be assigned a different session ID).
|
475
|
+
* If your OS cannot provide a unique session ID as described above,
|
476
|
+
* presenting a session ID of (bus_number << 8 | device_address) should
|
477
|
+
* be sufficient. Bus numbers and device addresses wrap and get reused,
|
478
|
+
* but that is an unlikely case.
|
479
|
+
*
|
480
|
+
* After computing a session ID for a device, call
|
481
|
+
* usbi_get_device_by_session_id(). This function checks if libusbx already
|
482
|
+
* knows about the device, and if so, it provides you with a libusb_device
|
483
|
+
* structure for it.
|
484
|
+
*
|
485
|
+
* If usbi_get_device_by_session_id() returns NULL, it is time to allocate
|
486
|
+
* a new device structure for the device. Call usbi_alloc_device() to
|
487
|
+
* obtain a new libusb_device structure with reference count 1. Populate
|
488
|
+
* the bus_number and device_address attributes of the new device, and
|
489
|
+
* perform any other internal backend initialization you need to do. At
|
490
|
+
* this point, you should be ready to provide device descriptors and so
|
491
|
+
* on through the get_*_descriptor functions. Finally, call
|
492
|
+
* usbi_sanitize_device() to perform some final sanity checks on the
|
493
|
+
* device. Assuming all of the above succeeded, we can now continue.
|
494
|
+
* If any of the above failed, remember to unreference the device that
|
495
|
+
* was returned by usbi_alloc_device().
|
496
|
+
*
|
497
|
+
* At this stage we have a populated libusb_device structure (either one
|
498
|
+
* that was found earlier, or one that we have just allocated and
|
499
|
+
* populated). This can now be added to the discovered devices list
|
500
|
+
* using discovered_devs_append(). Note that discovered_devs_append()
|
501
|
+
* may reallocate the list, returning a new location for it, and also
|
502
|
+
* note that reallocation can fail. Your backend should handle these
|
503
|
+
* error conditions appropriately.
|
504
|
+
*
|
505
|
+
* This function should not generate any bus I/O and should not block.
|
506
|
+
* If I/O is required (e.g. reading the active configuration value), it is
|
507
|
+
* OK to ignore these suggestions :)
|
508
|
+
*
|
509
|
+
* This function is executed when the user wishes to retrieve a list
|
510
|
+
* of USB devices connected to the system.
|
511
|
+
*
|
512
|
+
* Return 0 on success, or a LIBUSB_ERROR code on failure.
|
513
|
+
*/
|
514
|
+
int (*get_device_list)(struct libusb_context *ctx,
|
515
|
+
struct discovered_devs **discdevs);
|
516
|
+
|
517
|
+
/* Open a device for I/O and other USB operations. The device handle
|
518
|
+
* is preallocated for you, you can retrieve the device in question
|
519
|
+
* through handle->dev.
|
520
|
+
*
|
521
|
+
* Your backend should allocate any internal resources required for I/O
|
522
|
+
* and other operations so that those operations can happen (hopefully)
|
523
|
+
* without hiccup. This is also a good place to inform libusbx that it
|
524
|
+
* should monitor certain file descriptors related to this device -
|
525
|
+
* see the usbi_add_pollfd() function.
|
526
|
+
*
|
527
|
+
* This function should not generate any bus I/O and should not block.
|
528
|
+
*
|
529
|
+
* This function is called when the user attempts to obtain a device
|
530
|
+
* handle for a device.
|
531
|
+
*
|
532
|
+
* Return:
|
533
|
+
* - 0 on success
|
534
|
+
* - LIBUSB_ERROR_ACCESS if the user has insufficient permissions
|
535
|
+
* - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since
|
536
|
+
* discovery
|
537
|
+
* - another LIBUSB_ERROR code on other failure
|
538
|
+
*
|
539
|
+
* Do not worry about freeing the handle on failed open, the upper layers
|
540
|
+
* do this for you.
|
541
|
+
*/
|
542
|
+
int (*open)(struct libusb_device_handle *handle);
|
543
|
+
|
544
|
+
/* Close a device such that the handle cannot be used again. Your backend
|
545
|
+
* should destroy any resources that were allocated in the open path.
|
546
|
+
* This may also be a good place to call usbi_remove_pollfd() to inform
|
547
|
+
* libusbx of any file descriptors associated with this device that should
|
548
|
+
* no longer be monitored.
|
549
|
+
*
|
550
|
+
* This function is called when the user closes a device handle.
|
551
|
+
*/
|
552
|
+
void (*close)(struct libusb_device_handle *handle);
|
553
|
+
|
554
|
+
/* Retrieve the device descriptor from a device.
|
555
|
+
*
|
556
|
+
* The descriptor should be retrieved from memory, NOT via bus I/O to the
|
557
|
+
* device. This means that you may have to cache it in a private structure
|
558
|
+
* during get_device_list enumeration. Alternatively, you may be able
|
559
|
+
* to retrieve it from a kernel interface (some Linux setups can do this)
|
560
|
+
* still without generating bus I/O.
|
561
|
+
*
|
562
|
+
* This function is expected to write DEVICE_DESC_LENGTH (18) bytes into
|
563
|
+
* buffer, which is guaranteed to be big enough.
|
564
|
+
*
|
565
|
+
* This function is called when sanity-checking a device before adding
|
566
|
+
* it to the list of discovered devices, and also when the user requests
|
567
|
+
* to read the device descriptor.
|
568
|
+
*
|
569
|
+
* This function is expected to return the descriptor in bus-endian format
|
570
|
+
* (LE). If it returns the multi-byte values in host-endian format,
|
571
|
+
* set the host_endian output parameter to "1".
|
572
|
+
*
|
573
|
+
* Return 0 on success or a LIBUSB_ERROR code on failure.
|
574
|
+
*/
|
575
|
+
int (*get_device_descriptor)(struct libusb_device *device,
|
576
|
+
unsigned char *buffer, int *host_endian);
|
577
|
+
|
578
|
+
/* Get the ACTIVE configuration descriptor for a device.
|
579
|
+
*
|
580
|
+
* The descriptor should be retrieved from memory, NOT via bus I/O to the
|
581
|
+
* device. This means that you may have to cache it in a private structure
|
582
|
+
* during get_device_list enumeration. You may also have to keep track
|
583
|
+
* of which configuration is active when the user changes it.
|
584
|
+
*
|
585
|
+
* This function is expected to write len bytes of data into buffer, which
|
586
|
+
* is guaranteed to be big enough. If you can only do a partial write,
|
587
|
+
* return an error code.
|
588
|
+
*
|
589
|
+
* This function is expected to return the descriptor in bus-endian format
|
590
|
+
* (LE). If it returns the multi-byte values in host-endian format,
|
591
|
+
* set the host_endian output parameter to "1".
|
592
|
+
*
|
593
|
+
* Return:
|
594
|
+
* - 0 on success
|
595
|
+
* - LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state
|
596
|
+
* - another LIBUSB_ERROR code on other failure
|
597
|
+
*/
|
598
|
+
int (*get_active_config_descriptor)(struct libusb_device *device,
|
599
|
+
unsigned char *buffer, size_t len, int *host_endian);
|
600
|
+
|
601
|
+
/* Get a specific configuration descriptor for a device.
|
602
|
+
*
|
603
|
+
* The descriptor should be retrieved from memory, NOT via bus I/O to the
|
604
|
+
* device. This means that you may have to cache it in a private structure
|
605
|
+
* during get_device_list enumeration.
|
606
|
+
*
|
607
|
+
* The requested descriptor is expressed as a zero-based index (i.e. 0
|
608
|
+
* indicates that we are requesting the first descriptor). The index does
|
609
|
+
* not (necessarily) equal the bConfigurationValue of the configuration
|
610
|
+
* being requested.
|
611
|
+
*
|
612
|
+
* This function is expected to write len bytes of data into buffer, which
|
613
|
+
* is guaranteed to be big enough. If you can only do a partial write,
|
614
|
+
* return an error code.
|
615
|
+
*
|
616
|
+
* This function is expected to return the descriptor in bus-endian format
|
617
|
+
* (LE). If it returns the multi-byte values in host-endian format,
|
618
|
+
* set the host_endian output parameter to "1".
|
619
|
+
*
|
620
|
+
* Return 0 on success or a LIBUSB_ERROR code on failure.
|
621
|
+
*/
|
622
|
+
int (*get_config_descriptor)(struct libusb_device *device,
|
623
|
+
uint8_t config_index, unsigned char *buffer, size_t len,
|
624
|
+
int *host_endian);
|
625
|
+
|
626
|
+
/* Get the bConfigurationValue for the active configuration for a device.
|
627
|
+
* Optional. This should only be implemented if you can retrieve it from
|
628
|
+
* cache (don't generate I/O).
|
629
|
+
*
|
630
|
+
* If you cannot retrieve this from cache, either do not implement this
|
631
|
+
* function, or return LIBUSB_ERROR_NOT_SUPPORTED. This will cause
|
632
|
+
* libusbx to retrieve the information through a standard control transfer.
|
633
|
+
*
|
634
|
+
* This function must be non-blocking.
|
635
|
+
* Return:
|
636
|
+
* - 0 on success
|
637
|
+
* - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it
|
638
|
+
* was opened
|
639
|
+
* - LIBUSB_ERROR_NOT_SUPPORTED if the value cannot be retrieved without
|
640
|
+
* blocking
|
641
|
+
* - another LIBUSB_ERROR code on other failure.
|
642
|
+
*/
|
643
|
+
int (*get_configuration)(struct libusb_device_handle *handle, int *config);
|
644
|
+
|
645
|
+
/* Set the active configuration for a device.
|
646
|
+
*
|
647
|
+
* A configuration value of -1 should put the device in unconfigured state.
|
648
|
+
*
|
649
|
+
* This function can block.
|
650
|
+
*
|
651
|
+
* Return:
|
652
|
+
* - 0 on success
|
653
|
+
* - LIBUSB_ERROR_NOT_FOUND if the configuration does not exist
|
654
|
+
* - LIBUSB_ERROR_BUSY if interfaces are currently claimed (and hence
|
655
|
+
* configuration cannot be changed)
|
656
|
+
* - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it
|
657
|
+
* was opened
|
658
|
+
* - another LIBUSB_ERROR code on other failure.
|
659
|
+
*/
|
660
|
+
int (*set_configuration)(struct libusb_device_handle *handle, int config);
|
661
|
+
|
662
|
+
/* Claim an interface. When claimed, the application can then perform
|
663
|
+
* I/O to an interface's endpoints.
|
664
|
+
*
|
665
|
+
* This function should not generate any bus I/O and should not block.
|
666
|
+
* Interface claiming is a logical operation that simply ensures that
|
667
|
+
* no other drivers/applications are using the interface, and after
|
668
|
+
* claiming, no other drivers/applicatiosn can use the interface because
|
669
|
+
* we now "own" it.
|
670
|
+
*
|
671
|
+
* Return:
|
672
|
+
* - 0 on success
|
673
|
+
* - LIBUSB_ERROR_NOT_FOUND if the interface does not exist
|
674
|
+
* - LIBUSB_ERROR_BUSY if the interface is in use by another driver/app
|
675
|
+
* - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it
|
676
|
+
* was opened
|
677
|
+
* - another LIBUSB_ERROR code on other failure
|
678
|
+
*/
|
679
|
+
int (*claim_interface)(struct libusb_device_handle *handle, int interface_number);
|
680
|
+
|
681
|
+
/* Release a previously claimed interface.
|
682
|
+
*
|
683
|
+
* This function should also generate a SET_INTERFACE control request,
|
684
|
+
* resetting the alternate setting of that interface to 0. It's OK for
|
685
|
+
* this function to block as a result.
|
686
|
+
*
|
687
|
+
* You will only ever be asked to release an interface which was
|
688
|
+
* successfully claimed earlier.
|
689
|
+
*
|
690
|
+
* Return:
|
691
|
+
* - 0 on success
|
692
|
+
* - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it
|
693
|
+
* was opened
|
694
|
+
* - another LIBUSB_ERROR code on other failure
|
695
|
+
*/
|
696
|
+
int (*release_interface)(struct libusb_device_handle *handle, int interface_number);
|
697
|
+
|
698
|
+
/* Set the alternate setting for an interface.
|
699
|
+
*
|
700
|
+
* You will only ever be asked to set the alternate setting for an
|
701
|
+
* interface which was successfully claimed earlier.
|
702
|
+
*
|
703
|
+
* It's OK for this function to block.
|
704
|
+
*
|
705
|
+
* Return:
|
706
|
+
* - 0 on success
|
707
|
+
* - LIBUSB_ERROR_NOT_FOUND if the alternate setting does not exist
|
708
|
+
* - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it
|
709
|
+
* was opened
|
710
|
+
* - another LIBUSB_ERROR code on other failure
|
711
|
+
*/
|
712
|
+
int (*set_interface_altsetting)(struct libusb_device_handle *handle,
|
713
|
+
int interface_number, int altsetting);
|
714
|
+
|
715
|
+
/* Clear a halt/stall condition on an endpoint.
|
716
|
+
*
|
717
|
+
* It's OK for this function to block.
|
718
|
+
*
|
719
|
+
* Return:
|
720
|
+
* - 0 on success
|
721
|
+
* - LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist
|
722
|
+
* - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it
|
723
|
+
* was opened
|
724
|
+
* - another LIBUSB_ERROR code on other failure
|
725
|
+
*/
|
726
|
+
int (*clear_halt)(struct libusb_device_handle *handle,
|
727
|
+
unsigned char endpoint);
|
728
|
+
|
729
|
+
/* Perform a USB port reset to reinitialize a device.
|
730
|
+
*
|
731
|
+
* If possible, the handle should still be usable after the reset
|
732
|
+
* completes, assuming that the device descriptors did not change during
|
733
|
+
* reset and all previous interface state can be restored.
|
734
|
+
*
|
735
|
+
* If something changes, or you cannot easily locate/verify the resetted
|
736
|
+
* device, return LIBUSB_ERROR_NOT_FOUND. This prompts the application
|
737
|
+
* to close the old handle and re-enumerate the device.
|
738
|
+
*
|
739
|
+
* Return:
|
740
|
+
* - 0 on success
|
741
|
+
* - LIBUSB_ERROR_NOT_FOUND if re-enumeration is required, or if the device
|
742
|
+
* has been disconnected since it was opened
|
743
|
+
* - another LIBUSB_ERROR code on other failure
|
744
|
+
*/
|
745
|
+
int (*reset_device)(struct libusb_device_handle *handle);
|
746
|
+
|
747
|
+
/* Determine if a kernel driver is active on an interface. Optional.
|
748
|
+
*
|
749
|
+
* The presence of a kernel driver on an interface indicates that any
|
750
|
+
* calls to claim_interface would fail with the LIBUSB_ERROR_BUSY code.
|
751
|
+
*
|
752
|
+
* Return:
|
753
|
+
* - 0 if no driver is active
|
754
|
+
* - 1 if a driver is active
|
755
|
+
* - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it
|
756
|
+
* was opened
|
757
|
+
* - another LIBUSB_ERROR code on other failure
|
758
|
+
*/
|
759
|
+
int (*kernel_driver_active)(struct libusb_device_handle *handle,
|
760
|
+
int interface_number);
|
761
|
+
|
762
|
+
/* Detach a kernel driver from an interface. Optional.
|
763
|
+
*
|
764
|
+
* After detaching a kernel driver, the interface should be available
|
765
|
+
* for claim.
|
766
|
+
*
|
767
|
+
* Return:
|
768
|
+
* - 0 on success
|
769
|
+
* - LIBUSB_ERROR_NOT_FOUND if no kernel driver was active
|
770
|
+
* - LIBUSB_ERROR_INVALID_PARAM if the interface does not exist
|
771
|
+
* - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it
|
772
|
+
* was opened
|
773
|
+
* - another LIBUSB_ERROR code on other failure
|
774
|
+
*/
|
775
|
+
int (*detach_kernel_driver)(struct libusb_device_handle *handle,
|
776
|
+
int interface_number);
|
777
|
+
|
778
|
+
/* Attach a kernel driver to an interface. Optional.
|
779
|
+
*
|
780
|
+
* Reattach a kernel driver to the device.
|
781
|
+
*
|
782
|
+
* Return:
|
783
|
+
* - 0 on success
|
784
|
+
* - LIBUSB_ERROR_NOT_FOUND if no kernel driver was active
|
785
|
+
* - LIBUSB_ERROR_INVALID_PARAM if the interface does not exist
|
786
|
+
* - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it
|
787
|
+
* was opened
|
788
|
+
* - LIBUSB_ERROR_BUSY if a program or driver has claimed the interface,
|
789
|
+
* preventing reattachment
|
790
|
+
* - another LIBUSB_ERROR code on other failure
|
791
|
+
*/
|
792
|
+
int (*attach_kernel_driver)(struct libusb_device_handle *handle,
|
793
|
+
int interface_number);
|
794
|
+
|
795
|
+
/* Destroy a device. Optional.
|
796
|
+
*
|
797
|
+
* This function is called when the last reference to a device is
|
798
|
+
* destroyed. It should free any resources allocated in the get_device_list
|
799
|
+
* path.
|
800
|
+
*/
|
801
|
+
void (*destroy_device)(struct libusb_device *dev);
|
802
|
+
|
803
|
+
/* Submit a transfer. Your implementation should take the transfer,
|
804
|
+
* morph it into whatever form your platform requires, and submit it
|
805
|
+
* asynchronously.
|
806
|
+
*
|
807
|
+
* This function must not block.
|
808
|
+
*
|
809
|
+
* Return:
|
810
|
+
* - 0 on success
|
811
|
+
* - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected
|
812
|
+
* - another LIBUSB_ERROR code on other failure
|
813
|
+
*/
|
814
|
+
int (*submit_transfer)(struct usbi_transfer *itransfer);
|
815
|
+
|
816
|
+
/* Cancel a previously submitted transfer.
|
817
|
+
*
|
818
|
+
* This function must not block. The transfer cancellation must complete
|
819
|
+
* later, resulting in a call to usbi_handle_transfer_cancellation()
|
820
|
+
* from the context of handle_events.
|
821
|
+
*/
|
822
|
+
int (*cancel_transfer)(struct usbi_transfer *itransfer);
|
823
|
+
|
824
|
+
/* Clear a transfer as if it has completed or cancelled, but do not
|
825
|
+
* report any completion/cancellation to the library. You should free
|
826
|
+
* all private data from the transfer as if you were just about to report
|
827
|
+
* completion or cancellation.
|
828
|
+
*
|
829
|
+
* This function might seem a bit out of place. It is used when libusbx
|
830
|
+
* detects a disconnected device - it calls this function for all pending
|
831
|
+
* transfers before reporting completion (with the disconnect code) to
|
832
|
+
* the user. Maybe we can improve upon this internal interface in future.
|
833
|
+
*/
|
834
|
+
void (*clear_transfer_priv)(struct usbi_transfer *itransfer);
|
835
|
+
|
836
|
+
/* Handle any pending events. This involves monitoring any active
|
837
|
+
* transfers and processing their completion or cancellation.
|
838
|
+
*
|
839
|
+
* The function is passed an array of pollfd structures (size nfds)
|
840
|
+
* as a result of the poll() system call. The num_ready parameter
|
841
|
+
* indicates the number of file descriptors that have reported events
|
842
|
+
* (i.e. the poll() return value). This should be enough information
|
843
|
+
* for you to determine which actions need to be taken on the currently
|
844
|
+
* active transfers.
|
845
|
+
*
|
846
|
+
* For any cancelled transfers, call usbi_handle_transfer_cancellation().
|
847
|
+
* For completed transfers, call usbi_handle_transfer_completion().
|
848
|
+
* For control/bulk/interrupt transfers, populate the "transferred"
|
849
|
+
* element of the appropriate usbi_transfer structure before calling the
|
850
|
+
* above functions. For isochronous transfers, populate the status and
|
851
|
+
* transferred fields of the iso packet descriptors of the transfer.
|
852
|
+
*
|
853
|
+
* This function should also be able to detect disconnection of the
|
854
|
+
* device, reporting that situation with usbi_handle_disconnect().
|
855
|
+
*
|
856
|
+
* When processing an event related to a transfer, you probably want to
|
857
|
+
* take usbi_transfer.lock to prevent races. See the documentation for
|
858
|
+
* the usbi_transfer structure.
|
859
|
+
*
|
860
|
+
* Return 0 on success, or a LIBUSB_ERROR code on failure.
|
861
|
+
*/
|
862
|
+
int (*handle_events)(struct libusb_context *ctx,
|
863
|
+
struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready);
|
864
|
+
|
865
|
+
/* Get time from specified clock. At least two clocks must be implemented
|
866
|
+
by the backend: USBI_CLOCK_REALTIME, and USBI_CLOCK_MONOTONIC.
|
867
|
+
|
868
|
+
Description of clocks:
|
869
|
+
USBI_CLOCK_REALTIME : clock returns time since system epoch.
|
870
|
+
USBI_CLOCK_MONOTONIC: clock returns time since unspecified start
|
871
|
+
time (usually boot).
|
872
|
+
*/
|
873
|
+
int (*clock_gettime)(int clkid, struct timespec *tp);
|
874
|
+
|
875
|
+
#ifdef USBI_TIMERFD_AVAILABLE
|
876
|
+
/* clock ID of the clock that should be used for timerfd */
|
877
|
+
clockid_t (*get_timerfd_clockid)(void);
|
878
|
+
#endif
|
879
|
+
|
880
|
+
/* Number of bytes to reserve for per-device private backend data.
|
881
|
+
* This private data area is accessible through the "os_priv" field of
|
882
|
+
* struct libusb_device. */
|
883
|
+
size_t device_priv_size;
|
884
|
+
|
885
|
+
/* Number of bytes to reserve for per-handle private backend data.
|
886
|
+
* This private data area is accessible through the "os_priv" field of
|
887
|
+
* struct libusb_device. */
|
888
|
+
size_t device_handle_priv_size;
|
889
|
+
|
890
|
+
/* Number of bytes to reserve for per-transfer private backend data.
|
891
|
+
* This private data area is accessible by calling
|
892
|
+
* usbi_transfer_get_os_priv() on the appropriate usbi_transfer instance.
|
893
|
+
*/
|
894
|
+
size_t transfer_priv_size;
|
895
|
+
|
896
|
+
/* Mumber of additional bytes for os_priv for each iso packet.
|
897
|
+
* Can your backend use this? */
|
898
|
+
/* FIXME: linux can't use this any more. if other OS's cannot either,
|
899
|
+
* then remove this */
|
900
|
+
size_t add_iso_packet_size;
|
901
|
+
};
|
902
|
+
|
903
|
+
extern const struct usbi_os_backend * const usbi_backend;
|
904
|
+
|
905
|
+
extern const struct usbi_os_backend linux_usbfs_backend;
|
906
|
+
extern const struct usbi_os_backend darwin_backend;
|
907
|
+
extern const struct usbi_os_backend openbsd_backend;
|
908
|
+
extern const struct usbi_os_backend windows_backend;
|
909
|
+
|
910
|
+
#endif
|