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