libusbi.h revision e9364d72151ae1de9cce4175f330fe1529f02511
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>
28852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <sys/ioctl.h>
29852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <time.h>
30852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
31e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#include <libusb.h>
32852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <usbfs.h>
33852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
34852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define USBFS_PATH "/dev/bus/usb"
35852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define DEVICE_DESC_LENGTH		18
36852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
37a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXENDPOINTS	32
38a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXINTERFACES	32
39a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXCONFIG		8
40a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake
41852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestruct list_head {
42852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct list_head *prev, *next;
43852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
44852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
45852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* Get an entry from the list
46852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * 	ptr - the address of this list_head element in "type"
47852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * 	type - the data type that contains "member"
48852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * 	member - the list_head element in "type"
49852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake */
50852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_entry(ptr, type, member) \
51852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	((type *)((char *)(ptr) - (unsigned long)(&((type *)0L)->member)))
52852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
53852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* Get each entry from a list
54852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake *	pos - A structure pointer has a "member" element
55852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake *	head - list head
56852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake *	member - the list_head element in "pos"
57852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake */
58852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_for_each_entry(pos, head, member)				\
59852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	for (pos = list_entry((head)->next, typeof(*pos), member);	\
60852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	     &pos->member != (head);					\
61852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	     pos = list_entry(pos->member.next, typeof(*pos), member))
62852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
63852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_for_each_entry_safe(pos, n, head, member)			\
64852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake        for (pos = list_entry((head)->next, typeof(*pos), member),	\
65852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake		n = list_entry(pos->member.next, typeof(*pos), member);	\
66852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	     &pos->member != (head);					\
67852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	     pos = n, n = list_entry(n->member.next, typeof(*n), member))
68852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
69852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_empty(entry) ((entry)->next == (entry))
70852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
71852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_init(struct list_head *entry)
72852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{
73852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->prev = entry->next = entry;
74852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}
75852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
76852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_add(struct list_head *entry, struct list_head *head)
77852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{
78852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->next = head->next;
79852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->prev = head;
80852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
81852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	head->next->prev = entry;
82852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	head->next = entry;
83852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}
84852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
85852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_add_tail(struct list_head *entry,
86852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct list_head *head)
87852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{
88852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->next = head;
89852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->prev = head->prev;
90852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
91852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	head->prev->next = entry;
92852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	head->prev = entry;
93852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}
94852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
95852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_del(struct list_head *entry)
96852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{
97852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->next->prev = entry->prev;
98852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	entry->prev->next = entry->next;
99852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}
100852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
101852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define container_of(ptr, type, member) ({                      \
102852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
103852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake        (type *)( (char *)__mptr - offsetof(type,member) );})
104852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
105852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define bswap16(x) (((x & 0xff) << 8) | (x >> 8))
106852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#if __BYTE_ORDER == __LITTLE_ENDIAN
107852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define cpu_to_le16(x) (x)
108852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define le16_to_cpu(x) (x)
109852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#elif __BYTE_ORDER == __BIG_ENDIAN
110852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define le16_to_cpu(x) bswap16(x)
111852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define cpu_to_le16(x) bswap16(x)
112852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else
113852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#error "Unrecognized endianness"
114852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif
115852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
116852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define MIN(a, b)	((a) < (b) ? (a) : (b))
117852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define MAX(a, b)	((a) > (b) ? (a) : (b))
118852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
119852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define TIMESPEC_IS_SET(ts) ((ts)->tv_sec != 0 || (ts)->tv_nsec != 0)
120852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
121852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakeenum fpi_log_level {
122852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	LOG_LEVEL_DEBUG,
123852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	LOG_LEVEL_INFO,
124852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	LOG_LEVEL_WARNING,
125852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	LOG_LEVEL_ERROR,
126852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
127852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
128852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakevoid fpi_log(enum fpi_log_level, const char *function, const char *format, ...);
129852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
130852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#ifdef ENABLE_LOGGING
131852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define _fpi_log(level, fmt...) fpi_log(level, __FUNCTION__, fmt)
132852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else
133852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define _fpi_log(level, fmt...)
134852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif
135852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
136852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#ifdef ENABLE_DEBUG_LOGGING
137852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define fp_dbg(fmt...) _fpi_log(LOG_LEVEL_DEBUG, fmt)
138852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else
139852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define fp_dbg(fmt...)
140852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif
141852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
142852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define fp_info(fmt...) _fpi_log(LOG_LEVEL_INFO, fmt)
143852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define fp_warn(fmt...) _fpi_log(LOG_LEVEL_WARNING, fmt)
144852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define fp_err(fmt...) _fpi_log(LOG_LEVEL_ERROR, fmt)
145852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
146e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drakestruct libusb_dev {
147852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct list_head list;
148852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	char *nodepath;
149852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct usb_dev_descriptor desc;
150a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake	struct usb_config_descriptor *config;
151852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
152852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
153e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drakestruct libusb_dev_handle {
154852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct list_head list;
155e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake	struct libusb_dev *dev;
156852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	int fd;
157852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
158852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
159e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drakeenum libusb_urb_type {
160e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake	LIBUSB_URB_CONTROL,
161e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake	LIBUSB_URB_BULK,
162852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
163852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
164e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#define LIBUSB_URBH_DATA_BELONGS_TO_USER		(1<<0)
165e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#define LIBUSB_URBH_SYNC_CANCELLED 			(1<<1)
166e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#define LIBUSB_URBH_TIMED_OUT	 			(1<<2)
167852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
168e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drakestruct libusb_urb_handle {
169e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake	struct libusb_dev_handle *devh;
170852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct usb_urb urb;
171852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct list_head list;
172852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	struct timespec timeout;
173852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	timer_t timer;
174852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	unsigned char urb_type;
175852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	unsigned char endpoint;
176852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	int transfer_len;
177852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	int transferred;
178852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	unsigned char *buffer;
179852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	void *callback;
180852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	void *user_data;
181852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake	uint8_t flags;
182852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake};
183852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
184852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* bus structures */
185852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
186a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake/* All standard descriptors have these 2 fields in common */
187a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drakestruct usb_descriptor_header {
188a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake	uint8_t  bLength;
189a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake	uint8_t  bDescriptorType;
190a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake};
191a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake
192852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* shared data and functions */
193852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
194852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakeextern struct list_head open_devs;
195852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
196852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakeint fpi_io_init(int _signum);
197852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakevoid fpi_io_exit(void);
198852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
199a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drakeint fpi_parse_descriptor(unsigned char *source, char *descriptor, void *dest);
200a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drakeint fpi_parse_configuration(struct usb_config_descriptor *config,
201a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake		unsigned char *buffer);
202a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake
203852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif
204852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake
205