libusbi.h revision c3844f7aeb2176636ce6e6ef697659fdb0b30048
1852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/*
2e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake * Internal header for libusb
3852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * Copyright (C) 2007 Daniel Drake <dsd@gentoo.org>
4852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * Copyright (c) 2001 Johannes Erdfelt <johannes@erdfelt.com>
5852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake *
6852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * This library is free software; you can redistribute it and/or
7852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * modify it under the terms of the GNU Lesser General Public
8852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * License as published by the Free Software Foundation; either
9852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * version 2.1 of the License, or (at your option) any later version.
10852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake *
11852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * This library is distributed in the hope that it will be useful,
12852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * but WITHOUT ANY WARRANTY; without even the implied warranty of
13852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * Lesser General Public License for more details.
15852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake *
16852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * You should have received a copy of the GNU Lesser General Public
17852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * License along with this library; if not, write to the Free Software
18852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake */
20852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
21e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#ifndef __LIBUSBI_H__
22e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#define __LIBUSBI_H__
23852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
24852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <config.h>
25852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
26852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <endian.h>
270efd2efa65d5513e5754d717d522b2c5c45332e2Daniel Drake#include <pthread.h>
28852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <stddef.h>
29c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake#include <sys/select.h>
30852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <time.h>
31852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
32e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#include <libusb.h>
33852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
34852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define DEVICE_DESC_LENGTH		18
35852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
36a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXENDPOINTS	32
37a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXINTERFACES	32
38a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXCONFIG		8
39a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake
40852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestruct list_head {
41852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct list_head *prev, *next;
42852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
43852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
44852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* Get an entry from the list
45852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * 	ptr - the address of this list_head element in "type"
46852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * 	type - the data type that contains "member"
47852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * 	member - the list_head element in "type"
48852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake */
49852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_entry(ptr, type, member) \
50852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	((type *)((char *)(ptr) - (unsigned long)(&((type *)0L)->member)))
51852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
52852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* Get each entry from a list
53852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake *	pos - A structure pointer has a "member" element
54852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake *	head - list head
55852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake *	member - the list_head element in "pos"
56852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake */
57852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_for_each_entry(pos, head, member)				\
58852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	for (pos = list_entry((head)->next, typeof(*pos), member);	\
59852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	     &pos->member != (head);					\
60852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	     pos = list_entry(pos->member.next, typeof(*pos), member))
61852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
62852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_for_each_entry_safe(pos, n, head, member)			\
63852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake        for (pos = list_entry((head)->next, typeof(*pos), member),	\
64852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake		n = list_entry(pos->member.next, typeof(*pos), member);	\
65852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	     &pos->member != (head);					\
66852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	     pos = n, n = list_entry(n->member.next, typeof(*n), member))
67852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
68852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_empty(entry) ((entry)->next == (entry))
69852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
70852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_init(struct list_head *entry)
71852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{
72852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->prev = entry->next = entry;
73852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}
74852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
75852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_add(struct list_head *entry, struct list_head *head)
76852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{
77852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->next = head->next;
78852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->prev = head;
79852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
80852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	head->next->prev = entry;
81852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	head->next = entry;
82852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}
83852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
84852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_add_tail(struct list_head *entry,
85852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct list_head *head)
86852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{
87852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->next = head;
88852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->prev = head->prev;
89852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
90852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	head->prev->next = entry;
91852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	head->prev = entry;
92852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}
93852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
94852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_del(struct list_head *entry)
95852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{
96852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->next->prev = entry->prev;
97852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->prev->next = entry->next;
98852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}
99852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
100852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define container_of(ptr, type, member) ({                      \
101852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
102852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake        (type *)( (char *)__mptr - offsetof(type,member) );})
103852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
104852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define bswap16(x) (((x & 0xff) << 8) | (x >> 8))
105852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#if __BYTE_ORDER == __LITTLE_ENDIAN
106852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define cpu_to_le16(x) (x)
107852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define le16_to_cpu(x) (x)
108852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#elif __BYTE_ORDER == __BIG_ENDIAN
109852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define le16_to_cpu(x) bswap16(x)
110852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define cpu_to_le16(x) bswap16(x)
111852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else
112852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#error "Unrecognized endianness"
113852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif
114852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
115852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define MIN(a, b)	((a) < (b) ? (a) : (b))
116852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define MAX(a, b)	((a) > (b) ? (a) : (b))
117852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
118852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define TIMESPEC_IS_SET(ts) ((ts)->tv_sec != 0 || (ts)->tv_nsec != 0)
119852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
120dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drakeenum usbi_log_level {
121852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	LOG_LEVEL_DEBUG,
122852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	LOG_LEVEL_INFO,
123852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	LOG_LEVEL_WARNING,
124852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	LOG_LEVEL_ERROR,
125852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
126852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
127dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drakevoid usbi_log(enum usbi_log_level, const char *function, const char *format, ...);
128852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
129852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#ifdef ENABLE_LOGGING
130dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drake#define _usbi_log(level, fmt...) usbi_log(level, __FUNCTION__, fmt)
131852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else
132dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drake#define _usbi_log(level, fmt...)
133852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif
134852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
135852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#ifdef ENABLE_DEBUG_LOGGING
136e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_dbg(fmt...) _usbi_log(LOG_LEVEL_DEBUG, fmt)
137852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else
138e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_dbg(fmt...)
139852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif
140852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
141e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_info(fmt...) _usbi_log(LOG_LEVEL_INFO, fmt)
142e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_warn(fmt...) _usbi_log(LOG_LEVEL_WARNING, fmt)
143e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_err(fmt...) _usbi_log(LOG_LEVEL_ERROR, fmt)
144852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
1459cfdb494fccac53a4277da7c8b6d15f1a72a4959Daniel Drakestruct libusb_device {
1461fcdb0678b759569db7cd530457dbc0a5f86fb1dDaniel Drake	/* lock protects refcnt, everything else is finalized at initialization
1471fcdb0678b759569db7cd530457dbc0a5f86fb1dDaniel Drake	 * time */
1481fcdb0678b759569db7cd530457dbc0a5f86fb1dDaniel Drake	pthread_mutex_t lock;
1499cfdb494fccac53a4277da7c8b6d15f1a72a4959Daniel Drake	int refcnt;
1501fcdb0678b759569db7cd530457dbc0a5f86fb1dDaniel Drake
1513675e978fb7a1042f8601931255658bcd14a2298Daniel Drake	uint8_t bus_number;
1523675e978fb7a1042f8601931255658bcd14a2298Daniel Drake	uint8_t device_address;
153c3844f7aeb2176636ce6e6ef697659fdb0b30048Daniel Drake	uint8_t num_configurations;
1543675e978fb7a1042f8601931255658bcd14a2298Daniel Drake
1551fcdb0678b759569db7cd530457dbc0a5f86fb1dDaniel Drake	struct list_head list;
156f3fdf447916289cd92b7190377681894e8ab611aDaniel Drake	unsigned long session_data;
157c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	unsigned char os_priv[0];
158852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
159852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
160ebad1c79688ba603ad017ed0fe2f3c0dc8edd1adDaniel Drakestruct libusb_device_handle {
161e20f8281fb7da32587f81b5eea5818af1eab0fe0Daniel Drake	/* lock protects claimed_interfaces */
162e20f8281fb7da32587f81b5eea5818af1eab0fe0Daniel Drake	pthread_mutex_t lock;
163e20f8281fb7da32587f81b5eea5818af1eab0fe0Daniel Drake	unsigned long claimed_interfaces;
164e20f8281fb7da32587f81b5eea5818af1eab0fe0Daniel Drake
165852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct list_head list;
1669cfdb494fccac53a4277da7c8b6d15f1a72a4959Daniel Drake	struct libusb_device *dev;
167c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	unsigned char os_priv[0];
168852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
169852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
1707ac0a405b4c57db42e88cbcba5f135697f03b646Daniel Drake#define USBI_TRANSFER_TIMED_OUT	 			(1<<0)
171852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
172211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake/* in-memory transfer layout:
173211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake *
174211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * 1. struct usbi_transfer
175211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * 2. struct libusb_transfer (which includes iso packets) [variable size]
176211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * 3. os private data [variable size]
177211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake *
178211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * from a libusb_transfer, you can get the usbi_transfer by rewinding the
179211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * appropriate number of bytes.
180211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * the usbi_transfer includes the number of allocated packets, so you can
181211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * determine the size of the transfer and hence the start and length of the
182211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * OS-private data.
183211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake */
184852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
185211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drakestruct usbi_transfer {
186211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake	int num_iso_packets;
187852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct list_head list;
188637a8d7ff8a11a23588925d9d3003a609bda8075Daniel Drake	struct timeval timeout;
189852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	int transferred;
190852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	uint8_t flags;
191852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
192852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
193211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake#define __USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer) \
194211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake	((struct libusb_transfer *)(((void *)(transfer)) \
195211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake		+ sizeof(struct usbi_transfer)))
196211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake#define __LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer) \
197211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake	((struct usbi_transfer *)(((void *)(transfer)) \
198211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake		- sizeof(struct usbi_transfer)))
199211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake
200211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drakestatic inline void *usbi_transfer_get_os_priv(struct usbi_transfer *transfer)
201211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake{
202211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake	return ((void *)transfer) + sizeof(struct usbi_transfer)
203211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake		+ sizeof(struct libusb_transfer)
204211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake		+ (transfer->num_iso_packets
205211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake			* sizeof(struct libusb_iso_packet_descriptor));
206211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake}
207211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake
208852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* bus structures */
209852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
210a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake/* All standard descriptors have these 2 fields in common */
211a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drakestruct usb_descriptor_header {
212a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake	uint8_t  bLength;
213a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake	uint8_t  bDescriptorType;
214a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake};
215a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake
216852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* shared data and functions */
217852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
218c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeextern struct list_head usbi_open_devs;
2190efd2efa65d5513e5754d717d522b2c5c45332e2Daniel Drakeextern pthread_mutex_t usbi_open_devs_lock;
220852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
221637a8d7ff8a11a23588925d9d3003a609bda8075Daniel Drakevoid usbi_io_init(void);
222c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
223c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct libusb_device *usbi_alloc_device(unsigned long session_id);
224c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct libusb_device *usbi_get_device_by_session_id(unsigned long session_id);
225fe4adcc99e30115204ab832ad3e0170c9aca7629Daniel Drakeint usbi_sanitize_device(struct libusb_device *dev);
226c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
227c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakevoid usbi_handle_transfer_completion(struct usbi_transfer *itransfer,
228c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	enum libusb_transfer_status status);
229c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakevoid usbi_handle_transfer_cancellation(struct usbi_transfer *transfer);
230852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
231dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drakeint usbi_parse_descriptor(unsigned char *source, char *descriptor, void *dest);
232a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake
233c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* polling */
234c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
235c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct usbi_pollfd {
236c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	/* must come first */
237c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	struct libusb_pollfd pollfd;
238c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
239c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	struct list_head list;
240c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake};
241c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
242c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeint usbi_add_pollfd(int fd, short events);
243c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakevoid usbi_remove_pollfd(int fd);
244c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
245c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* device discovery */
246c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
247c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* we traverse usbfs without knowing how many devices we are going to find.
248c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * so we create this discovered_devs model which is similar to a linked-list
249c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * which grows when required. it can be freed once discovery has completed,
250c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * eliminating the need for a list node in the libusb_device structure
251c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * itself. */
252c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct discovered_devs {
253c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	size_t len;
254c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	size_t capacity;
255c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	struct libusb_device *devices[0];
256c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake};
257c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
258c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct discovered_devs *discovered_devs_append(
259c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	struct discovered_devs *discdevs, struct libusb_device *dev);
260c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
261c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* OS abstraction */
262c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
263c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct usbi_os_backend {
264c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	const char *name;
265c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	int (*init)(void);
266c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	void (*exit)(void);
267c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
268285724cc14ea5f993e2c4c92fe0aaf6c335bc139Vasily Khoruzhick	int (*get_device_list)(struct discovered_devs **discdevs);
269c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
270c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	int (*open)(struct libusb_device_handle *handle);
271c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	void (*close)(struct libusb_device_handle *handle);
272c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
273b27fff633843824744df7d334cb89ece329cafa6Daniel Drake	int (*get_device_descriptor)(struct libusb_device *device,
274fe4adcc99e30115204ab832ad3e0170c9aca7629Daniel Drake		unsigned char *buffer);
275fe4adcc99e30115204ab832ad3e0170c9aca7629Daniel Drake	int (*get_active_config_descriptor)(struct libusb_device *device,
276fe4adcc99e30115204ab832ad3e0170c9aca7629Daniel Drake		unsigned char *buffer, size_t len);
277c3844f7aeb2176636ce6e6ef697659fdb0b30048Daniel Drake	int (*get_config_descriptor)(struct libusb_device *device,
278c3844f7aeb2176636ce6e6ef697659fdb0b30048Daniel Drake		uint8_t config_index, unsigned char *buffer, size_t len);
279b27fff633843824744df7d334cb89ece329cafa6Daniel Drake
2800f463fe671455670efcf4a93e526b2a9082b0afeDaniel Drake	int (*set_configuration)(struct libusb_device_handle *handle, int config);
2810f463fe671455670efcf4a93e526b2a9082b0afeDaniel Drake
282c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	int (*claim_interface)(struct libusb_device_handle *handle, int iface);
283c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	int (*release_interface)(struct libusb_device_handle *handle, int iface);
284c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
28562077b7fa5b222e1bb9dea3467585aed69d596e2Daniel Drake	int (*set_interface_altsetting)(struct libusb_device_handle *handle,
28662077b7fa5b222e1bb9dea3467585aed69d596e2Daniel Drake		int iface, int altsetting);
287c01f744ce07bbeccbe353e956479f0cc5a811a6fDaniel Drake	int (*clear_halt)(struct libusb_device_handle *handle,
288c01f744ce07bbeccbe353e956479f0cc5a811a6fDaniel Drake		unsigned char endpoint);
289bfe74e9cd9c17a40fff042ea0647326f51cfecaeDaniel Drake	int (*reset_device)(struct libusb_device_handle *handle);
29062077b7fa5b222e1bb9dea3467585aed69d596e2Daniel Drake
291470b1bc42bf53373ce678fc76bab9160a54d6881Daniel Drake	/* optional */
292470b1bc42bf53373ce678fc76bab9160a54d6881Daniel Drake	int (*kernel_driver_active)(struct libusb_device_handle *handle,
293470b1bc42bf53373ce678fc76bab9160a54d6881Daniel Drake		int interface);
294470b1bc42bf53373ce678fc76bab9160a54d6881Daniel Drake	int (*detach_kernel_driver)(struct libusb_device_handle *handle,
295470b1bc42bf53373ce678fc76bab9160a54d6881Daniel Drake		int interface);
296470b1bc42bf53373ce678fc76bab9160a54d6881Daniel Drake
297c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	void (*destroy_device)(struct libusb_device *dev);
298c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
299c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	int (*submit_transfer)(struct usbi_transfer *itransfer);
300c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	int (*cancel_transfer)(struct usbi_transfer *itransfer);
301c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
302c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	int (*handle_events)(fd_set *readfds, fd_set *writefds);
303c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
304c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	/* number of bytes to reserve for libusb_device.os_priv */
305c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	size_t device_priv_size;
306c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
307c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	/* number of bytes to reserve for libusb_device_handle.os_priv */
308c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	size_t device_handle_priv_size;
309c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
310c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	/* number of bytes to reserve for usbi_transfer.os_priv */
311c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	size_t transfer_priv_size;
312211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake
313211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake	/* number of additional bytes for os_priv for each iso packet */
314ad6e2b712c5b54af44424e58a2776686314e26b7Daniel Drake	/* FIXME: linux can't use this any more. if other OS's cannot either,
315ad6e2b712c5b54af44424e58a2776686314e26b7Daniel Drake	 * then remove this */
316211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake	size_t add_iso_packet_size;
317c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake};
318c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
319c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeextern const struct usbi_os_backend * const usbi_backend;
320c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
321c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeextern const struct usbi_os_backend linux_usbfs_backend;
322c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
323852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif
324852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
325