libusbi.h revision 62077b7fa5b222e1bb9dea3467585aed69d596e2
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>
27852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <stddef.h>
28c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake#include <sys/select.h>
29852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <time.h>
30852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
31e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#include <libusb.h>
32852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
33852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define DEVICE_DESC_LENGTH		18
34852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
35a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXENDPOINTS	32
36a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXINTERFACES	32
37a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXCONFIG		8
38a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake
39852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestruct list_head {
40852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct list_head *prev, *next;
41852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
42852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
43852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* Get an entry from the list
44852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * 	ptr - the address of this list_head element in "type"
45852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * 	type - the data type that contains "member"
46852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * 	member - the list_head element in "type"
47852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake */
48852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_entry(ptr, type, member) \
49852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	((type *)((char *)(ptr) - (unsigned long)(&((type *)0L)->member)))
50852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
51852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* Get each entry from a list
52852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake *	pos - A structure pointer has a "member" element
53852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake *	head - list head
54852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake *	member - the list_head element in "pos"
55852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake */
56852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_for_each_entry(pos, head, member)				\
57852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	for (pos = list_entry((head)->next, typeof(*pos), member);	\
58852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	     &pos->member != (head);					\
59852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	     pos = list_entry(pos->member.next, typeof(*pos), member))
60852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
61852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_for_each_entry_safe(pos, n, head, member)			\
62852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake        for (pos = list_entry((head)->next, typeof(*pos), member),	\
63852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake		n = list_entry(pos->member.next, typeof(*pos), member);	\
64852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	     &pos->member != (head);					\
65852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	     pos = n, n = list_entry(n->member.next, typeof(*n), member))
66852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
67852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_empty(entry) ((entry)->next == (entry))
68852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
69852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_init(struct list_head *entry)
70852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{
71852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->prev = entry->next = entry;
72852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}
73852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
74852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_add(struct list_head *entry, struct list_head *head)
75852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{
76852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->next = head->next;
77852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->prev = head;
78852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
79852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	head->next->prev = entry;
80852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	head->next = entry;
81852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}
82852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
83852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_add_tail(struct list_head *entry,
84852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct list_head *head)
85852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{
86852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->next = head;
87852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->prev = head->prev;
88852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
89852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	head->prev->next = entry;
90852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	head->prev = entry;
91852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}
92852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
93852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_del(struct list_head *entry)
94852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{
95852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->next->prev = entry->prev;
96852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->prev->next = entry->next;
97852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}
98852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
99852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define container_of(ptr, type, member) ({                      \
100852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
101852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake        (type *)( (char *)__mptr - offsetof(type,member) );})
102852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
103852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define bswap16(x) (((x & 0xff) << 8) | (x >> 8))
104852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#if __BYTE_ORDER == __LITTLE_ENDIAN
105852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define cpu_to_le16(x) (x)
106852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define le16_to_cpu(x) (x)
107852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#elif __BYTE_ORDER == __BIG_ENDIAN
108852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define le16_to_cpu(x) bswap16(x)
109852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define cpu_to_le16(x) bswap16(x)
110852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else
111852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#error "Unrecognized endianness"
112852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif
113852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
114852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define MIN(a, b)	((a) < (b) ? (a) : (b))
115852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define MAX(a, b)	((a) > (b) ? (a) : (b))
116852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
117852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define TIMESPEC_IS_SET(ts) ((ts)->tv_sec != 0 || (ts)->tv_nsec != 0)
118852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
119dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drakeenum usbi_log_level {
120852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	LOG_LEVEL_DEBUG,
121852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	LOG_LEVEL_INFO,
122852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	LOG_LEVEL_WARNING,
123852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	LOG_LEVEL_ERROR,
124852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
125852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
126dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drakevoid usbi_log(enum usbi_log_level, const char *function, const char *format, ...);
127852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
128852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#ifdef ENABLE_LOGGING
129dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drake#define _usbi_log(level, fmt...) usbi_log(level, __FUNCTION__, fmt)
130852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else
131dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drake#define _usbi_log(level, fmt...)
132852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif
133852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
134852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#ifdef ENABLE_DEBUG_LOGGING
135e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_dbg(fmt...) _usbi_log(LOG_LEVEL_DEBUG, fmt)
136852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else
137e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_dbg(fmt...)
138852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif
139852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
140e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_info(fmt...) _usbi_log(LOG_LEVEL_INFO, fmt)
141e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_warn(fmt...) _usbi_log(LOG_LEVEL_WARNING, fmt)
142e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_err(fmt...) _usbi_log(LOG_LEVEL_ERROR, fmt)
143852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
1449cfdb494fccac53a4277da7c8b6d15f1a72a4959Daniel Drakestruct libusb_device {
145f3fdf447916289cd92b7190377681894e8ab611aDaniel Drake	struct list_head list;
1469cfdb494fccac53a4277da7c8b6d15f1a72a4959Daniel Drake	int refcnt;
147f3fdf447916289cd92b7190377681894e8ab611aDaniel Drake	unsigned long session_data;
1489e89d1aa82cbe7e21672ee3e2e545238fffc5318Daniel Drake	struct libusb_device_descriptor desc;
149dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drake	struct libusb_config_descriptor *config;
150c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	unsigned char os_priv[0];
151852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
152852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
153ebad1c79688ba603ad017ed0fe2f3c0dc8edd1adDaniel Drakestruct libusb_device_handle {
154852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct list_head list;
1559cfdb494fccac53a4277da7c8b6d15f1a72a4959Daniel Drake	struct libusb_device *dev;
156c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	unsigned char os_priv[0];
157852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
158852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
15966348c90ea4570bf999ac301089e006d0cce1926Daniel Drake#define USBI_TRANSFER_SYNC_CANCELLED 		(1<<0)
16066348c90ea4570bf999ac301089e006d0cce1926Daniel Drake#define USBI_TRANSFER_TIMED_OUT	 			(1<<1)
161852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
16266348c90ea4570bf999ac301089e006d0cce1926Daniel Drakestruct usbi_transfer {
16366348c90ea4570bf999ac301089e006d0cce1926Daniel Drake	/* must come first */
16466348c90ea4570bf999ac301089e006d0cce1926Daniel Drake	struct libusb_transfer pub;
165852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
166852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct list_head list;
167637a8d7ff8a11a23588925d9d3003a609bda8075Daniel Drake	struct timeval timeout;
168852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	int transferred;
169852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	uint8_t flags;
170c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
171c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	unsigned char os_priv[0];
172852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
173852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
174852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* bus structures */
175852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
176a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake/* All standard descriptors have these 2 fields in common */
177a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drakestruct usb_descriptor_header {
178a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake	uint8_t  bLength;
179a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake	uint8_t  bDescriptorType;
180a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake};
181a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake
182852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* shared data and functions */
183852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
184c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeextern struct list_head usbi_open_devs;
185852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
186637a8d7ff8a11a23588925d9d3003a609bda8075Daniel Drakevoid usbi_io_init(void);
187c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
188c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct libusb_device *usbi_alloc_device(unsigned long session_id);
189c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct libusb_device *usbi_get_device_by_session_id(unsigned long session_id);
190c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
191c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakevoid usbi_handle_transfer_completion(struct usbi_transfer *itransfer,
192c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	enum libusb_transfer_status status);
193c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakevoid usbi_handle_transfer_cancellation(struct usbi_transfer *transfer);
194852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
195dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drakeint usbi_parse_descriptor(unsigned char *source, char *descriptor, void *dest);
196dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drakeint usbi_parse_configuration(struct libusb_config_descriptor *config,
197a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake		unsigned char *buffer);
198a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake
199c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* polling */
200c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
201c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct usbi_pollfd {
202c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	/* must come first */
203c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	struct libusb_pollfd pollfd;
204c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
205c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	struct list_head list;
206c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake};
207c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
208c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeint usbi_add_pollfd(int fd, short events);
209c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakevoid usbi_remove_pollfd(int fd);
210c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
211c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* device discovery */
212c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
213c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* we traverse usbfs without knowing how many devices we are going to find.
214c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * so we create this discovered_devs model which is similar to a linked-list
215c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * which grows when required. it can be freed once discovery has completed,
216c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * eliminating the need for a list node in the libusb_device structure
217c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * itself. */
218c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct discovered_devs {
219c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	size_t len;
220c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	size_t capacity;
221c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	struct libusb_device *devices[0];
222c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake};
223c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
224c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct discovered_devs *discovered_devs_append(
225c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	struct discovered_devs *discdevs, struct libusb_device *dev);
226c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
227c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* OS abstraction */
228c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
229c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct usbi_os_backend {
230c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	const char *name;
231c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	int (*init)(void);
232c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	void (*exit)(void);
233c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
234285724cc14ea5f993e2c4c92fe0aaf6c335bc139Vasily Khoruzhick	int (*get_device_list)(struct discovered_devs **discdevs);
235c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
236c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	int (*open)(struct libusb_device_handle *handle);
237c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	void (*close)(struct libusb_device_handle *handle);
238c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
239c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	int (*claim_interface)(struct libusb_device_handle *handle, int iface);
240c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	int (*release_interface)(struct libusb_device_handle *handle, int iface);
241c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
24262077b7fa5b222e1bb9dea3467585aed69d596e2Daniel Drake	int (*set_interface_altsetting)(struct libusb_device_handle *handle,
24362077b7fa5b222e1bb9dea3467585aed69d596e2Daniel Drake		int iface, int altsetting);
24462077b7fa5b222e1bb9dea3467585aed69d596e2Daniel Drake
245c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	void (*destroy_device)(struct libusb_device *dev);
246c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
247c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	int (*submit_transfer)(struct usbi_transfer *itransfer);
248c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	int (*cancel_transfer)(struct usbi_transfer *itransfer);
249c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
250c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	int (*handle_events)(fd_set *readfds, fd_set *writefds);
251c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
252c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	/* number of bytes to reserve for libusb_device.os_priv */
253c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	size_t device_priv_size;
254c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
255c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	/* number of bytes to reserve for libusb_device_handle.os_priv */
256c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	size_t device_handle_priv_size;
257c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
258c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	/* number of bytes to reserve for usbi_transfer.os_priv */
259c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake	size_t transfer_priv_size;
260c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake};
261c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
262c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeextern const struct usbi_os_backend * const usbi_backend;
263c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
264c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeextern const struct usbi_os_backend linux_usbfs_backend;
265c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake
266852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif
267852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
268