1/*
2 * Prototypes, structure definitions and macros.
3 *
4 * Copyright (c) 2000-2003 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 * This file (and only this file) may alternatively be licensed under the
21 * BSD license. See the LICENSE file shipped with the libusb-compat-0.1 source
22 * distribution for details.
23 */
24
25#ifndef __USB_H__
26#define __USB_H__
27
28#include <unistd.h>
29#include <stdlib.h>
30#include <limits.h>
31
32#include <dirent.h>
33
34/*
35 * USB spec information
36 *
37 * This is all stuff grabbed from various USB specs and is pretty much
38 * not subject to change
39 */
40
41/*
42 * Device and/or Interface Class codes
43 */
44#define USB_CLASS_PER_INTERFACE		0	/* for DeviceClass */
45#define USB_CLASS_AUDIO			1
46#define USB_CLASS_COMM			2
47#define USB_CLASS_HID			3
48#define USB_CLASS_PRINTER		7
49#define USB_CLASS_PTP			6
50#define USB_CLASS_MASS_STORAGE		8
51#define USB_CLASS_HUB			9
52#define USB_CLASS_DATA			10
53#define USB_CLASS_VENDOR_SPEC		0xff
54
55/*
56 * Descriptor types
57 */
58#define USB_DT_DEVICE			0x01
59#define USB_DT_CONFIG			0x02
60#define USB_DT_STRING			0x03
61#define USB_DT_INTERFACE		0x04
62#define USB_DT_ENDPOINT			0x05
63
64#define USB_DT_HID			0x21
65#define USB_DT_REPORT			0x22
66#define USB_DT_PHYSICAL			0x23
67#define USB_DT_HUB			0x29
68
69/*
70 * Descriptor sizes per descriptor type
71 */
72#define USB_DT_DEVICE_SIZE		18
73#define USB_DT_CONFIG_SIZE		9
74#define USB_DT_INTERFACE_SIZE		9
75#define USB_DT_ENDPOINT_SIZE		7
76#define USB_DT_ENDPOINT_AUDIO_SIZE	9	/* Audio extension */
77#define USB_DT_HUB_NONVAR_SIZE		7
78
79/* All standard descriptors have these 2 fields in common */
80struct usb_descriptor_header {
81	u_int8_t  bLength;
82	u_int8_t  bDescriptorType;
83};
84
85/* String descriptor */
86struct usb_string_descriptor {
87	u_int8_t  bLength;
88	u_int8_t  bDescriptorType;
89	u_int16_t wData[1];
90};
91
92/* HID descriptor */
93struct usb_hid_descriptor {
94	u_int8_t  bLength;
95	u_int8_t  bDescriptorType;
96	u_int16_t bcdHID;
97	u_int8_t  bCountryCode;
98	u_int8_t  bNumDescriptors;
99	/* u_int8_t  bReportDescriptorType; */
100	/* u_int16_t wDescriptorLength; */
101	/* ... */
102};
103
104/* Endpoint descriptor */
105#define USB_MAXENDPOINTS	32
106struct usb_endpoint_descriptor {
107	u_int8_t  bLength;
108	u_int8_t  bDescriptorType;
109	u_int8_t  bEndpointAddress;
110	u_int8_t  bmAttributes;
111	u_int16_t wMaxPacketSize;
112	u_int8_t  bInterval;
113	u_int8_t  bRefresh;
114	u_int8_t  bSynchAddress;
115
116	unsigned char *extra;	/* Extra descriptors */
117	int extralen;
118};
119
120#define USB_ENDPOINT_ADDRESS_MASK	0x0f    /* in bEndpointAddress */
121#define USB_ENDPOINT_DIR_MASK		0x80
122
123#define USB_ENDPOINT_TYPE_MASK		0x03    /* in bmAttributes */
124#define USB_ENDPOINT_TYPE_CONTROL	0
125#define USB_ENDPOINT_TYPE_ISOCHRONOUS	1
126#define USB_ENDPOINT_TYPE_BULK		2
127#define USB_ENDPOINT_TYPE_INTERRUPT	3
128
129/* Interface descriptor */
130#define USB_MAXINTERFACES	32
131struct usb_interface_descriptor {
132	u_int8_t  bLength;
133	u_int8_t  bDescriptorType;
134	u_int8_t  bInterfaceNumber;
135	u_int8_t  bAlternateSetting;
136	u_int8_t  bNumEndpoints;
137	u_int8_t  bInterfaceClass;
138	u_int8_t  bInterfaceSubClass;
139	u_int8_t  bInterfaceProtocol;
140	u_int8_t  iInterface;
141
142	struct usb_endpoint_descriptor *endpoint;
143
144	unsigned char *extra;	/* Extra descriptors */
145	int extralen;
146};
147
148#define USB_MAXALTSETTING	128	/* Hard limit */
149struct usb_interface {
150	struct usb_interface_descriptor *altsetting;
151
152	int num_altsetting;
153};
154
155/* Configuration descriptor information.. */
156#define USB_MAXCONFIG		8
157struct usb_config_descriptor {
158	u_int8_t  bLength;
159	u_int8_t  bDescriptorType;
160	u_int16_t wTotalLength;
161	u_int8_t  bNumInterfaces;
162	u_int8_t  bConfigurationValue;
163	u_int8_t  iConfiguration;
164	u_int8_t  bmAttributes;
165	u_int8_t  MaxPower;
166
167	struct usb_interface *interface;
168
169	unsigned char *extra;	/* Extra descriptors */
170	int extralen;
171};
172
173/* Device descriptor */
174struct usb_device_descriptor {
175	u_int8_t  bLength;
176	u_int8_t  bDescriptorType;
177	u_int16_t bcdUSB;
178	u_int8_t  bDeviceClass;
179	u_int8_t  bDeviceSubClass;
180	u_int8_t  bDeviceProtocol;
181	u_int8_t  bMaxPacketSize0;
182	u_int16_t idVendor;
183	u_int16_t idProduct;
184	u_int16_t bcdDevice;
185	u_int8_t  iManufacturer;
186	u_int8_t  iProduct;
187	u_int8_t  iSerialNumber;
188	u_int8_t  bNumConfigurations;
189};
190
191struct usb_ctrl_setup {
192	u_int8_t  bRequestType;
193	u_int8_t  bRequest;
194	u_int16_t wValue;
195	u_int16_t wIndex;
196	u_int16_t wLength;
197};
198
199/*
200 * Standard requests
201 */
202#define USB_REQ_GET_STATUS		0x00
203#define USB_REQ_CLEAR_FEATURE		0x01
204/* 0x02 is reserved */
205#define USB_REQ_SET_FEATURE		0x03
206/* 0x04 is reserved */
207#define USB_REQ_SET_ADDRESS		0x05
208#define USB_REQ_GET_DESCRIPTOR		0x06
209#define USB_REQ_SET_DESCRIPTOR		0x07
210#define USB_REQ_GET_CONFIGURATION	0x08
211#define USB_REQ_SET_CONFIGURATION	0x09
212#define USB_REQ_GET_INTERFACE		0x0A
213#define USB_REQ_SET_INTERFACE		0x0B
214#define USB_REQ_SYNCH_FRAME		0x0C
215
216#define USB_TYPE_STANDARD		(0x00 << 5)
217#define USB_TYPE_CLASS			(0x01 << 5)
218#define USB_TYPE_VENDOR			(0x02 << 5)
219#define USB_TYPE_RESERVED		(0x03 << 5)
220
221#define USB_RECIP_DEVICE		0x00
222#define USB_RECIP_INTERFACE		0x01
223#define USB_RECIP_ENDPOINT		0x02
224#define USB_RECIP_OTHER			0x03
225
226/*
227 * Various libusb API related stuff
228 */
229
230#define USB_ENDPOINT_IN			0x80
231#define USB_ENDPOINT_OUT		0x00
232
233/* Error codes */
234#define USB_ERROR_BEGIN			500000
235
236/* Data types */
237struct usb_device;
238struct usb_bus;
239
240/*
241 * To maintain compatibility with applications already built with libusb,
242 * we must only add entries to the end of this structure. NEVER delete or
243 * move members and only change types if you really know what you're doing.
244 */
245struct usb_device {
246  struct usb_device *next, *prev;
247
248  char filename[PATH_MAX + 1];
249
250  struct usb_bus *bus;
251
252  struct usb_device_descriptor descriptor;
253  struct usb_config_descriptor *config;
254
255  void *dev;		/* Darwin support */
256
257  u_int8_t devnum;
258
259  unsigned char num_children;
260  struct usb_device **children;
261};
262
263struct usb_bus {
264  struct usb_bus *next, *prev;
265
266  char dirname[PATH_MAX + 1];
267
268  struct usb_device *devices;
269  u_int32_t location;
270
271  struct usb_device *root_dev;
272};
273
274struct usb_dev_handle;
275typedef struct usb_dev_handle usb_dev_handle;
276
277/* Variables */
278extern struct usb_bus *usb_busses;
279
280#ifdef __cplusplus
281extern "C" {
282#endif
283
284/* Function prototypes */
285
286/* usb.c */
287usb_dev_handle *usb_open(struct usb_device *dev);
288int usb_close(usb_dev_handle *dev);
289int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf,
290	size_t buflen);
291int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf,
292	size_t buflen);
293
294/* descriptors.c */
295int usb_get_descriptor_by_endpoint(usb_dev_handle *udev, int ep,
296	unsigned char type, unsigned char index, void *buf, int size);
297int usb_get_descriptor(usb_dev_handle *udev, unsigned char type,
298	unsigned char index, void *buf, int size);
299
300/* <arch>.c */
301int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size,
302	int timeout);
303int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size,
304	int timeout);
305int usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes, int size,
306        int timeout);
307int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size,
308        int timeout);
309int usb_control_msg(usb_dev_handle *dev, int requesttype, int request,
310	int value, int index, char *bytes, int size, int timeout);
311int usb_set_configuration(usb_dev_handle *dev, int configuration);
312int usb_claim_interface(usb_dev_handle *dev, int interface);
313int usb_release_interface(usb_dev_handle *dev, int interface);
314int usb_set_altinterface(usb_dev_handle *dev, int alternate);
315int usb_resetep(usb_dev_handle *dev, unsigned int ep);
316int usb_clear_halt(usb_dev_handle *dev, unsigned int ep);
317int usb_reset(usb_dev_handle *dev);
318
319#define LIBUSB_HAS_GET_DRIVER_NP 1
320int usb_get_driver_np(usb_dev_handle *dev, int interface, char *name,
321	unsigned int namelen);
322#define LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP 1
323int usb_detach_kernel_driver_np(usb_dev_handle *dev, int interface);
324
325char *usb_strerror(void);
326
327void usb_init(void);
328void usb_set_debug(int level);
329int usb_find_busses(void);
330int usb_find_devices(void);
331struct usb_device *usb_device(usb_dev_handle *dev);
332struct usb_bus *usb_get_busses(void);
333
334#ifdef __cplusplus
335}
336#endif
337
338#endif /* __USB_H__ */
339
340