Annotation of sys/dev/usb/usb.h, Revision 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