usb.h revision 192984
1184610Salfred/* $FreeBSD: head/sys/dev/usb/usb.h 192984 2009-05-28 17:36:36Z thompsa $ */ 2184610Salfred/*- 3184610Salfred * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. 4184610Salfred * Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved. 5184610Salfred * Copyright (c) 1998 Lennart Augustsson. All rights reserved. 6184610Salfred * 7184610Salfred * Redistribution and use in source and binary forms, with or without 8184610Salfred * modification, are permitted provided that the following conditions 9184610Salfred * are met: 10184610Salfred * 1. Redistributions of source code must retain the above copyright 11184610Salfred * notice, this list of conditions and the following disclaimer. 12184610Salfred * 2. Redistributions in binary form must reproduce the above copyright 13184610Salfred * notice, this list of conditions and the following disclaimer in the 14184610Salfred * documentation and/or other materials provided with the distribution. 15184610Salfred * 16184610Salfred * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17184610Salfred * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18184610Salfred * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19184610Salfred * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20184610Salfred * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21184610Salfred * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22184610Salfred * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23184610Salfred * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24184610Salfred * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25184610Salfred * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26184610Salfred * SUCH DAMAGE. 27184610Salfred */ 28184610Salfred 29185290Salfred/* 30185290Salfred * This file contains standard definitions for the following USB 31185290Salfred * protocol versions: 32185290Salfred * 33185290Salfred * USB v1.0 34185290Salfred * USB v1.1 35185290Salfred * USB v2.0 36185290Salfred * USB v3.0 37185290Salfred */ 38185290Salfred 39184610Salfred#ifndef _USB2_STANDARD_H_ 40184610Salfred#define _USB2_STANDARD_H_ 41184610Salfred 42188942Sthompsa#include <dev/usb/usb_endian.h> 43184610Salfred 44184610Salfred/* 45184610Salfred * Minimum time a device needs to be powered down to go through a 46184610Salfred * power cycle. These values are not in the USB specification. 47184610Salfred */ 48184610Salfred#define USB_POWER_DOWN_TIME 200 /* ms */ 49184610Salfred#define USB_PORT_POWER_DOWN_TIME 100 /* ms */ 50184610Salfred 51186730Salfred/* Definition of software USB power modes */ 52186730Salfred#define USB_POWER_MODE_OFF 0 /* turn off device */ 53186730Salfred#define USB_POWER_MODE_ON 1 /* always on */ 54186730Salfred#define USB_POWER_MODE_SAVE 2 /* automatic suspend and resume */ 55186730Salfred#define USB_POWER_MODE_SUSPEND 3 /* force suspend */ 56186730Salfred#define USB_POWER_MODE_RESUME 4 /* force resume */ 57186730Salfred 58184610Salfred#if 0 59184610Salfred/* These are the values from the USB specification. */ 60184610Salfred#define USB_PORT_RESET_DELAY 10 /* ms */ 61184610Salfred#define USB_PORT_ROOT_RESET_DELAY 50 /* ms */ 62184610Salfred#define USB_PORT_RESET_RECOVERY 10 /* ms */ 63184610Salfred#define USB_PORT_POWERUP_DELAY 100 /* ms */ 64186730Salfred#define USB_PORT_RESUME_DELAY 20 /* ms */ 65184610Salfred#define USB_SET_ADDRESS_SETTLE 2 /* ms */ 66184610Salfred#define USB_RESUME_DELAY (20*5) /* ms */ 67184610Salfred#define USB_RESUME_WAIT 10 /* ms */ 68184610Salfred#define USB_RESUME_RECOVERY 10 /* ms */ 69184610Salfred#define USB_EXTRA_POWER_UP_TIME 0 /* ms */ 70184610Salfred#else 71184610Salfred/* Allow for marginal and non-conforming devices. */ 72184610Salfred#define USB_PORT_RESET_DELAY 50 /* ms */ 73184610Salfred#define USB_PORT_ROOT_RESET_DELAY 250 /* ms */ 74184610Salfred#define USB_PORT_RESET_RECOVERY 250 /* ms */ 75184610Salfred#define USB_PORT_POWERUP_DELAY 300 /* ms */ 76186730Salfred#define USB_PORT_RESUME_DELAY (20*2) /* ms */ 77184610Salfred#define USB_SET_ADDRESS_SETTLE 10 /* ms */ 78184610Salfred#define USB_RESUME_DELAY (50*5) /* ms */ 79184610Salfred#define USB_RESUME_WAIT 50 /* ms */ 80184610Salfred#define USB_RESUME_RECOVERY 50 /* ms */ 81184610Salfred#define USB_EXTRA_POWER_UP_TIME 20 /* ms */ 82184610Salfred#endif 83184610Salfred 84184610Salfred#define USB_MIN_POWER 100 /* mA */ 85184610Salfred#define USB_MAX_POWER 500 /* mA */ 86184610Salfred 87184610Salfred#define USB_BUS_RESET_DELAY 100 /* ms */ 88184610Salfred 89184610Salfred/* 90184610Salfred * USB record layout in memory: 91184610Salfred * 92184610Salfred * - USB config 0 93184610Salfred * - USB interfaces 94184610Salfred * - USB alternative interfaces 95184610Salfred * - USB pipes 96184610Salfred * 97184610Salfred * - USB config 1 98184610Salfred * - USB interfaces 99184610Salfred * - USB alternative interfaces 100184610Salfred * - USB pipes 101184610Salfred */ 102184610Salfred 103184610Salfred/* Declaration of USB records */ 104184610Salfred 105192984Sthompsastruct usb_device_request { 106184610Salfred uByte bmRequestType; 107184610Salfred uByte bRequest; 108184610Salfred uWord wValue; 109184610Salfred uWord wIndex; 110184610Salfred uWord wLength; 111184610Salfred} __packed; 112192984Sthompsatypedef struct usb_device_request usb_device_request_t; 113184610Salfred 114184610Salfred#define UT_WRITE 0x00 115184610Salfred#define UT_READ 0x80 116184610Salfred#define UT_STANDARD 0x00 117184610Salfred#define UT_CLASS 0x20 118184610Salfred#define UT_VENDOR 0x40 119184610Salfred#define UT_DEVICE 0x00 120184610Salfred#define UT_INTERFACE 0x01 121184610Salfred#define UT_ENDPOINT 0x02 122184610Salfred#define UT_OTHER 0x03 123184610Salfred 124184610Salfred#define UT_READ_DEVICE (UT_READ | UT_STANDARD | UT_DEVICE) 125184610Salfred#define UT_READ_INTERFACE (UT_READ | UT_STANDARD | UT_INTERFACE) 126184610Salfred#define UT_READ_ENDPOINT (UT_READ | UT_STANDARD | UT_ENDPOINT) 127184610Salfred#define UT_WRITE_DEVICE (UT_WRITE | UT_STANDARD | UT_DEVICE) 128184610Salfred#define UT_WRITE_INTERFACE (UT_WRITE | UT_STANDARD | UT_INTERFACE) 129184610Salfred#define UT_WRITE_ENDPOINT (UT_WRITE | UT_STANDARD | UT_ENDPOINT) 130184610Salfred#define UT_READ_CLASS_DEVICE (UT_READ | UT_CLASS | UT_DEVICE) 131184610Salfred#define UT_READ_CLASS_INTERFACE (UT_READ | UT_CLASS | UT_INTERFACE) 132184610Salfred#define UT_READ_CLASS_OTHER (UT_READ | UT_CLASS | UT_OTHER) 133184610Salfred#define UT_READ_CLASS_ENDPOINT (UT_READ | UT_CLASS | UT_ENDPOINT) 134184610Salfred#define UT_WRITE_CLASS_DEVICE (UT_WRITE | UT_CLASS | UT_DEVICE) 135184610Salfred#define UT_WRITE_CLASS_INTERFACE (UT_WRITE | UT_CLASS | UT_INTERFACE) 136184610Salfred#define UT_WRITE_CLASS_OTHER (UT_WRITE | UT_CLASS | UT_OTHER) 137184610Salfred#define UT_WRITE_CLASS_ENDPOINT (UT_WRITE | UT_CLASS | UT_ENDPOINT) 138184610Salfred#define UT_READ_VENDOR_DEVICE (UT_READ | UT_VENDOR | UT_DEVICE) 139184610Salfred#define UT_READ_VENDOR_INTERFACE (UT_READ | UT_VENDOR | UT_INTERFACE) 140184610Salfred#define UT_READ_VENDOR_OTHER (UT_READ | UT_VENDOR | UT_OTHER) 141184610Salfred#define UT_READ_VENDOR_ENDPOINT (UT_READ | UT_VENDOR | UT_ENDPOINT) 142184610Salfred#define UT_WRITE_VENDOR_DEVICE (UT_WRITE | UT_VENDOR | UT_DEVICE) 143184610Salfred#define UT_WRITE_VENDOR_INTERFACE (UT_WRITE | UT_VENDOR | UT_INTERFACE) 144184610Salfred#define UT_WRITE_VENDOR_OTHER (UT_WRITE | UT_VENDOR | UT_OTHER) 145184610Salfred#define UT_WRITE_VENDOR_ENDPOINT (UT_WRITE | UT_VENDOR | UT_ENDPOINT) 146184610Salfred 147184610Salfred/* Requests */ 148184610Salfred#define UR_GET_STATUS 0x00 149184610Salfred#define UR_CLEAR_FEATURE 0x01 150184610Salfred#define UR_SET_FEATURE 0x03 151184610Salfred#define UR_SET_ADDRESS 0x05 152184610Salfred#define UR_GET_DESCRIPTOR 0x06 153184610Salfred#define UDESC_DEVICE 0x01 154184610Salfred#define UDESC_CONFIG 0x02 155184610Salfred#define UDESC_STRING 0x03 156185290Salfred#define USB_LANGUAGE_TABLE 0x00 /* language ID string index */ 157185290Salfred#define UDESC_INTERFACE 0x04 158184610Salfred#define UDESC_ENDPOINT 0x05 159184610Salfred#define UDESC_DEVICE_QUALIFIER 0x06 160184610Salfred#define UDESC_OTHER_SPEED_CONFIGURATION 0x07 161184610Salfred#define UDESC_INTERFACE_POWER 0x08 162184610Salfred#define UDESC_OTG 0x09 163185290Salfred#define UDESC_DEBUG 0x0A 164185290Salfred#define UDESC_IFACE_ASSOC 0x0B /* interface association */ 165185290Salfred#define UDESC_BOS 0x0F /* binary object store */ 166185290Salfred#define UDESC_DEVICE_CAPABILITY 0x10 167185290Salfred#define UDESC_CS_DEVICE 0x21 /* class specific */ 168185290Salfred#define UDESC_CS_CONFIG 0x22 169185290Salfred#define UDESC_CS_STRING 0x23 170184610Salfred#define UDESC_CS_INTERFACE 0x24 171184610Salfred#define UDESC_CS_ENDPOINT 0x25 172184610Salfred#define UDESC_HUB 0x29 173185290Salfred#define UDESC_ENDPOINT_SS_COMP 0x30 /* super speed */ 174184610Salfred#define UR_SET_DESCRIPTOR 0x07 175184610Salfred#define UR_GET_CONFIG 0x08 176184610Salfred#define UR_SET_CONFIG 0x09 177184610Salfred#define UR_GET_INTERFACE 0x0a 178184610Salfred#define UR_SET_INTERFACE 0x0b 179184610Salfred#define UR_SYNCH_FRAME 0x0c 180185290Salfred#define UR_SET_SEL 0x30 181185290Salfred#define UR_ISOCH_DELAY 0x31 182184610Salfred 183184610Salfred/* HUB specific request */ 184184610Salfred#define UR_GET_BUS_STATE 0x02 185184610Salfred#define UR_CLEAR_TT_BUFFER 0x08 186184610Salfred#define UR_RESET_TT 0x09 187184610Salfred#define UR_GET_TT_STATE 0x0a 188184610Salfred#define UR_STOP_TT 0x0b 189185290Salfred#define UR_SET_HUB_DEPTH 0x0c 190185290Salfred#define UR_GET_PORT_ERR_COUNT 0x0d 191184610Salfred 192184610Salfred/* Feature numbers */ 193184610Salfred#define UF_ENDPOINT_HALT 0 194184610Salfred#define UF_DEVICE_REMOTE_WAKEUP 1 195184610Salfred#define UF_TEST_MODE 2 196185290Salfred#define UF_U1_ENABLE 0x30 197185290Salfred#define UF_U2_ENABLE 0x31 198185290Salfred#define UF_LTM_ENABLE 0x32 199184610Salfred 200184610Salfred/* HUB specific features */ 201184610Salfred#define UHF_C_HUB_LOCAL_POWER 0 202184610Salfred#define UHF_C_HUB_OVER_CURRENT 1 203184610Salfred#define UHF_PORT_CONNECTION 0 204184610Salfred#define UHF_PORT_ENABLE 1 205184610Salfred#define UHF_PORT_SUSPEND 2 206184610Salfred#define UHF_PORT_OVER_CURRENT 3 207184610Salfred#define UHF_PORT_RESET 4 208185290Salfred#define UHF_PORT_LINK_STATE 5 209184610Salfred#define UHF_PORT_POWER 8 210184610Salfred#define UHF_PORT_LOW_SPEED 9 211184610Salfred#define UHF_C_PORT_CONNECTION 16 212184610Salfred#define UHF_C_PORT_ENABLE 17 213184610Salfred#define UHF_C_PORT_SUSPEND 18 214184610Salfred#define UHF_C_PORT_OVER_CURRENT 19 215184610Salfred#define UHF_C_PORT_RESET 20 216184610Salfred#define UHF_PORT_TEST 21 217184610Salfred#define UHF_PORT_INDICATOR 22 218184610Salfred 219185290Salfred/* SuperSpeed HUB specific features */ 220185290Salfred#define UHF_PORT_U1_TIMEOUT 23 221185290Salfred#define UHF_PORT_U2_TIMEOUT 24 222185290Salfred#define UHF_C_PORT_LINK_STATE 25 223185290Salfred#define UHF_C_PORT_CONFIG_ERROR 26 224185290Salfred#define UHF_PORT_REMOTE_WAKE_MASK 27 225185290Salfred#define UHF_BH_PORT_RESET 28 226185290Salfred#define UHF_C_BH_PORT_RESET 29 227185290Salfred#define UHF_FORCE_LINKPM_ACCEPT 30 228185290Salfred 229192984Sthompsastruct usb_descriptor { 230184610Salfred uByte bLength; 231184610Salfred uByte bDescriptorType; 232184610Salfred uByte bDescriptorSubtype; 233184610Salfred} __packed; 234192984Sthompsatypedef struct usb_descriptor usb_descriptor_t; 235184610Salfred 236192984Sthompsastruct usb_device_descriptor { 237184610Salfred uByte bLength; 238184610Salfred uByte bDescriptorType; 239184610Salfred uWord bcdUSB; 240184610Salfred#define UD_USB_2_0 0x0200 241185290Salfred#define UD_USB_3_0 0x0300 242185290Salfred#define UD_IS_USB2(d) ((d)->bcdUSB[1] == 0x02) 243185290Salfred#define UD_IS_USB3(d) ((d)->bcdUSB[1] == 0x03) 244184610Salfred uByte bDeviceClass; 245184610Salfred uByte bDeviceSubClass; 246184610Salfred uByte bDeviceProtocol; 247184610Salfred uByte bMaxPacketSize; 248184610Salfred /* The fields below are not part of the initial descriptor. */ 249184610Salfred uWord idVendor; 250184610Salfred uWord idProduct; 251184610Salfred uWord bcdDevice; 252184610Salfred uByte iManufacturer; 253184610Salfred uByte iProduct; 254184610Salfred uByte iSerialNumber; 255184610Salfred uByte bNumConfigurations; 256184610Salfred} __packed; 257192984Sthompsatypedef struct usb_device_descriptor usb_device_descriptor_t; 258184610Salfred 259185290Salfred/* Binary Device Object Store (BOS) */ 260192984Sthompsastruct usb_bos_descriptor { 261185290Salfred uByte bLength; 262185290Salfred uByte bDescriptorType; 263185290Salfred uWord wTotalLength; 264185290Salfred uByte bNumDeviceCaps; 265185290Salfred} __packed; 266192984Sthompsatypedef struct usb_bos_descriptor usb_bos_descriptor_t; 267185290Salfred 268185290Salfred/* Binary Device Object Store Capability */ 269192984Sthompsastruct usb_bos_cap_descriptor { 270185290Salfred uByte bLength; 271185290Salfred uByte bDescriptorType; 272185290Salfred uByte bDevCapabilityType; 273185290Salfred#define USB_DEVCAP_RESERVED 0x00 274185290Salfred#define USB_DEVCAP_WUSB 0x01 275185290Salfred#define USB_DEVCAP_USB2EXT 0x02 276185290Salfred#define USB_DEVCAP_SUPER_SPEED 0x03 277185290Salfred#define USB_DEVCAP_CONTAINER_ID 0x04 278185290Salfred /* data ... */ 279185290Salfred} __packed; 280192984Sthompsatypedef struct usb_bos_cap_descriptor usb_bos_cap_descriptor_t; 281185290Salfred 282192984Sthompsastruct usb_devcap_usb2ext_descriptor { 283185290Salfred uByte bLength; 284185290Salfred uByte bDescriptorType; 285185290Salfred uByte bDevCapabilityType; 286185290Salfred uByte bmAttributes; 287185290Salfred#define USB_V2EXT_LPM 0x02 288185290Salfred} __packed; 289192984Sthompsatypedef struct usb_devcap_usb2ext_descriptor usb_devcap_usb2ext_descriptor_t; 290185290Salfred 291192984Sthompsastruct usb_devcap_ss_descriptor { 292185290Salfred uByte bLength; 293185290Salfred uByte bDescriptorType; 294185290Salfred uByte bDevCapabilityType; 295185290Salfred uByte bmAttributes; 296185290Salfred uWord wSpeedsSupported; 297185290Salfred uByte bFunctionaltySupport; 298185290Salfred uByte bU1DevExitLat; 299185290Salfred uByte bU2DevExitLat; 300185290Salfred} __packed; 301192984Sthompsatypedef struct usb_devcap_ss_descriptor usb_devcap_ss_descriptor_t; 302185290Salfred 303192984Sthompsastruct usb_devcap_container_id_descriptor { 304185290Salfred uByte bLength; 305185290Salfred uByte bDescriptorType; 306185290Salfred uByte bDevCapabilityType; 307185290Salfred uByte bReserved; 308185290Salfred uByte ContainerID; 309185290Salfred} __packed; 310192984Sthompsatypedef struct usb_devcap_container_id_descriptor 311188947Sthompsa usb_devcap_container_id_descriptor_t; 312185290Salfred 313184610Salfred/* Device class codes */ 314184610Salfred#define UDCLASS_IN_INTERFACE 0x00 315184610Salfred#define UDCLASS_COMM 0x02 316184610Salfred#define UDCLASS_HUB 0x09 317184610Salfred#define UDSUBCLASS_HUB 0x00 318184610Salfred#define UDPROTO_FSHUB 0x00 319184610Salfred#define UDPROTO_HSHUBSTT 0x01 320184610Salfred#define UDPROTO_HSHUBMTT 0x02 321184610Salfred#define UDCLASS_DIAGNOSTIC 0xdc 322184610Salfred#define UDCLASS_WIRELESS 0xe0 323184610Salfred#define UDSUBCLASS_RF 0x01 324184610Salfred#define UDPROTO_BLUETOOTH 0x01 325184610Salfred#define UDCLASS_VENDOR 0xff 326184610Salfred 327192984Sthompsastruct usb_config_descriptor { 328184610Salfred uByte bLength; 329184610Salfred uByte bDescriptorType; 330184610Salfred uWord wTotalLength; 331184610Salfred uByte bNumInterface; 332184610Salfred uByte bConfigurationValue; 333184610Salfred#define USB_UNCONFIG_NO 0 334184610Salfred uByte iConfiguration; 335184610Salfred uByte bmAttributes; 336184610Salfred#define UC_BUS_POWERED 0x80 337184610Salfred#define UC_SELF_POWERED 0x40 338184610Salfred#define UC_REMOTE_WAKEUP 0x20 339184610Salfred uByte bMaxPower; /* max current in 2 mA units */ 340184610Salfred#define UC_POWER_FACTOR 2 341184610Salfred} __packed; 342192984Sthompsatypedef struct usb_config_descriptor usb_config_descriptor_t; 343184610Salfred 344192984Sthompsastruct usb_interface_descriptor { 345184610Salfred uByte bLength; 346184610Salfred uByte bDescriptorType; 347184610Salfred uByte bInterfaceNumber; 348184610Salfred uByte bAlternateSetting; 349184610Salfred uByte bNumEndpoints; 350184610Salfred uByte bInterfaceClass; 351184610Salfred uByte bInterfaceSubClass; 352184610Salfred uByte bInterfaceProtocol; 353184610Salfred uByte iInterface; 354184610Salfred} __packed; 355192984Sthompsatypedef struct usb_interface_descriptor usb_interface_descriptor_t; 356184610Salfred 357192984Sthompsastruct usb_interface_assoc_descriptor { 358185290Salfred uByte bLength; 359185290Salfred uByte bDescriptorType; 360185290Salfred uByte bFirstInterface; 361185290Salfred uByte bInterfaceCount; 362185290Salfred uByte bFunctionClass; 363185290Salfred uByte bFunctionSubClass; 364185290Salfred uByte bFunctionProtocol; 365185290Salfred uByte iFunction; 366185290Salfred} __packed; 367192984Sthompsatypedef struct usb_interface_assoc_descriptor usb_interface_assoc_descriptor_t; 368185290Salfred 369184610Salfred/* Interface class codes */ 370184610Salfred#define UICLASS_UNSPEC 0x00 371184610Salfred#define UICLASS_AUDIO 0x01 /* audio */ 372184610Salfred#define UISUBCLASS_AUDIOCONTROL 1 373184610Salfred#define UISUBCLASS_AUDIOSTREAM 2 374184610Salfred#define UISUBCLASS_MIDISTREAM 3 375184610Salfred 376184610Salfred#define UICLASS_CDC 0x02 /* communication */ 377184610Salfred#define UISUBCLASS_DIRECT_LINE_CONTROL_MODEL 1 378184610Salfred#define UISUBCLASS_ABSTRACT_CONTROL_MODEL 2 379184610Salfred#define UISUBCLASS_TELEPHONE_CONTROL_MODEL 3 380184610Salfred#define UISUBCLASS_MULTICHANNEL_CONTROL_MODEL 4 381184610Salfred#define UISUBCLASS_CAPI_CONTROLMODEL 5 382184610Salfred#define UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL 6 383184610Salfred#define UISUBCLASS_ATM_NETWORKING_CONTROL_MODEL 7 384184610Salfred#define UISUBCLASS_WIRELESS_HANDSET_CM 8 385184610Salfred#define UISUBCLASS_DEVICE_MGMT 9 386184610Salfred#define UISUBCLASS_MOBILE_DIRECT_LINE_MODEL 10 387184610Salfred#define UISUBCLASS_OBEX 11 388184610Salfred#define UISUBCLASS_ETHERNET_EMULATION_MODEL 12 389184610Salfred 390184610Salfred#define UIPROTO_CDC_AT 1 391184610Salfred#define UIPROTO_CDC_ETH_512X4 0x76 /* FreeBSD specific */ 392184610Salfred 393184610Salfred#define UICLASS_HID 0x03 394184610Salfred#define UISUBCLASS_BOOT 1 395184610Salfred#define UIPROTO_BOOT_KEYBOARD 1 396184610Salfred#define UIPROTO_MOUSE 2 397184610Salfred 398184610Salfred#define UICLASS_PHYSICAL 0x05 399184610Salfred#define UICLASS_IMAGE 0x06 400184610Salfred#define UISUBCLASS_SIC 1 /* still image class */ 401184610Salfred#define UICLASS_PRINTER 0x07 402184610Salfred#define UISUBCLASS_PRINTER 1 403184610Salfred#define UIPROTO_PRINTER_UNI 1 404184610Salfred#define UIPROTO_PRINTER_BI 2 405184610Salfred#define UIPROTO_PRINTER_1284 3 406184610Salfred 407184610Salfred#define UICLASS_MASS 0x08 408184610Salfred#define UISUBCLASS_RBC 1 409184610Salfred#define UISUBCLASS_SFF8020I 2 410184610Salfred#define UISUBCLASS_QIC157 3 411184610Salfred#define UISUBCLASS_UFI 4 412184610Salfred#define UISUBCLASS_SFF8070I 5 413184610Salfred#define UISUBCLASS_SCSI 6 414184610Salfred#define UIPROTO_MASS_CBI_I 0 415184610Salfred#define UIPROTO_MASS_CBI 1 416184610Salfred#define UIPROTO_MASS_BBB_OLD 2 /* Not in the spec anymore */ 417184610Salfred#define UIPROTO_MASS_BBB 80 /* 'P' for the Iomega Zip drive */ 418184610Salfred 419184610Salfred#define UICLASS_HUB 0x09 420184610Salfred#define UISUBCLASS_HUB 0 421184610Salfred#define UIPROTO_FSHUB 0 422184610Salfred#define UIPROTO_HSHUBSTT 0 /* Yes, same as previous */ 423184610Salfred#define UIPROTO_HSHUBMTT 1 424184610Salfred 425184610Salfred#define UICLASS_CDC_DATA 0x0a 426184610Salfred#define UISUBCLASS_DATA 0 427184610Salfred#define UIPROTO_DATA_ISDNBRI 0x30 /* Physical iface */ 428184610Salfred#define UIPROTO_DATA_HDLC 0x31 /* HDLC */ 429184610Salfred#define UIPROTO_DATA_TRANSPARENT 0x32 /* Transparent */ 430184610Salfred#define UIPROTO_DATA_Q921M 0x50 /* Management for Q921 */ 431184610Salfred#define UIPROTO_DATA_Q921 0x51 /* Data for Q921 */ 432184610Salfred#define UIPROTO_DATA_Q921TM 0x52 /* TEI multiplexer for Q921 */ 433184610Salfred#define UIPROTO_DATA_V42BIS 0x90 /* Data compression */ 434184610Salfred#define UIPROTO_DATA_Q931 0x91 /* Euro-ISDN */ 435184610Salfred#define UIPROTO_DATA_V120 0x92 /* V.24 rate adaption */ 436184610Salfred#define UIPROTO_DATA_CAPI 0x93 /* CAPI 2.0 commands */ 437184610Salfred#define UIPROTO_DATA_HOST_BASED 0xfd /* Host based driver */ 438184610Salfred#define UIPROTO_DATA_PUF 0xfe /* see Prot. Unit Func. Desc. */ 439184610Salfred#define UIPROTO_DATA_VENDOR 0xff /* Vendor specific */ 440184610Salfred 441184610Salfred#define UICLASS_SMARTCARD 0x0b 442184610Salfred#define UICLASS_FIRM_UPD 0x0c 443184610Salfred#define UICLASS_SECURITY 0x0d 444184610Salfred#define UICLASS_DIAGNOSTIC 0xdc 445184610Salfred#define UICLASS_WIRELESS 0xe0 446184610Salfred#define UISUBCLASS_RF 0x01 447184610Salfred#define UIPROTO_BLUETOOTH 0x01 448184610Salfred 449184610Salfred#define UICLASS_APPL_SPEC 0xfe 450184610Salfred#define UISUBCLASS_FIRMWARE_DOWNLOAD 1 451184610Salfred#define UISUBCLASS_IRDA 2 452184610Salfred#define UIPROTO_IRDA 0 453184610Salfred 454184610Salfred#define UICLASS_VENDOR 0xff 455184610Salfred#define UISUBCLASS_XBOX360_CONTROLLER 0x5d 456184610Salfred#define UIPROTO_XBOX360_GAMEPAD 0x01 457184610Salfred 458192984Sthompsastruct usb_endpoint_descriptor { 459184610Salfred uByte bLength; 460184610Salfred uByte bDescriptorType; 461184610Salfred uByte bEndpointAddress; 462184610Salfred#define UE_GET_DIR(a) ((a) & 0x80) 463184610Salfred#define UE_SET_DIR(a,d) ((a) | (((d)&1) << 7)) 464190732Sthompsa#define UE_DIR_IN 0x80 /* IN-token endpoint, fixed */ 465190732Sthompsa#define UE_DIR_OUT 0x00 /* OUT-token endpoint, fixed */ 466190732Sthompsa#define UE_DIR_RX 0xfd /* for internal use only! */ 467190732Sthompsa#define UE_DIR_TX 0xfe /* for internal use only! */ 468184610Salfred#define UE_DIR_ANY 0xff /* for internal use only! */ 469184610Salfred#define UE_ADDR 0x0f 470184610Salfred#define UE_ADDR_ANY 0xff /* for internal use only! */ 471184610Salfred#define UE_GET_ADDR(a) ((a) & UE_ADDR) 472184610Salfred uByte bmAttributes; 473184610Salfred#define UE_XFERTYPE 0x03 474184610Salfred#define UE_CONTROL 0x00 475184610Salfred#define UE_ISOCHRONOUS 0x01 476184610Salfred#define UE_BULK 0x02 477184610Salfred#define UE_INTERRUPT 0x03 478184610Salfred#define UE_BULK_INTR 0xfe /* for internal use only! */ 479184610Salfred#define UE_TYPE_ANY 0xff /* for internal use only! */ 480184610Salfred#define UE_GET_XFERTYPE(a) ((a) & UE_XFERTYPE) 481184610Salfred#define UE_ISO_TYPE 0x0c 482184610Salfred#define UE_ISO_ASYNC 0x04 483184610Salfred#define UE_ISO_ADAPT 0x08 484184610Salfred#define UE_ISO_SYNC 0x0c 485184610Salfred#define UE_GET_ISO_TYPE(a) ((a) & UE_ISO_TYPE) 486184610Salfred uWord wMaxPacketSize; 487184610Salfred#define UE_ZERO_MPS 0xFFFF /* for internal use only */ 488184610Salfred uByte bInterval; 489184610Salfred} __packed; 490192984Sthompsatypedef struct usb_endpoint_descriptor usb_endpoint_descriptor_t; 491184610Salfred 492192984Sthompsastruct usb_endpoint_ss_comp_descriptor { 493185290Salfred uByte bLength; 494185290Salfred uByte bDescriptorType; 495185290Salfred uWord bMaxBurst; 496185290Salfred uByte bmAttributes; 497185290Salfred uWord wBytesPerInterval; 498185290Salfred} __packed; 499192984Sthompsatypedef struct usb_endpoint_ss_comp_descriptor 500188947Sthompsa usb_endpoint_ss_comp_descriptor_t; 501185290Salfred 502192984Sthompsastruct usb_string_descriptor { 503184610Salfred uByte bLength; 504184610Salfred uByte bDescriptorType; 505184610Salfred uWord bString[126]; 506184610Salfred uByte bUnused; 507184610Salfred} __packed; 508192984Sthompsatypedef struct usb_string_descriptor usb_string_descriptor_t; 509184610Salfred 510184610Salfred#define USB_MAKE_STRING_DESC(m,name) \ 511184610Salfredstruct name { \ 512184610Salfred uByte bLength; \ 513184610Salfred uByte bDescriptorType; \ 514184610Salfred uByte bData[sizeof((uint8_t []){m})]; \ 515184610Salfred} __packed; \ 516184610Salfredstatic const struct name name = { \ 517184610Salfred .bLength = sizeof(struct name), \ 518184610Salfred .bDescriptorType = UDESC_STRING, \ 519184610Salfred .bData = { m }, \ 520184610Salfred} 521184610Salfred 522192984Sthompsastruct usb_hub_descriptor { 523184610Salfred uByte bDescLength; 524184610Salfred uByte bDescriptorType; 525184610Salfred uByte bNbrPorts; 526184610Salfred uWord wHubCharacteristics; 527184610Salfred#define UHD_PWR 0x0003 528184610Salfred#define UHD_PWR_GANGED 0x0000 529184610Salfred#define UHD_PWR_INDIVIDUAL 0x0001 530184610Salfred#define UHD_PWR_NO_SWITCH 0x0002 531184610Salfred#define UHD_COMPOUND 0x0004 532184610Salfred#define UHD_OC 0x0018 533184610Salfred#define UHD_OC_GLOBAL 0x0000 534184610Salfred#define UHD_OC_INDIVIDUAL 0x0008 535184610Salfred#define UHD_OC_NONE 0x0010 536184610Salfred#define UHD_TT_THINK 0x0060 537184610Salfred#define UHD_TT_THINK_8 0x0000 538184610Salfred#define UHD_TT_THINK_16 0x0020 539184610Salfred#define UHD_TT_THINK_24 0x0040 540184610Salfred#define UHD_TT_THINK_32 0x0060 541184610Salfred#define UHD_PORT_IND 0x0080 542184610Salfred uByte bPwrOn2PwrGood; /* delay in 2 ms units */ 543184610Salfred#define UHD_PWRON_FACTOR 2 544184610Salfred uByte bHubContrCurrent; 545184610Salfred uByte DeviceRemovable[32]; /* max 255 ports */ 546184610Salfred#define UHD_NOT_REMOV(desc, i) \ 547184610Salfred (((desc)->DeviceRemovable[(i)/8] >> ((i) % 8)) & 1) 548185290Salfred uByte PortPowerCtrlMask[1]; /* deprecated */ 549184610Salfred} __packed; 550192984Sthompsatypedef struct usb_hub_descriptor usb_hub_descriptor_t; 551184610Salfred 552192984Sthompsastruct usb_hub_ss_descriptor { 553185290Salfred uByte bDescLength; 554185290Salfred uByte bDescriptorType; 555185290Salfred uByte bNbrPorts; /* max 15 */ 556185290Salfred uWord wHubCharacteristics; 557185290Salfred uByte bPwrOn2PwrGood; /* delay in 2 ms units */ 558185290Salfred uByte bHubContrCurrent; 559185290Salfred uByte bHubHdrDecLat; 560185290Salfred uWord wHubDelay; 561185290Salfred uByte DeviceRemovable[2]; /* max 15 ports */ 562185290Salfred} __packed; 563192984Sthompsatypedef struct usb_hub_ss_descriptor usb_hub_ss_descriptor_t; 564185290Salfred 565184610Salfred/* minimum HUB descriptor (8-ports maximum) */ 566192984Sthompsastruct usb_hub_descriptor_min { 567184610Salfred uByte bDescLength; 568184610Salfred uByte bDescriptorType; 569184610Salfred uByte bNbrPorts; 570184610Salfred uWord wHubCharacteristics; 571184610Salfred uByte bPwrOn2PwrGood; 572184610Salfred uByte bHubContrCurrent; 573184610Salfred uByte DeviceRemovable[1]; 574184610Salfred uByte PortPowerCtrlMask[1]; 575184610Salfred} __packed; 576192984Sthompsatypedef struct usb_hub_descriptor_min usb_hub_descriptor_min_t; 577184610Salfred 578192984Sthompsastruct usb_device_qualifier { 579184610Salfred uByte bLength; 580184610Salfred uByte bDescriptorType; 581184610Salfred uWord bcdUSB; 582184610Salfred uByte bDeviceClass; 583184610Salfred uByte bDeviceSubClass; 584184610Salfred uByte bDeviceProtocol; 585184610Salfred uByte bMaxPacketSize0; 586184610Salfred uByte bNumConfigurations; 587184610Salfred uByte bReserved; 588184610Salfred} __packed; 589192984Sthompsatypedef struct usb_device_qualifier usb_device_qualifier_t; 590184610Salfred 591192984Sthompsastruct usb_otg_descriptor { 592184610Salfred uByte bLength; 593184610Salfred uByte bDescriptorType; 594184610Salfred uByte bmAttributes; 595184610Salfred#define UOTG_SRP 0x01 596184610Salfred#define UOTG_HNP 0x02 597184610Salfred} __packed; 598192984Sthompsatypedef struct usb_otg_descriptor usb_otg_descriptor_t; 599184610Salfred 600184610Salfred/* OTG feature selectors */ 601184610Salfred#define UOTG_B_HNP_ENABLE 3 602184610Salfred#define UOTG_A_HNP_SUPPORT 4 603184610Salfred#define UOTG_A_ALT_HNP_SUPPORT 5 604184610Salfred 605192984Sthompsastruct usb_status { 606184610Salfred uWord wStatus; 607184610Salfred/* Device status flags */ 608184610Salfred#define UDS_SELF_POWERED 0x0001 609184610Salfred#define UDS_REMOTE_WAKEUP 0x0002 610184610Salfred/* Endpoint status flags */ 611184610Salfred#define UES_HALT 0x0001 612184610Salfred} __packed; 613192984Sthompsatypedef struct usb_status usb_status_t; 614184610Salfred 615192984Sthompsastruct usb_hub_status { 616184610Salfred uWord wHubStatus; 617184610Salfred#define UHS_LOCAL_POWER 0x0001 618184610Salfred#define UHS_OVER_CURRENT 0x0002 619184610Salfred uWord wHubChange; 620184610Salfred} __packed; 621192984Sthompsatypedef struct usb_hub_status usb_hub_status_t; 622184610Salfred 623192984Sthompsastruct usb_port_status { 624184610Salfred uWord wPortStatus; 625184610Salfred#define UPS_CURRENT_CONNECT_STATUS 0x0001 626184610Salfred#define UPS_PORT_ENABLED 0x0002 627184610Salfred#define UPS_SUSPEND 0x0004 628184610Salfred#define UPS_OVERCURRENT_INDICATOR 0x0008 629184610Salfred#define UPS_RESET 0x0010 630184610Salfred#define UPS_PORT_POWER 0x0100 631184610Salfred#define UPS_LOW_SPEED 0x0200 632184610Salfred#define UPS_HIGH_SPEED 0x0400 633184610Salfred#define UPS_PORT_TEST 0x0800 634184610Salfred#define UPS_PORT_INDICATOR 0x1000 635187180Sthompsa#define UPS_PORT_MODE_DEVICE 0x8000 /* currently FreeBSD specific */ 636184610Salfred uWord wPortChange; 637184610Salfred#define UPS_C_CONNECT_STATUS 0x0001 638184610Salfred#define UPS_C_PORT_ENABLED 0x0002 639184610Salfred#define UPS_C_SUSPEND 0x0004 640184610Salfred#define UPS_C_OVERCURRENT_INDICATOR 0x0008 641184610Salfred#define UPS_C_PORT_RESET 0x0010 642184610Salfred} __packed; 643192984Sthompsatypedef struct usb_port_status usb_port_status_t; 644184610Salfred 645184610Salfred#endif /* _USB2_STANDARD_H_ */ 646