summaryrefslogtreecommitdiff
path: root/devel/libusb/files/libusbugen_impl.h
blob: fd93ca7e5ed66c56449bde83cc5bfb4236498595 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef _SYS_USB_LIBUSB_LIBUSB_IMPL_H
#define	_SYS_USB_LIBUSB_LIBUSB_IMPL_H

#ifdef	__cplusplus
extern "C" {
#endif

/* debug levels */
#define	DEBUG_NONE		0
#define	DEBUG_ERRORS		1
#define	DEBUG_RECOVERABLE	2
#define	DEBUG_FUNCTIONS 	3
#define	DEBUG_DETAILED		4
#define	DEBUG_DATA_DUMP		5

/* api binding */
#define	API_RELAXED		0
#define	API_STRICT		1

/*
 * XXX issues: remove duplicates with usb.h
 */
typedef struct usb_device usb_device_t;
typedef struct usb_bus usb_bus_t;
typedef struct usb_ctrl_setup usb_ctrl_setup_t;

/* some useful defines */
#define	USB_DEV_REQ_HOST_TO_DEV 	0x00
#define	USB_DEV_REQ_DEV_TO_HOST 	0x80
#define	USB_DEV_REQ_DIR_MASK		0x80

#define	USB_DESCR_TYPE_SETUP_DEV		0x0100
#define	USB_DESCR_TYPE_SETUP_CFG		0x0200
#define	USB_DESCR_TYPE_SETUP_STRING		0x0300
#define	USB_DESCR_TYPE_SETUP_IF 		0x0400
#define	USB_DESCR_TYPE_SETUP_EP 		0x0500
#define	USB_DESCR_TYPE_SETUP_DEV_QLF		0x0600
#define	USB_DESCR_TYPE_SETUP_OTHER_SPEED_CFG	0x0700
#define	USB_DESCR_TYPE_SETUP_IFPWR		0x0800

#define	USB_DESCR_TYPE_DEV			0x01
#define	USB_DESCR_TYPE_CFG			0x02
#define	USB_DESCR_TYPE_STRING			0x03
#define	USB_DESCR_TYPE_IF			0x04
#define	USB_DESCR_TYPE_EP			0x05
#define	USB_DESCR_TYPE_DEV_QLF			0x06
#define	USB_DESCR_TYPE_OTHER_SPEED_CFG		0x07
#define	USB_DESCR_TYPE_IF_PWR			0x08

/*
 * bEndpointAddress masks
 */
#define	USB_EP_NUM_MASK 	0x0F		/* endpoint number mask */
#define	USB_EP_DIR_MASK 	0x80		/* direction mask */
#define	USB_EP_DIR_OUT		0x00		/* OUT endpoint */
#define	USB_EP_DIR_IN		0x80		/* IN endpoint */

/*
 * The compiler pads the above structures;  the following represent the
 * unpadded, aggregate data sizes.
 */
#define	USB_DEV_DESCR_SIZE	18	/* device descr size */
#define	USB_CFG_DESCR_SIZE	 9	/* configuration desc. size */
#define	USBA_CFG_PWR_DESCR_SIZE 18	/* configuration pwr desc. size */
#define	USB_IF_DESCR_SIZE	 9	/* interface descr size */
#define	USBA_IF_PWR_DESCR_SIZE	15	/* interface pwr descr size */
#define	USB_EP_DESCR_SIZE	 7	/* endpoint descr size */

#define	BYTE_SWAP(x)  ((((x) & 0xff) << 8) | (((x) & 0xff00) >> 8))

/* I/O direction */
#define	READ	0
#define	WRITE	1

typedef enum {
	USB_ERROR_TYPE_NONE = 0,
	USB_ERROR_TYPE_STRING,
	USB_ERROR_TYPE_ERRNO
} usb_error_type_t;

/*
 * This records the file descriptors for endpoint/status devices.
 */
typedef struct usb_dev_handle_info {
	int	configuration_value;
	int	configuration_index;
	int	claimed_interface;
	int	alternate;
	int	ep_fd[USB_MAXENDPOINTS];
	int	ep_status_fd[USB_MAXENDPOINTS];
	int	ep_interface[USB_MAXENDPOINTS];
} usb_dev_handle_info_t;

typedef struct {
	usb_device_t	*device;
	usb_dev_handle_info_t *info;
} usb_dev_handle_impl_t;

#define	USB_MAX_INTERFACES	256

typedef struct {
	int	ref_count;
	int	ep0_fd;
	int	ep0_fd_stat;
	usb_dev_handle_impl_t
		*claimed_interfaces[USB_MAX_INTERFACES];
} usb_device_specific_t;

#define	USB_PARSE_ERROR 0
#define	USB_DESCR_TYPE_ANY			-1	/* Wild card */

#define	INCREMENT_BUF(buf) \
		if ((buf)[0] == 0) { \
			break; \
		} else { \
			(buf) += (buf)[0]; \
		}
#define	isdigit(ch) ((ch >= '0') && (ch <= '9'))

typedef struct usb_cfg_descr {
	uint8_t 	bLength;	/* descriptor size		*/
	uint8_t 	bDescriptorType; /* set to CONFIGURATION	*/
	uint16_t	wTotalLength;	/* total length of data returned */
	uint8_t 	bNumInterfaces; /* # interfaces in config	*/
	uint8_t 	bConfigurationValue; /* arg for SetConfiguration */
	uint8_t 	iConfiguration; /* configuration string 	*/
	uint8_t 	bmAttributes;	/* config characteristics	*/
	uint8_t 	MaxPower;	/* max pwr consumption		*/
} usb_cfg_descr_t;


/*
 * usb_if_descr:
 *	usb interface descriptor, refer to USB 2.0/9.6.5
 */
typedef  struct usb_if_descr {
	uint8_t 	bLength;		/* descriptor size	*/
	uint8_t 	bDescriptorType;	/* set to INTERFACE	*/
	uint8_t 	bInterfaceNumber;	/* interface number	*/
	uint8_t 	bAlternateSetting;	/* alt. interface number */
	uint8_t 	bNumEndpoints;		/* # of endpoints	*/
	uint8_t 	bInterfaceClass;	/* class code		*/
	uint8_t 	bInterfaceSubClass;	/* sub class code	*/
	uint8_t 	bInterfaceProtocol;	/* protocol code	*/
	uint8_t 	iInterface;		/* description string	*/
} usb_if_descr_t;


/*
 * usb_ep_descr:
 *	usb endpoint descriptor, refer to USB 2.0/9.6.6
 */
typedef struct usb_ep_descr {
	uint8_t 	bLength;		/* descriptor size	*/
	uint8_t 	bDescriptorType;	/* set to ENDPOINT	*/
	uint8_t 	bEndpointAddress;	/* address of this e/p */
	uint8_t 	bmAttributes;		/* transfer type	*/
	uint16_t	wMaxPacketSize; 	/* maximum packet size	*/
	uint8_t 	bInterval;		/* e/p polling interval */
	uint8_t		bRefresh;		/* refresh */
	uint8_t		bSynchAddress;
} usb_ep_descr_t;

#ifdef __cplusplus
}
#endif

#endif /* _SYS_USB_LIBUSB_LIBUSB_IMPL_H */