1 |
1275 |
phoenix |
#ifndef __LINUX_USB_H
|
2 |
|
|
#define __LINUX_USB_H
|
3 |
|
|
|
4 |
|
|
/* USB constants */
|
5 |
|
|
|
6 |
|
|
/*
|
7 |
|
|
* Device and/or Interface Class codes
|
8 |
|
|
*/
|
9 |
|
|
#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */
|
10 |
|
|
#define USB_CLASS_AUDIO 1
|
11 |
|
|
#define USB_CLASS_COMM 2
|
12 |
|
|
#define USB_CLASS_HID 3
|
13 |
|
|
#define USB_CLASS_PHYSICAL 5
|
14 |
|
|
#define USB_CLASS_STILL_IMAGE 6
|
15 |
|
|
#define USB_CLASS_PRINTER 7
|
16 |
|
|
#define USB_CLASS_MASS_STORAGE 8
|
17 |
|
|
#define USB_CLASS_HUB 9
|
18 |
|
|
#define USB_CLASS_CDC_DATA 0x0a
|
19 |
|
|
#define USB_CLASS_CSCID 0x0b /* chip+ smart card */
|
20 |
|
|
#define USB_CLASS_CONTENT_SEC 0x0d /* content security */
|
21 |
|
|
#define USB_CLASS_APP_SPEC 0xfe
|
22 |
|
|
#define USB_CLASS_VENDOR_SPEC 0xff
|
23 |
|
|
|
24 |
|
|
/*
|
25 |
|
|
* USB types
|
26 |
|
|
*/
|
27 |
|
|
#define USB_TYPE_MASK (0x03 << 5)
|
28 |
|
|
#define USB_TYPE_STANDARD (0x00 << 5)
|
29 |
|
|
#define USB_TYPE_CLASS (0x01 << 5)
|
30 |
|
|
#define USB_TYPE_VENDOR (0x02 << 5)
|
31 |
|
|
#define USB_TYPE_RESERVED (0x03 << 5)
|
32 |
|
|
|
33 |
|
|
/*
|
34 |
|
|
* USB recipients
|
35 |
|
|
*/
|
36 |
|
|
#define USB_RECIP_MASK 0x1f
|
37 |
|
|
#define USB_RECIP_DEVICE 0x00
|
38 |
|
|
#define USB_RECIP_INTERFACE 0x01
|
39 |
|
|
#define USB_RECIP_ENDPOINT 0x02
|
40 |
|
|
#define USB_RECIP_OTHER 0x03
|
41 |
|
|
|
42 |
|
|
/*
|
43 |
|
|
* USB directions
|
44 |
|
|
*/
|
45 |
|
|
#define USB_DIR_OUT 0 /* to device */
|
46 |
|
|
#define USB_DIR_IN 0x80 /* to host */
|
47 |
|
|
|
48 |
|
|
/*
|
49 |
|
|
* Descriptor types
|
50 |
|
|
*/
|
51 |
|
|
#define USB_DT_DEVICE 0x01
|
52 |
|
|
#define USB_DT_CONFIG 0x02
|
53 |
|
|
#define USB_DT_STRING 0x03
|
54 |
|
|
#define USB_DT_INTERFACE 0x04
|
55 |
|
|
#define USB_DT_ENDPOINT 0x05
|
56 |
|
|
|
57 |
|
|
#define USB_DT_HID (USB_TYPE_CLASS | 0x01)
|
58 |
|
|
#define USB_DT_REPORT (USB_TYPE_CLASS | 0x02)
|
59 |
|
|
#define USB_DT_PHYSICAL (USB_TYPE_CLASS | 0x03)
|
60 |
|
|
#define USB_DT_HUB (USB_TYPE_CLASS | 0x09)
|
61 |
|
|
|
62 |
|
|
/*
|
63 |
|
|
* Descriptor sizes per descriptor type
|
64 |
|
|
*/
|
65 |
|
|
#define USB_DT_DEVICE_SIZE 18
|
66 |
|
|
#define USB_DT_CONFIG_SIZE 9
|
67 |
|
|
#define USB_DT_INTERFACE_SIZE 9
|
68 |
|
|
#define USB_DT_ENDPOINT_SIZE 7
|
69 |
|
|
#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */
|
70 |
|
|
#define USB_DT_HUB_NONVAR_SIZE 7
|
71 |
|
|
#define USB_DT_HID_SIZE 9
|
72 |
|
|
|
73 |
|
|
/*
|
74 |
|
|
* Endpoints
|
75 |
|
|
*/
|
76 |
|
|
#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */
|
77 |
|
|
#define USB_ENDPOINT_DIR_MASK 0x80
|
78 |
|
|
|
79 |
|
|
#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */
|
80 |
|
|
#define USB_ENDPOINT_XFER_CONTROL 0
|
81 |
|
|
#define USB_ENDPOINT_XFER_ISOC 1
|
82 |
|
|
#define USB_ENDPOINT_XFER_BULK 2
|
83 |
|
|
#define USB_ENDPOINT_XFER_INT 3
|
84 |
|
|
|
85 |
|
|
/*
|
86 |
|
|
* USB Packet IDs (PIDs)
|
87 |
|
|
*/
|
88 |
|
|
#define USB_PID_UNDEF_0 0xf0
|
89 |
|
|
#define USB_PID_OUT 0xe1
|
90 |
|
|
#define USB_PID_ACK 0xd2
|
91 |
|
|
#define USB_PID_DATA0 0xc3
|
92 |
|
|
#define USB_PID_PING 0xb4 /* USB 2.0 */
|
93 |
|
|
#define USB_PID_SOF 0xa5
|
94 |
|
|
#define USB_PID_NYET 0x96 /* USB 2.0 */
|
95 |
|
|
#define USB_PID_DATA2 0x87 /* USB 2.0 */
|
96 |
|
|
#define USB_PID_SPLIT 0x78 /* USB 2.0 */
|
97 |
|
|
#define USB_PID_IN 0x69
|
98 |
|
|
#define USB_PID_NAK 0x5a
|
99 |
|
|
#define USB_PID_DATA1 0x4b
|
100 |
|
|
#define USB_PID_PREAMBLE 0x3c /* Token mode */
|
101 |
|
|
#define USB_PID_ERR 0x3c /* USB 2.0: handshake mode */
|
102 |
|
|
#define USB_PID_SETUP 0x2d
|
103 |
|
|
#define USB_PID_STALL 0x1e
|
104 |
|
|
#define USB_PID_MDATA 0x0f /* USB 2.0 */
|
105 |
|
|
|
106 |
|
|
/*
|
107 |
|
|
* Standard requests
|
108 |
|
|
*/
|
109 |
|
|
#define USB_REQ_GET_STATUS 0x00
|
110 |
|
|
#define USB_REQ_CLEAR_FEATURE 0x01
|
111 |
|
|
#define USB_REQ_SET_FEATURE 0x03
|
112 |
|
|
#define USB_REQ_SET_ADDRESS 0x05
|
113 |
|
|
#define USB_REQ_GET_DESCRIPTOR 0x06
|
114 |
|
|
#define USB_REQ_SET_DESCRIPTOR 0x07
|
115 |
|
|
#define USB_REQ_GET_CONFIGURATION 0x08
|
116 |
|
|
#define USB_REQ_SET_CONFIGURATION 0x09
|
117 |
|
|
#define USB_REQ_GET_INTERFACE 0x0A
|
118 |
|
|
#define USB_REQ_SET_INTERFACE 0x0B
|
119 |
|
|
#define USB_REQ_SYNCH_FRAME 0x0C
|
120 |
|
|
|
121 |
|
|
/*
|
122 |
|
|
* HID requests
|
123 |
|
|
*/
|
124 |
|
|
#define USB_REQ_GET_REPORT 0x01
|
125 |
|
|
#define USB_REQ_GET_IDLE 0x02
|
126 |
|
|
#define USB_REQ_GET_PROTOCOL 0x03
|
127 |
|
|
#define USB_REQ_SET_REPORT 0x09
|
128 |
|
|
#define USB_REQ_SET_IDLE 0x0A
|
129 |
|
|
#define USB_REQ_SET_PROTOCOL 0x0B
|
130 |
|
|
|
131 |
|
|
|
132 |
|
|
#ifdef __KERNEL__
|
133 |
|
|
|
134 |
|
|
#include <linux/types.h>
|
135 |
|
|
#include <linux/ioctl.h>
|
136 |
|
|
#include <linux/version.h>
|
137 |
|
|
#include <linux/sched.h>
|
138 |
|
|
#include <linux/delay.h>
|
139 |
|
|
#include <linux/interrupt.h> /* for in_interrupt() */
|
140 |
|
|
#include <linux/config.h>
|
141 |
|
|
#include <linux/list.h>
|
142 |
|
|
|
143 |
|
|
#define USB_MAJOR 180
|
144 |
|
|
|
145 |
|
|
static __inline__ void wait_ms(unsigned int ms)
|
146 |
|
|
{
|
147 |
|
|
if(!in_interrupt()) {
|
148 |
|
|
current->state = TASK_UNINTERRUPTIBLE;
|
149 |
|
|
schedule_timeout(1 + ms * HZ / 1000);
|
150 |
|
|
}
|
151 |
|
|
else
|
152 |
|
|
mdelay(ms);
|
153 |
|
|
}
|
154 |
|
|
|
155 |
|
|
/**
|
156 |
|
|
* struct usb_ctrlrequest - structure used to make USB device control requests easier to create and decode
|
157 |
|
|
* @bRequestType: matches the USB bmRequestType field
|
158 |
|
|
* @bRequest: matches the USB bRequest field
|
159 |
|
|
* @wValue: matches the USB wValue field
|
160 |
|
|
* @wIndex: matches the USB wIndex field
|
161 |
|
|
* @wLength: matches the USB wLength field
|
162 |
|
|
*
|
163 |
|
|
* This structure is used to send control requests to a USB device. It matches
|
164 |
|
|
* the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the
|
165 |
|
|
* USB spec for a fuller description of the different fields, and what they are
|
166 |
|
|
* used for.
|
167 |
|
|
*/
|
168 |
|
|
struct usb_ctrlrequest {
|
169 |
|
|
__u8 bRequestType;
|
170 |
|
|
__u8 bRequest;
|
171 |
|
|
__u16 wValue;
|
172 |
|
|
__u16 wIndex;
|
173 |
|
|
__u16 wLength;
|
174 |
|
|
} __attribute__ ((packed));
|
175 |
|
|
|
176 |
|
|
/*
|
177 |
|
|
* USB-status codes:
|
178 |
|
|
* USB_ST* maps to -E* and should go away in the future
|
179 |
|
|
*/
|
180 |
|
|
|
181 |
|
|
#define USB_ST_NOERROR 0
|
182 |
|
|
#define USB_ST_CRC (-EILSEQ)
|
183 |
|
|
#define USB_ST_BITSTUFF (-EPROTO)
|
184 |
|
|
#define USB_ST_NORESPONSE (-ETIMEDOUT) /* device not responding/handshaking */
|
185 |
|
|
#define USB_ST_DATAOVERRUN (-EOVERFLOW)
|
186 |
|
|
#define USB_ST_DATAUNDERRUN (-EREMOTEIO)
|
187 |
|
|
#define USB_ST_BUFFEROVERRUN (-ECOMM)
|
188 |
|
|
#define USB_ST_BUFFERUNDERRUN (-ENOSR)
|
189 |
|
|
#define USB_ST_INTERNALERROR (-EPROTO) /* unknown error */
|
190 |
|
|
#define USB_ST_SHORT_PACKET (-EREMOTEIO)
|
191 |
|
|
#define USB_ST_PARTIAL_ERROR (-EXDEV) /* ISO transfer only partially completed */
|
192 |
|
|
#define USB_ST_URB_KILLED (-ENOENT) /* URB canceled by user */
|
193 |
|
|
#define USB_ST_URB_PENDING (-EINPROGRESS)
|
194 |
|
|
#define USB_ST_REMOVED (-ENODEV) /* device not existing or removed */
|
195 |
|
|
#define USB_ST_TIMEOUT (-ETIMEDOUT) /* communication timed out, also in urb->status**/
|
196 |
|
|
#define USB_ST_NOTSUPPORTED (-ENOSYS)
|
197 |
|
|
#define USB_ST_BANDWIDTH_ERROR (-ENOSPC) /* too much bandwidth used */
|
198 |
|
|
#define USB_ST_URB_INVALID_ERROR (-EINVAL) /* invalid value/transfer type */
|
199 |
|
|
#define USB_ST_URB_REQUEST_ERROR (-ENXIO) /* invalid endpoint */
|
200 |
|
|
#define USB_ST_STALL (-EPIPE) /* pipe stalled, also in urb->status*/
|
201 |
|
|
|
202 |
|
|
/*
|
203 |
|
|
* USB device number allocation bitmap. There's one bitmap
|
204 |
|
|
* per USB tree.
|
205 |
|
|
*/
|
206 |
|
|
struct usb_devmap {
|
207 |
|
|
unsigned long devicemap[128 / (8*sizeof(unsigned long))];
|
208 |
|
|
};
|
209 |
|
|
|
210 |
|
|
#define USB_MAXBUS 64
|
211 |
|
|
|
212 |
|
|
struct usb_busmap {
|
213 |
|
|
unsigned long busmap[USB_MAXBUS / (8*sizeof(unsigned long))];
|
214 |
|
|
};
|
215 |
|
|
|
216 |
|
|
/*
|
217 |
|
|
* This is a USB device descriptor.
|
218 |
|
|
*
|
219 |
|
|
* USB device information
|
220 |
|
|
*/
|
221 |
|
|
|
222 |
|
|
/* Everything but the endpoint maximums are aribtrary */
|
223 |
|
|
#define USB_MAXCONFIG 8
|
224 |
|
|
#define USB_ALTSETTINGALLOC 4
|
225 |
|
|
#define USB_MAXALTSETTING 128 /* Hard limit */
|
226 |
|
|
#define USB_MAXINTERFACES 32
|
227 |
|
|
#define USB_MAXENDPOINTS 32
|
228 |
|
|
|
229 |
|
|
/* All standard descriptors have these 2 fields in common */
|
230 |
|
|
struct usb_descriptor_header {
|
231 |
|
|
__u8 bLength;
|
232 |
|
|
__u8 bDescriptorType;
|
233 |
|
|
} __attribute__ ((packed));
|
234 |
|
|
|
235 |
|
|
/* Device descriptor */
|
236 |
|
|
struct usb_device_descriptor {
|
237 |
|
|
__u8 bLength;
|
238 |
|
|
__u8 bDescriptorType;
|
239 |
|
|
__u16 bcdUSB;
|
240 |
|
|
__u8 bDeviceClass;
|
241 |
|
|
__u8 bDeviceSubClass;
|
242 |
|
|
__u8 bDeviceProtocol;
|
243 |
|
|
__u8 bMaxPacketSize0;
|
244 |
|
|
__u16 idVendor;
|
245 |
|
|
__u16 idProduct;
|
246 |
|
|
__u16 bcdDevice;
|
247 |
|
|
__u8 iManufacturer;
|
248 |
|
|
__u8 iProduct;
|
249 |
|
|
__u8 iSerialNumber;
|
250 |
|
|
__u8 bNumConfigurations;
|
251 |
|
|
} __attribute__ ((packed));
|
252 |
|
|
|
253 |
|
|
/* Endpoint descriptor */
|
254 |
|
|
struct usb_endpoint_descriptor {
|
255 |
|
|
__u8 bLength __attribute__ ((packed));
|
256 |
|
|
__u8 bDescriptorType __attribute__ ((packed));
|
257 |
|
|
__u8 bEndpointAddress __attribute__ ((packed));
|
258 |
|
|
__u8 bmAttributes __attribute__ ((packed));
|
259 |
|
|
__u16 wMaxPacketSize __attribute__ ((packed));
|
260 |
|
|
__u8 bInterval __attribute__ ((packed));
|
261 |
|
|
__u8 bRefresh __attribute__ ((packed));
|
262 |
|
|
__u8 bSynchAddress __attribute__ ((packed));
|
263 |
|
|
|
264 |
|
|
unsigned char *extra; /* Extra descriptors */
|
265 |
|
|
int extralen;
|
266 |
|
|
};
|
267 |
|
|
|
268 |
|
|
/* Interface descriptor */
|
269 |
|
|
struct usb_interface_descriptor {
|
270 |
|
|
__u8 bLength __attribute__ ((packed));
|
271 |
|
|
__u8 bDescriptorType __attribute__ ((packed));
|
272 |
|
|
__u8 bInterfaceNumber __attribute__ ((packed));
|
273 |
|
|
__u8 bAlternateSetting __attribute__ ((packed));
|
274 |
|
|
__u8 bNumEndpoints __attribute__ ((packed));
|
275 |
|
|
__u8 bInterfaceClass __attribute__ ((packed));
|
276 |
|
|
__u8 bInterfaceSubClass __attribute__ ((packed));
|
277 |
|
|
__u8 bInterfaceProtocol __attribute__ ((packed));
|
278 |
|
|
__u8 iInterface __attribute__ ((packed));
|
279 |
|
|
|
280 |
|
|
struct usb_endpoint_descriptor *endpoint;
|
281 |
|
|
|
282 |
|
|
unsigned char *extra; /* Extra descriptors */
|
283 |
|
|
int extralen;
|
284 |
|
|
};
|
285 |
|
|
|
286 |
|
|
struct usb_interface {
|
287 |
|
|
struct usb_interface_descriptor *altsetting;
|
288 |
|
|
|
289 |
|
|
int act_altsetting; /* active alternate setting */
|
290 |
|
|
int num_altsetting; /* number of alternate settings */
|
291 |
|
|
int max_altsetting; /* total memory allocated */
|
292 |
|
|
|
293 |
|
|
struct usb_driver *driver; /* driver */
|
294 |
|
|
void *private_data;
|
295 |
|
|
};
|
296 |
|
|
|
297 |
|
|
/* Configuration descriptor information.. */
|
298 |
|
|
struct usb_config_descriptor {
|
299 |
|
|
__u8 bLength __attribute__ ((packed));
|
300 |
|
|
__u8 bDescriptorType __attribute__ ((packed));
|
301 |
|
|
__u16 wTotalLength __attribute__ ((packed));
|
302 |
|
|
__u8 bNumInterfaces __attribute__ ((packed));
|
303 |
|
|
__u8 bConfigurationValue __attribute__ ((packed));
|
304 |
|
|
__u8 iConfiguration __attribute__ ((packed));
|
305 |
|
|
__u8 bmAttributes __attribute__ ((packed));
|
306 |
|
|
__u8 MaxPower __attribute__ ((packed));
|
307 |
|
|
|
308 |
|
|
struct usb_interface *interface;
|
309 |
|
|
|
310 |
|
|
unsigned char *extra; /* Extra descriptors */
|
311 |
|
|
int extralen;
|
312 |
|
|
};
|
313 |
|
|
|
314 |
|
|
/* String descriptor */
|
315 |
|
|
struct usb_string_descriptor {
|
316 |
|
|
__u8 bLength;
|
317 |
|
|
__u8 bDescriptorType;
|
318 |
|
|
__u16 wData[1];
|
319 |
|
|
} __attribute__ ((packed));
|
320 |
|
|
|
321 |
|
|
struct usb_device;
|
322 |
|
|
|
323 |
|
|
/*
|
324 |
|
|
* Device table entry for "new style" table-driven USB drivers.
|
325 |
|
|
* User mode code can read these tables to choose which modules to load.
|
326 |
|
|
* Declare the table as __devinitdata, and as a MODULE_DEVICE_TABLE.
|
327 |
|
|
*
|
328 |
|
|
* With a device table provide bind() instead of probe(). Then the
|
329 |
|
|
* third bind() parameter will point to a matching entry from this
|
330 |
|
|
* table. (Null value reserved.)
|
331 |
|
|
*
|
332 |
|
|
* Terminate the driver's table with an all-zeroes entry.
|
333 |
|
|
* Init the fields you care about; zeroes are not used in comparisons.
|
334 |
|
|
*/
|
335 |
|
|
#define USB_DEVICE_ID_MATCH_VENDOR 0x0001
|
336 |
|
|
#define USB_DEVICE_ID_MATCH_PRODUCT 0x0002
|
337 |
|
|
#define USB_DEVICE_ID_MATCH_DEV_LO 0x0004
|
338 |
|
|
#define USB_DEVICE_ID_MATCH_DEV_HI 0x0008
|
339 |
|
|
#define USB_DEVICE_ID_MATCH_DEV_CLASS 0x0010
|
340 |
|
|
#define USB_DEVICE_ID_MATCH_DEV_SUBCLASS 0x0020
|
341 |
|
|
#define USB_DEVICE_ID_MATCH_DEV_PROTOCOL 0x0040
|
342 |
|
|
#define USB_DEVICE_ID_MATCH_INT_CLASS 0x0080
|
343 |
|
|
#define USB_DEVICE_ID_MATCH_INT_SUBCLASS 0x0100
|
344 |
|
|
#define USB_DEVICE_ID_MATCH_INT_PROTOCOL 0x0200
|
345 |
|
|
|
346 |
|
|
#define USB_DEVICE_ID_MATCH_DEVICE (USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT)
|
347 |
|
|
#define USB_DEVICE_ID_MATCH_DEV_RANGE (USB_DEVICE_ID_MATCH_DEV_LO | USB_DEVICE_ID_MATCH_DEV_HI)
|
348 |
|
|
#define USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION (USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_DEV_RANGE)
|
349 |
|
|
#define USB_DEVICE_ID_MATCH_DEV_INFO \
|
350 |
|
|
(USB_DEVICE_ID_MATCH_DEV_CLASS | USB_DEVICE_ID_MATCH_DEV_SUBCLASS | USB_DEVICE_ID_MATCH_DEV_PROTOCOL)
|
351 |
|
|
#define USB_DEVICE_ID_MATCH_INT_INFO \
|
352 |
|
|
(USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS | USB_DEVICE_ID_MATCH_INT_PROTOCOL)
|
353 |
|
|
|
354 |
|
|
/* Some useful macros */
|
355 |
|
|
#define USB_DEVICE(vend,prod) \
|
356 |
|
|
match_flags: USB_DEVICE_ID_MATCH_DEVICE, idVendor: (vend), idProduct: (prod)
|
357 |
|
|
#define USB_DEVICE_VER(vend,prod,lo,hi) \
|
358 |
|
|
match_flags: USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, idVendor: (vend), idProduct: (prod), bcdDevice_lo: (lo), bcdDevice_hi: (hi)
|
359 |
|
|
#define USB_DEVICE_INFO(cl,sc,pr) \
|
360 |
|
|
match_flags: USB_DEVICE_ID_MATCH_DEV_INFO, bDeviceClass: (cl), bDeviceSubClass: (sc), bDeviceProtocol: (pr)
|
361 |
|
|
#define USB_INTERFACE_INFO(cl,sc,pr) \
|
362 |
|
|
match_flags: USB_DEVICE_ID_MATCH_INT_INFO, bInterfaceClass: (cl), bInterfaceSubClass: (sc), bInterfaceProtocol: (pr)
|
363 |
|
|
|
364 |
|
|
struct usb_device_id {
|
365 |
|
|
/* This bitmask is used to determine which of the following fields
|
366 |
|
|
* are to be used for matching.
|
367 |
|
|
*/
|
368 |
|
|
__u16 match_flags;
|
369 |
|
|
|
370 |
|
|
/*
|
371 |
|
|
* vendor/product codes are checked, if vendor is nonzero
|
372 |
|
|
* Range is for device revision (bcdDevice), inclusive;
|
373 |
|
|
* zero values here mean range isn't considered
|
374 |
|
|
*/
|
375 |
|
|
__u16 idVendor;
|
376 |
|
|
__u16 idProduct;
|
377 |
|
|
__u16 bcdDevice_lo, bcdDevice_hi;
|
378 |
|
|
|
379 |
|
|
/*
|
380 |
|
|
* if device class != 0, these can be match criteria;
|
381 |
|
|
* but only if this bDeviceClass value is nonzero
|
382 |
|
|
*/
|
383 |
|
|
__u8 bDeviceClass;
|
384 |
|
|
__u8 bDeviceSubClass;
|
385 |
|
|
__u8 bDeviceProtocol;
|
386 |
|
|
|
387 |
|
|
/*
|
388 |
|
|
* if interface class != 0, these can be match criteria;
|
389 |
|
|
* but only if this bInterfaceClass value is nonzero
|
390 |
|
|
*/
|
391 |
|
|
__u8 bInterfaceClass;
|
392 |
|
|
__u8 bInterfaceSubClass;
|
393 |
|
|
__u8 bInterfaceProtocol;
|
394 |
|
|
|
395 |
|
|
/*
|
396 |
|
|
* for driver's use; not involved in driver matching.
|
397 |
|
|
*/
|
398 |
|
|
unsigned long driver_info;
|
399 |
|
|
};
|
400 |
|
|
|
401 |
|
|
/**
|
402 |
|
|
* struct usb_driver - identifies USB driver to usbcore
|
403 |
|
|
* @owner: Pointer to the module owner of this driver; initialize
|
404 |
|
|
* it using THIS_MODULE.
|
405 |
|
|
* @name: The driver name should be unique among USB drivers,
|
406 |
|
|
* and should normally be the same as the module name.
|
407 |
|
|
* @probe: Called to see if the driver is willing to manage a particular
|
408 |
|
|
* interface on a device. The probe routine returns a handle that
|
409 |
|
|
* will later be provided to disconnect(), or a null pointer to
|
410 |
|
|
* indicate that the driver will not handle the interface.
|
411 |
|
|
* The handle is normally a pointer to driver-specific data.
|
412 |
|
|
* If the probe() routine needs to access the interface
|
413 |
|
|
* structure itself, use usb_ifnum_to_if() to make sure it's using
|
414 |
|
|
* the right one.
|
415 |
|
|
* @disconnect: Called when the interface is no longer accessible, usually
|
416 |
|
|
* because its device has been (or is being) disconnected. The
|
417 |
|
|
* handle passed is what was returned by probe(), or was provided
|
418 |
|
|
* to usb_driver_claim_interface().
|
419 |
|
|
* @ioctl: Used for drivers that want to talk to userspace through
|
420 |
|
|
* the "usbfs" filesystem. This lets devices provide ways to
|
421 |
|
|
* expose information to user space regardless of where they
|
422 |
|
|
* do (or don't) show up otherwise in the filesystem.
|
423 |
|
|
* @fops: pointer to a fops structure if the driver wants to use the USB
|
424 |
|
|
* major number.
|
425 |
|
|
* @minor: the starting minor number for this driver, if the fops
|
426 |
|
|
* pointer is set.
|
427 |
|
|
* @id_table: USB drivers use ID table to support hotplugging.
|
428 |
|
|
* Export this with MODULE_DEVICE_TABLE(usb,...), or use NULL to
|
429 |
|
|
* say that probe() should be called for any unclaimed interface.
|
430 |
|
|
*
|
431 |
|
|
* USB drivers must provide a name, probe() and disconnect() methods,
|
432 |
|
|
* and an id_table. Other driver fields are optional.
|
433 |
|
|
*
|
434 |
|
|
* The id_table is used in hotplugging. It holds a set of descriptors,
|
435 |
|
|
* and specialized data may be associated with each entry. That table
|
436 |
|
|
* is used by both user and kernel mode hotplugging support.
|
437 |
|
|
* The probe() and disconnect() methods are called in a context where
|
438 |
|
|
* they can sleep, but they should avoid abusing the privilege. Most
|
439 |
|
|
* work to connect to a device should be done when the device is opened,
|
440 |
|
|
* and undone at the last close. The disconnect code needs to address
|
441 |
|
|
* concurrency issues with respect to open() and close() methods, as
|
442 |
|
|
* well as forcing all pending I/O requests to complete (by unlinking
|
443 |
|
|
* them as necessary, and blocking until the unlinks complete).
|
444 |
|
|
*/
|
445 |
|
|
struct usb_driver {
|
446 |
|
|
struct module *owner;
|
447 |
|
|
|
448 |
|
|
const char *name;
|
449 |
|
|
|
450 |
|
|
void *(*probe)(
|
451 |
|
|
struct usb_device *dev, /* the device */
|
452 |
|
|
unsigned intf, /* what interface */
|
453 |
|
|
const struct usb_device_id *id /* from id_table */
|
454 |
|
|
);
|
455 |
|
|
void (*disconnect)(struct usb_device *, void *);
|
456 |
|
|
|
457 |
|
|
struct list_head driver_list;
|
458 |
|
|
|
459 |
|
|
struct file_operations *fops;
|
460 |
|
|
int minor;
|
461 |
|
|
|
462 |
|
|
struct semaphore serialize;
|
463 |
|
|
|
464 |
|
|
int (*ioctl)(struct usb_device *dev, unsigned int code, void *buf);
|
465 |
|
|
|
466 |
|
|
const struct usb_device_id *id_table;
|
467 |
|
|
};
|
468 |
|
|
|
469 |
|
|
/*----------------------------------------------------------------------------*
|
470 |
|
|
* New USB Structures *
|
471 |
|
|
*----------------------------------------------------------------------------*/
|
472 |
|
|
|
473 |
|
|
/*
|
474 |
|
|
* urb->transfer_flags:
|
475 |
|
|
*/
|
476 |
|
|
#define USB_DISABLE_SPD 0x0001
|
477 |
|
|
#define URB_SHORT_NOT_OK USB_DISABLE_SPD
|
478 |
|
|
#define USB_ISO_ASAP 0x0002
|
479 |
|
|
#define USB_ASYNC_UNLINK 0x0008
|
480 |
|
|
#define USB_QUEUE_BULK 0x0010
|
481 |
|
|
#define USB_NO_FSBR 0x0020
|
482 |
|
|
#define USB_ZERO_PACKET 0x0040 // Finish bulk OUTs always with zero length packet
|
483 |
|
|
#define URB_NO_INTERRUPT 0x0080 /* HINT: no non-error interrupt needed */
|
484 |
|
|
/* ... less overhead for QUEUE_BULK */
|
485 |
|
|
#define USB_TIMEOUT_KILLED 0x1000 // only set by HCD!
|
486 |
|
|
|
487 |
|
|
struct iso_packet_descriptor
|
488 |
|
|
{
|
489 |
|
|
unsigned int offset;
|
490 |
|
|
unsigned int length; // expected length
|
491 |
|
|
unsigned int actual_length;
|
492 |
|
|
unsigned int status;
|
493 |
|
|
};
|
494 |
|
|
|
495 |
|
|
#define usb_iso_packet_descriptor iso_packet_descriptor
|
496 |
|
|
|
497 |
|
|
struct urb;
|
498 |
|
|
typedef void (*usb_complete_t)(struct urb *);
|
499 |
|
|
|
500 |
|
|
struct urb
|
501 |
|
|
{
|
502 |
|
|
spinlock_t lock; // lock for the URB
|
503 |
|
|
void *hcpriv; // private data for host controller
|
504 |
|
|
struct list_head urb_list; // list pointer to all active urbs
|
505 |
|
|
struct urb *next; // pointer to next URB
|
506 |
|
|
struct usb_device *dev; // pointer to associated USB device
|
507 |
|
|
unsigned int pipe; // pipe information
|
508 |
|
|
int status; // returned status
|
509 |
|
|
unsigned int transfer_flags; // USB_DISABLE_SPD | USB_ISO_ASAP | etc.
|
510 |
|
|
void *transfer_buffer; // associated data buffer
|
511 |
|
|
dma_addr_t transfer_dma; // dma addr for transfer_buffer
|
512 |
|
|
int transfer_buffer_length; // data buffer length
|
513 |
|
|
int actual_length; // actual data buffer length
|
514 |
|
|
int bandwidth; // bandwidth for this transfer request (INT or ISO)
|
515 |
|
|
unsigned char *setup_packet; // setup packet (control only)
|
516 |
|
|
dma_addr_t setup_dma; // dma addr for setup_packet
|
517 |
|
|
//
|
518 |
|
|
int start_frame; // start frame (iso/irq only)
|
519 |
|
|
int number_of_packets; // number of packets in this request (iso)
|
520 |
|
|
int interval; // polling interval (irq only)
|
521 |
|
|
int error_count; // number of errors in this transfer (iso only)
|
522 |
|
|
int timeout; // timeout (in jiffies)
|
523 |
|
|
//
|
524 |
|
|
void *context; // context for completion routine
|
525 |
|
|
usb_complete_t complete; // pointer to completion routine
|
526 |
|
|
//
|
527 |
|
|
struct iso_packet_descriptor iso_frame_desc[0];
|
528 |
|
|
};
|
529 |
|
|
|
530 |
|
|
/**
|
531 |
|
|
* FILL_CONTROL_URB - macro to help initialize a control urb
|
532 |
|
|
* @URB: pointer to the urb to initialize.
|
533 |
|
|
* @DEV: pointer to the struct usb_device for this urb.
|
534 |
|
|
* @PIPE: the endpoint pipe
|
535 |
|
|
* @SETUP_PACKET: pointer to the setup_packet buffer
|
536 |
|
|
* @TRANSFER_BUFFER: pointer to the transfer buffer
|
537 |
|
|
* @BUFFER_LENGTH: length of the transfer buffer
|
538 |
|
|
* @COMPLETE: pointer to the usb_complete_t function
|
539 |
|
|
* @CONTEXT: what to set the urb context to.
|
540 |
|
|
*
|
541 |
|
|
* Initializes a control urb with the proper information needed to submit
|
542 |
|
|
* it to a device. This macro is depreciated, the usb_fill_control_urb()
|
543 |
|
|
* function should be used instead.
|
544 |
|
|
*/
|
545 |
|
|
#define FILL_CONTROL_URB(URB,DEV,PIPE,SETUP_PACKET,TRANSFER_BUFFER,BUFFER_LENGTH,COMPLETE,CONTEXT) \
|
546 |
|
|
do {\
|
547 |
|
|
spin_lock_init(&(URB)->lock);\
|
548 |
|
|
(URB)->dev=DEV;\
|
549 |
|
|
(URB)->pipe=PIPE;\
|
550 |
|
|
(URB)->setup_packet=SETUP_PACKET;\
|
551 |
|
|
(URB)->transfer_buffer=TRANSFER_BUFFER;\
|
552 |
|
|
(URB)->transfer_buffer_length=BUFFER_LENGTH;\
|
553 |
|
|
(URB)->complete=COMPLETE;\
|
554 |
|
|
(URB)->context=CONTEXT;\
|
555 |
|
|
} while (0)
|
556 |
|
|
|
557 |
|
|
/**
|
558 |
|
|
* FILL_BULK_URB - macro to help initialize a bulk urb
|
559 |
|
|
* @URB: pointer to the urb to initialize.
|
560 |
|
|
* @DEV: pointer to the struct usb_device for this urb.
|
561 |
|
|
* @PIPE: the endpoint pipe
|
562 |
|
|
* @TRANSFER_BUFFER: pointer to the transfer buffer
|
563 |
|
|
* @BUFFER_LENGTH: length of the transfer buffer
|
564 |
|
|
* @COMPLETE: pointer to the usb_complete_t function
|
565 |
|
|
* @CONTEXT: what to set the urb context to.
|
566 |
|
|
*
|
567 |
|
|
* Initializes a bulk urb with the proper information needed to submit it
|
568 |
|
|
* to a device. This macro is depreciated, the usb_fill_bulk_urb()
|
569 |
|
|
* function should be used instead.
|
570 |
|
|
*/
|
571 |
|
|
#define FILL_BULK_URB(URB,DEV,PIPE,TRANSFER_BUFFER,BUFFER_LENGTH,COMPLETE,CONTEXT) \
|
572 |
|
|
do {\
|
573 |
|
|
spin_lock_init(&(URB)->lock);\
|
574 |
|
|
(URB)->dev=DEV;\
|
575 |
|
|
(URB)->pipe=PIPE;\
|
576 |
|
|
(URB)->transfer_buffer=TRANSFER_BUFFER;\
|
577 |
|
|
(URB)->transfer_buffer_length=BUFFER_LENGTH;\
|
578 |
|
|
(URB)->complete=COMPLETE;\
|
579 |
|
|
(URB)->context=CONTEXT;\
|
580 |
|
|
} while (0)
|
581 |
|
|
|
582 |
|
|
/**
|
583 |
|
|
* FILL_INT_URB - macro to help initialize a interrupt urb
|
584 |
|
|
* @URB: pointer to the urb to initialize.
|
585 |
|
|
* @DEV: pointer to the struct usb_device for this urb.
|
586 |
|
|
* @PIPE: the endpoint pipe
|
587 |
|
|
* @TRANSFER_BUFFER: pointer to the transfer buffer
|
588 |
|
|
* @BUFFER_LENGTH: length of the transfer buffer
|
589 |
|
|
* @COMPLETE: pointer to the usb_complete_t function
|
590 |
|
|
* @CONTEXT: what to set the urb context to.
|
591 |
|
|
* @INTERVAL: what to set the urb interval to.
|
592 |
|
|
*
|
593 |
|
|
* Initializes a interrupt urb with the proper information needed to submit
|
594 |
|
|
* it to a device. This macro is depreciated, the usb_fill_int_urb()
|
595 |
|
|
* function should be used instead.
|
596 |
|
|
*/
|
597 |
|
|
#define FILL_INT_URB(URB,DEV,PIPE,TRANSFER_BUFFER,BUFFER_LENGTH,COMPLETE,CONTEXT,INTERVAL) \
|
598 |
|
|
do {\
|
599 |
|
|
spin_lock_init(&(URB)->lock);\
|
600 |
|
|
(URB)->dev=DEV;\
|
601 |
|
|
(URB)->pipe=PIPE;\
|
602 |
|
|
(URB)->transfer_buffer=TRANSFER_BUFFER;\
|
603 |
|
|
(URB)->transfer_buffer_length=BUFFER_LENGTH;\
|
604 |
|
|
(URB)->complete=COMPLETE;\
|
605 |
|
|
(URB)->context=CONTEXT;\
|
606 |
|
|
(URB)->interval=INTERVAL;\
|
607 |
|
|
(URB)->start_frame=-1;\
|
608 |
|
|
} while (0)
|
609 |
|
|
|
610 |
|
|
#define FILL_CONTROL_URB_TO(a,aa,b,c,d,e,f,g,h) \
|
611 |
|
|
do {\
|
612 |
|
|
spin_lock_init(&(a)->lock);\
|
613 |
|
|
(a)->dev=aa;\
|
614 |
|
|
(a)->pipe=b;\
|
615 |
|
|
(a)->setup_packet=c;\
|
616 |
|
|
(a)->transfer_buffer=d;\
|
617 |
|
|
(a)->transfer_buffer_length=e;\
|
618 |
|
|
(a)->complete=f;\
|
619 |
|
|
(a)->context=g;\
|
620 |
|
|
(a)->timeout=h;\
|
621 |
|
|
} while (0)
|
622 |
|
|
|
623 |
|
|
#define FILL_BULK_URB_TO(a,aa,b,c,d,e,f,g) \
|
624 |
|
|
do {\
|
625 |
|
|
spin_lock_init(&(a)->lock);\
|
626 |
|
|
(a)->dev=aa;\
|
627 |
|
|
(a)->pipe=b;\
|
628 |
|
|
(a)->transfer_buffer=c;\
|
629 |
|
|
(a)->transfer_buffer_length=d;\
|
630 |
|
|
(a)->complete=e;\
|
631 |
|
|
(a)->context=f;\
|
632 |
|
|
(a)->timeout=g;\
|
633 |
|
|
} while (0)
|
634 |
|
|
|
635 |
|
|
/**
|
636 |
|
|
* usb_fill_control_urb - initializes a control urb
|
637 |
|
|
* @urb: pointer to the urb to initialize.
|
638 |
|
|
* @dev: pointer to the struct usb_device for this urb.
|
639 |
|
|
* @pipe: the endpoint pipe
|
640 |
|
|
* @setup_packet: pointer to the setup_packet buffer
|
641 |
|
|
* @transfer_buffer: pointer to the transfer buffer
|
642 |
|
|
* @buffer_length: length of the transfer buffer
|
643 |
|
|
* @complete: pointer to the usb_complete_t function
|
644 |
|
|
* @context: what to set the urb context to.
|
645 |
|
|
*
|
646 |
|
|
* Initializes a control urb with the proper information needed to submit
|
647 |
|
|
* it to a device.
|
648 |
|
|
*/
|
649 |
|
|
static inline void usb_fill_control_urb (struct urb *urb,
|
650 |
|
|
struct usb_device *dev,
|
651 |
|
|
unsigned int pipe,
|
652 |
|
|
unsigned char *setup_packet,
|
653 |
|
|
void *transfer_buffer,
|
654 |
|
|
int buffer_length,
|
655 |
|
|
usb_complete_t complete,
|
656 |
|
|
void *context)
|
657 |
|
|
{
|
658 |
|
|
spin_lock_init(&urb->lock);
|
659 |
|
|
urb->dev = dev;
|
660 |
|
|
urb->pipe = pipe;
|
661 |
|
|
urb->setup_packet = setup_packet;
|
662 |
|
|
urb->transfer_buffer = transfer_buffer;
|
663 |
|
|
urb->transfer_buffer_length = buffer_length;
|
664 |
|
|
urb->complete = complete;
|
665 |
|
|
urb->context = context;
|
666 |
|
|
}
|
667 |
|
|
|
668 |
|
|
/**
|
669 |
|
|
* usb_fill_bulk_urb - macro to help initialize a bulk urb
|
670 |
|
|
* @urb: pointer to the urb to initialize.
|
671 |
|
|
* @dev: pointer to the struct usb_device for this urb.
|
672 |
|
|
* @pipe: the endpoint pipe
|
673 |
|
|
* @transfer_buffer: pointer to the transfer buffer
|
674 |
|
|
* @buffer_length: length of the transfer buffer
|
675 |
|
|
* @complete: pointer to the usb_complete_t function
|
676 |
|
|
* @context: what to set the urb context to.
|
677 |
|
|
*
|
678 |
|
|
* Initializes a bulk urb with the proper information needed to submit it
|
679 |
|
|
* to a device.
|
680 |
|
|
*/
|
681 |
|
|
static inline void usb_fill_bulk_urb (struct urb *urb,
|
682 |
|
|
struct usb_device *dev,
|
683 |
|
|
unsigned int pipe,
|
684 |
|
|
void *transfer_buffer,
|
685 |
|
|
int buffer_length,
|
686 |
|
|
usb_complete_t complete,
|
687 |
|
|
void *context)
|
688 |
|
|
|
689 |
|
|
{
|
690 |
|
|
spin_lock_init(&urb->lock);
|
691 |
|
|
urb->dev = dev;
|
692 |
|
|
urb->pipe = pipe;
|
693 |
|
|
urb->transfer_buffer = transfer_buffer;
|
694 |
|
|
urb->transfer_buffer_length = buffer_length;
|
695 |
|
|
urb->complete = complete;
|
696 |
|
|
urb->context = context;
|
697 |
|
|
}
|
698 |
|
|
|
699 |
|
|
/**
|
700 |
|
|
* usb_fill_int_urb - macro to help initialize a interrupt urb
|
701 |
|
|
* @urb: pointer to the urb to initialize.
|
702 |
|
|
* @dev: pointer to the struct usb_device for this urb.
|
703 |
|
|
* @pipe: the endpoint pipe
|
704 |
|
|
* @transfer_buffer: pointer to the transfer buffer
|
705 |
|
|
* @buffer_length: length of the transfer buffer
|
706 |
|
|
* @complete: pointer to the usb_complete_t function
|
707 |
|
|
* @context: what to set the urb context to.
|
708 |
|
|
* @interval: what to set the urb interval to.
|
709 |
|
|
*
|
710 |
|
|
* Initializes a interrupt urb with the proper information needed to submit
|
711 |
|
|
* it to a device.
|
712 |
|
|
*/
|
713 |
|
|
static inline void usb_fill_int_urb (struct urb *urb,
|
714 |
|
|
struct usb_device *dev,
|
715 |
|
|
unsigned int pipe,
|
716 |
|
|
void *transfer_buffer,
|
717 |
|
|
int buffer_length,
|
718 |
|
|
usb_complete_t complete,
|
719 |
|
|
void *context,
|
720 |
|
|
int interval)
|
721 |
|
|
{
|
722 |
|
|
spin_lock_init(&urb->lock);
|
723 |
|
|
urb->dev = dev;
|
724 |
|
|
urb->pipe = pipe;
|
725 |
|
|
urb->transfer_buffer = transfer_buffer;
|
726 |
|
|
urb->transfer_buffer_length = buffer_length;
|
727 |
|
|
urb->complete = complete;
|
728 |
|
|
urb->context = context;
|
729 |
|
|
urb->interval = interval;
|
730 |
|
|
urb->start_frame = -1;
|
731 |
|
|
}
|
732 |
|
|
|
733 |
|
|
struct urb *usb_alloc_urb(int iso_packets);
|
734 |
|
|
void usb_free_urb (struct urb *urb);
|
735 |
|
|
int usb_submit_urb(struct urb *urb);
|
736 |
|
|
int usb_unlink_urb(struct urb *urb);
|
737 |
|
|
int usb_internal_control_msg(struct usb_device *usb_dev, unsigned int pipe, struct usb_ctrlrequest *cmd, void *data, int len, int timeout);
|
738 |
|
|
int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length, int timeout);
|
739 |
|
|
|
740 |
|
|
/*-------------------------------------------------------------------*
|
741 |
|
|
* SYNCHRONOUS CALL SUPPORT *
|
742 |
|
|
*-------------------------------------------------------------------*/
|
743 |
|
|
|
744 |
|
|
struct usb_api_data
|
745 |
|
|
{
|
746 |
|
|
wait_queue_head_t wqh;
|
747 |
|
|
int done;
|
748 |
|
|
/* void* stuff; */ /* Possible extension later. */
|
749 |
|
|
};
|
750 |
|
|
|
751 |
|
|
/* -------------------------------------------------------------------------- */
|
752 |
|
|
|
753 |
|
|
struct usb_operations {
|
754 |
|
|
int (*allocate)(struct usb_device *);
|
755 |
|
|
int (*deallocate)(struct usb_device *);
|
756 |
|
|
int (*get_frame_number) (struct usb_device *usb_dev);
|
757 |
|
|
int (*submit_urb) (struct urb* purb);
|
758 |
|
|
int (*unlink_urb) (struct urb* purb);
|
759 |
|
|
};
|
760 |
|
|
|
761 |
|
|
#define DEVNUM_ROUND_ROBIN /***** OPTION *****/
|
762 |
|
|
|
763 |
|
|
/*
|
764 |
|
|
* Allocated per bus we have
|
765 |
|
|
*/
|
766 |
|
|
struct usb_bus {
|
767 |
|
|
int busnum; /* Bus number (in order of reg) */
|
768 |
|
|
char *bus_name; /* stable id (PCI slot_name etc) */
|
769 |
|
|
|
770 |
|
|
#ifdef DEVNUM_ROUND_ROBIN
|
771 |
|
|
int devnum_next; /* Next open device number in round-robin allocation */
|
772 |
|
|
#endif /* DEVNUM_ROUND_ROBIN */
|
773 |
|
|
|
774 |
|
|
struct usb_devmap devmap; /* Device map */
|
775 |
|
|
struct usb_operations *op; /* Operations (specific to the HC) */
|
776 |
|
|
struct usb_device *root_hub; /* Root hub */
|
777 |
|
|
struct list_head bus_list;
|
778 |
|
|
void *hcpriv; /* Host Controller private data */
|
779 |
|
|
|
780 |
|
|
int bandwidth_allocated; /* on this Host Controller; */
|
781 |
|
|
/* applies to Int. and Isoc. pipes; */
|
782 |
|
|
/* measured in microseconds/frame; */
|
783 |
|
|
/* range is 0..900, where 900 = */
|
784 |
|
|
/* 90% of a 1-millisecond frame */
|
785 |
|
|
int bandwidth_int_reqs; /* number of Interrupt requesters */
|
786 |
|
|
int bandwidth_isoc_reqs; /* number of Isoc. requesters */
|
787 |
|
|
|
788 |
|
|
/* usbdevfs inode list */
|
789 |
|
|
struct list_head inodes;
|
790 |
|
|
|
791 |
|
|
atomic_t refcnt;
|
792 |
|
|
};
|
793 |
|
|
|
794 |
|
|
/*
|
795 |
|
|
* As of USB 2.0, full/low speed devices are segregated into trees.
|
796 |
|
|
* One type grows from USB 1.1 host controllers (OHCI, UHCI etc).
|
797 |
|
|
* The other type grows from high speed hubs when they connect to
|
798 |
|
|
* full/low speed devices using "Transaction Translators" (TTs).
|
799 |
|
|
*
|
800 |
|
|
* TTs should only be known to the hub driver, and high speed bus
|
801 |
|
|
* drivers (only EHCI for now). They affect periodic scheduling and
|
802 |
|
|
* sometimes control/bulk error recovery.
|
803 |
|
|
*/
|
804 |
|
|
struct usb_tt {
|
805 |
|
|
struct usb_device *hub; /* upstream highspeed hub */
|
806 |
|
|
int multi; /* true means one TT per port */
|
807 |
|
|
};
|
808 |
|
|
|
809 |
|
|
|
810 |
|
|
/* This is arbitrary.
|
811 |
|
|
* From USB 2.0 spec Table 11-13, offset 7, a hub can
|
812 |
|
|
* have up to 255 ports. The most yet reported is 10.
|
813 |
|
|
*/
|
814 |
|
|
#define USB_MAXCHILDREN (16)
|
815 |
|
|
|
816 |
|
|
struct usb_device {
|
817 |
|
|
int devnum; /* Address on USB bus */
|
818 |
|
|
char devpath [16]; /* Use in messages: /port/port/... */
|
819 |
|
|
|
820 |
|
|
enum {
|
821 |
|
|
USB_SPEED_UNKNOWN = 0, /* enumerating */
|
822 |
|
|
USB_SPEED_LOW, USB_SPEED_FULL, /* usb 1.1 */
|
823 |
|
|
USB_SPEED_HIGH /* usb 2.0 */
|
824 |
|
|
} speed;
|
825 |
|
|
|
826 |
|
|
struct usb_tt *tt; /* low/full speed dev, highspeed hub */
|
827 |
|
|
int ttport; /* device port on that tt hub */
|
828 |
|
|
|
829 |
|
|
atomic_t refcnt; /* Reference count */
|
830 |
|
|
struct semaphore serialize;
|
831 |
|
|
|
832 |
|
|
unsigned int toggle[2]; /* one bit for each endpoint ([0] = IN, [1] = OUT) */
|
833 |
|
|
unsigned int halted[2]; /* endpoint halts; one bit per endpoint # & direction; */
|
834 |
|
|
/* [0] = IN, [1] = OUT */
|
835 |
|
|
int epmaxpacketin[16]; /* INput endpoint specific maximums */
|
836 |
|
|
int epmaxpacketout[16]; /* OUTput endpoint specific maximums */
|
837 |
|
|
|
838 |
|
|
struct usb_device *parent;
|
839 |
|
|
struct usb_bus *bus; /* Bus we're part of */
|
840 |
|
|
|
841 |
|
|
struct usb_device_descriptor descriptor;/* Descriptor */
|
842 |
|
|
struct usb_config_descriptor *config; /* All of the configs */
|
843 |
|
|
struct usb_config_descriptor *actconfig;/* the active configuration */
|
844 |
|
|
|
845 |
|
|
char **rawdescriptors; /* Raw descriptors for each config */
|
846 |
|
|
|
847 |
|
|
int have_langid; /* whether string_langid is valid yet */
|
848 |
|
|
int string_langid; /* language ID for strings */
|
849 |
|
|
|
850 |
|
|
void *hcpriv; /* Host Controller private data */
|
851 |
|
|
|
852 |
|
|
/* usbdevfs inode list */
|
853 |
|
|
struct list_head inodes;
|
854 |
|
|
struct list_head filelist;
|
855 |
|
|
|
856 |
|
|
/*
|
857 |
|
|
* Child devices - these can be either new devices
|
858 |
|
|
* (if this is a hub device), or different instances
|
859 |
|
|
* of this same device.
|
860 |
|
|
*
|
861 |
|
|
* Each instance needs its own set of data structures.
|
862 |
|
|
*/
|
863 |
|
|
|
864 |
|
|
int maxchild; /* Number of ports if hub */
|
865 |
|
|
struct usb_device *children[USB_MAXCHILDREN];
|
866 |
|
|
};
|
867 |
|
|
|
868 |
|
|
extern int usb_ifnum_to_ifpos(struct usb_device *dev, unsigned ifnum);
|
869 |
|
|
extern struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum);
|
870 |
|
|
extern struct usb_endpoint_descriptor *usb_epnum_to_ep_desc(struct usb_device *dev, unsigned epnum);
|
871 |
|
|
|
872 |
|
|
extern int usb_register(struct usb_driver *);
|
873 |
|
|
extern void usb_deregister(struct usb_driver *);
|
874 |
|
|
extern void usb_scan_devices(void);
|
875 |
|
|
|
876 |
|
|
/* used these for multi-interface device registration */
|
877 |
|
|
extern int usb_find_interface_driver_for_ifnum(struct usb_device *dev, unsigned int ifnum);
|
878 |
|
|
extern void usb_driver_claim_interface(struct usb_driver *driver, struct usb_interface *iface, void* priv);
|
879 |
|
|
extern int usb_interface_claimed(struct usb_interface *iface);
|
880 |
|
|
extern void usb_driver_release_interface(struct usb_driver *driver, struct usb_interface *iface);
|
881 |
|
|
const struct usb_device_id *usb_match_id(struct usb_device *dev,
|
882 |
|
|
struct usb_interface *interface,
|
883 |
|
|
const struct usb_device_id *id);
|
884 |
|
|
|
885 |
|
|
extern struct usb_bus *usb_alloc_bus(struct usb_operations *);
|
886 |
|
|
extern void usb_free_bus(struct usb_bus *);
|
887 |
|
|
extern void usb_register_bus(struct usb_bus *);
|
888 |
|
|
extern void usb_deregister_bus(struct usb_bus *);
|
889 |
|
|
|
890 |
|
|
extern struct usb_device *usb_alloc_dev(struct usb_device *parent, struct usb_bus *);
|
891 |
|
|
extern void usb_free_dev(struct usb_device *);
|
892 |
|
|
extern void usb_inc_dev_use(struct usb_device *);
|
893 |
|
|
#define usb_dec_dev_use usb_free_dev
|
894 |
|
|
|
895 |
|
|
extern int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype, __u16 value, __u16 index, void *data, __u16 size, int timeout);
|
896 |
|
|
|
897 |
|
|
extern int usb_root_hub_string(int id, int serial, char *type, __u8 *data, int len);
|
898 |
|
|
extern void usb_connect(struct usb_device *dev);
|
899 |
|
|
extern void usb_disconnect(struct usb_device **);
|
900 |
|
|
|
901 |
|
|
extern void usb_destroy_configuration(struct usb_device *dev);
|
902 |
|
|
|
903 |
|
|
int usb_get_current_frame_number (struct usb_device *usb_dev);
|
904 |
|
|
|
905 |
|
|
|
906 |
|
|
/**
|
907 |
|
|
* usb_make_path - returns stable device path in the usb tree
|
908 |
|
|
* @dev: the device whose path is being constructed
|
909 |
|
|
* @buf: where to put the string
|
910 |
|
|
* @size: how big is "buf"?
|
911 |
|
|
*
|
912 |
|
|
* Returns length of the string (> 0) or negative if size was too small.
|
913 |
|
|
*
|
914 |
|
|
* This identifier is intended to be "stable", reflecting physical paths in
|
915 |
|
|
* hardware such as physical bus addresses for host controllers or ports on
|
916 |
|
|
* USB hubs. That makes it stay the same until systems are physically
|
917 |
|
|
* reconfigured, by re-cabling a tree of USB devices or by moving USB host
|
918 |
|
|
* controllers. Adding and removing devices, including virtual root hubs
|
919 |
|
|
* in host controller driver modules, does not change these path identifers;
|
920 |
|
|
* neither does rebooting or re-enumerating. These are more useful identifiers
|
921 |
|
|
* than changeable ("unstable") ones like bus numbers or device addresses.
|
922 |
|
|
* (The stability of the id depends on stability of the bus_name associated
|
923 |
|
|
* with the bus the device uses; that is normally stable.)
|
924 |
|
|
*
|
925 |
|
|
* With a partial exception for devices connected to USB 2.0 root hubs, these
|
926 |
|
|
* identifiers are also predictable. So long as the device tree isn't changed,
|
927 |
|
|
* plugging any USB device into a given hub port always gives it the same path.
|
928 |
|
|
* Because of the use of "companion" controllers, devices connected to ports on
|
929 |
|
|
* USB 2.0 root hubs (EHCI host controllers) will get one path ID if they are
|
930 |
|
|
* high speed, and a different one if they are full or low speed.
|
931 |
|
|
*/
|
932 |
|
|
static inline int usb_make_path (struct usb_device *dev, char *buf, size_t size)
|
933 |
|
|
{
|
934 |
|
|
int actual;
|
935 |
|
|
actual = snprintf (buf, size, "usb-%s-%s",
|
936 |
|
|
dev->bus->bus_name, dev->devpath);
|
937 |
|
|
return (actual >= size) ? -1 : actual;
|
938 |
|
|
}
|
939 |
|
|
|
940 |
|
|
|
941 |
|
|
/*
|
942 |
|
|
* Calling this entity a "pipe" is glorifying it. A USB pipe
|
943 |
|
|
* is something embarrassingly simple: it basically consists
|
944 |
|
|
* of the following information:
|
945 |
|
|
* - device number (7 bits)
|
946 |
|
|
* - endpoint number (4 bits)
|
947 |
|
|
* - current Data0/1 state (1 bit)
|
948 |
|
|
* - direction (1 bit)
|
949 |
|
|
* - speed (1 bit)
|
950 |
|
|
* - max packet size (2 bits: 8, 16, 32 or 64) [Historical; now gone.]
|
951 |
|
|
* - pipe type (2 bits: control, interrupt, bulk, isochronous)
|
952 |
|
|
*
|
953 |
|
|
* That's 18 bits. Really. Nothing more. And the USB people have
|
954 |
|
|
* documented these eighteen bits as some kind of glorious
|
955 |
|
|
* virtual data structure.
|
956 |
|
|
*
|
957 |
|
|
* Let's not fall in that trap. We'll just encode it as a simple
|
958 |
|
|
* unsigned int. The encoding is:
|
959 |
|
|
*
|
960 |
|
|
* - max size: bits 0-1 (00 = 8, 01 = 16, 10 = 32, 11 = 64) [Historical; now gone.]
|
961 |
|
|
* - direction: bit 7 (0 = Host-to-Device [Out], 1 = Device-to-Host [In])
|
962 |
|
|
* - device: bits 8-14
|
963 |
|
|
* - endpoint: bits 15-18
|
964 |
|
|
* - Data0/1: bit 19
|
965 |
|
|
* - speed: bit 26 (0 = Full, 1 = Low Speed)
|
966 |
|
|
* - pipe type: bits 30-31 (00 = isochronous, 01 = interrupt, 10 = control, 11 = bulk)
|
967 |
|
|
*
|
968 |
|
|
* Why? Because it's arbitrary, and whatever encoding we select is really
|
969 |
|
|
* up to us. This one happens to share a lot of bit positions with the UHCI
|
970 |
|
|
* specification, so that much of the uhci driver can just mask the bits
|
971 |
|
|
* appropriately.
|
972 |
|
|
*
|
973 |
|
|
* NOTE: there's no encoding (yet?) for a "high speed" endpoint; treat them
|
974 |
|
|
* like full speed devices.
|
975 |
|
|
*/
|
976 |
|
|
|
977 |
|
|
#define PIPE_ISOCHRONOUS 0
|
978 |
|
|
#define PIPE_INTERRUPT 1
|
979 |
|
|
#define PIPE_CONTROL 2
|
980 |
|
|
#define PIPE_BULK 3
|
981 |
|
|
|
982 |
|
|
#define usb_maxpacket(dev, pipe, out) (out \
|
983 |
|
|
? (dev)->epmaxpacketout[usb_pipeendpoint(pipe)] \
|
984 |
|
|
: (dev)->epmaxpacketin [usb_pipeendpoint(pipe)] )
|
985 |
|
|
#define usb_packetid(pipe) (((pipe) & USB_DIR_IN) ? USB_PID_IN : USB_PID_OUT)
|
986 |
|
|
|
987 |
|
|
#define usb_pipeout(pipe) ((((pipe) >> 7) & 1) ^ 1)
|
988 |
|
|
#define usb_pipein(pipe) (((pipe) >> 7) & 1)
|
989 |
|
|
#define usb_pipedevice(pipe) (((pipe) >> 8) & 0x7f)
|
990 |
|
|
#define usb_pipe_endpdev(pipe) (((pipe) >> 8) & 0x7ff)
|
991 |
|
|
#define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf)
|
992 |
|
|
#define usb_pipedata(pipe) (((pipe) >> 19) & 1)
|
993 |
|
|
#define usb_pipeslow(pipe) (((pipe) >> 26) & 1)
|
994 |
|
|
#define usb_pipetype(pipe) (((pipe) >> 30) & 3)
|
995 |
|
|
#define usb_pipeisoc(pipe) (usb_pipetype((pipe)) == PIPE_ISOCHRONOUS)
|
996 |
|
|
#define usb_pipeint(pipe) (usb_pipetype((pipe)) == PIPE_INTERRUPT)
|
997 |
|
|
#define usb_pipecontrol(pipe) (usb_pipetype((pipe)) == PIPE_CONTROL)
|
998 |
|
|
#define usb_pipebulk(pipe) (usb_pipetype((pipe)) == PIPE_BULK)
|
999 |
|
|
|
1000 |
|
|
#define PIPE_DEVEP_MASK 0x0007ff00
|
1001 |
|
|
|
1002 |
|
|
/* The D0/D1 toggle bits */
|
1003 |
|
|
#define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> (ep)) & 1)
|
1004 |
|
|
#define usb_dotoggle(dev, ep, out) ((dev)->toggle[out] ^= (1 << (ep)))
|
1005 |
|
|
static inline void usb_settoggle(struct usb_device *dev,
|
1006 |
|
|
unsigned int ep,
|
1007 |
|
|
unsigned int out,
|
1008 |
|
|
int bit)
|
1009 |
|
|
{
|
1010 |
|
|
dev->toggle[out] &= ~(1 << ep);
|
1011 |
|
|
dev->toggle[out] |= bit << ep;
|
1012 |
|
|
}
|
1013 |
|
|
|
1014 |
|
|
/* Endpoint halt control/status */
|
1015 |
|
|
#define usb_endpoint_out(ep_dir) (((ep_dir >> 7) & 1) ^ 1)
|
1016 |
|
|
#define usb_endpoint_halt(dev, ep, out) ((dev)->halted[out] |= (1 << (ep)))
|
1017 |
|
|
#define usb_endpoint_running(dev, ep, out) ((dev)->halted[out] &= ~(1 << (ep)))
|
1018 |
|
|
#define usb_endpoint_halted(dev, ep, out) ((dev)->halted[out] & (1 << (ep)))
|
1019 |
|
|
|
1020 |
|
|
static inline unsigned int __create_pipe(struct usb_device *dev, unsigned int endpoint)
|
1021 |
|
|
{
|
1022 |
|
|
return (dev->devnum << 8) | (endpoint << 15) |
|
1023 |
|
|
((dev->speed == USB_SPEED_LOW) << 26);
|
1024 |
|
|
}
|
1025 |
|
|
|
1026 |
|
|
static inline unsigned int __default_pipe(struct usb_device *dev)
|
1027 |
|
|
{
|
1028 |
|
|
return ((dev->speed == USB_SPEED_LOW) << 26);
|
1029 |
|
|
}
|
1030 |
|
|
|
1031 |
|
|
/* Create various pipes... */
|
1032 |
|
|
#define usb_sndctrlpipe(dev,endpoint) ((PIPE_CONTROL << 30) | __create_pipe(dev,endpoint))
|
1033 |
|
|
#define usb_rcvctrlpipe(dev,endpoint) ((PIPE_CONTROL << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)
|
1034 |
|
|
#define usb_sndisocpipe(dev,endpoint) ((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev,endpoint))
|
1035 |
|
|
#define usb_rcvisocpipe(dev,endpoint) ((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)
|
1036 |
|
|
#define usb_sndbulkpipe(dev,endpoint) ((PIPE_BULK << 30) | __create_pipe(dev,endpoint))
|
1037 |
|
|
#define usb_rcvbulkpipe(dev,endpoint) ((PIPE_BULK << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)
|
1038 |
|
|
#define usb_sndintpipe(dev,endpoint) ((PIPE_INTERRUPT << 30) | __create_pipe(dev,endpoint))
|
1039 |
|
|
#define usb_rcvintpipe(dev,endpoint) ((PIPE_INTERRUPT << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)
|
1040 |
|
|
#define usb_snddefctrl(dev) ((PIPE_CONTROL << 30) | __default_pipe(dev))
|
1041 |
|
|
#define usb_rcvdefctrl(dev) ((PIPE_CONTROL << 30) | __default_pipe(dev) | USB_DIR_IN)
|
1042 |
|
|
|
1043 |
|
|
/*
|
1044 |
|
|
* Send and receive control messages..
|
1045 |
|
|
*/
|
1046 |
|
|
int usb_new_device(struct usb_device *dev);
|
1047 |
|
|
int usb_reset_device(struct usb_device *dev);
|
1048 |
|
|
int usb_set_address(struct usb_device *dev);
|
1049 |
|
|
int usb_get_descriptor(struct usb_device *dev, unsigned char desctype,
|
1050 |
|
|
unsigned char descindex, void *buf, int size);
|
1051 |
|
|
int usb_get_class_descriptor(struct usb_device *dev, int ifnum, unsigned char desctype,
|
1052 |
|
|
unsigned char descindex, void *buf, int size);
|
1053 |
|
|
int usb_get_device_descriptor(struct usb_device *dev);
|
1054 |
|
|
int __usb_get_extra_descriptor(char *buffer, unsigned size, unsigned char type, void **ptr);
|
1055 |
|
|
int usb_get_status(struct usb_device *dev, int type, int target, void *data);
|
1056 |
|
|
int usb_get_configuration(struct usb_device *dev);
|
1057 |
|
|
int usb_get_protocol(struct usb_device *dev, int ifnum);
|
1058 |
|
|
int usb_set_protocol(struct usb_device *dev, int ifnum, int protocol);
|
1059 |
|
|
int usb_set_interface(struct usb_device *dev, int ifnum, int alternate);
|
1060 |
|
|
int usb_set_idle(struct usb_device *dev, int ifnum, int duration, int report_id);
|
1061 |
|
|
int usb_set_configuration(struct usb_device *dev, int configuration);
|
1062 |
|
|
int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type,
|
1063 |
|
|
unsigned char id, void *buf, int size);
|
1064 |
|
|
int usb_set_report(struct usb_device *dev, int ifnum, unsigned char type,
|
1065 |
|
|
unsigned char id, void *buf, int size);
|
1066 |
|
|
int usb_string(struct usb_device *dev, int index, char *buf, size_t size);
|
1067 |
|
|
int usb_clear_halt(struct usb_device *dev, int pipe);
|
1068 |
|
|
void usb_set_maxpacket(struct usb_device *dev);
|
1069 |
|
|
|
1070 |
|
|
#define usb_get_extra_descriptor(ifpoint,type,ptr)\
|
1071 |
|
|
__usb_get_extra_descriptor((ifpoint)->extra,(ifpoint)->extralen,type,(void**)ptr)
|
1072 |
|
|
|
1073 |
|
|
/*
|
1074 |
|
|
* Debugging helpers..
|
1075 |
|
|
*/
|
1076 |
|
|
void usb_show_device_descriptor(struct usb_device_descriptor *);
|
1077 |
|
|
void usb_show_config_descriptor(struct usb_config_descriptor *);
|
1078 |
|
|
void usb_show_interface_descriptor(struct usb_interface_descriptor *);
|
1079 |
|
|
void usb_show_endpoint_descriptor(struct usb_endpoint_descriptor *);
|
1080 |
|
|
void usb_show_device(struct usb_device *);
|
1081 |
|
|
void usb_show_string(struct usb_device *dev, char *id, int index);
|
1082 |
|
|
|
1083 |
|
|
#ifdef DEBUG
|
1084 |
|
|
#define dbg(format, arg...) printk(KERN_DEBUG __FILE__ ": " format "\n" , ## arg)
|
1085 |
|
|
#else
|
1086 |
|
|
#define dbg(format, arg...) do {} while (0)
|
1087 |
|
|
#endif
|
1088 |
|
|
#define err(format, arg...) printk(KERN_ERR __FILE__ ": " format "\n" , ## arg)
|
1089 |
|
|
#define info(format, arg...) printk(KERN_INFO __FILE__ ": " format "\n" , ## arg)
|
1090 |
|
|
#define warn(format, arg...) printk(KERN_WARNING __FILE__ ": " format "\n" , ## arg)
|
1091 |
|
|
|
1092 |
|
|
|
1093 |
|
|
/*
|
1094 |
|
|
* bus and driver list
|
1095 |
|
|
*/
|
1096 |
|
|
|
1097 |
|
|
extern struct list_head usb_driver_list;
|
1098 |
|
|
extern struct list_head usb_bus_list;
|
1099 |
|
|
extern struct semaphore usb_bus_list_lock;
|
1100 |
|
|
|
1101 |
|
|
/*
|
1102 |
|
|
* USB device fs stuff
|
1103 |
|
|
*/
|
1104 |
|
|
|
1105 |
|
|
#ifdef CONFIG_USB_DEVICEFS
|
1106 |
|
|
|
1107 |
|
|
/*
|
1108 |
|
|
* these are expected to be called from the USB core/hub thread
|
1109 |
|
|
* with the kernel lock held
|
1110 |
|
|
*/
|
1111 |
|
|
extern void usbdevfs_add_bus(struct usb_bus *bus);
|
1112 |
|
|
extern void usbdevfs_remove_bus(struct usb_bus *bus);
|
1113 |
|
|
extern void usbdevfs_add_device(struct usb_device *dev);
|
1114 |
|
|
extern void usbdevfs_remove_device(struct usb_device *dev);
|
1115 |
|
|
|
1116 |
|
|
extern int usbdevfs_init(void);
|
1117 |
|
|
extern void usbdevfs_cleanup(void);
|
1118 |
|
|
|
1119 |
|
|
#else /* CONFIG_USB_DEVICEFS */
|
1120 |
|
|
|
1121 |
|
|
static inline void usbdevfs_add_bus(struct usb_bus *bus) {}
|
1122 |
|
|
static inline void usbdevfs_remove_bus(struct usb_bus *bus) {}
|
1123 |
|
|
static inline void usbdevfs_add_device(struct usb_device *dev) {}
|
1124 |
|
|
static inline void usbdevfs_remove_device(struct usb_device *dev) {}
|
1125 |
|
|
|
1126 |
|
|
static inline int usbdevfs_init(void) { return 0; }
|
1127 |
|
|
static inline void usbdevfs_cleanup(void) { }
|
1128 |
|
|
|
1129 |
|
|
#endif /* CONFIG_USB_DEVICEFS */
|
1130 |
|
|
|
1131 |
|
|
#endif /* __KERNEL__ */
|
1132 |
|
|
|
1133 |
|
|
#endif
|