Annotation of sys/dev/usb/usb.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: usb.h,v 1.29 2007/07/27 09:16:09 mbalmer Exp $ */
2: /* $NetBSD: usb.h,v 1.69 2002/09/22 23:20:50 augustss Exp $ */
3: /* $FreeBSD: src/sys/dev/usb/usb.h,v 1.14 1999/11/17 22:33:46 n_hibma Exp $ */
4:
5: /*
6: * Copyright (c) 1998 The NetBSD Foundation, Inc.
7: * All rights reserved.
8: *
9: * This code is derived from software contributed to The NetBSD Foundation
10: * by Lennart Augustsson (lennart@augustsson.net) at
11: * Carlstedt Research & Technology.
12: *
13: * Redistribution and use in source and binary forms, with or without
14: * modification, are permitted provided that the following conditions
15: * are met:
16: * 1. Redistributions of source code must retain the above copyright
17: * notice, this list of conditions and the following disclaimer.
18: * 2. Redistributions in binary form must reproduce the above copyright
19: * notice, this list of conditions and the following disclaimer in the
20: * documentation and/or other materials provided with the distribution.
21: * 3. All advertising materials mentioning features or use of this software
22: * must display the following acknowledgement:
23: * This product includes software developed by the NetBSD
24: * Foundation, Inc. and its contributors.
25: * 4. Neither the name of The NetBSD Foundation nor the names of its
26: * contributors may be used to endorse or promote products derived
27: * from this software without specific prior written permission.
28: *
29: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
30: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
31: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
32: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
33: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
34: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
35: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
36: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
37: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39: * POSSIBILITY OF SUCH DAMAGE.
40: */
41:
42:
43: #ifndef _USB_H_
44: #define _USB_H_
45:
46: #include <sys/types.h>
47: #include <sys/time.h>
48:
49: #include <sys/ioctl.h>
50:
51: #define USB_STACK_VERSION 2
52:
53: #define USB_MAX_DEVICES 128
54: #define USB_START_ADDR 0
55:
56: #define USB_CONTROL_ENDPOINT 0
57: #define USB_MAX_ENDPOINTS 16
58:
59: #define USB_FRAMES_PER_SECOND 1000
60:
61: /*
62: * The USB records contain some unaligned little-endian word
63: * components. The U[SG]ETW macros take care of both the alignment
64: * and endian problem and should always be used to access non-byte
65: * values.
66: */
67: typedef u_int8_t uByte;
68: typedef u_int8_t uWord[2];
69: typedef u_int8_t uDWord[4];
70:
71: #define USETW2(w,h,l) ((w)[0] = (u_int8_t)(l), (w)[1] = (u_int8_t)(h))
72:
73: #if defined(__STRICT_ALIGNMENT) || _BYTE_ORDER != _LITTLE_ENDIAN
74: #define UGETW(w) ((w)[0] | ((w)[1] << 8))
75: #define USETW(w,v) ((w)[0] = (u_int8_t)(v), (w)[1] = (u_int8_t)((v) >> 8))
76: #define UGETDW(w) ((w)[0] | ((w)[1] << 8) | ((w)[2] << 16) | ((w)[3] << 24))
77: #define USETDW(w,v) ((w)[0] = (u_int8_t)(v), \
78: (w)[1] = (u_int8_t)((v) >> 8), \
79: (w)[2] = (u_int8_t)((v) >> 16), \
80: (w)[3] = (u_int8_t)((v) >> 24))
81: #else
82: /*
83: * On little-endian machines that can handle unaligned accesses
84: * (e.g. i386) these macros can be replaced by the following.
85: */
86: #define UGETW(w) (*(u_int16_t *)(w))
87: #define USETW(w,v) (*(u_int16_t *)(w) = (v))
88: #define UGETDW(w) (*(u_int32_t *)(w))
89: #define USETDW(w,v) (*(u_int32_t *)(w) = (v))
90: #endif
91:
92: typedef struct {
93: uByte bmRequestType;
94: uByte bRequest;
95: uWord wValue;
96: uWord wIndex;
97: uWord wLength;
98: } __packed usb_device_request_t;
99:
100: #define UT_WRITE 0x00
101: #define UT_READ 0x80
102: #define UT_STANDARD 0x00
103: #define UT_CLASS 0x20
104: #define UT_VENDOR 0x40
105: #define UT_DEVICE 0x00
106: #define UT_INTERFACE 0x01
107: #define UT_ENDPOINT 0x02
108: #define UT_OTHER 0x03
109:
110: #define UT_READ_DEVICE (UT_READ | UT_STANDARD | UT_DEVICE)
111: #define UT_READ_INTERFACE (UT_READ | UT_STANDARD | UT_INTERFACE)
112: #define UT_READ_ENDPOINT (UT_READ | UT_STANDARD | UT_ENDPOINT)
113: #define UT_WRITE_DEVICE (UT_WRITE | UT_STANDARD | UT_DEVICE)
114: #define UT_WRITE_INTERFACE (UT_WRITE | UT_STANDARD | UT_INTERFACE)
115: #define UT_WRITE_ENDPOINT (UT_WRITE | UT_STANDARD | UT_ENDPOINT)
116: #define UT_READ_CLASS_DEVICE (UT_READ | UT_CLASS | UT_DEVICE)
117: #define UT_READ_CLASS_INTERFACE (UT_READ | UT_CLASS | UT_INTERFACE)
118: #define UT_READ_CLASS_OTHER (UT_READ | UT_CLASS | UT_OTHER)
119: #define UT_READ_CLASS_ENDPOINT (UT_READ | UT_CLASS | UT_ENDPOINT)
120: #define UT_WRITE_CLASS_DEVICE (UT_WRITE | UT_CLASS | UT_DEVICE)
121: #define UT_WRITE_CLASS_INTERFACE (UT_WRITE | UT_CLASS | UT_INTERFACE)
122: #define UT_WRITE_CLASS_OTHER (UT_WRITE | UT_CLASS | UT_OTHER)
123: #define UT_WRITE_CLASS_ENDPOINT (UT_WRITE | UT_CLASS | UT_ENDPOINT)
124: #define UT_READ_VENDOR_DEVICE (UT_READ | UT_VENDOR | UT_DEVICE)
125: #define UT_READ_VENDOR_INTERFACE (UT_READ | UT_VENDOR | UT_INTERFACE)
126: #define UT_READ_VENDOR_OTHER (UT_READ | UT_VENDOR | UT_OTHER)
127: #define UT_READ_VENDOR_ENDPOINT (UT_READ | UT_VENDOR | UT_ENDPOINT)
128: #define UT_WRITE_VENDOR_DEVICE (UT_WRITE | UT_VENDOR | UT_DEVICE)
129: #define UT_WRITE_VENDOR_INTERFACE (UT_WRITE | UT_VENDOR | UT_INTERFACE)
130: #define UT_WRITE_VENDOR_OTHER (UT_WRITE | UT_VENDOR | UT_OTHER)
131: #define UT_WRITE_VENDOR_ENDPOINT (UT_WRITE | UT_VENDOR | UT_ENDPOINT)
132:
133: /* Requests */
134: #define UR_GET_STATUS 0x00
135: #define UR_CLEAR_FEATURE 0x01
136: #define UR_SET_FEATURE 0x03
137: #define UR_SET_ADDRESS 0x05
138: #define UR_GET_DESCRIPTOR 0x06
139: #define UDESC_DEVICE 0x01
140: #define UDESC_CONFIG 0x02
141: #define UDESC_STRING 0x03
142: #define UDESC_INTERFACE 0x04
143: #define UDESC_ENDPOINT 0x05
144: #define UDESC_DEVICE_QUALIFIER 0x06
145: #define UDESC_OTHER_SPEED_CONFIGURATION 0x07
146: #define UDESC_INTERFACE_POWER 0x08
147: #define UDESC_OTG 0x09
148: #define UDESC_CS_DEVICE 0x21 /* class specific */
149: #define UDESC_CS_CONFIG 0x22
150: #define UDESC_CS_STRING 0x23
151: #define UDESC_CS_INTERFACE 0x24
152: #define UDESC_CS_ENDPOINT 0x25
153: #define UDESC_HUB 0x29
154: #define UR_SET_DESCRIPTOR 0x07
155: #define UR_GET_CONFIG 0x08
156: #define UR_SET_CONFIG 0x09
157: #define UR_GET_INTERFACE 0x0a
158: #define UR_SET_INTERFACE 0x0b
159: #define UR_SYNCH_FRAME 0x0c
160:
161: /* Feature numbers */
162: #define UF_ENDPOINT_HALT 0
163: #define UF_DEVICE_REMOTE_WAKEUP 1
164: #define UF_TEST_MODE 2
165:
166: #define USB_MAX_IPACKET 8 /* maximum size of the initial packet */
167:
168: #define USB_2_MAX_CTRL_PACKET 64
169: #define USB_2_MAX_BULK_PACKET 512
170:
171: typedef struct {
172: uByte bLength;
173: uByte bDescriptorType;
174: uByte bDescriptorSubtype;
175: } __packed usb_descriptor_t;
176:
177: typedef struct {
178: uByte bLength;
179: uByte bDescriptorType;
180: uWord bcdUSB;
181: #define UD_USB_2_0 0x0200
182: #define UD_IS_USB2(d) (UGETW((d)->bcdUSB) >= UD_USB_2_0)
183: uByte bDeviceClass;
184: uByte bDeviceSubClass;
185: uByte bDeviceProtocol;
186: uByte bMaxPacketSize;
187: /* The fields below are not part of the initial descriptor. */
188: uWord idVendor;
189: uWord idProduct;
190: uWord bcdDevice;
191: uByte iManufacturer;
192: uByte iProduct;
193: uByte iSerialNumber;
194: uByte bNumConfigurations;
195: } __packed usb_device_descriptor_t;
196: #define USB_DEVICE_DESCRIPTOR_SIZE 18
197:
198: typedef struct {
199: uByte bLength;
200: uByte bDescriptorType;
201: uWord wTotalLength;
202: uByte bNumInterface;
203: uByte bConfigurationValue;
204: uByte iConfiguration;
205: uByte bmAttributes;
206: #define UC_BUS_POWERED 0x80
207: #define UC_SELF_POWERED 0x40
208: #define UC_REMOTE_WAKEUP 0x20
209: uByte bMaxPower; /* max current in 2 mA units */
210: #define UC_POWER_FACTOR 2
211: } __packed usb_config_descriptor_t;
212: #define USB_CONFIG_DESCRIPTOR_SIZE 9
213:
214: typedef struct {
215: uByte bLength;
216: uByte bDescriptorType;
217: uByte bInterfaceNumber;
218: uByte bAlternateSetting;
219: uByte bNumEndpoints;
220: uByte bInterfaceClass;
221: uByte bInterfaceSubClass;
222: uByte bInterfaceProtocol;
223: uByte iInterface;
224: } __packed usb_interface_descriptor_t;
225: #define USB_INTERFACE_DESCRIPTOR_SIZE 9
226:
227: typedef struct {
228: uByte bLength;
229: uByte bDescriptorType;
230: uByte bEndpointAddress;
231: #define UE_GET_DIR(a) ((a) & 0x80)
232: #define UE_SET_DIR(a,d) ((a) | (((d)&1) << 7))
233: #define UE_DIR_IN 0x80
234: #define UE_DIR_OUT 0x00
235: #define UE_ADDR 0x0f
236: #define UE_GET_ADDR(a) ((a) & UE_ADDR)
237: uByte bmAttributes;
238: #define UE_XFERTYPE 0x03
239: #define UE_CONTROL 0x00
240: #define UE_ISOCHRONOUS 0x01
241: #define UE_BULK 0x02
242: #define UE_INTERRUPT 0x03
243: #define UE_GET_XFERTYPE(a) ((a) & UE_XFERTYPE)
244: #define UE_ISO_TYPE 0x0c
245: #define UE_ISO_ASYNC 0x04
246: #define UE_ISO_ADAPT 0x08
247: #define UE_ISO_SYNC 0x0c
248: #define UE_GET_ISO_TYPE(a) ((a) & UE_ISO_TYPE)
249: uWord wMaxPacketSize;
250: uByte bInterval;
251: } __packed usb_endpoint_descriptor_t;
252: #define USB_ENDPOINT_DESCRIPTOR_SIZE 7
253:
254: /*
255: * Note: The length of the USB string descriptor is stored in a one byte
256: * value and can therefore be no longer than 255 bytes. Two bytes are
257: * used for the length itself and the descriptor type, a theoretical maximum
258: * of 253 bytes is left for the actual string data. Since the strings are
259: * encoded as 2-byte unicode characters, only 252 bytes or 126 two-byte
260: * characters can be used. USB_MAX_STRING_LEN is defined as 127, leaving
261: * space for the terminal '\0' character in C strings.
262: */
263: typedef struct {
264: uByte bLength;
265: uByte bDescriptorType;
266: uWord bString[126];
267: } __packed usb_string_descriptor_t;
268: #define USB_MAX_STRING_LEN 127
269: #define USB_LANGUAGE_TABLE 0 /* # of the string language id table */
270:
271: /* Hub specific request */
272: #define UR_GET_BUS_STATE 0x02
273: #define UR_CLEAR_TT_BUFFER 0x08
274: #define UR_RESET_TT 0x09
275: #define UR_GET_TT_STATE 0x0a
276: #define UR_STOP_TT 0x0b
277:
278: /* Hub features */
279: #define UHF_C_HUB_LOCAL_POWER 0
280: #define UHF_C_HUB_OVER_CURRENT 1
281: #define UHF_PORT_CONNECTION 0
282: #define UHF_PORT_ENABLE 1
283: #define UHF_PORT_SUSPEND 2
284: #define UHF_PORT_OVER_CURRENT 3
285: #define UHF_PORT_RESET 4
286: #define UHF_PORT_POWER 8
287: #define UHF_PORT_LOW_SPEED 9
288: #define UHF_C_PORT_CONNECTION 16
289: #define UHF_C_PORT_ENABLE 17
290: #define UHF_C_PORT_SUSPEND 18
291: #define UHF_C_PORT_OVER_CURRENT 19
292: #define UHF_C_PORT_RESET 20
293: #define UHF_PORT_TEST 21
294: #define UHF_PORT_INDICATOR 22
295:
296: typedef struct {
297: uByte bDescLength;
298: uByte bDescriptorType;
299: uByte bNbrPorts;
300: uWord wHubCharacteristics;
301: #define UHD_PWR 0x0003
302: #define UHD_PWR_GANGED 0x0000
303: #define UHD_PWR_INDIVIDUAL 0x0001
304: #define UHD_PWR_NO_SWITCH 0x0002
305: #define UHD_COMPOUND 0x0004
306: #define UHD_OC 0x0018
307: #define UHD_OC_GLOBAL 0x0000
308: #define UHD_OC_INDIVIDUAL 0x0008
309: #define UHD_OC_NONE 0x0010
310: #define UHD_TT_THINK 0x0060
311: #define UHD_TT_THINK_8 0x0000
312: #define UHD_TT_THINK_16 0x0020
313: #define UHD_TT_THINK_24 0x0040
314: #define UHD_TT_THINK_32 0x0060
315: #define UHD_PORT_IND 0x0080
316: uByte bPwrOn2PwrGood; /* delay in 2 ms units */
317: #define UHD_PWRON_FACTOR 2
318: uByte bHubContrCurrent;
319: uByte DeviceRemovable[32]; /* max 255 ports */
320: #define UHD_NOT_REMOV(desc, i) \
321: (((desc)->DeviceRemovable[(i)/8] >> ((i) % 8)) & 1)
322: /* deprecated */ uByte PortPowerCtrlMask[1];
323: } __packed usb_hub_descriptor_t;
324: #define USB_HUB_DESCRIPTOR_SIZE 9 /* includes deprecated PortPowerCtrlMask */
325:
326: typedef struct {
327: uByte bLength;
328: uByte bDescriptorType;
329: uWord bcdUSB;
330: uByte bDeviceClass;
331: uByte bDeviceSubClass;
332: uByte bDeviceProtocol;
333: uByte bMaxPacketSize0;
334: uByte bNumConfigurations;
335: uByte bReserved;
336: } __packed usb_device_qualifier_t;
337: #define USB_DEVICE_QUALIFIER_SIZE 10
338:
339: typedef struct {
340: uByte bLength;
341: uByte bDescriptorType;
342: uByte bmAttributes;
343: #define UOTG_SRP 0x01
344: #define UOTG_HNP 0x02
345: } __packed usb_otg_descriptor_t;
346:
347: /* OTG feature selectors */
348: #define UOTG_B_HNP_ENABLE 3
349: #define UOTG_A_HNP_SUPPORT 4
350: #define UOTG_A_ALT_HNP_SUPPORT 5
351:
352: typedef struct {
353: uWord wStatus;
354: /* Device status flags */
355: #define UDS_SELF_POWERED 0x0001
356: #define UDS_REMOTE_WAKEUP 0x0002
357: /* Endpoint status flags */
358: #define UES_HALT 0x0001
359: } __packed usb_status_t;
360:
361: typedef struct {
362: uWord wHubStatus;
363: #define UHS_LOCAL_POWER 0x0001
364: #define UHS_OVER_CURRENT 0x0002
365: uWord wHubChange;
366: } __packed usb_hub_status_t;
367:
368: typedef struct {
369: uWord wPortStatus;
370: #define UPS_CURRENT_CONNECT_STATUS 0x0001
371: #define UPS_PORT_ENABLED 0x0002
372: #define UPS_SUSPEND 0x0004
373: #define UPS_OVERCURRENT_INDICATOR 0x0008
374: #define UPS_RESET 0x0010
375: #define UPS_PORT_POWER 0x0100
376: #define UPS_LOW_SPEED 0x0200
377: #define UPS_HIGH_SPEED 0x0400
378: #define UPS_PORT_TEST 0x0800
379: #define UPS_PORT_INDICATOR 0x1000
380: uWord wPortChange;
381: #define UPS_C_CONNECT_STATUS 0x0001
382: #define UPS_C_PORT_ENABLED 0x0002
383: #define UPS_C_SUSPEND 0x0004
384: #define UPS_C_OVERCURRENT_INDICATOR 0x0008
385: #define UPS_C_PORT_RESET 0x0010
386: } __packed usb_port_status_t;
387:
388: /* Device class codes */
389: #define UDCLASS_IN_INTERFACE 0x00
390: #define UDCLASS_COMM 0x02
391: #define UDCLASS_HUB 0x09
392: #define UDSUBCLASS_HUB 0x00
393: #define UDPROTO_FSHUB 0x00
394: #define UDPROTO_HSHUBSTT 0x01
395: #define UDPROTO_HSHUBMTT 0x02
396: #define UDCLASS_DIAGNOSTIC 0xdc
397: #define UDCLASS_WIRELESS 0xe0
398: #define UDSUBCLASS_RF 0x01
399: #define UDPROTO_BLUETOOTH 0x01
400: #define UDCLASS_VENDOR 0xff
401:
402: /* Interface class codes */
403: #define UICLASS_UNSPEC 0x00
404:
405: #define UICLASS_AUDIO 0x01
406: #define UISUBCLASS_AUDIOCONTROL 1
407: #define UISUBCLASS_AUDIOSTREAM 2
408: #define UISUBCLASS_MIDISTREAM 3
409:
410: #define UICLASS_CDC 0x02 /* communication */
411: #define UISUBCLASS_DIRECT_LINE_CONTROL_MODEL 1
412: #define UISUBCLASS_ABSTRACT_CONTROL_MODEL 2
413: #define UISUBCLASS_TELEPHONE_CONTROL_MODEL 3
414: #define UISUBCLASS_MULTICHANNEL_CONTROL_MODEL 4
415: #define UISUBCLASS_CAPI_CONTROLMODEL 5
416: #define UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL 6
417: #define UISUBCLASS_ATM_NETWORKING_CONTROL_MODEL 7
418: #define UIPROTO_CDC_AT 1
419:
420: #define UICLASS_HID 0x03
421: #define UISUBCLASS_BOOT 1
422: #define UIPROTO_BOOT_KEYBOARD 1
423:
424: #define UICLASS_PHYSICAL 0x05
425:
426: #define UICLASS_IMAGE 0x06
427:
428: #define UICLASS_PRINTER 0x07
429: #define UISUBCLASS_PRINTER 1
430: #define UIPROTO_PRINTER_UNI 1
431: #define UIPROTO_PRINTER_BI 2
432: #define UIPROTO_PRINTER_1284 3
433:
434: #define UICLASS_MASS 0x08
435: #define UISUBCLASS_RBC 1
436: #define UISUBCLASS_SFF8020I 2
437: #define UISUBCLASS_QIC157 3
438: #define UISUBCLASS_UFI 4
439: #define UISUBCLASS_SFF8070I 5
440: #define UISUBCLASS_SCSI 6
441: #define UIPROTO_MASS_CBI_I 0
442: #define UIPROTO_MASS_CBI 1
443: #define UIPROTO_MASS_BBB_OLD 2 /* Not in the spec anymore */
444: #define UIPROTO_MASS_BBB 80 /* 'P' for the Iomega Zip drive */
445:
446: #define UICLASS_HUB 0x09
447: #define UISUBCLASS_HUB 0
448: #define UIPROTO_FSHUB 0
449: #define UIPROTO_HSHUBSTT 0 /* Yes, same as previous */
450: #define UIPROTO_HSHUBMTT 1
451:
452: #define UICLASS_CDC_DATA 0x0a
453: #define UISUBCLASS_DATA 0
454: #define UIPROTO_DATA_ISDNBRI 0x30 /* Physical iface */
455: #define UIPROTO_DATA_HDLC 0x31 /* HDLC */
456: #define UIPROTO_DATA_TRANSPARENT 0x32 /* Transparent */
457: #define UIPROTO_DATA_Q921M 0x50 /* Management for Q921 */
458: #define UIPROTO_DATA_Q921 0x51 /* Data for Q921 */
459: #define UIPROTO_DATA_Q921TM 0x52 /* TEI multiplexer for Q921 */
460: #define UIPROTO_DATA_V42BIS 0x90 /* Data compression */
461: #define UIPROTO_DATA_Q931 0x91 /* Euro-ISDN */
462: #define UIPROTO_DATA_V120 0x92 /* V.24 rate adaption */
463: #define UIPROTO_DATA_CAPI 0x93 /* CAPI 2.0 commands */
464: #define UIPROTO_DATA_HOST_BASED 0xfd /* Host based driver */
465: #define UIPROTO_DATA_PUF 0xfe /* see Prot. Unit Func. Desc.*/
466: #define UIPROTO_DATA_VENDOR 0xff /* Vendor specific */
467:
468: #define UICLASS_SMARTCARD 0x0b
469:
470: /*#define UICLASS_FIRM_UPD 0x0c*/
471:
472: #define UICLASS_SECURITY 0x0d
473:
474: #define UICLASS_DIAGNOSTIC 0xdc
475:
476: #define UICLASS_WIRELESS 0xe0
477: #define UISUBCLASS_RF 0x01
478: #define UIPROTO_BLUETOOTH 0x01
479:
480: #define UICLASS_APPL_SPEC 0xfe
481: #define UISUBCLASS_FIRMWARE_DOWNLOAD 1
482: #define UISUBCLASS_IRDA 2
483: #define UIPROTO_IRDA 0
484:
485: #define UICLASS_VENDOR 0xff
486:
487:
488: #define USB_HUB_MAX_DEPTH 5
489:
490: /*
491: * Minimum time a device needs to be powered down to go through
492: * a power cycle. XXX Are these time in the spec?
493: */
494: #define USB_POWER_DOWN_TIME 200 /* ms */
495: #define USB_PORT_POWER_DOWN_TIME 100 /* ms */
496:
497: #if 0
498: /* These are the values from the spec. */
499: #define USB_PORT_RESET_DELAY 10 /* ms */
500: #define USB_PORT_ROOT_RESET_DELAY 50 /* ms */
501: #define USB_PORT_RESET_RECOVERY 10 /* ms */
502: #define USB_PORT_POWERUP_DELAY 100 /* ms */
503: #define USB_SET_ADDRESS_SETTLE 2 /* ms */
504: #define USB_RESUME_DELAY (20*5) /* ms */
505: #define USB_RESUME_WAIT 10 /* ms */
506: #define USB_RESUME_RECOVERY 10 /* ms */
507: #define USB_EXTRA_POWER_UP_TIME 0 /* ms */
508: #else
509: /* Allow for marginal (i.e. non-conforming) devices. */
510: #define USB_PORT_RESET_DELAY 50 /* ms */
511: #define USB_PORT_ROOT_RESET_DELAY 250 /* ms */
512: #define USB_PORT_RESET_RECOVERY 250 /* ms */
513: #define USB_PORT_POWERUP_DELAY 300 /* ms */
514: #define USB_SET_ADDRESS_SETTLE 10 /* ms */
515: #define USB_RESUME_DELAY (50*5) /* ms */
516: #define USB_RESUME_WAIT 50 /* ms */
517: #define USB_RESUME_RECOVERY 50 /* ms */
518: #define USB_EXTRA_POWER_UP_TIME 20 /* ms */
519: #endif
520:
521: #define USB_MIN_POWER 100 /* mA */
522: #define USB_MAX_POWER 500 /* mA */
523:
524: #define USB_BUS_RESET_DELAY 100 /* ms XXX?*/
525:
526:
527: #define USB_UNCONFIG_NO 0
528: #define USB_UNCONFIG_INDEX (-1)
529:
530: /*** ioctl() related stuff ***/
531:
532: struct usb_ctl_request {
533: int ucr_addr;
534: usb_device_request_t ucr_request;
535: void *ucr_data;
536: int ucr_flags;
537: #define USBD_SHORT_XFER_OK 0x04 /* allow short reads */
538: int ucr_actlen; /* actual length transferred */
539: };
540:
541: struct usb_alt_interface {
542: int uai_config_index;
543: int uai_interface_index;
544: int uai_alt_no;
545: };
546:
547: #define USB_CURRENT_CONFIG_INDEX (-1)
548: #define USB_CURRENT_ALT_INDEX (-1)
549:
550: struct usb_config_desc {
551: int ucd_config_index;
552: usb_config_descriptor_t ucd_desc;
553: };
554:
555: struct usb_interface_desc {
556: int uid_config_index;
557: int uid_interface_index;
558: int uid_alt_index;
559: usb_interface_descriptor_t uid_desc;
560: };
561:
562: struct usb_endpoint_desc {
563: int ued_config_index;
564: int ued_interface_index;
565: int ued_alt_index;
566: int ued_endpoint_index;
567: usb_endpoint_descriptor_t ued_desc;
568: };
569:
570: struct usb_full_desc {
571: int ufd_config_index;
572: u_int ufd_size;
573: u_char *ufd_data;
574: };
575:
576: struct usb_string_desc {
577: int usd_string_index;
578: int usd_language_id;
579: usb_string_descriptor_t usd_desc;
580: };
581:
582: struct usb_ctl_report_desc {
583: int ucrd_size;
584: u_char ucrd_data[1024]; /* filled data size will vary */
585: };
586:
587: typedef struct { u_int32_t cookie; } usb_event_cookie_t;
588:
589: #define USB_MAX_DEVNAMES 4
590: #define USB_MAX_DEVNAMELEN 16
591: struct usb_device_info {
592: u_int8_t udi_bus;
593: u_int8_t udi_addr; /* device address */
594: usb_event_cookie_t udi_cookie;
595: char udi_product[USB_MAX_STRING_LEN];
596: char udi_vendor[USB_MAX_STRING_LEN];
597: char udi_release[8];
598: u_int16_t udi_productNo;
599: u_int16_t udi_vendorNo;
600: u_int16_t udi_releaseNo;
601: u_int8_t udi_class;
602: u_int8_t udi_subclass;
603: u_int8_t udi_protocol;
604: u_int8_t udi_config;
605: u_int8_t udi_speed;
606: #define USB_SPEED_LOW 1
607: #define USB_SPEED_FULL 2
608: #define USB_SPEED_HIGH 3
609: int udi_power; /* power consumption in mA, 0 if selfpowered */
610: int udi_nports;
611: char udi_devnames[USB_MAX_DEVNAMES][USB_MAX_DEVNAMELEN];
612: u_int8_t udi_ports[16];/* hub only: addresses of devices on ports */
613: #define USB_PORT_ENABLED 0xff
614: #define USB_PORT_SUSPENDED 0xfe
615: #define USB_PORT_POWERED 0xfd
616: #define USB_PORT_DISABLED 0xfc
617: };
618:
619: struct usb_ctl_report {
620: int ucr_report;
621: u_char ucr_data[1024]; /* filled data size will vary */
622: };
623:
624: struct usb_device_stats {
625: u_long uds_requests[4]; /* indexed by transfer type UE_* */
626: };
627:
628: /* Events that can be read from /dev/usb */
629: struct usb_event {
630: int ue_type;
631: #define USB_EVENT_CTRLR_ATTACH 1
632: #define USB_EVENT_CTRLR_DETACH 2
633: #define USB_EVENT_DEVICE_ATTACH 3
634: #define USB_EVENT_DEVICE_DETACH 4
635: #define USB_EVENT_DRIVER_ATTACH 5
636: #define USB_EVENT_DRIVER_DETACH 6
637: #define USB_EVENT_IS_ATTACH(n) ((n) == USB_EVENT_CTRLR_ATTACH || (n) == USB_EVENT_DEVICE_ATTACH || (n) == USB_EVENT_DRIVER_ATTACH)
638: #define USB_EVENT_IS_DETACH(n) ((n) == USB_EVENT_CTRLR_DETACH || (n) == USB_EVENT_DEVICE_DETACH || (n) == USB_EVENT_DRIVER_DETACH)
639: struct timespec ue_time;
640: union {
641: struct {
642: int ue_bus;
643: } ue_ctrlr;
644: struct usb_device_info ue_device;
645: struct {
646: usb_event_cookie_t ue_cookie;
647: char ue_devname[16];
648: } ue_driver;
649: } u;
650: };
651:
652: /* USB controller */
653: #define USB_REQUEST _IOWR('U', 1, struct usb_ctl_request)
654: #define USB_SETDEBUG _IOW ('U', 2, int)
655: #define USB_DISCOVER _IO ('U', 3)
656: #define USB_DEVICEINFO _IOWR('U', 4, struct usb_device_info)
657: #define USB_DEVICESTATS _IOR ('U', 5, struct usb_device_stats)
658:
659: /* Generic HID device */
660: #define USB_GET_REPORT_DESC _IOR ('U', 21, struct usb_ctl_report_desc)
661: #define USB_SET_IMMED _IOW ('U', 22, int)
662: #define USB_GET_REPORT _IOWR('U', 23, struct usb_ctl_report)
663: #define USB_SET_REPORT _IOW ('U', 24, struct usb_ctl_report)
664: #define USB_GET_REPORT_ID _IOR ('U', 25, int)
665:
666: /* Generic USB device */
667: #define USB_GET_CONFIG _IOR ('U', 100, int)
668: #define USB_SET_CONFIG _IOW ('U', 101, int)
669: #define USB_GET_ALTINTERFACE _IOWR('U', 102, struct usb_alt_interface)
670: #define USB_SET_ALTINTERFACE _IOWR('U', 103, struct usb_alt_interface)
671: #define USB_GET_NO_ALT _IOWR('U', 104, struct usb_alt_interface)
672: #define USB_GET_DEVICE_DESC _IOR ('U', 105, usb_device_descriptor_t)
673: #define USB_GET_CONFIG_DESC _IOWR('U', 106, struct usb_config_desc)
674: #define USB_GET_INTERFACE_DESC _IOWR('U', 107, struct usb_interface_desc)
675: #define USB_GET_ENDPOINT_DESC _IOWR('U', 108, struct usb_endpoint_desc)
676: #define USB_GET_FULL_DESC _IOWR('U', 109, struct usb_full_desc)
677: #define USB_GET_STRING_DESC _IOWR('U', 110, struct usb_string_desc)
678: #define USB_DO_REQUEST _IOWR('U', 111, struct usb_ctl_request)
679: #define USB_GET_DEVICEINFO _IOR ('U', 112, struct usb_device_info)
680: #define USB_SET_SHORT_XFER _IOW ('U', 113, int)
681: #define USB_SET_TIMEOUT _IOW ('U', 114, int)
682:
683: /* Modem device */
684: #define USB_GET_CM_OVER_DATA _IOR ('U', 130, int)
685: #define USB_SET_CM_OVER_DATA _IOW ('U', 131, int)
686:
687: #endif /* _USB_H_ */
CVSweb