102ac6454SAndrew Thompson /* $FreeBSD$ */ 202ac6454SAndrew Thompson /*- 3718cf2ccSPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-NetBSD 4718cf2ccSPedro F. Giffuni * 502ac6454SAndrew Thompson * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. 602ac6454SAndrew Thompson * Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved. 702ac6454SAndrew Thompson * Copyright (c) 1998 Lennart Augustsson. All rights reserved. 802ac6454SAndrew Thompson * 902ac6454SAndrew Thompson * Redistribution and use in source and binary forms, with or without 1002ac6454SAndrew Thompson * modification, are permitted provided that the following conditions 1102ac6454SAndrew Thompson * are met: 1202ac6454SAndrew Thompson * 1. Redistributions of source code must retain the above copyright 1302ac6454SAndrew Thompson * notice, this list of conditions and the following disclaimer. 1402ac6454SAndrew Thompson * 2. Redistributions in binary form must reproduce the above copyright 1502ac6454SAndrew Thompson * notice, this list of conditions and the following disclaimer in the 1602ac6454SAndrew Thompson * documentation and/or other materials provided with the distribution. 1702ac6454SAndrew Thompson * 1802ac6454SAndrew Thompson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1902ac6454SAndrew Thompson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2002ac6454SAndrew Thompson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2102ac6454SAndrew Thompson * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2202ac6454SAndrew Thompson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2302ac6454SAndrew Thompson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2402ac6454SAndrew Thompson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2502ac6454SAndrew Thompson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2602ac6454SAndrew Thompson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2702ac6454SAndrew Thompson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2802ac6454SAndrew Thompson * SUCH DAMAGE. 2902ac6454SAndrew Thompson */ 3002ac6454SAndrew Thompson 3102ac6454SAndrew Thompson /* 3202ac6454SAndrew Thompson * This file contains standard definitions for the following USB 3302ac6454SAndrew Thompson * protocol versions: 3402ac6454SAndrew Thompson * 3502ac6454SAndrew Thompson * USB v1.0 3602ac6454SAndrew Thompson * USB v1.1 3702ac6454SAndrew Thompson * USB v2.0 3802ac6454SAndrew Thompson * USB v3.0 3902ac6454SAndrew Thompson */ 4002ac6454SAndrew Thompson 4175973647SAndrew Thompson #ifndef _USB_STANDARD_H_ 4275973647SAndrew Thompson #define _USB_STANDARD_H_ 4302ac6454SAndrew Thompson 44a2dd1caaSHans Petter Selasky #if defined(_KERNEL) || defined(_STANDALONE) 45d2b99310SHans Petter Selasky #ifndef USB_GLOBAL_INCLUDE_FILE 46ed6d949aSAndrew Thompson #include "opt_usb.h" 47d2b99310SHans Petter Selasky #endif 48ed6d949aSAndrew Thompson 49ed6d949aSAndrew Thompson /* Declare parent SYSCTL USB node. */ 50ed6d949aSAndrew Thompson #ifdef SYSCTL_DECL 51ed6d949aSAndrew Thompson SYSCTL_DECL(_hw_usb); 52ed6d949aSAndrew Thompson #endif 53ed6d949aSAndrew Thompson 54d2b99310SHans Petter Selasky #ifndef USB_GLOBAL_INCLUDE_FILE 55ed6d949aSAndrew Thompson #include <sys/malloc.h> 56d2b99310SHans Petter Selasky #endif 57ed6d949aSAndrew Thompson 58ed6d949aSAndrew Thompson MALLOC_DECLARE(M_USB); 59ed6d949aSAndrew Thompson MALLOC_DECLARE(M_USBDEV); 60a2dd1caaSHans Petter Selasky #endif /* _KERNEL || _STANDALONE */ 61ed6d949aSAndrew Thompson 62d2b99310SHans Petter Selasky #ifndef USB_GLOBAL_INCLUDE_FILE 6302ac6454SAndrew Thompson #include <dev/usb/usb_endian.h> 64ed6d949aSAndrew Thompson #include <dev/usb/usb_freebsd.h> 65d2b99310SHans Petter Selasky #endif 66ed6d949aSAndrew Thompson 67ed6d949aSAndrew Thompson #define USB_STACK_VERSION 2000 /* 2.0 */ 68ed6d949aSAndrew Thompson 69ed6d949aSAndrew Thompson /* Definition of some hardcoded USB constants. */ 70ed6d949aSAndrew Thompson 71ed6d949aSAndrew Thompson #define USB_MAX_IPACKET 8 /* initial USB packet size */ 72ed6d949aSAndrew Thompson #define USB_EP_MAX (2*16) /* hardcoded */ 73ed6d949aSAndrew Thompson #define USB_ROOT_HUB_ADDR 1 /* index */ 74ed6d949aSAndrew Thompson #define USB_MIN_DEVICES 2 /* unused + root HUB */ 75ed6d949aSAndrew Thompson #define USB_UNCONFIG_INDEX 0xFF /* internal use only */ 76ed6d949aSAndrew Thompson #define USB_IFACE_INDEX_ANY 0xFF /* internal use only */ 77ed6d949aSAndrew Thompson #define USB_START_ADDR 0 /* default USB device BUS address 78ed6d949aSAndrew Thompson * after USB bus reset */ 79ed6d949aSAndrew Thompson #define USB_CONTROL_ENDPOINT 0 /* default control endpoint */ 80ed6d949aSAndrew Thompson 81ed6d949aSAndrew Thompson #define USB_FRAMES_PER_SECOND_FS 1000 /* full speed */ 82ed6d949aSAndrew Thompson #define USB_FRAMES_PER_SECOND_HS 8000 /* high speed */ 83ed6d949aSAndrew Thompson 84ed6d949aSAndrew Thompson #define USB_FS_BYTES_PER_HS_UFRAME 188 /* bytes */ 85ed6d949aSAndrew Thompson #define USB_HS_MICRO_FRAMES_MAX 8 /* units */ 86ed6d949aSAndrew Thompson 87ed6d949aSAndrew Thompson #define USB_ISOC_TIME_MAX 128 /* ms */ 8802ac6454SAndrew Thompson 8902ac6454SAndrew Thompson /* 9002ac6454SAndrew Thompson * Minimum time a device needs to be powered down to go through a 9102ac6454SAndrew Thompson * power cycle. These values are not in the USB specification. 9202ac6454SAndrew Thompson */ 9302ac6454SAndrew Thompson #define USB_POWER_DOWN_TIME 200 /* ms */ 9402ac6454SAndrew Thompson #define USB_PORT_POWER_DOWN_TIME 100 /* ms */ 9502ac6454SAndrew Thompson 9602ac6454SAndrew Thompson /* Definition of software USB power modes */ 9702ac6454SAndrew Thompson #define USB_POWER_MODE_OFF 0 /* turn off device */ 9802ac6454SAndrew Thompson #define USB_POWER_MODE_ON 1 /* always on */ 9902ac6454SAndrew Thompson #define USB_POWER_MODE_SAVE 2 /* automatic suspend and resume */ 10002ac6454SAndrew Thompson #define USB_POWER_MODE_SUSPEND 3 /* force suspend */ 10102ac6454SAndrew Thompson #define USB_POWER_MODE_RESUME 4 /* force resume */ 10202ac6454SAndrew Thompson 10302ac6454SAndrew Thompson /* These are the values from the USB specification. */ 10437506412SHans Petter Selasky #define USB_PORT_RESET_DELAY_SPEC 10 /* ms */ 10537506412SHans Petter Selasky #define USB_PORT_ROOT_RESET_DELAY_SPEC 50 /* ms */ 10637506412SHans Petter Selasky #define USB_PORT_RESET_RECOVERY_SPEC 10 /* ms */ 10737506412SHans Petter Selasky #define USB_PORT_POWERUP_DELAY_SPEC 100 /* ms */ 10837506412SHans Petter Selasky #define USB_PORT_RESUME_DELAY_SPEC 20 /* ms */ 10937506412SHans Petter Selasky #define USB_SET_ADDRESS_SETTLE_SPEC 2 /* ms */ 11037506412SHans Petter Selasky #define USB_RESUME_DELAY_SPEC (20*5) /* ms */ 11137506412SHans Petter Selasky #define USB_RESUME_WAIT_SPEC 10 /* ms */ 11237506412SHans Petter Selasky #define USB_RESUME_RECOVERY_SPEC 10 /* ms */ 11337506412SHans Petter Selasky #define USB_EXTRA_POWER_UP_TIME_SPEC 0 /* ms */ 11437506412SHans Petter Selasky 11502ac6454SAndrew Thompson /* Allow for marginal and non-conforming devices. */ 11602ac6454SAndrew Thompson #define USB_PORT_RESET_DELAY 50 /* ms */ 117c61ee529SHans Petter Selasky #define USB_PORT_ROOT_RESET_DELAY 200 /* ms */ 11870ffaaa6SHans Petter Selasky #define USB_PORT_RESET_RECOVERY 10 /* ms */ 11902ac6454SAndrew Thompson #define USB_PORT_POWERUP_DELAY 300 /* ms */ 12002ac6454SAndrew Thompson #define USB_PORT_RESUME_DELAY (20*2) /* ms */ 12102ac6454SAndrew Thompson #define USB_SET_ADDRESS_SETTLE 10 /* ms */ 12202ac6454SAndrew Thompson #define USB_RESUME_DELAY (50*5) /* ms */ 12302ac6454SAndrew Thompson #define USB_RESUME_WAIT 50 /* ms */ 12402ac6454SAndrew Thompson #define USB_RESUME_RECOVERY 50 /* ms */ 12502ac6454SAndrew Thompson #define USB_EXTRA_POWER_UP_TIME 20 /* ms */ 126*8758aabbSHans Petter Selasky #define USB_ENUM_NICE_TIME 16 /* ms */ 12702ac6454SAndrew Thompson 12802ac6454SAndrew Thompson #define USB_MIN_POWER 100 /* mA */ 12902ac6454SAndrew Thompson #define USB_MAX_POWER 500 /* mA */ 13002ac6454SAndrew Thompson 13102ac6454SAndrew Thompson #define USB_BUS_RESET_DELAY 100 /* ms */ 13202ac6454SAndrew Thompson 13302ac6454SAndrew Thompson /* 13402ac6454SAndrew Thompson * USB record layout in memory: 13502ac6454SAndrew Thompson * 13602ac6454SAndrew Thompson * - USB config 0 13702ac6454SAndrew Thompson * - USB interfaces 13802ac6454SAndrew Thompson * - USB alternative interfaces 139ae60fdfbSAndrew Thompson * - USB endpoints 14002ac6454SAndrew Thompson * 14102ac6454SAndrew Thompson * - USB config 1 14202ac6454SAndrew Thompson * - USB interfaces 14302ac6454SAndrew Thompson * - USB alternative interfaces 144ae60fdfbSAndrew Thompson * - USB endpoints 14502ac6454SAndrew Thompson */ 14602ac6454SAndrew Thompson 14702ac6454SAndrew Thompson /* Declaration of USB records */ 14802ac6454SAndrew Thompson 149760bc48eSAndrew Thompson struct usb_device_request { 15002ac6454SAndrew Thompson uByte bmRequestType; 15102ac6454SAndrew Thompson uByte bRequest; 15202ac6454SAndrew Thompson uWord wValue; 15302ac6454SAndrew Thompson uWord wIndex; 15402ac6454SAndrew Thompson uWord wLength; 15502ac6454SAndrew Thompson } __packed; 156760bc48eSAndrew Thompson typedef struct usb_device_request usb_device_request_t; 15702ac6454SAndrew Thompson 15802ac6454SAndrew Thompson #define UT_WRITE 0x00 15902ac6454SAndrew Thompson #define UT_READ 0x80 16002ac6454SAndrew Thompson #define UT_STANDARD 0x00 16102ac6454SAndrew Thompson #define UT_CLASS 0x20 16202ac6454SAndrew Thompson #define UT_VENDOR 0x40 16302ac6454SAndrew Thompson #define UT_DEVICE 0x00 16402ac6454SAndrew Thompson #define UT_INTERFACE 0x01 16502ac6454SAndrew Thompson #define UT_ENDPOINT 0x02 16602ac6454SAndrew Thompson #define UT_OTHER 0x03 16702ac6454SAndrew Thompson 16802ac6454SAndrew Thompson #define UT_READ_DEVICE (UT_READ | UT_STANDARD | UT_DEVICE) 16902ac6454SAndrew Thompson #define UT_READ_INTERFACE (UT_READ | UT_STANDARD | UT_INTERFACE) 17002ac6454SAndrew Thompson #define UT_READ_ENDPOINT (UT_READ | UT_STANDARD | UT_ENDPOINT) 17102ac6454SAndrew Thompson #define UT_WRITE_DEVICE (UT_WRITE | UT_STANDARD | UT_DEVICE) 17202ac6454SAndrew Thompson #define UT_WRITE_INTERFACE (UT_WRITE | UT_STANDARD | UT_INTERFACE) 17302ac6454SAndrew Thompson #define UT_WRITE_ENDPOINT (UT_WRITE | UT_STANDARD | UT_ENDPOINT) 17402ac6454SAndrew Thompson #define UT_READ_CLASS_DEVICE (UT_READ | UT_CLASS | UT_DEVICE) 17502ac6454SAndrew Thompson #define UT_READ_CLASS_INTERFACE (UT_READ | UT_CLASS | UT_INTERFACE) 17602ac6454SAndrew Thompson #define UT_READ_CLASS_OTHER (UT_READ | UT_CLASS | UT_OTHER) 17702ac6454SAndrew Thompson #define UT_READ_CLASS_ENDPOINT (UT_READ | UT_CLASS | UT_ENDPOINT) 17802ac6454SAndrew Thompson #define UT_WRITE_CLASS_DEVICE (UT_WRITE | UT_CLASS | UT_DEVICE) 17902ac6454SAndrew Thompson #define UT_WRITE_CLASS_INTERFACE (UT_WRITE | UT_CLASS | UT_INTERFACE) 18002ac6454SAndrew Thompson #define UT_WRITE_CLASS_OTHER (UT_WRITE | UT_CLASS | UT_OTHER) 18102ac6454SAndrew Thompson #define UT_WRITE_CLASS_ENDPOINT (UT_WRITE | UT_CLASS | UT_ENDPOINT) 18202ac6454SAndrew Thompson #define UT_READ_VENDOR_DEVICE (UT_READ | UT_VENDOR | UT_DEVICE) 18302ac6454SAndrew Thompson #define UT_READ_VENDOR_INTERFACE (UT_READ | UT_VENDOR | UT_INTERFACE) 18402ac6454SAndrew Thompson #define UT_READ_VENDOR_OTHER (UT_READ | UT_VENDOR | UT_OTHER) 18502ac6454SAndrew Thompson #define UT_READ_VENDOR_ENDPOINT (UT_READ | UT_VENDOR | UT_ENDPOINT) 18602ac6454SAndrew Thompson #define UT_WRITE_VENDOR_DEVICE (UT_WRITE | UT_VENDOR | UT_DEVICE) 18702ac6454SAndrew Thompson #define UT_WRITE_VENDOR_INTERFACE (UT_WRITE | UT_VENDOR | UT_INTERFACE) 18802ac6454SAndrew Thompson #define UT_WRITE_VENDOR_OTHER (UT_WRITE | UT_VENDOR | UT_OTHER) 18902ac6454SAndrew Thompson #define UT_WRITE_VENDOR_ENDPOINT (UT_WRITE | UT_VENDOR | UT_ENDPOINT) 19002ac6454SAndrew Thompson 19102ac6454SAndrew Thompson /* Requests */ 19202ac6454SAndrew Thompson #define UR_GET_STATUS 0x00 19302ac6454SAndrew Thompson #define UR_CLEAR_FEATURE 0x01 19402ac6454SAndrew Thompson #define UR_SET_FEATURE 0x03 19502ac6454SAndrew Thompson #define UR_SET_ADDRESS 0x05 19602ac6454SAndrew Thompson #define UR_GET_DESCRIPTOR 0x06 19702ac6454SAndrew Thompson #define UDESC_DEVICE 0x01 19802ac6454SAndrew Thompson #define UDESC_CONFIG 0x02 19902ac6454SAndrew Thompson #define UDESC_STRING 0x03 20002ac6454SAndrew Thompson #define USB_LANGUAGE_TABLE 0x00 /* language ID string index */ 20102ac6454SAndrew Thompson #define UDESC_INTERFACE 0x04 20202ac6454SAndrew Thompson #define UDESC_ENDPOINT 0x05 20302ac6454SAndrew Thompson #define UDESC_DEVICE_QUALIFIER 0x06 20402ac6454SAndrew Thompson #define UDESC_OTHER_SPEED_CONFIGURATION 0x07 20502ac6454SAndrew Thompson #define UDESC_INTERFACE_POWER 0x08 20602ac6454SAndrew Thompson #define UDESC_OTG 0x09 20702ac6454SAndrew Thompson #define UDESC_DEBUG 0x0A 20802ac6454SAndrew Thompson #define UDESC_IFACE_ASSOC 0x0B /* interface association */ 20902ac6454SAndrew Thompson #define UDESC_BOS 0x0F /* binary object store */ 21002ac6454SAndrew Thompson #define UDESC_DEVICE_CAPABILITY 0x10 21102ac6454SAndrew Thompson #define UDESC_CS_DEVICE 0x21 /* class specific */ 21202ac6454SAndrew Thompson #define UDESC_CS_CONFIG 0x22 21302ac6454SAndrew Thompson #define UDESC_CS_STRING 0x23 21402ac6454SAndrew Thompson #define UDESC_CS_INTERFACE 0x24 21502ac6454SAndrew Thompson #define UDESC_CS_ENDPOINT 0x25 21602ac6454SAndrew Thompson #define UDESC_HUB 0x29 2177b039740SHans Petter Selasky #define UDESC_SS_HUB 0x2A /* super speed */ 21802ac6454SAndrew Thompson #define UDESC_ENDPOINT_SS_COMP 0x30 /* super speed */ 21902ac6454SAndrew Thompson #define UR_SET_DESCRIPTOR 0x07 22002ac6454SAndrew Thompson #define UR_GET_CONFIG 0x08 22102ac6454SAndrew Thompson #define UR_SET_CONFIG 0x09 22202ac6454SAndrew Thompson #define UR_GET_INTERFACE 0x0a 22302ac6454SAndrew Thompson #define UR_SET_INTERFACE 0x0b 22402ac6454SAndrew Thompson #define UR_SYNCH_FRAME 0x0c 22502ac6454SAndrew Thompson #define UR_SET_SEL 0x30 22602ac6454SAndrew Thompson #define UR_ISOCH_DELAY 0x31 22702ac6454SAndrew Thompson 22802ac6454SAndrew Thompson /* HUB specific request */ 22902ac6454SAndrew Thompson #define UR_GET_BUS_STATE 0x02 23002ac6454SAndrew Thompson #define UR_CLEAR_TT_BUFFER 0x08 23102ac6454SAndrew Thompson #define UR_RESET_TT 0x09 23202ac6454SAndrew Thompson #define UR_GET_TT_STATE 0x0a 23302ac6454SAndrew Thompson #define UR_STOP_TT 0x0b 2344563ba7aSHans Petter Selasky #define UR_SET_AND_TEST 0x0c /* USB 2.0 only */ 2354563ba7aSHans Petter Selasky #define UR_SET_HUB_DEPTH 0x0c /* USB 3.0 only */ 2367b039740SHans Petter Selasky #define USB_SS_HUB_DEPTH_MAX 5 23702ac6454SAndrew Thompson #define UR_GET_PORT_ERR_COUNT 0x0d 23802ac6454SAndrew Thompson 23902ac6454SAndrew Thompson /* Feature numbers */ 24002ac6454SAndrew Thompson #define UF_ENDPOINT_HALT 0 24102ac6454SAndrew Thompson #define UF_DEVICE_REMOTE_WAKEUP 1 24202ac6454SAndrew Thompson #define UF_TEST_MODE 2 24302ac6454SAndrew Thompson #define UF_U1_ENABLE 0x30 24402ac6454SAndrew Thompson #define UF_U2_ENABLE 0x31 24502ac6454SAndrew Thompson #define UF_LTM_ENABLE 0x32 24602ac6454SAndrew Thompson 24702ac6454SAndrew Thompson /* HUB specific features */ 24802ac6454SAndrew Thompson #define UHF_C_HUB_LOCAL_POWER 0 24902ac6454SAndrew Thompson #define UHF_C_HUB_OVER_CURRENT 1 25002ac6454SAndrew Thompson #define UHF_PORT_CONNECTION 0 25102ac6454SAndrew Thompson #define UHF_PORT_ENABLE 1 25202ac6454SAndrew Thompson #define UHF_PORT_SUSPEND 2 25302ac6454SAndrew Thompson #define UHF_PORT_OVER_CURRENT 3 25402ac6454SAndrew Thompson #define UHF_PORT_RESET 4 25502ac6454SAndrew Thompson #define UHF_PORT_LINK_STATE 5 25602ac6454SAndrew Thompson #define UHF_PORT_POWER 8 25702ac6454SAndrew Thompson #define UHF_PORT_LOW_SPEED 9 2584563ba7aSHans Petter Selasky #define UHF_PORT_L1 10 25902ac6454SAndrew Thompson #define UHF_C_PORT_CONNECTION 16 26002ac6454SAndrew Thompson #define UHF_C_PORT_ENABLE 17 26102ac6454SAndrew Thompson #define UHF_C_PORT_SUSPEND 18 26202ac6454SAndrew Thompson #define UHF_C_PORT_OVER_CURRENT 19 26302ac6454SAndrew Thompson #define UHF_C_PORT_RESET 20 26402ac6454SAndrew Thompson #define UHF_PORT_TEST 21 26502ac6454SAndrew Thompson #define UHF_PORT_INDICATOR 22 2664563ba7aSHans Petter Selasky #define UHF_C_PORT_L1 23 26702ac6454SAndrew Thompson 26802ac6454SAndrew Thompson /* SuperSpeed HUB specific features */ 26902ac6454SAndrew Thompson #define UHF_PORT_U1_TIMEOUT 23 27002ac6454SAndrew Thompson #define UHF_PORT_U2_TIMEOUT 24 27102ac6454SAndrew Thompson #define UHF_C_PORT_LINK_STATE 25 27202ac6454SAndrew Thompson #define UHF_C_PORT_CONFIG_ERROR 26 27302ac6454SAndrew Thompson #define UHF_PORT_REMOTE_WAKE_MASK 27 27402ac6454SAndrew Thompson #define UHF_BH_PORT_RESET 28 27502ac6454SAndrew Thompson #define UHF_C_BH_PORT_RESET 29 27602ac6454SAndrew Thompson #define UHF_FORCE_LINKPM_ACCEPT 30 27702ac6454SAndrew Thompson 278d76ca5b1SHans Petter Selasky /* SuperSpeed suspend support */ 279d76ca5b1SHans Petter Selasky #define USB_INTERFACE_FUNC_SUSPEND 0 280d76ca5b1SHans Petter Selasky #define USB_INTERFACE_FUNC_SUSPEND_LP (1 << 8) 281d76ca5b1SHans Petter Selasky #define USB_INTERFACE_FUNC_SUSPEND_RW (1 << 9) 282d76ca5b1SHans Petter Selasky 283760bc48eSAndrew Thompson struct usb_descriptor { 28402ac6454SAndrew Thompson uByte bLength; 28502ac6454SAndrew Thompson uByte bDescriptorType; 28602ac6454SAndrew Thompson uByte bDescriptorSubtype; 28702ac6454SAndrew Thompson } __packed; 288760bc48eSAndrew Thompson typedef struct usb_descriptor usb_descriptor_t; 28902ac6454SAndrew Thompson 290760bc48eSAndrew Thompson struct usb_device_descriptor { 29102ac6454SAndrew Thompson uByte bLength; 29202ac6454SAndrew Thompson uByte bDescriptorType; 29302ac6454SAndrew Thompson uWord bcdUSB; 29402ac6454SAndrew Thompson #define UD_USB_2_0 0x0200 29502ac6454SAndrew Thompson #define UD_USB_3_0 0x0300 29602ac6454SAndrew Thompson #define UD_IS_USB2(d) ((d)->bcdUSB[1] == 0x02) 29702ac6454SAndrew Thompson #define UD_IS_USB3(d) ((d)->bcdUSB[1] == 0x03) 29802ac6454SAndrew Thompson uByte bDeviceClass; 29902ac6454SAndrew Thompson uByte bDeviceSubClass; 30002ac6454SAndrew Thompson uByte bDeviceProtocol; 30102ac6454SAndrew Thompson uByte bMaxPacketSize; 30202ac6454SAndrew Thompson /* The fields below are not part of the initial descriptor. */ 30302ac6454SAndrew Thompson uWord idVendor; 30402ac6454SAndrew Thompson uWord idProduct; 30502ac6454SAndrew Thompson uWord bcdDevice; 30602ac6454SAndrew Thompson uByte iManufacturer; 30702ac6454SAndrew Thompson uByte iProduct; 30802ac6454SAndrew Thompson uByte iSerialNumber; 30902ac6454SAndrew Thompson uByte bNumConfigurations; 31002ac6454SAndrew Thompson } __packed; 311760bc48eSAndrew Thompson typedef struct usb_device_descriptor usb_device_descriptor_t; 31202ac6454SAndrew Thompson 31302ac6454SAndrew Thompson /* Binary Device Object Store (BOS) */ 314760bc48eSAndrew Thompson struct usb_bos_descriptor { 31502ac6454SAndrew Thompson uByte bLength; 31602ac6454SAndrew Thompson uByte bDescriptorType; 31702ac6454SAndrew Thompson uWord wTotalLength; 31802ac6454SAndrew Thompson uByte bNumDeviceCaps; 31902ac6454SAndrew Thompson } __packed; 320760bc48eSAndrew Thompson typedef struct usb_bos_descriptor usb_bos_descriptor_t; 32102ac6454SAndrew Thompson 32202ac6454SAndrew Thompson /* Binary Device Object Store Capability */ 323760bc48eSAndrew Thompson struct usb_bos_cap_descriptor { 32402ac6454SAndrew Thompson uByte bLength; 32502ac6454SAndrew Thompson uByte bDescriptorType; 32602ac6454SAndrew Thompson uByte bDevCapabilityType; 32702ac6454SAndrew Thompson #define USB_DEVCAP_RESERVED 0x00 32802ac6454SAndrew Thompson #define USB_DEVCAP_WUSB 0x01 32902ac6454SAndrew Thompson #define USB_DEVCAP_USB2EXT 0x02 33002ac6454SAndrew Thompson #define USB_DEVCAP_SUPER_SPEED 0x03 33102ac6454SAndrew Thompson #define USB_DEVCAP_CONTAINER_ID 0x04 33202ac6454SAndrew Thompson /* data ... */ 33302ac6454SAndrew Thompson } __packed; 334760bc48eSAndrew Thompson typedef struct usb_bos_cap_descriptor usb_bos_cap_descriptor_t; 33502ac6454SAndrew Thompson 336760bc48eSAndrew Thompson struct usb_devcap_usb2ext_descriptor { 33702ac6454SAndrew Thompson uByte bLength; 33802ac6454SAndrew Thompson uByte bDescriptorType; 33902ac6454SAndrew Thompson uByte bDevCapabilityType; 340b3b1747aSHans Petter Selasky uDWord bmAttributes; 3414563ba7aSHans Petter Selasky #define USB_V2EXT_LPM (1U << 1) 3424563ba7aSHans Petter Selasky #define USB_V2EXT_BESL_SUPPORTED (1U << 2) 3434563ba7aSHans Petter Selasky #define USB_V2EXT_BESL_BASELINE_VALID (1U << 3) 3444563ba7aSHans Petter Selasky #define USB_V2EXT_BESL_DEEP_VALID (1U << 4) 3454563ba7aSHans Petter Selasky #define USB_V2EXT_BESL_BASELINE_GET(x) (((x) >> 8) & 0xF) 3464563ba7aSHans Petter Selasky #define USB_V2EXT_BESL_DEEP_GET(x) (((x) >> 12) & 0xF) 34702ac6454SAndrew Thompson } __packed; 348760bc48eSAndrew Thompson typedef struct usb_devcap_usb2ext_descriptor usb_devcap_usb2ext_descriptor_t; 34902ac6454SAndrew Thompson 350760bc48eSAndrew Thompson struct usb_devcap_ss_descriptor { 35102ac6454SAndrew Thompson uByte bLength; 35202ac6454SAndrew Thompson uByte bDescriptorType; 35302ac6454SAndrew Thompson uByte bDevCapabilityType; 35402ac6454SAndrew Thompson uByte bmAttributes; 35502ac6454SAndrew Thompson uWord wSpeedsSupported; 3567b039740SHans Petter Selasky uByte bFunctionalitySupport; 35702ac6454SAndrew Thompson uByte bU1DevExitLat; 358c089ba5eSHans Petter Selasky uWord wU2DevExitLat; 35902ac6454SAndrew Thompson } __packed; 360760bc48eSAndrew Thompson typedef struct usb_devcap_ss_descriptor usb_devcap_ss_descriptor_t; 36102ac6454SAndrew Thompson 362760bc48eSAndrew Thompson struct usb_devcap_container_id_descriptor { 36302ac6454SAndrew Thompson uByte bLength; 36402ac6454SAndrew Thompson uByte bDescriptorType; 36502ac6454SAndrew Thompson uByte bDevCapabilityType; 36602ac6454SAndrew Thompson uByte bReserved; 3677b039740SHans Petter Selasky uByte bContainerID; 36802ac6454SAndrew Thompson } __packed; 369760bc48eSAndrew Thompson typedef struct usb_devcap_container_id_descriptor 370d7e3163dSAndrew Thompson usb_devcap_container_id_descriptor_t; 37102ac6454SAndrew Thompson 37202ac6454SAndrew Thompson /* Device class codes */ 37302ac6454SAndrew Thompson #define UDCLASS_IN_INTERFACE 0x00 37402ac6454SAndrew Thompson #define UDCLASS_COMM 0x02 37502ac6454SAndrew Thompson #define UDCLASS_HUB 0x09 37602ac6454SAndrew Thompson #define UDSUBCLASS_HUB 0x00 37702ac6454SAndrew Thompson #define UDPROTO_FSHUB 0x00 37802ac6454SAndrew Thompson #define UDPROTO_HSHUBSTT 0x01 37902ac6454SAndrew Thompson #define UDPROTO_HSHUBMTT 0x02 3807b039740SHans Petter Selasky #define UDPROTO_SSHUB 0x03 38102ac6454SAndrew Thompson #define UDCLASS_DIAGNOSTIC 0xdc 38202ac6454SAndrew Thompson #define UDCLASS_WIRELESS 0xe0 38302ac6454SAndrew Thompson #define UDSUBCLASS_RF 0x01 38402ac6454SAndrew Thompson #define UDPROTO_BLUETOOTH 0x01 38502ac6454SAndrew Thompson #define UDCLASS_VENDOR 0xff 38602ac6454SAndrew Thompson 387760bc48eSAndrew Thompson struct usb_config_descriptor { 38802ac6454SAndrew Thompson uByte bLength; 38902ac6454SAndrew Thompson uByte bDescriptorType; 39002ac6454SAndrew Thompson uWord wTotalLength; 39102ac6454SAndrew Thompson uByte bNumInterface; 39202ac6454SAndrew Thompson uByte bConfigurationValue; 39302ac6454SAndrew Thompson #define USB_UNCONFIG_NO 0 39402ac6454SAndrew Thompson uByte iConfiguration; 39502ac6454SAndrew Thompson uByte bmAttributes; 39602ac6454SAndrew Thompson #define UC_BUS_POWERED 0x80 39702ac6454SAndrew Thompson #define UC_SELF_POWERED 0x40 39802ac6454SAndrew Thompson #define UC_REMOTE_WAKEUP 0x20 39902ac6454SAndrew Thompson uByte bMaxPower; /* max current in 2 mA units */ 40002ac6454SAndrew Thompson #define UC_POWER_FACTOR 2 40102ac6454SAndrew Thompson } __packed; 402760bc48eSAndrew Thompson typedef struct usb_config_descriptor usb_config_descriptor_t; 40302ac6454SAndrew Thompson 404760bc48eSAndrew Thompson struct usb_interface_descriptor { 40502ac6454SAndrew Thompson uByte bLength; 40602ac6454SAndrew Thompson uByte bDescriptorType; 40702ac6454SAndrew Thompson uByte bInterfaceNumber; 40802ac6454SAndrew Thompson uByte bAlternateSetting; 40902ac6454SAndrew Thompson uByte bNumEndpoints; 41002ac6454SAndrew Thompson uByte bInterfaceClass; 41102ac6454SAndrew Thompson uByte bInterfaceSubClass; 41202ac6454SAndrew Thompson uByte bInterfaceProtocol; 41302ac6454SAndrew Thompson uByte iInterface; 41402ac6454SAndrew Thompson } __packed; 415760bc48eSAndrew Thompson typedef struct usb_interface_descriptor usb_interface_descriptor_t; 41602ac6454SAndrew Thompson 417760bc48eSAndrew Thompson struct usb_interface_assoc_descriptor { 41802ac6454SAndrew Thompson uByte bLength; 41902ac6454SAndrew Thompson uByte bDescriptorType; 42002ac6454SAndrew Thompson uByte bFirstInterface; 42102ac6454SAndrew Thompson uByte bInterfaceCount; 42202ac6454SAndrew Thompson uByte bFunctionClass; 42302ac6454SAndrew Thompson uByte bFunctionSubClass; 42402ac6454SAndrew Thompson uByte bFunctionProtocol; 42502ac6454SAndrew Thompson uByte iFunction; 42602ac6454SAndrew Thompson } __packed; 427760bc48eSAndrew Thompson typedef struct usb_interface_assoc_descriptor usb_interface_assoc_descriptor_t; 42802ac6454SAndrew Thompson 42902ac6454SAndrew Thompson /* Interface class codes */ 43002ac6454SAndrew Thompson #define UICLASS_UNSPEC 0x00 43102ac6454SAndrew Thompson #define UICLASS_AUDIO 0x01 /* audio */ 43202ac6454SAndrew Thompson #define UISUBCLASS_AUDIOCONTROL 1 43302ac6454SAndrew Thompson #define UISUBCLASS_AUDIOSTREAM 2 43402ac6454SAndrew Thompson #define UISUBCLASS_MIDISTREAM 3 43502ac6454SAndrew Thompson 43602ac6454SAndrew Thompson #define UICLASS_CDC 0x02 /* communication */ 43702ac6454SAndrew Thompson #define UISUBCLASS_DIRECT_LINE_CONTROL_MODEL 1 43802ac6454SAndrew Thompson #define UISUBCLASS_ABSTRACT_CONTROL_MODEL 2 43902ac6454SAndrew Thompson #define UISUBCLASS_TELEPHONE_CONTROL_MODEL 3 44002ac6454SAndrew Thompson #define UISUBCLASS_MULTICHANNEL_CONTROL_MODEL 4 44102ac6454SAndrew Thompson #define UISUBCLASS_CAPI_CONTROLMODEL 5 44202ac6454SAndrew Thompson #define UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL 6 44302ac6454SAndrew Thompson #define UISUBCLASS_ATM_NETWORKING_CONTROL_MODEL 7 44402ac6454SAndrew Thompson #define UISUBCLASS_WIRELESS_HANDSET_CM 8 44502ac6454SAndrew Thompson #define UISUBCLASS_DEVICE_MGMT 9 44602ac6454SAndrew Thompson #define UISUBCLASS_MOBILE_DIRECT_LINE_MODEL 10 44702ac6454SAndrew Thompson #define UISUBCLASS_OBEX 11 44802ac6454SAndrew Thompson #define UISUBCLASS_ETHERNET_EMULATION_MODEL 12 4494076dd23SAndrew Thompson #define UISUBCLASS_NETWORK_CONTROL_MODEL 13 45002ac6454SAndrew Thompson 451c48efaecSAdrian Chadd #define UIPROTO_CDC_NONE 0 45202ac6454SAndrew Thompson #define UIPROTO_CDC_AT 1 45363722e52SEdward Tomasz Napierala #define UIPROTO_CDC_EEM 7 45402ac6454SAndrew Thompson 45502ac6454SAndrew Thompson #define UICLASS_HID 0x03 45602ac6454SAndrew Thompson #define UISUBCLASS_BOOT 1 45702ac6454SAndrew Thompson #define UIPROTO_BOOT_KEYBOARD 1 45802ac6454SAndrew Thompson #define UIPROTO_MOUSE 2 45902ac6454SAndrew Thompson 46002ac6454SAndrew Thompson #define UICLASS_PHYSICAL 0x05 46102ac6454SAndrew Thompson #define UICLASS_IMAGE 0x06 46202ac6454SAndrew Thompson #define UISUBCLASS_SIC 1 /* still image class */ 46302ac6454SAndrew Thompson #define UICLASS_PRINTER 0x07 46402ac6454SAndrew Thompson #define UISUBCLASS_PRINTER 1 46502ac6454SAndrew Thompson #define UIPROTO_PRINTER_UNI 1 46602ac6454SAndrew Thompson #define UIPROTO_PRINTER_BI 2 46702ac6454SAndrew Thompson #define UIPROTO_PRINTER_1284 3 46802ac6454SAndrew Thompson 46902ac6454SAndrew Thompson #define UICLASS_MASS 0x08 47002ac6454SAndrew Thompson #define UISUBCLASS_RBC 1 47102ac6454SAndrew Thompson #define UISUBCLASS_SFF8020I 2 47202ac6454SAndrew Thompson #define UISUBCLASS_QIC157 3 47302ac6454SAndrew Thompson #define UISUBCLASS_UFI 4 47402ac6454SAndrew Thompson #define UISUBCLASS_SFF8070I 5 47502ac6454SAndrew Thompson #define UISUBCLASS_SCSI 6 47602ac6454SAndrew Thompson #define UIPROTO_MASS_CBI_I 0 47702ac6454SAndrew Thompson #define UIPROTO_MASS_CBI 1 47802ac6454SAndrew Thompson #define UIPROTO_MASS_BBB_OLD 2 /* Not in the spec anymore */ 47902ac6454SAndrew Thompson #define UIPROTO_MASS_BBB 80 /* 'P' for the Iomega Zip drive */ 48002ac6454SAndrew Thompson 48102ac6454SAndrew Thompson #define UICLASS_HUB 0x09 48202ac6454SAndrew Thompson #define UISUBCLASS_HUB 0 48302ac6454SAndrew Thompson #define UIPROTO_FSHUB 0 48402ac6454SAndrew Thompson #define UIPROTO_HSHUBSTT 0 /* Yes, same as previous */ 48502ac6454SAndrew Thompson #define UIPROTO_HSHUBMTT 1 48602ac6454SAndrew Thompson 48702ac6454SAndrew Thompson #define UICLASS_CDC_DATA 0x0a 4884076dd23SAndrew Thompson #define UISUBCLASS_DATA 0x00 48902ac6454SAndrew Thompson #define UIPROTO_DATA_ISDNBRI 0x30 /* Physical iface */ 49002ac6454SAndrew Thompson #define UIPROTO_DATA_HDLC 0x31 /* HDLC */ 49102ac6454SAndrew Thompson #define UIPROTO_DATA_TRANSPARENT 0x32 /* Transparent */ 49202ac6454SAndrew Thompson #define UIPROTO_DATA_Q921M 0x50 /* Management for Q921 */ 49302ac6454SAndrew Thompson #define UIPROTO_DATA_Q921 0x51 /* Data for Q921 */ 49402ac6454SAndrew Thompson #define UIPROTO_DATA_Q921TM 0x52 /* TEI multiplexer for Q921 */ 49502ac6454SAndrew Thompson #define UIPROTO_DATA_V42BIS 0x90 /* Data compression */ 49602ac6454SAndrew Thompson #define UIPROTO_DATA_Q931 0x91 /* Euro-ISDN */ 49702ac6454SAndrew Thompson #define UIPROTO_DATA_V120 0x92 /* V.24 rate adaption */ 49802ac6454SAndrew Thompson #define UIPROTO_DATA_CAPI 0x93 /* CAPI 2.0 commands */ 49902ac6454SAndrew Thompson #define UIPROTO_DATA_HOST_BASED 0xfd /* Host based driver */ 50002ac6454SAndrew Thompson #define UIPROTO_DATA_PUF 0xfe /* see Prot. Unit Func. Desc. */ 50102ac6454SAndrew Thompson #define UIPROTO_DATA_VENDOR 0xff /* Vendor specific */ 5024076dd23SAndrew Thompson #define UIPROTO_DATA_NCM 0x01 /* Network Control Model */ 50302ac6454SAndrew Thompson 50402ac6454SAndrew Thompson #define UICLASS_SMARTCARD 0x0b 50502ac6454SAndrew Thompson #define UICLASS_FIRM_UPD 0x0c 50602ac6454SAndrew Thompson #define UICLASS_SECURITY 0x0d 50702ac6454SAndrew Thompson #define UICLASS_DIAGNOSTIC 0xdc 50802ac6454SAndrew Thompson #define UICLASS_WIRELESS 0xe0 50902ac6454SAndrew Thompson #define UISUBCLASS_RF 0x01 51002ac6454SAndrew Thompson #define UIPROTO_BLUETOOTH 0x01 51129311227SHans Petter Selasky #define UIPROTO_RNDIS 0x03 51202ac6454SAndrew Thompson 513ec1201a2SAlfred Perlstein #define UICLASS_IAD 0xEF /* Interface Association Descriptor */ 51429311227SHans Petter Selasky #define UISUBCLASS_SYNC 0x01 51529311227SHans Petter Selasky #define UIPROTO_ACTIVESYNC 0x01 516ec1201a2SAlfred Perlstein 51702ac6454SAndrew Thompson #define UICLASS_APPL_SPEC 0xfe 51802ac6454SAndrew Thompson #define UISUBCLASS_FIRMWARE_DOWNLOAD 1 51902ac6454SAndrew Thompson #define UISUBCLASS_IRDA 2 52002ac6454SAndrew Thompson #define UIPROTO_IRDA 0 52102ac6454SAndrew Thompson 52202ac6454SAndrew Thompson #define UICLASS_VENDOR 0xff 52302ac6454SAndrew Thompson #define UISUBCLASS_XBOX360_CONTROLLER 0x5d 524dab84426SHans Petter Selasky #define UISUBCLASS_VENDOR 0xff 52502ac6454SAndrew Thompson #define UIPROTO_XBOX360_GAMEPAD 0x01 52602ac6454SAndrew Thompson 527760bc48eSAndrew Thompson struct usb_endpoint_descriptor { 52802ac6454SAndrew Thompson uByte bLength; 52902ac6454SAndrew Thompson uByte bDescriptorType; 53002ac6454SAndrew Thompson uByte bEndpointAddress; 53102ac6454SAndrew Thompson #define UE_GET_DIR(a) ((a) & 0x80) 53202ac6454SAndrew Thompson #define UE_SET_DIR(a,d) ((a) | (((d)&1) << 7)) 53351ec1603SAndrew Thompson #define UE_DIR_IN 0x80 /* IN-token endpoint, fixed */ 53451ec1603SAndrew Thompson #define UE_DIR_OUT 0x00 /* OUT-token endpoint, fixed */ 53551ec1603SAndrew Thompson #define UE_DIR_RX 0xfd /* for internal use only! */ 53651ec1603SAndrew Thompson #define UE_DIR_TX 0xfe /* for internal use only! */ 53702ac6454SAndrew Thompson #define UE_DIR_ANY 0xff /* for internal use only! */ 53802ac6454SAndrew Thompson #define UE_ADDR 0x0f 53902ac6454SAndrew Thompson #define UE_ADDR_ANY 0xff /* for internal use only! */ 54002ac6454SAndrew Thompson #define UE_GET_ADDR(a) ((a) & UE_ADDR) 54102ac6454SAndrew Thompson uByte bmAttributes; 54202ac6454SAndrew Thompson #define UE_XFERTYPE 0x03 54302ac6454SAndrew Thompson #define UE_CONTROL 0x00 54402ac6454SAndrew Thompson #define UE_ISOCHRONOUS 0x01 54502ac6454SAndrew Thompson #define UE_BULK 0x02 54602ac6454SAndrew Thompson #define UE_INTERRUPT 0x03 54702ac6454SAndrew Thompson #define UE_BULK_INTR 0xfe /* for internal use only! */ 54802ac6454SAndrew Thompson #define UE_TYPE_ANY 0xff /* for internal use only! */ 54902ac6454SAndrew Thompson #define UE_GET_XFERTYPE(a) ((a) & UE_XFERTYPE) 55002ac6454SAndrew Thompson #define UE_ISO_TYPE 0x0c 55102ac6454SAndrew Thompson #define UE_ISO_ASYNC 0x04 55202ac6454SAndrew Thompson #define UE_ISO_ADAPT 0x08 55302ac6454SAndrew Thompson #define UE_ISO_SYNC 0x0c 55402ac6454SAndrew Thompson #define UE_GET_ISO_TYPE(a) ((a) & UE_ISO_TYPE) 5555c155f23SHans Petter Selasky #define UE_ISO_USAGE 0x30 5565c155f23SHans Petter Selasky #define UE_ISO_USAGE_DATA 0x00 5575c155f23SHans Petter Selasky #define UE_ISO_USAGE_FEEDBACK 0x10 5585c155f23SHans Petter Selasky #define UE_ISO_USAGE_IMPLICT_FB 0x20 5595c155f23SHans Petter Selasky #define UE_GET_ISO_USAGE(a) ((a) & UE_ISO_USAGE) 56002ac6454SAndrew Thompson uWord wMaxPacketSize; 56102ac6454SAndrew Thompson #define UE_ZERO_MPS 0xFFFF /* for internal use only */ 56202ac6454SAndrew Thompson uByte bInterval; 56302ac6454SAndrew Thompson } __packed; 564760bc48eSAndrew Thompson typedef struct usb_endpoint_descriptor usb_endpoint_descriptor_t; 56502ac6454SAndrew Thompson 566760bc48eSAndrew Thompson struct usb_endpoint_ss_comp_descriptor { 56702ac6454SAndrew Thompson uByte bLength; 56802ac6454SAndrew Thompson uByte bDescriptorType; 5697b039740SHans Petter Selasky uByte bMaxBurst; 57002ac6454SAndrew Thompson uByte bmAttributes; 571a5cf1aaaSHans Petter Selasky #define UE_GET_BULK_STREAMS(x) ((x) & 0x0F) 572a5cf1aaaSHans Petter Selasky #define UE_GET_SS_ISO_MULT(x) ((x) & 0x03) 57302ac6454SAndrew Thompson uWord wBytesPerInterval; 57402ac6454SAndrew Thompson } __packed; 575760bc48eSAndrew Thompson typedef struct usb_endpoint_ss_comp_descriptor 576d7e3163dSAndrew Thompson usb_endpoint_ss_comp_descriptor_t; 57702ac6454SAndrew Thompson 578760bc48eSAndrew Thompson struct usb_string_descriptor { 57902ac6454SAndrew Thompson uByte bLength; 58002ac6454SAndrew Thompson uByte bDescriptorType; 58102ac6454SAndrew Thompson uWord bString[126]; 58202ac6454SAndrew Thompson uByte bUnused; 58302ac6454SAndrew Thompson } __packed; 584760bc48eSAndrew Thompson typedef struct usb_string_descriptor usb_string_descriptor_t; 58502ac6454SAndrew Thompson 58602ac6454SAndrew Thompson #define USB_MAKE_STRING_DESC(m,name) \ 58701923b39SHans Petter Selasky static const struct { \ 58802ac6454SAndrew Thompson uByte bLength; \ 58902ac6454SAndrew Thompson uByte bDescriptorType; \ 59002ac6454SAndrew Thompson uByte bData[sizeof((uint8_t []){m})]; \ 59101923b39SHans Petter Selasky } __packed name = { \ 59201923b39SHans Petter Selasky .bLength = sizeof(name), \ 59302ac6454SAndrew Thompson .bDescriptorType = UDESC_STRING, \ 59402ac6454SAndrew Thompson .bData = { m }, \ 59502ac6454SAndrew Thompson } 59602ac6454SAndrew Thompson 59723ab0871SHans Petter Selasky struct usb_string_lang { 59823ab0871SHans Petter Selasky uByte bLength; 59923ab0871SHans Petter Selasky uByte bDescriptorType; 60023ab0871SHans Petter Selasky uByte bData[2]; 60123ab0871SHans Petter Selasky } __packed; 60223ab0871SHans Petter Selasky typedef struct usb_string_lang usb_string_lang_t; 60323ab0871SHans Petter Selasky 604760bc48eSAndrew Thompson struct usb_hub_descriptor { 60502ac6454SAndrew Thompson uByte bDescLength; 60602ac6454SAndrew Thompson uByte bDescriptorType; 60702ac6454SAndrew Thompson uByte bNbrPorts; 60802ac6454SAndrew Thompson uWord wHubCharacteristics; 60902ac6454SAndrew Thompson #define UHD_PWR 0x0003 61002ac6454SAndrew Thompson #define UHD_PWR_GANGED 0x0000 61102ac6454SAndrew Thompson #define UHD_PWR_INDIVIDUAL 0x0001 61202ac6454SAndrew Thompson #define UHD_PWR_NO_SWITCH 0x0002 61302ac6454SAndrew Thompson #define UHD_COMPOUND 0x0004 61402ac6454SAndrew Thompson #define UHD_OC 0x0018 61502ac6454SAndrew Thompson #define UHD_OC_GLOBAL 0x0000 61602ac6454SAndrew Thompson #define UHD_OC_INDIVIDUAL 0x0008 61702ac6454SAndrew Thompson #define UHD_OC_NONE 0x0010 61802ac6454SAndrew Thompson #define UHD_TT_THINK 0x0060 61902ac6454SAndrew Thompson #define UHD_TT_THINK_8 0x0000 62002ac6454SAndrew Thompson #define UHD_TT_THINK_16 0x0020 62102ac6454SAndrew Thompson #define UHD_TT_THINK_24 0x0040 62202ac6454SAndrew Thompson #define UHD_TT_THINK_32 0x0060 62302ac6454SAndrew Thompson #define UHD_PORT_IND 0x0080 62402ac6454SAndrew Thompson uByte bPwrOn2PwrGood; /* delay in 2 ms units */ 62502ac6454SAndrew Thompson #define UHD_PWRON_FACTOR 2 62602ac6454SAndrew Thompson uByte bHubContrCurrent; 62702ac6454SAndrew Thompson uByte DeviceRemovable[32]; /* max 255 ports */ 62802ac6454SAndrew Thompson #define UHD_NOT_REMOV(desc, i) \ 62902ac6454SAndrew Thompson (((desc)->DeviceRemovable[(i)/8] >> ((i) % 8)) & 1) 63002ac6454SAndrew Thompson uByte PortPowerCtrlMask[1]; /* deprecated */ 63102ac6454SAndrew Thompson } __packed; 632760bc48eSAndrew Thompson typedef struct usb_hub_descriptor usb_hub_descriptor_t; 63302ac6454SAndrew Thompson 634760bc48eSAndrew Thompson struct usb_hub_ss_descriptor { 6357b039740SHans Petter Selasky uByte bLength; 63602ac6454SAndrew Thompson uByte bDescriptorType; 6377b039740SHans Petter Selasky uByte bNbrPorts; 63802ac6454SAndrew Thompson uWord wHubCharacteristics; 63902ac6454SAndrew Thompson uByte bPwrOn2PwrGood; /* delay in 2 ms units */ 64002ac6454SAndrew Thompson uByte bHubContrCurrent; 64102ac6454SAndrew Thompson uByte bHubHdrDecLat; 64202ac6454SAndrew Thompson uWord wHubDelay; 6437b039740SHans Petter Selasky uByte DeviceRemovable[32]; /* max 255 ports */ 64402ac6454SAndrew Thompson } __packed; 645760bc48eSAndrew Thompson typedef struct usb_hub_ss_descriptor usb_hub_ss_descriptor_t; 64602ac6454SAndrew Thompson 64702ac6454SAndrew Thompson /* minimum HUB descriptor (8-ports maximum) */ 648760bc48eSAndrew Thompson struct usb_hub_descriptor_min { 64902ac6454SAndrew Thompson uByte bDescLength; 65002ac6454SAndrew Thompson uByte bDescriptorType; 65102ac6454SAndrew Thompson uByte bNbrPorts; 65202ac6454SAndrew Thompson uWord wHubCharacteristics; 65302ac6454SAndrew Thompson uByte bPwrOn2PwrGood; 65402ac6454SAndrew Thompson uByte bHubContrCurrent; 65502ac6454SAndrew Thompson uByte DeviceRemovable[1]; 65602ac6454SAndrew Thompson uByte PortPowerCtrlMask[1]; 65702ac6454SAndrew Thompson } __packed; 658760bc48eSAndrew Thompson typedef struct usb_hub_descriptor_min usb_hub_descriptor_min_t; 65902ac6454SAndrew Thompson 660760bc48eSAndrew Thompson struct usb_device_qualifier { 66102ac6454SAndrew Thompson uByte bLength; 66202ac6454SAndrew Thompson uByte bDescriptorType; 66302ac6454SAndrew Thompson uWord bcdUSB; 66402ac6454SAndrew Thompson uByte bDeviceClass; 66502ac6454SAndrew Thompson uByte bDeviceSubClass; 66602ac6454SAndrew Thompson uByte bDeviceProtocol; 66702ac6454SAndrew Thompson uByte bMaxPacketSize0; 66802ac6454SAndrew Thompson uByte bNumConfigurations; 66902ac6454SAndrew Thompson uByte bReserved; 67002ac6454SAndrew Thompson } __packed; 671760bc48eSAndrew Thompson typedef struct usb_device_qualifier usb_device_qualifier_t; 67202ac6454SAndrew Thompson 673760bc48eSAndrew Thompson struct usb_otg_descriptor { 67402ac6454SAndrew Thompson uByte bLength; 67502ac6454SAndrew Thompson uByte bDescriptorType; 67602ac6454SAndrew Thompson uByte bmAttributes; 67702ac6454SAndrew Thompson #define UOTG_SRP 0x01 67802ac6454SAndrew Thompson #define UOTG_HNP 0x02 67902ac6454SAndrew Thompson } __packed; 680760bc48eSAndrew Thompson typedef struct usb_otg_descriptor usb_otg_descriptor_t; 68102ac6454SAndrew Thompson 68202ac6454SAndrew Thompson /* OTG feature selectors */ 68302ac6454SAndrew Thompson #define UOTG_B_HNP_ENABLE 3 68402ac6454SAndrew Thompson #define UOTG_A_HNP_SUPPORT 4 68502ac6454SAndrew Thompson #define UOTG_A_ALT_HNP_SUPPORT 5 68602ac6454SAndrew Thompson 687760bc48eSAndrew Thompson struct usb_status { 68802ac6454SAndrew Thompson uWord wStatus; 68902ac6454SAndrew Thompson /* Device status flags */ 69002ac6454SAndrew Thompson #define UDS_SELF_POWERED 0x0001 69102ac6454SAndrew Thompson #define UDS_REMOTE_WAKEUP 0x0002 69202ac6454SAndrew Thompson /* Endpoint status flags */ 69302ac6454SAndrew Thompson #define UES_HALT 0x0001 69402ac6454SAndrew Thompson } __packed; 695760bc48eSAndrew Thompson typedef struct usb_status usb_status_t; 69602ac6454SAndrew Thompson 697760bc48eSAndrew Thompson struct usb_hub_status { 69802ac6454SAndrew Thompson uWord wHubStatus; 69902ac6454SAndrew Thompson #define UHS_LOCAL_POWER 0x0001 70002ac6454SAndrew Thompson #define UHS_OVER_CURRENT 0x0002 70102ac6454SAndrew Thompson uWord wHubChange; 70202ac6454SAndrew Thompson } __packed; 703760bc48eSAndrew Thompson typedef struct usb_hub_status usb_hub_status_t; 70402ac6454SAndrew Thompson 705760bc48eSAndrew Thompson struct usb_port_status { 70602ac6454SAndrew Thompson uWord wPortStatus; 70702ac6454SAndrew Thompson #define UPS_CURRENT_CONNECT_STATUS 0x0001 70802ac6454SAndrew Thompson #define UPS_PORT_ENABLED 0x0002 70902ac6454SAndrew Thompson #define UPS_SUSPEND 0x0004 71002ac6454SAndrew Thompson #define UPS_OVERCURRENT_INDICATOR 0x0008 71102ac6454SAndrew Thompson #define UPS_RESET 0x0010 7124563ba7aSHans Petter Selasky #define UPS_PORT_L1 0x0020 /* USB 2.0 only */ 7137b039740SHans Petter Selasky /* The link-state bits are valid for Super-Speed USB HUBs */ 7147b039740SHans Petter Selasky #define UPS_PORT_LINK_STATE_GET(x) (((x) >> 5) & 0xF) 7157b039740SHans Petter Selasky #define UPS_PORT_LINK_STATE_SET(x) (((x) & 0xF) << 5) 7167b039740SHans Petter Selasky #define UPS_PORT_LS_U0 0x00 7177b039740SHans Petter Selasky #define UPS_PORT_LS_U1 0x01 7187b039740SHans Petter Selasky #define UPS_PORT_LS_U2 0x02 7197b039740SHans Petter Selasky #define UPS_PORT_LS_U3 0x03 7207b039740SHans Petter Selasky #define UPS_PORT_LS_SS_DIS 0x04 7217b039740SHans Petter Selasky #define UPS_PORT_LS_RX_DET 0x05 7227b039740SHans Petter Selasky #define UPS_PORT_LS_SS_INA 0x06 7237b039740SHans Petter Selasky #define UPS_PORT_LS_POLL 0x07 7247b039740SHans Petter Selasky #define UPS_PORT_LS_RECOVER 0x08 7257b039740SHans Petter Selasky #define UPS_PORT_LS_HOT_RST 0x09 7267b039740SHans Petter Selasky #define UPS_PORT_LS_COMP_MODE 0x0A 7277b039740SHans Petter Selasky #define UPS_PORT_LS_LOOPBACK 0x0B 7283d09c7b3SHans Petter Selasky #define UPS_PORT_LS_RESUME 0x0F 72902ac6454SAndrew Thompson #define UPS_PORT_POWER 0x0100 7304131f6fbSHans Petter Selasky #define UPS_PORT_POWER_SS 0x0200 /* super-speed only */ 73102ac6454SAndrew Thompson #define UPS_LOW_SPEED 0x0200 73202ac6454SAndrew Thompson #define UPS_HIGH_SPEED 0x0400 7337b039740SHans Petter Selasky #define UPS_OTHER_SPEED 0x0600 /* currently FreeBSD specific */ 73402ac6454SAndrew Thompson #define UPS_PORT_TEST 0x0800 73502ac6454SAndrew Thompson #define UPS_PORT_INDICATOR 0x1000 73602ac6454SAndrew Thompson #define UPS_PORT_MODE_DEVICE 0x8000 /* currently FreeBSD specific */ 73702ac6454SAndrew Thompson uWord wPortChange; 73802ac6454SAndrew Thompson #define UPS_C_CONNECT_STATUS 0x0001 73902ac6454SAndrew Thompson #define UPS_C_PORT_ENABLED 0x0002 74002ac6454SAndrew Thompson #define UPS_C_SUSPEND 0x0004 74102ac6454SAndrew Thompson #define UPS_C_OVERCURRENT_INDICATOR 0x0008 74202ac6454SAndrew Thompson #define UPS_C_PORT_RESET 0x0010 7434563ba7aSHans Petter Selasky #define UPS_C_PORT_L1 0x0020 /* USB 2.0 only */ 7444563ba7aSHans Petter Selasky #define UPS_C_BH_PORT_RESET 0x0020 /* USB 3.0 only */ 7457b039740SHans Petter Selasky #define UPS_C_PORT_LINK_STATE 0x0040 7467b039740SHans Petter Selasky #define UPS_C_PORT_CONFIG_ERROR 0x0080 74702ac6454SAndrew Thompson } __packed; 748760bc48eSAndrew Thompson typedef struct usb_port_status usb_port_status_t; 74902ac6454SAndrew Thompson 750ed6d949aSAndrew Thompson /* 751ed6d949aSAndrew Thompson * The "USB_SPEED" macros defines all the supported USB speeds. 752ed6d949aSAndrew Thompson */ 753ed6d949aSAndrew Thompson enum usb_dev_speed { 754ed6d949aSAndrew Thompson USB_SPEED_VARIABLE, 755ed6d949aSAndrew Thompson USB_SPEED_LOW, 756ed6d949aSAndrew Thompson USB_SPEED_FULL, 757ed6d949aSAndrew Thompson USB_SPEED_HIGH, 758ed6d949aSAndrew Thompson USB_SPEED_SUPER, 759ed6d949aSAndrew Thompson }; 760ed6d949aSAndrew Thompson #define USB_SPEED_MAX (USB_SPEED_SUPER+1) 761ed6d949aSAndrew Thompson 762ed6d949aSAndrew Thompson /* 763ed6d949aSAndrew Thompson * The "USB_REV" macros defines all the supported USB revisions. 764ed6d949aSAndrew Thompson */ 765ed6d949aSAndrew Thompson enum usb_revision { 766ed6d949aSAndrew Thompson USB_REV_UNKNOWN, 767ed6d949aSAndrew Thompson USB_REV_PRE_1_0, 768ed6d949aSAndrew Thompson USB_REV_1_0, 769ed6d949aSAndrew Thompson USB_REV_1_1, 770ed6d949aSAndrew Thompson USB_REV_2_0, 771ed6d949aSAndrew Thompson USB_REV_2_5, 772ed6d949aSAndrew Thompson USB_REV_3_0 773ed6d949aSAndrew Thompson }; 774ed6d949aSAndrew Thompson #define USB_REV_MAX (USB_REV_3_0+1) 775ed6d949aSAndrew Thompson 776ed6d949aSAndrew Thompson /* 777a5cf1aaaSHans Petter Selasky * Supported host controller modes. 778ed6d949aSAndrew Thompson */ 779ed6d949aSAndrew Thompson enum usb_hc_mode { 780ed6d949aSAndrew Thompson USB_MODE_HOST, /* initiates transfers */ 781ed6d949aSAndrew Thompson USB_MODE_DEVICE, /* bus transfer target */ 782ed6d949aSAndrew Thompson USB_MODE_DUAL /* can be host or device */ 783ed6d949aSAndrew Thompson }; 784ed6d949aSAndrew Thompson #define USB_MODE_MAX (USB_MODE_DUAL+1) 785ed6d949aSAndrew Thompson 786ed6d949aSAndrew Thompson /* 787a5cf1aaaSHans Petter Selasky * The "USB_STATE" enums define all the supported device states. 788ed6d949aSAndrew Thompson */ 789ed6d949aSAndrew Thompson enum usb_dev_state { 790ed6d949aSAndrew Thompson USB_STATE_DETACHED, 791ed6d949aSAndrew Thompson USB_STATE_ATTACHED, 792ed6d949aSAndrew Thompson USB_STATE_POWERED, 793ed6d949aSAndrew Thompson USB_STATE_ADDRESSED, 794ed6d949aSAndrew Thompson USB_STATE_CONFIGURED, 795ed6d949aSAndrew Thompson }; 796ed6d949aSAndrew Thompson #define USB_STATE_MAX (USB_STATE_CONFIGURED+1) 797a5cf1aaaSHans Petter Selasky 798a5cf1aaaSHans Petter Selasky /* 799a5cf1aaaSHans Petter Selasky * The "USB_EP_MODE" macros define all the currently supported 800a5cf1aaaSHans Petter Selasky * endpoint modes. 801a5cf1aaaSHans Petter Selasky */ 802a5cf1aaaSHans Petter Selasky enum usb_ep_mode { 803a5cf1aaaSHans Petter Selasky USB_EP_MODE_DEFAULT, 804a5cf1aaaSHans Petter Selasky USB_EP_MODE_STREAMS, /* USB3.0 specific */ 805a5cf1aaaSHans Petter Selasky USB_EP_MODE_HW_MASS_STORAGE, 806a5cf1aaaSHans Petter Selasky USB_EP_MODE_HW_SERIAL, 807a5cf1aaaSHans Petter Selasky USB_EP_MODE_HW_ETHERNET_CDC, 808a5cf1aaaSHans Petter Selasky USB_EP_MODE_HW_ETHERNET_NCM, 809a5cf1aaaSHans Petter Selasky USB_EP_MODE_MAX 810a5cf1aaaSHans Petter Selasky }; 81175973647SAndrew Thompson #endif /* _USB_STANDARD_H_ */ 812