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 */
|