usb.h revision 184610
1/* $FreeBSD: head/lib/libusb20/libusb20_compat01.h 184610 2008-11-04 02:31:03Z alfred $ */
2/*-
3 * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#ifndef _LIBUSB20_COMPAT_01_H_
28#define	_LIBUSB20_COMPAT_01_H_
29
30#include <sys/stdint.h>
31#include <sys/endian.h>
32#include <sys/types.h>
33#include <sys/param.h>
34
35/* USB interface class codes */
36
37#define	USB_CLASS_PER_INTERFACE         0
38#define	USB_CLASS_AUDIO                 1
39#define	USB_CLASS_COMM                  2
40#define	USB_CLASS_HID                   3
41#define	USB_CLASS_PRINTER               7
42#define	USB_CLASS_PTP                   6
43#define	USB_CLASS_MASS_STORAGE          8
44#define	USB_CLASS_HUB                   9
45#define	USB_CLASS_DATA                  10
46#define	USB_CLASS_VENDOR_SPEC           0xff
47
48/* USB descriptor types */
49
50#define	USB_DT_DEVICE                   0x01
51#define	USB_DT_CONFIG                   0x02
52#define	USB_DT_STRING                   0x03
53#define	USB_DT_INTERFACE                0x04
54#define	USB_DT_ENDPOINT                 0x05
55
56#define	USB_DT_HID                      0x21
57#define	USB_DT_REPORT                   0x22
58#define	USB_DT_PHYSICAL                 0x23
59#define	USB_DT_HUB                      0x29
60
61/* USB descriptor type sizes */
62
63#define	USB_DT_DEVICE_SIZE              18
64#define	USB_DT_CONFIG_SIZE              9
65#define	USB_DT_INTERFACE_SIZE           9
66#define	USB_DT_ENDPOINT_SIZE            7
67#define	USB_DT_ENDPOINT_AUDIO_SIZE      9
68#define	USB_DT_HUB_NONVAR_SIZE          7
69
70/* USB descriptor header */
71struct usb_descriptor_header {
72	uint8_t	bLength;
73	uint8_t	bDescriptorType;
74};
75
76/* USB string descriptor */
77struct usb_string_descriptor {
78	uint8_t	bLength;
79	uint8_t	bDescriptorType;
80	uint16_t wData[1];
81};
82
83/* USB HID descriptor */
84struct usb_hid_descriptor {
85	uint8_t	bLength;
86	uint8_t	bDescriptorType;
87	uint16_t bcdHID;
88	uint8_t	bCountryCode;
89	uint8_t	bNumDescriptors;
90	/* uint8_t  bReportDescriptorType; */
91	/* uint16_t wDescriptorLength; */
92	/* ... */
93};
94
95/* USB endpoint descriptor */
96#define	USB_MAXENDPOINTS        32
97struct usb_endpoint_descriptor {
98	uint8_t	bLength;
99	uint8_t	bDescriptorType;
100	uint8_t	bEndpointAddress;
101#define	USB_ENDPOINT_ADDRESS_MASK       0x0f
102#define	USB_ENDPOINT_DIR_MASK           0x80
103	uint8_t	bmAttributes;
104#define	USB_ENDPOINT_TYPE_MASK          0x03
105#define	USB_ENDPOINT_TYPE_CONTROL       0
106#define	USB_ENDPOINT_TYPE_ISOCHRONOUS   1
107#define	USB_ENDPOINT_TYPE_BULK          2
108#define	USB_ENDPOINT_TYPE_INTERRUPT     3
109	uint16_t wMaxPacketSize;
110	uint8_t	bInterval;
111	uint8_t	bRefresh;
112	uint8_t	bSynchAddress;
113
114	uint8_t *extra;			/* Extra descriptors */
115	int	extralen;
116};
117
118/* USB interface descriptor */
119#define	USB_MAXINTERFACES       32
120struct usb_interface_descriptor {
121	uint8_t	bLength;
122	uint8_t	bDescriptorType;
123	uint8_t	bInterfaceNumber;
124	uint8_t	bAlternateSetting;
125	uint8_t	bNumEndpoints;
126	uint8_t	bInterfaceClass;
127	uint8_t	bInterfaceSubClass;
128	uint8_t	bInterfaceProtocol;
129	uint8_t	iInterface;
130
131	struct usb_endpoint_descriptor *endpoint;
132
133	uint8_t *extra;			/* Extra descriptors */
134	int	extralen;
135};
136
137#define	USB_MAXALTSETTING       128	/* Hard limit */
138struct usb_interface {
139	struct usb_interface_descriptor *altsetting;
140
141	int	num_altsetting;
142};
143
144/* USB configuration descriptor */
145#define	USB_MAXCONFIG           8
146struct usb_config_descriptor {
147	uint8_t	bLength;
148	uint8_t	bDescriptorType;
149	uint16_t wTotalLength;
150	uint8_t	bNumInterfaces;
151	uint8_t	bConfigurationValue;
152	uint8_t	iConfiguration;
153	uint8_t	bmAttributes;
154	uint8_t	MaxPower;
155
156	struct usb_interface *interface;
157
158	uint8_t *extra;			/* Extra descriptors */
159	int	extralen;
160};
161
162/* USB device descriptor */
163struct usb_device_descriptor {
164	uint8_t	bLength;
165	uint8_t	bDescriptorType;
166	uint16_t bcdUSB;
167	uint8_t	bDeviceClass;
168	uint8_t	bDeviceSubClass;
169	uint8_t	bDeviceProtocol;
170	uint8_t	bMaxPacketSize0;
171	uint16_t idVendor;
172	uint16_t idProduct;
173	uint16_t bcdDevice;
174	uint8_t	iManufacturer;
175	uint8_t	iProduct;
176	uint8_t	iSerialNumber;
177	uint8_t	bNumConfigurations;
178};
179
180/* USB setup packet */
181struct usb_ctrl_setup {
182	uint8_t	bRequestType;
183#define	USB_RECIP_DEVICE                0x00
184#define	USB_RECIP_INTERFACE             0x01
185#define	USB_RECIP_ENDPOINT              0x02
186#define	USB_RECIP_OTHER                 0x03
187#define	USB_TYPE_STANDARD               (0x00 << 5)
188#define	USB_TYPE_CLASS                  (0x01 << 5)
189#define	USB_TYPE_VENDOR                 (0x02 << 5)
190#define	USB_TYPE_RESERVED               (0x03 << 5)
191#define	USB_ENDPOINT_IN                 0x80
192#define	USB_ENDPOINT_OUT                0x00
193	uint8_t	bRequest;
194#define	USB_REQ_GET_STATUS              0x00
195#define	USB_REQ_CLEAR_FEATURE           0x01
196#define	USB_REQ_SET_FEATURE             0x03
197#define	USB_REQ_SET_ADDRESS             0x05
198#define	USB_REQ_GET_DESCRIPTOR          0x06
199#define	USB_REQ_SET_DESCRIPTOR          0x07
200#define	USB_REQ_GET_CONFIGURATION       0x08
201#define	USB_REQ_SET_CONFIGURATION       0x09
202#define	USB_REQ_GET_INTERFACE           0x0A
203#define	USB_REQ_SET_INTERFACE           0x0B
204#define	USB_REQ_SYNCH_FRAME             0x0C
205	uint16_t wValue;
206	uint16_t wIndex;
207	uint16_t wLength;
208};
209
210/* Error codes */
211#define	USB_ERROR_BEGIN                 500000
212
213/* Byte swapping */
214#define	USB_LE16_TO_CPU(x) le16toh(x)
215
216/* Data types */
217struct usb_device;
218struct usb_bus;
219
220/*
221 * To maintain compatibility with applications already built with libusb,
222 * we must only add entries to the end of this structure. NEVER delete or
223 * move members and only change types if you really know what you're doing.
224 */
225struct usb_device {
226	struct usb_device *next;
227	struct usb_device *prev;
228
229	char	filename[PATH_MAX + 1];
230
231	struct usb_bus *bus;
232
233	struct usb_device_descriptor descriptor;
234	struct usb_config_descriptor *config;
235
236	void   *dev;
237
238	uint8_t	devnum;
239
240	uint8_t	num_children;
241	struct usb_device **children;
242};
243
244struct usb_bus {
245	struct usb_bus *next;
246	struct usb_bus *prev;
247
248	char	dirname[PATH_MAX + 1];
249
250	struct usb_device *devices;
251	uint32_t location;
252
253	struct usb_device *root_dev;
254};
255
256struct usb_dev_handle;
257typedef struct usb_dev_handle usb_dev_handle;
258
259/* Variables */
260extern struct usb_bus *usb_busses;
261
262#ifdef __cplusplus
263extern	"C" {
264#endif
265#if 0
266}					/* style */
267
268#endif
269
270/* Function prototypes from "libusb20_compat01.c" */
271
272usb_dev_handle *usb_open(struct usb_device *dev);
273int	usb_close(usb_dev_handle * dev);
274int	usb_get_string(usb_dev_handle * dev, int index, int langid, char *buf, size_t buflen);
275int	usb_get_string_simple(usb_dev_handle * dev, int index, char *buf, size_t buflen);
276int	usb_get_descriptor_by_endpoint(usb_dev_handle * udev, int ep, uint8_t type, uint8_t index, void *buf, int size);
277int	usb_get_descriptor(usb_dev_handle * udev, uint8_t type, uint8_t index, void *buf, int size);
278int	usb_parse_descriptor(uint8_t *source, char *description, void *dest);
279int	usb_parse_configuration(struct usb_config_descriptor *config, uint8_t *buffer);
280void	usb_destroy_configuration(struct usb_device *dev);
281void	usb_fetch_and_parse_descriptors(usb_dev_handle * udev);
282int	usb_bulk_write(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout);
283int	usb_bulk_read(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout);
284int	usb_interrupt_write(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout);
285int	usb_interrupt_read(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout);
286int	usb_control_msg(usb_dev_handle * dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout);
287int	usb_set_configuration(usb_dev_handle * dev, int configuration);
288int	usb_claim_interface(usb_dev_handle * dev, int interface);
289int	usb_release_interface(usb_dev_handle * dev, int interface);
290int	usb_set_altinterface(usb_dev_handle * dev, int alternate);
291int	usb_resetep(usb_dev_handle * dev, unsigned int ep);
292int	usb_clear_halt(usb_dev_handle * dev, unsigned int ep);
293int	usb_reset(usb_dev_handle * dev);
294char   *usb_strerror(void);
295void	usb_init(void);
296void	usb_set_debug(int level);
297int	usb_find_busses(void);
298int	usb_find_devices(void);
299struct usb_device *usb_device(usb_dev_handle * dev);
300struct usb_bus *usb_get_busses(void);
301
302#if 0
303{					/* style */
304#endif
305#ifdef __cplusplus
306}
307
308#endif
309
310#endif					/* _LIBUSB20_COMPAT01_H_ */
311