1f2b12529SMarkus Pfeiffer /* $FreeBSD: head/sys/dev/usb/usb.h 273456 2014-10-22 07:50:19Z hselasky $ */ 212bd3c8bSSascha Wildner /*- 312bd3c8bSSascha Wildner * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. 412bd3c8bSSascha Wildner * Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved. 512bd3c8bSSascha Wildner * Copyright (c) 1998 Lennart Augustsson. All rights reserved. 612bd3c8bSSascha Wildner * 712bd3c8bSSascha Wildner * Redistribution and use in source and binary forms, with or without 812bd3c8bSSascha Wildner * modification, are permitted provided that the following conditions 912bd3c8bSSascha Wildner * are met: 1012bd3c8bSSascha Wildner * 1. Redistributions of source code must retain the above copyright 1112bd3c8bSSascha Wildner * notice, this list of conditions and the following disclaimer. 1212bd3c8bSSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright 1312bd3c8bSSascha Wildner * notice, this list of conditions and the following disclaimer in the 1412bd3c8bSSascha Wildner * documentation and/or other materials provided with the distribution. 1512bd3c8bSSascha Wildner * 1612bd3c8bSSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1712bd3c8bSSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1812bd3c8bSSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1912bd3c8bSSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2012bd3c8bSSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2112bd3c8bSSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2212bd3c8bSSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2312bd3c8bSSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2412bd3c8bSSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2512bd3c8bSSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2612bd3c8bSSascha Wildner * SUCH DAMAGE. 2712bd3c8bSSascha Wildner */ 2812bd3c8bSSascha Wildner 2912bd3c8bSSascha Wildner /* 3012bd3c8bSSascha Wildner * This file contains standard definitions for the following USB 3112bd3c8bSSascha Wildner * protocol versions: 3212bd3c8bSSascha Wildner * 3312bd3c8bSSascha Wildner * USB v1.0 3412bd3c8bSSascha Wildner * USB v1.1 3512bd3c8bSSascha Wildner * USB v2.0 3612bd3c8bSSascha Wildner * USB v3.0 3712bd3c8bSSascha Wildner */ 3812bd3c8bSSascha Wildner 3912bd3c8bSSascha Wildner #ifndef _USB_STANDARD_H_ 4012bd3c8bSSascha Wildner #define _USB_STANDARD_H_ 4112bd3c8bSSascha Wildner 4212bd3c8bSSascha Wildner #if defined(_KERNEL) 4312bd3c8bSSascha Wildner #include "opt_usb.h" 4412bd3c8bSSascha Wildner 4512bd3c8bSSascha Wildner /* Declare parent SYSCTL USB node. */ 4612bd3c8bSSascha Wildner #ifdef SYSCTL_DECL 4712bd3c8bSSascha Wildner SYSCTL_DECL(_hw_usb); 4812bd3c8bSSascha Wildner #endif 4912bd3c8bSSascha Wildner 50*805c8e8eSzrj #ifdef MALLOC_DECLARE 5112bd3c8bSSascha Wildner MALLOC_DECLARE(M_USB); 5212bd3c8bSSascha Wildner MALLOC_DECLARE(M_USBDEV); 53*805c8e8eSzrj #endif 5412bd3c8bSSascha Wildner #endif /* _KERNEL */ 5512bd3c8bSSascha Wildner 563186c89eSSascha Wildner #include <bus/u4b/usb_endian.h> 579e7c2a9fSMarkus Pfeiffer #include <bus/u4b/usb_dragonfly.h> 5812bd3c8bSSascha Wildner 5912bd3c8bSSascha Wildner #define USB_STACK_VERSION 2000 /* 2.0 */ 6012bd3c8bSSascha Wildner 6112bd3c8bSSascha Wildner /* Definition of some hardcoded USB constants. */ 6212bd3c8bSSascha Wildner 6312bd3c8bSSascha Wildner #define USB_MAX_IPACKET 8 /* initial USB packet size */ 6412bd3c8bSSascha Wildner #define USB_EP_MAX (2*16) /* hardcoded */ 6512bd3c8bSSascha Wildner #define USB_ROOT_HUB_ADDR 1 /* index */ 6612bd3c8bSSascha Wildner #define USB_MIN_DEVICES 2 /* unused + root HUB */ 6712bd3c8bSSascha Wildner #define USB_UNCONFIG_INDEX 0xFF /* internal use only */ 6812bd3c8bSSascha Wildner #define USB_IFACE_INDEX_ANY 0xFF /* internal use only */ 6912bd3c8bSSascha Wildner #define USB_START_ADDR 0 /* default USB device BUS address 7012bd3c8bSSascha Wildner * after USB bus reset */ 7112bd3c8bSSascha Wildner #define USB_CONTROL_ENDPOINT 0 /* default control endpoint */ 7212bd3c8bSSascha Wildner 7312bd3c8bSSascha Wildner #define USB_FRAMES_PER_SECOND_FS 1000 /* full speed */ 7412bd3c8bSSascha Wildner #define USB_FRAMES_PER_SECOND_HS 8000 /* high speed */ 7512bd3c8bSSascha Wildner 7612bd3c8bSSascha Wildner #define USB_FS_BYTES_PER_HS_UFRAME 188 /* bytes */ 7712bd3c8bSSascha Wildner #define USB_HS_MICRO_FRAMES_MAX 8 /* units */ 7812bd3c8bSSascha Wildner 7912bd3c8bSSascha Wildner #define USB_ISOC_TIME_MAX 128 /* ms */ 8012bd3c8bSSascha Wildner 8112bd3c8bSSascha Wildner /* 8212bd3c8bSSascha Wildner * Minimum time a device needs to be powered down to go through a 8312bd3c8bSSascha Wildner * power cycle. These values are not in the USB specification. 8412bd3c8bSSascha Wildner */ 8512bd3c8bSSascha Wildner #define USB_POWER_DOWN_TIME 200 /* ms */ 8612bd3c8bSSascha Wildner #define USB_PORT_POWER_DOWN_TIME 100 /* ms */ 8712bd3c8bSSascha Wildner 8812bd3c8bSSascha Wildner /* Definition of software USB power modes */ 8912bd3c8bSSascha Wildner #define USB_POWER_MODE_OFF 0 /* turn off device */ 9012bd3c8bSSascha Wildner #define USB_POWER_MODE_ON 1 /* always on */ 9112bd3c8bSSascha Wildner #define USB_POWER_MODE_SAVE 2 /* automatic suspend and resume */ 9212bd3c8bSSascha Wildner #define USB_POWER_MODE_SUSPEND 3 /* force suspend */ 9312bd3c8bSSascha Wildner #define USB_POWER_MODE_RESUME 4 /* force resume */ 9412bd3c8bSSascha Wildner 9512bd3c8bSSascha Wildner /* These are the values from the USB specification. */ 965e41ab93SMarkus Pfeiffer #define USB_PORT_RESET_DELAY_SPEC 10 /* ms */ 975e41ab93SMarkus Pfeiffer #define USB_PORT_ROOT_RESET_DELAY_SPEC 50 /* ms */ 985e41ab93SMarkus Pfeiffer #define USB_PORT_RESET_RECOVERY_SPEC 10 /* ms */ 995e41ab93SMarkus Pfeiffer #define USB_PORT_POWERUP_DELAY_SPEC 100 /* ms */ 1005e41ab93SMarkus Pfeiffer #define USB_PORT_RESUME_DELAY_SPEC 20 /* ms */ 1015e41ab93SMarkus Pfeiffer #define USB_SET_ADDRESS_SETTLE_SPEC 2 /* ms */ 1025e41ab93SMarkus Pfeiffer #define USB_RESUME_DELAY_SPEC (20*5) /* ms */ 1035e41ab93SMarkus Pfeiffer #define USB_RESUME_WAIT_SPEC 10 /* ms */ 1045e41ab93SMarkus Pfeiffer #define USB_RESUME_RECOVERY_SPEC 10 /* ms */ 1055e41ab93SMarkus Pfeiffer #define USB_EXTRA_POWER_UP_TIME_SPEC 0 /* ms */ 1065e41ab93SMarkus Pfeiffer 10712bd3c8bSSascha Wildner /* Allow for marginal and non-conforming devices. */ 10812bd3c8bSSascha Wildner #define USB_PORT_RESET_DELAY 50 /* ms */ 10912bd3c8bSSascha Wildner #define USB_PORT_ROOT_RESET_DELAY 250 /* ms */ 11012bd3c8bSSascha Wildner #define USB_PORT_RESET_RECOVERY 250 /* ms */ 11112bd3c8bSSascha Wildner #define USB_PORT_POWERUP_DELAY 300 /* ms */ 11212bd3c8bSSascha Wildner #define USB_PORT_RESUME_DELAY (20*2) /* ms */ 11312bd3c8bSSascha Wildner #define USB_SET_ADDRESS_SETTLE 10 /* ms */ 11412bd3c8bSSascha Wildner #define USB_RESUME_DELAY (50*5) /* ms */ 11512bd3c8bSSascha Wildner #define USB_RESUME_WAIT 50 /* ms */ 11612bd3c8bSSascha Wildner #define USB_RESUME_RECOVERY 50 /* ms */ 11712bd3c8bSSascha Wildner #define USB_EXTRA_POWER_UP_TIME 20 /* ms */ 11812bd3c8bSSascha Wildner 11912bd3c8bSSascha Wildner #define USB_MIN_POWER 100 /* mA */ 12012bd3c8bSSascha Wildner #define USB_MAX_POWER 500 /* mA */ 12112bd3c8bSSascha Wildner 12212bd3c8bSSascha Wildner #define USB_BUS_RESET_DELAY 100 /* ms */ 12312bd3c8bSSascha Wildner 12412bd3c8bSSascha Wildner /* 12512bd3c8bSSascha Wildner * USB record layout in memory: 12612bd3c8bSSascha Wildner * 12712bd3c8bSSascha Wildner * - USB config 0 12812bd3c8bSSascha Wildner * - USB interfaces 12912bd3c8bSSascha Wildner * - USB alternative interfaces 13012bd3c8bSSascha Wildner * - USB endpoints 13112bd3c8bSSascha Wildner * 13212bd3c8bSSascha Wildner * - USB config 1 13312bd3c8bSSascha Wildner * - USB interfaces 13412bd3c8bSSascha Wildner * - USB alternative interfaces 13512bd3c8bSSascha Wildner * - USB endpoints 13612bd3c8bSSascha Wildner */ 13712bd3c8bSSascha Wildner 13812bd3c8bSSascha Wildner /* Declaration of USB records */ 13912bd3c8bSSascha Wildner 14012bd3c8bSSascha Wildner struct usb_device_request { 14112bd3c8bSSascha Wildner uByte bmRequestType; 14212bd3c8bSSascha Wildner uByte bRequest; 14312bd3c8bSSascha Wildner uWord wValue; 14412bd3c8bSSascha Wildner uWord wIndex; 14512bd3c8bSSascha Wildner uWord wLength; 14612bd3c8bSSascha Wildner } __packed; 14712bd3c8bSSascha Wildner typedef struct usb_device_request usb_device_request_t; 14812bd3c8bSSascha Wildner 14912bd3c8bSSascha Wildner #define UT_WRITE 0x00 15012bd3c8bSSascha Wildner #define UT_READ 0x80 15112bd3c8bSSascha Wildner #define UT_STANDARD 0x00 15212bd3c8bSSascha Wildner #define UT_CLASS 0x20 15312bd3c8bSSascha Wildner #define UT_VENDOR 0x40 15412bd3c8bSSascha Wildner #define UT_DEVICE 0x00 15512bd3c8bSSascha Wildner #define UT_INTERFACE 0x01 15612bd3c8bSSascha Wildner #define UT_ENDPOINT 0x02 15712bd3c8bSSascha Wildner #define UT_OTHER 0x03 15812bd3c8bSSascha Wildner 15912bd3c8bSSascha Wildner #define UT_READ_DEVICE (UT_READ | UT_STANDARD | UT_DEVICE) 16012bd3c8bSSascha Wildner #define UT_READ_INTERFACE (UT_READ | UT_STANDARD | UT_INTERFACE) 16112bd3c8bSSascha Wildner #define UT_READ_ENDPOINT (UT_READ | UT_STANDARD | UT_ENDPOINT) 16212bd3c8bSSascha Wildner #define UT_WRITE_DEVICE (UT_WRITE | UT_STANDARD | UT_DEVICE) 16312bd3c8bSSascha Wildner #define UT_WRITE_INTERFACE (UT_WRITE | UT_STANDARD | UT_INTERFACE) 16412bd3c8bSSascha Wildner #define UT_WRITE_ENDPOINT (UT_WRITE | UT_STANDARD | UT_ENDPOINT) 16512bd3c8bSSascha Wildner #define UT_READ_CLASS_DEVICE (UT_READ | UT_CLASS | UT_DEVICE) 16612bd3c8bSSascha Wildner #define UT_READ_CLASS_INTERFACE (UT_READ | UT_CLASS | UT_INTERFACE) 16712bd3c8bSSascha Wildner #define UT_READ_CLASS_OTHER (UT_READ | UT_CLASS | UT_OTHER) 16812bd3c8bSSascha Wildner #define UT_READ_CLASS_ENDPOINT (UT_READ | UT_CLASS | UT_ENDPOINT) 16912bd3c8bSSascha Wildner #define UT_WRITE_CLASS_DEVICE (UT_WRITE | UT_CLASS | UT_DEVICE) 17012bd3c8bSSascha Wildner #define UT_WRITE_CLASS_INTERFACE (UT_WRITE | UT_CLASS | UT_INTERFACE) 17112bd3c8bSSascha Wildner #define UT_WRITE_CLASS_OTHER (UT_WRITE | UT_CLASS | UT_OTHER) 17212bd3c8bSSascha Wildner #define UT_WRITE_CLASS_ENDPOINT (UT_WRITE | UT_CLASS | UT_ENDPOINT) 17312bd3c8bSSascha Wildner #define UT_READ_VENDOR_DEVICE (UT_READ | UT_VENDOR | UT_DEVICE) 17412bd3c8bSSascha Wildner #define UT_READ_VENDOR_INTERFACE (UT_READ | UT_VENDOR | UT_INTERFACE) 17512bd3c8bSSascha Wildner #define UT_READ_VENDOR_OTHER (UT_READ | UT_VENDOR | UT_OTHER) 17612bd3c8bSSascha Wildner #define UT_READ_VENDOR_ENDPOINT (UT_READ | UT_VENDOR | UT_ENDPOINT) 17712bd3c8bSSascha Wildner #define UT_WRITE_VENDOR_DEVICE (UT_WRITE | UT_VENDOR | UT_DEVICE) 17812bd3c8bSSascha Wildner #define UT_WRITE_VENDOR_INTERFACE (UT_WRITE | UT_VENDOR | UT_INTERFACE) 17912bd3c8bSSascha Wildner #define UT_WRITE_VENDOR_OTHER (UT_WRITE | UT_VENDOR | UT_OTHER) 18012bd3c8bSSascha Wildner #define UT_WRITE_VENDOR_ENDPOINT (UT_WRITE | UT_VENDOR | UT_ENDPOINT) 18112bd3c8bSSascha Wildner 18212bd3c8bSSascha Wildner /* Requests */ 18312bd3c8bSSascha Wildner #define UR_GET_STATUS 0x00 18412bd3c8bSSascha Wildner #define UR_CLEAR_FEATURE 0x01 18512bd3c8bSSascha Wildner #define UR_SET_FEATURE 0x03 18612bd3c8bSSascha Wildner #define UR_SET_ADDRESS 0x05 18712bd3c8bSSascha Wildner #define UR_GET_DESCRIPTOR 0x06 18812bd3c8bSSascha Wildner #define UDESC_DEVICE 0x01 18912bd3c8bSSascha Wildner #define UDESC_CONFIG 0x02 19012bd3c8bSSascha Wildner #define UDESC_STRING 0x03 19112bd3c8bSSascha Wildner #define USB_LANGUAGE_TABLE 0x00 /* language ID string index */ 19212bd3c8bSSascha Wildner #define UDESC_INTERFACE 0x04 19312bd3c8bSSascha Wildner #define UDESC_ENDPOINT 0x05 19412bd3c8bSSascha Wildner #define UDESC_DEVICE_QUALIFIER 0x06 19512bd3c8bSSascha Wildner #define UDESC_OTHER_SPEED_CONFIGURATION 0x07 19612bd3c8bSSascha Wildner #define UDESC_INTERFACE_POWER 0x08 19712bd3c8bSSascha Wildner #define UDESC_OTG 0x09 19812bd3c8bSSascha Wildner #define UDESC_DEBUG 0x0A 19912bd3c8bSSascha Wildner #define UDESC_IFACE_ASSOC 0x0B /* interface association */ 20012bd3c8bSSascha Wildner #define UDESC_BOS 0x0F /* binary object store */ 20112bd3c8bSSascha Wildner #define UDESC_DEVICE_CAPABILITY 0x10 20212bd3c8bSSascha Wildner #define UDESC_CS_DEVICE 0x21 /* class specific */ 20312bd3c8bSSascha Wildner #define UDESC_CS_CONFIG 0x22 20412bd3c8bSSascha Wildner #define UDESC_CS_STRING 0x23 20512bd3c8bSSascha Wildner #define UDESC_CS_INTERFACE 0x24 20612bd3c8bSSascha Wildner #define UDESC_CS_ENDPOINT 0x25 20712bd3c8bSSascha Wildner #define UDESC_HUB 0x29 20812bd3c8bSSascha Wildner #define UDESC_SS_HUB 0x2A /* super speed */ 20912bd3c8bSSascha Wildner #define UDESC_ENDPOINT_SS_COMP 0x30 /* super speed */ 21012bd3c8bSSascha Wildner #define UR_SET_DESCRIPTOR 0x07 21112bd3c8bSSascha Wildner #define UR_GET_CONFIG 0x08 21212bd3c8bSSascha Wildner #define UR_SET_CONFIG 0x09 21312bd3c8bSSascha Wildner #define UR_GET_INTERFACE 0x0a 21412bd3c8bSSascha Wildner #define UR_SET_INTERFACE 0x0b 21512bd3c8bSSascha Wildner #define UR_SYNCH_FRAME 0x0c 21612bd3c8bSSascha Wildner #define UR_SET_SEL 0x30 21712bd3c8bSSascha Wildner #define UR_ISOCH_DELAY 0x31 21812bd3c8bSSascha Wildner 21912bd3c8bSSascha Wildner /* HUB specific request */ 22012bd3c8bSSascha Wildner #define UR_GET_BUS_STATE 0x02 22112bd3c8bSSascha Wildner #define UR_CLEAR_TT_BUFFER 0x08 22212bd3c8bSSascha Wildner #define UR_RESET_TT 0x09 22312bd3c8bSSascha Wildner #define UR_GET_TT_STATE 0x0a 22412bd3c8bSSascha Wildner #define UR_STOP_TT 0x0b 2255e41ab93SMarkus Pfeiffer #define UR_SET_AND_TEST 0x0c /* USB 2.0 only */ 2265e41ab93SMarkus Pfeiffer #define UR_SET_HUB_DEPTH 0x0c /* USB 3.0 only */ 22712bd3c8bSSascha Wildner #define USB_SS_HUB_DEPTH_MAX 5 22812bd3c8bSSascha Wildner #define UR_GET_PORT_ERR_COUNT 0x0d 22912bd3c8bSSascha Wildner 23012bd3c8bSSascha Wildner /* Feature numbers */ 23112bd3c8bSSascha Wildner #define UF_ENDPOINT_HALT 0 23212bd3c8bSSascha Wildner #define UF_DEVICE_REMOTE_WAKEUP 1 23312bd3c8bSSascha Wildner #define UF_TEST_MODE 2 23412bd3c8bSSascha Wildner #define UF_U1_ENABLE 0x30 23512bd3c8bSSascha Wildner #define UF_U2_ENABLE 0x31 23612bd3c8bSSascha Wildner #define UF_LTM_ENABLE 0x32 23712bd3c8bSSascha Wildner 23812bd3c8bSSascha Wildner /* HUB specific features */ 23912bd3c8bSSascha Wildner #define UHF_C_HUB_LOCAL_POWER 0 24012bd3c8bSSascha Wildner #define UHF_C_HUB_OVER_CURRENT 1 24112bd3c8bSSascha Wildner #define UHF_PORT_CONNECTION 0 24212bd3c8bSSascha Wildner #define UHF_PORT_ENABLE 1 24312bd3c8bSSascha Wildner #define UHF_PORT_SUSPEND 2 24412bd3c8bSSascha Wildner #define UHF_PORT_OVER_CURRENT 3 24512bd3c8bSSascha Wildner #define UHF_PORT_RESET 4 24612bd3c8bSSascha Wildner #define UHF_PORT_LINK_STATE 5 24712bd3c8bSSascha Wildner #define UHF_PORT_POWER 8 24812bd3c8bSSascha Wildner #define UHF_PORT_LOW_SPEED 9 2495e41ab93SMarkus Pfeiffer #define UHF_PORT_L1 10 25012bd3c8bSSascha Wildner #define UHF_C_PORT_CONNECTION 16 25112bd3c8bSSascha Wildner #define UHF_C_PORT_ENABLE 17 25212bd3c8bSSascha Wildner #define UHF_C_PORT_SUSPEND 18 25312bd3c8bSSascha Wildner #define UHF_C_PORT_OVER_CURRENT 19 25412bd3c8bSSascha Wildner #define UHF_C_PORT_RESET 20 25512bd3c8bSSascha Wildner #define UHF_PORT_TEST 21 25612bd3c8bSSascha Wildner #define UHF_PORT_INDICATOR 22 2575e41ab93SMarkus Pfeiffer #define UHF_C_PORT_L1 23 25812bd3c8bSSascha Wildner 25912bd3c8bSSascha Wildner /* SuperSpeed HUB specific features */ 26012bd3c8bSSascha Wildner #define UHF_PORT_U1_TIMEOUT 23 26112bd3c8bSSascha Wildner #define UHF_PORT_U2_TIMEOUT 24 26212bd3c8bSSascha Wildner #define UHF_C_PORT_LINK_STATE 25 26312bd3c8bSSascha Wildner #define UHF_C_PORT_CONFIG_ERROR 26 26412bd3c8bSSascha Wildner #define UHF_PORT_REMOTE_WAKE_MASK 27 26512bd3c8bSSascha Wildner #define UHF_BH_PORT_RESET 28 26612bd3c8bSSascha Wildner #define UHF_C_BH_PORT_RESET 29 26712bd3c8bSSascha Wildner #define UHF_FORCE_LINKPM_ACCEPT 30 26812bd3c8bSSascha Wildner 26912bd3c8bSSascha Wildner struct usb_descriptor { 27012bd3c8bSSascha Wildner uByte bLength; 27112bd3c8bSSascha Wildner uByte bDescriptorType; 27212bd3c8bSSascha Wildner uByte bDescriptorSubtype; 27312bd3c8bSSascha Wildner } __packed; 27412bd3c8bSSascha Wildner typedef struct usb_descriptor usb_descriptor_t; 27512bd3c8bSSascha Wildner 27612bd3c8bSSascha Wildner struct usb_device_descriptor { 27712bd3c8bSSascha Wildner uByte bLength; 27812bd3c8bSSascha Wildner uByte bDescriptorType; 27912bd3c8bSSascha Wildner uWord bcdUSB; 28012bd3c8bSSascha Wildner #define UD_USB_2_0 0x0200 28112bd3c8bSSascha Wildner #define UD_USB_3_0 0x0300 28212bd3c8bSSascha Wildner #define UD_IS_USB2(d) ((d)->bcdUSB[1] == 0x02) 28312bd3c8bSSascha Wildner #define UD_IS_USB3(d) ((d)->bcdUSB[1] == 0x03) 28412bd3c8bSSascha Wildner uByte bDeviceClass; 28512bd3c8bSSascha Wildner uByte bDeviceSubClass; 28612bd3c8bSSascha Wildner uByte bDeviceProtocol; 28712bd3c8bSSascha Wildner uByte bMaxPacketSize; 28812bd3c8bSSascha Wildner /* The fields below are not part of the initial descriptor. */ 28912bd3c8bSSascha Wildner uWord idVendor; 29012bd3c8bSSascha Wildner uWord idProduct; 29112bd3c8bSSascha Wildner uWord bcdDevice; 29212bd3c8bSSascha Wildner uByte iManufacturer; 29312bd3c8bSSascha Wildner uByte iProduct; 29412bd3c8bSSascha Wildner uByte iSerialNumber; 29512bd3c8bSSascha Wildner uByte bNumConfigurations; 29612bd3c8bSSascha Wildner } __packed; 29712bd3c8bSSascha Wildner typedef struct usb_device_descriptor usb_device_descriptor_t; 29812bd3c8bSSascha Wildner 29912bd3c8bSSascha Wildner /* Binary Device Object Store (BOS) */ 30012bd3c8bSSascha Wildner struct usb_bos_descriptor { 30112bd3c8bSSascha Wildner uByte bLength; 30212bd3c8bSSascha Wildner uByte bDescriptorType; 30312bd3c8bSSascha Wildner uWord wTotalLength; 30412bd3c8bSSascha Wildner uByte bNumDeviceCaps; 30512bd3c8bSSascha Wildner } __packed; 30612bd3c8bSSascha Wildner typedef struct usb_bos_descriptor usb_bos_descriptor_t; 30712bd3c8bSSascha Wildner 30812bd3c8bSSascha Wildner /* Binary Device Object Store Capability */ 30912bd3c8bSSascha Wildner struct usb_bos_cap_descriptor { 31012bd3c8bSSascha Wildner uByte bLength; 31112bd3c8bSSascha Wildner uByte bDescriptorType; 31212bd3c8bSSascha Wildner uByte bDevCapabilityType; 31312bd3c8bSSascha Wildner #define USB_DEVCAP_RESERVED 0x00 31412bd3c8bSSascha Wildner #define USB_DEVCAP_WUSB 0x01 31512bd3c8bSSascha Wildner #define USB_DEVCAP_USB2EXT 0x02 31612bd3c8bSSascha Wildner #define USB_DEVCAP_SUPER_SPEED 0x03 31712bd3c8bSSascha Wildner #define USB_DEVCAP_CONTAINER_ID 0x04 31812bd3c8bSSascha Wildner /* data ... */ 31912bd3c8bSSascha Wildner } __packed; 32012bd3c8bSSascha Wildner typedef struct usb_bos_cap_descriptor usb_bos_cap_descriptor_t; 32112bd3c8bSSascha Wildner 32212bd3c8bSSascha Wildner struct usb_devcap_usb2ext_descriptor { 32312bd3c8bSSascha Wildner uByte bLength; 32412bd3c8bSSascha Wildner uByte bDescriptorType; 32512bd3c8bSSascha Wildner uByte bDevCapabilityType; 32612bd3c8bSSascha Wildner uDWord bmAttributes; 3275e41ab93SMarkus Pfeiffer #define USB_V2EXT_LPM (1U << 1) 3285e41ab93SMarkus Pfeiffer #define USB_V2EXT_BESL_SUPPORTED (1U << 2) 3295e41ab93SMarkus Pfeiffer #define USB_V2EXT_BESL_BASELINE_VALID (1U << 3) 3305e41ab93SMarkus Pfeiffer #define USB_V2EXT_BESL_DEEP_VALID (1U << 4) 3315e41ab93SMarkus Pfeiffer #define USB_V2EXT_BESL_BASELINE_GET(x) (((x) >> 8) & 0xF) 3325e41ab93SMarkus Pfeiffer #define USB_V2EXT_BESL_DEEP_GET(x) (((x) >> 12) & 0xF) 33312bd3c8bSSascha Wildner } __packed; 33412bd3c8bSSascha Wildner typedef struct usb_devcap_usb2ext_descriptor usb_devcap_usb2ext_descriptor_t; 33512bd3c8bSSascha Wildner 33612bd3c8bSSascha Wildner struct usb_devcap_ss_descriptor { 33712bd3c8bSSascha Wildner uByte bLength; 33812bd3c8bSSascha Wildner uByte bDescriptorType; 33912bd3c8bSSascha Wildner uByte bDevCapabilityType; 34012bd3c8bSSascha Wildner uByte bmAttributes; 34112bd3c8bSSascha Wildner uWord wSpeedsSupported; 34212bd3c8bSSascha Wildner uByte bFunctionalitySupport; 34312bd3c8bSSascha Wildner uByte bU1DevExitLat; 34412bd3c8bSSascha Wildner uWord wU2DevExitLat; 34512bd3c8bSSascha Wildner } __packed; 34612bd3c8bSSascha Wildner typedef struct usb_devcap_ss_descriptor usb_devcap_ss_descriptor_t; 34712bd3c8bSSascha Wildner 34812bd3c8bSSascha Wildner struct usb_devcap_container_id_descriptor { 34912bd3c8bSSascha Wildner uByte bLength; 35012bd3c8bSSascha Wildner uByte bDescriptorType; 35112bd3c8bSSascha Wildner uByte bDevCapabilityType; 35212bd3c8bSSascha Wildner uByte bReserved; 35312bd3c8bSSascha Wildner uByte bContainerID; 35412bd3c8bSSascha Wildner } __packed; 35512bd3c8bSSascha Wildner typedef struct usb_devcap_container_id_descriptor 35612bd3c8bSSascha Wildner usb_devcap_container_id_descriptor_t; 35712bd3c8bSSascha Wildner 35812bd3c8bSSascha Wildner /* Device class codes */ 35912bd3c8bSSascha Wildner #define UDCLASS_IN_INTERFACE 0x00 36012bd3c8bSSascha Wildner #define UDCLASS_COMM 0x02 36112bd3c8bSSascha Wildner #define UDCLASS_HUB 0x09 36212bd3c8bSSascha Wildner #define UDSUBCLASS_HUB 0x00 36312bd3c8bSSascha Wildner #define UDPROTO_FSHUB 0x00 36412bd3c8bSSascha Wildner #define UDPROTO_HSHUBSTT 0x01 36512bd3c8bSSascha Wildner #define UDPROTO_HSHUBMTT 0x02 36612bd3c8bSSascha Wildner #define UDPROTO_SSHUB 0x03 36712bd3c8bSSascha Wildner #define UDCLASS_DIAGNOSTIC 0xdc 36812bd3c8bSSascha Wildner #define UDCLASS_WIRELESS 0xe0 36912bd3c8bSSascha Wildner #define UDSUBCLASS_RF 0x01 37012bd3c8bSSascha Wildner #define UDPROTO_BLUETOOTH 0x01 37112bd3c8bSSascha Wildner #define UDCLASS_VENDOR 0xff 37212bd3c8bSSascha Wildner 37312bd3c8bSSascha Wildner struct usb_config_descriptor { 37412bd3c8bSSascha Wildner uByte bLength; 37512bd3c8bSSascha Wildner uByte bDescriptorType; 37612bd3c8bSSascha Wildner uWord wTotalLength; 37712bd3c8bSSascha Wildner uByte bNumInterface; 37812bd3c8bSSascha Wildner uByte bConfigurationValue; 37912bd3c8bSSascha Wildner #define USB_UNCONFIG_NO 0 38012bd3c8bSSascha Wildner uByte iConfiguration; 38112bd3c8bSSascha Wildner uByte bmAttributes; 38212bd3c8bSSascha Wildner #define UC_BUS_POWERED 0x80 38312bd3c8bSSascha Wildner #define UC_SELF_POWERED 0x40 38412bd3c8bSSascha Wildner #define UC_REMOTE_WAKEUP 0x20 38512bd3c8bSSascha Wildner uByte bMaxPower; /* max current in 2 mA units */ 38612bd3c8bSSascha Wildner #define UC_POWER_FACTOR 2 38712bd3c8bSSascha Wildner } __packed; 38812bd3c8bSSascha Wildner typedef struct usb_config_descriptor usb_config_descriptor_t; 38912bd3c8bSSascha Wildner 39012bd3c8bSSascha Wildner struct usb_interface_descriptor { 39112bd3c8bSSascha Wildner uByte bLength; 39212bd3c8bSSascha Wildner uByte bDescriptorType; 39312bd3c8bSSascha Wildner uByte bInterfaceNumber; 39412bd3c8bSSascha Wildner uByte bAlternateSetting; 39512bd3c8bSSascha Wildner uByte bNumEndpoints; 39612bd3c8bSSascha Wildner uByte bInterfaceClass; 39712bd3c8bSSascha Wildner uByte bInterfaceSubClass; 39812bd3c8bSSascha Wildner uByte bInterfaceProtocol; 39912bd3c8bSSascha Wildner uByte iInterface; 40012bd3c8bSSascha Wildner } __packed; 40112bd3c8bSSascha Wildner typedef struct usb_interface_descriptor usb_interface_descriptor_t; 40212bd3c8bSSascha Wildner 40312bd3c8bSSascha Wildner struct usb_interface_assoc_descriptor { 40412bd3c8bSSascha Wildner uByte bLength; 40512bd3c8bSSascha Wildner uByte bDescriptorType; 40612bd3c8bSSascha Wildner uByte bFirstInterface; 40712bd3c8bSSascha Wildner uByte bInterfaceCount; 40812bd3c8bSSascha Wildner uByte bFunctionClass; 40912bd3c8bSSascha Wildner uByte bFunctionSubClass; 41012bd3c8bSSascha Wildner uByte bFunctionProtocol; 41112bd3c8bSSascha Wildner uByte iFunction; 41212bd3c8bSSascha Wildner } __packed; 41312bd3c8bSSascha Wildner typedef struct usb_interface_assoc_descriptor usb_interface_assoc_descriptor_t; 41412bd3c8bSSascha Wildner 41512bd3c8bSSascha Wildner /* Interface class codes */ 41612bd3c8bSSascha Wildner #define UICLASS_UNSPEC 0x00 41712bd3c8bSSascha Wildner #define UICLASS_AUDIO 0x01 /* audio */ 41812bd3c8bSSascha Wildner #define UISUBCLASS_AUDIOCONTROL 1 41912bd3c8bSSascha Wildner #define UISUBCLASS_AUDIOSTREAM 2 42012bd3c8bSSascha Wildner #define UISUBCLASS_MIDISTREAM 3 42112bd3c8bSSascha Wildner 42212bd3c8bSSascha Wildner #define UICLASS_CDC 0x02 /* communication */ 42312bd3c8bSSascha Wildner #define UISUBCLASS_DIRECT_LINE_CONTROL_MODEL 1 42412bd3c8bSSascha Wildner #define UISUBCLASS_ABSTRACT_CONTROL_MODEL 2 42512bd3c8bSSascha Wildner #define UISUBCLASS_TELEPHONE_CONTROL_MODEL 3 42612bd3c8bSSascha Wildner #define UISUBCLASS_MULTICHANNEL_CONTROL_MODEL 4 42712bd3c8bSSascha Wildner #define UISUBCLASS_CAPI_CONTROLMODEL 5 42812bd3c8bSSascha Wildner #define UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL 6 42912bd3c8bSSascha Wildner #define UISUBCLASS_ATM_NETWORKING_CONTROL_MODEL 7 43012bd3c8bSSascha Wildner #define UISUBCLASS_WIRELESS_HANDSET_CM 8 43112bd3c8bSSascha Wildner #define UISUBCLASS_DEVICE_MGMT 9 43212bd3c8bSSascha Wildner #define UISUBCLASS_MOBILE_DIRECT_LINE_MODEL 10 43312bd3c8bSSascha Wildner #define UISUBCLASS_OBEX 11 43412bd3c8bSSascha Wildner #define UISUBCLASS_ETHERNET_EMULATION_MODEL 12 43512bd3c8bSSascha Wildner #define UISUBCLASS_NETWORK_CONTROL_MODEL 13 43612bd3c8bSSascha Wildner 4378922de18SMarkus Pfeiffer #define UIPROTO_CDC_NONE 0 43812bd3c8bSSascha Wildner #define UIPROTO_CDC_AT 1 43912bd3c8bSSascha Wildner 44012bd3c8bSSascha Wildner #define UICLASS_HID 0x03 44112bd3c8bSSascha Wildner #define UISUBCLASS_BOOT 1 44212bd3c8bSSascha Wildner #define UIPROTO_BOOT_KEYBOARD 1 44312bd3c8bSSascha Wildner #define UIPROTO_MOUSE 2 44412bd3c8bSSascha Wildner 44512bd3c8bSSascha Wildner #define UICLASS_PHYSICAL 0x05 44612bd3c8bSSascha Wildner #define UICLASS_IMAGE 0x06 44712bd3c8bSSascha Wildner #define UISUBCLASS_SIC 1 /* still image class */ 44812bd3c8bSSascha Wildner #define UICLASS_PRINTER 0x07 44912bd3c8bSSascha Wildner #define UISUBCLASS_PRINTER 1 45012bd3c8bSSascha Wildner #define UIPROTO_PRINTER_UNI 1 45112bd3c8bSSascha Wildner #define UIPROTO_PRINTER_BI 2 45212bd3c8bSSascha Wildner #define UIPROTO_PRINTER_1284 3 45312bd3c8bSSascha Wildner 45412bd3c8bSSascha Wildner #define UICLASS_MASS 0x08 45512bd3c8bSSascha Wildner #define UISUBCLASS_RBC 1 45612bd3c8bSSascha Wildner #define UISUBCLASS_SFF8020I 2 45712bd3c8bSSascha Wildner #define UISUBCLASS_QIC157 3 45812bd3c8bSSascha Wildner #define UISUBCLASS_UFI 4 45912bd3c8bSSascha Wildner #define UISUBCLASS_SFF8070I 5 46012bd3c8bSSascha Wildner #define UISUBCLASS_SCSI 6 46112bd3c8bSSascha Wildner #define UIPROTO_MASS_CBI_I 0 46212bd3c8bSSascha Wildner #define UIPROTO_MASS_CBI 1 46312bd3c8bSSascha Wildner #define UIPROTO_MASS_BBB_OLD 2 /* Not in the spec anymore */ 46412bd3c8bSSascha Wildner #define UIPROTO_MASS_BBB 80 /* 'P' for the Iomega Zip drive */ 46512bd3c8bSSascha Wildner 46612bd3c8bSSascha Wildner #define UICLASS_HUB 0x09 46712bd3c8bSSascha Wildner #define UISUBCLASS_HUB 0 46812bd3c8bSSascha Wildner #define UIPROTO_FSHUB 0 46912bd3c8bSSascha Wildner #define UIPROTO_HSHUBSTT 0 /* Yes, same as previous */ 47012bd3c8bSSascha Wildner #define UIPROTO_HSHUBMTT 1 47112bd3c8bSSascha Wildner 47212bd3c8bSSascha Wildner #define UICLASS_CDC_DATA 0x0a 47312bd3c8bSSascha Wildner #define UISUBCLASS_DATA 0x00 47412bd3c8bSSascha Wildner #define UIPROTO_DATA_ISDNBRI 0x30 /* Physical iface */ 47512bd3c8bSSascha Wildner #define UIPROTO_DATA_HDLC 0x31 /* HDLC */ 47612bd3c8bSSascha Wildner #define UIPROTO_DATA_TRANSPARENT 0x32 /* Transparent */ 47712bd3c8bSSascha Wildner #define UIPROTO_DATA_Q921M 0x50 /* Management for Q921 */ 47812bd3c8bSSascha Wildner #define UIPROTO_DATA_Q921 0x51 /* Data for Q921 */ 47912bd3c8bSSascha Wildner #define UIPROTO_DATA_Q921TM 0x52 /* TEI multiplexer for Q921 */ 48012bd3c8bSSascha Wildner #define UIPROTO_DATA_V42BIS 0x90 /* Data compression */ 48112bd3c8bSSascha Wildner #define UIPROTO_DATA_Q931 0x91 /* Euro-ISDN */ 48212bd3c8bSSascha Wildner #define UIPROTO_DATA_V120 0x92 /* V.24 rate adaption */ 48312bd3c8bSSascha Wildner #define UIPROTO_DATA_CAPI 0x93 /* CAPI 2.0 commands */ 48412bd3c8bSSascha Wildner #define UIPROTO_DATA_HOST_BASED 0xfd /* Host based driver */ 48512bd3c8bSSascha Wildner #define UIPROTO_DATA_PUF 0xfe /* see Prot. Unit Func. Desc. */ 48612bd3c8bSSascha Wildner #define UIPROTO_DATA_VENDOR 0xff /* Vendor specific */ 48712bd3c8bSSascha Wildner #define UIPROTO_DATA_NCM 0x01 /* Network Control Model */ 48812bd3c8bSSascha Wildner 48912bd3c8bSSascha Wildner #define UICLASS_SMARTCARD 0x0b 49012bd3c8bSSascha Wildner #define UICLASS_FIRM_UPD 0x0c 49112bd3c8bSSascha Wildner #define UICLASS_SECURITY 0x0d 49212bd3c8bSSascha Wildner #define UICLASS_DIAGNOSTIC 0xdc 49312bd3c8bSSascha Wildner #define UICLASS_WIRELESS 0xe0 49412bd3c8bSSascha Wildner #define UISUBCLASS_RF 0x01 49512bd3c8bSSascha Wildner #define UIPROTO_BLUETOOTH 0x01 496e4ca69a1SSascha Wildner #define UIPROTO_RNDIS 0x03 49712bd3c8bSSascha Wildner 49812bd3c8bSSascha Wildner #define UICLASS_IAD 0xEF /* Interface Association Descriptor */ 499e4ca69a1SSascha Wildner #define UISUBCLASS_SYNC 0x01 500e4ca69a1SSascha Wildner #define UIPROTO_ACTIVESYNC 0x01 50112bd3c8bSSascha Wildner 50212bd3c8bSSascha Wildner #define UICLASS_APPL_SPEC 0xfe 50312bd3c8bSSascha Wildner #define UISUBCLASS_FIRMWARE_DOWNLOAD 1 50412bd3c8bSSascha Wildner #define UISUBCLASS_IRDA 2 50512bd3c8bSSascha Wildner #define UIPROTO_IRDA 0 50612bd3c8bSSascha Wildner 50712bd3c8bSSascha Wildner #define UICLASS_VENDOR 0xff 50812bd3c8bSSascha Wildner #define UISUBCLASS_XBOX360_CONTROLLER 0x5d 50912bd3c8bSSascha Wildner #define UIPROTO_XBOX360_GAMEPAD 0x01 51012bd3c8bSSascha Wildner 51112bd3c8bSSascha Wildner struct usb_endpoint_descriptor { 51212bd3c8bSSascha Wildner uByte bLength; 51312bd3c8bSSascha Wildner uByte bDescriptorType; 51412bd3c8bSSascha Wildner uByte bEndpointAddress; 51512bd3c8bSSascha Wildner #define UE_GET_DIR(a) ((a) & 0x80) 51612bd3c8bSSascha Wildner #define UE_SET_DIR(a,d) ((a) | (((d)&1) << 7)) 51712bd3c8bSSascha Wildner #define UE_DIR_IN 0x80 /* IN-token endpoint, fixed */ 51812bd3c8bSSascha Wildner #define UE_DIR_OUT 0x00 /* OUT-token endpoint, fixed */ 51912bd3c8bSSascha Wildner #define UE_DIR_RX 0xfd /* for internal use only! */ 52012bd3c8bSSascha Wildner #define UE_DIR_TX 0xfe /* for internal use only! */ 52112bd3c8bSSascha Wildner #define UE_DIR_ANY 0xff /* for internal use only! */ 52212bd3c8bSSascha Wildner #define UE_ADDR 0x0f 52312bd3c8bSSascha Wildner #define UE_ADDR_ANY 0xff /* for internal use only! */ 52412bd3c8bSSascha Wildner #define UE_GET_ADDR(a) ((a) & UE_ADDR) 52512bd3c8bSSascha Wildner uByte bmAttributes; 52612bd3c8bSSascha Wildner #define UE_XFERTYPE 0x03 52712bd3c8bSSascha Wildner #define UE_CONTROL 0x00 52812bd3c8bSSascha Wildner #define UE_ISOCHRONOUS 0x01 52912bd3c8bSSascha Wildner #define UE_BULK 0x02 53012bd3c8bSSascha Wildner #define UE_INTERRUPT 0x03 53112bd3c8bSSascha Wildner #define UE_BULK_INTR 0xfe /* for internal use only! */ 53212bd3c8bSSascha Wildner #define UE_TYPE_ANY 0xff /* for internal use only! */ 53312bd3c8bSSascha Wildner #define UE_GET_XFERTYPE(a) ((a) & UE_XFERTYPE) 53412bd3c8bSSascha Wildner #define UE_ISO_TYPE 0x0c 53512bd3c8bSSascha Wildner #define UE_ISO_ASYNC 0x04 53612bd3c8bSSascha Wildner #define UE_ISO_ADAPT 0x08 53712bd3c8bSSascha Wildner #define UE_ISO_SYNC 0x0c 53812bd3c8bSSascha Wildner #define UE_GET_ISO_TYPE(a) ((a) & UE_ISO_TYPE) 53912bd3c8bSSascha Wildner uWord wMaxPacketSize; 54012bd3c8bSSascha Wildner #define UE_ZERO_MPS 0xFFFF /* for internal use only */ 54112bd3c8bSSascha Wildner uByte bInterval; 54212bd3c8bSSascha Wildner } __packed; 54312bd3c8bSSascha Wildner typedef struct usb_endpoint_descriptor usb_endpoint_descriptor_t; 54412bd3c8bSSascha Wildner 54512bd3c8bSSascha Wildner struct usb_endpoint_ss_comp_descriptor { 54612bd3c8bSSascha Wildner uByte bLength; 54712bd3c8bSSascha Wildner uByte bDescriptorType; 54812bd3c8bSSascha Wildner uByte bMaxBurst; 54912bd3c8bSSascha Wildner uByte bmAttributes; 5505e41ab93SMarkus Pfeiffer #define UE_GET_BULK_STREAMS(x) ((x) & 0x0F) 5515e41ab93SMarkus Pfeiffer #define UE_GET_SS_ISO_MULT(x) ((x) & 0x03) 55212bd3c8bSSascha Wildner uWord wBytesPerInterval; 55312bd3c8bSSascha Wildner } __packed; 55412bd3c8bSSascha Wildner typedef struct usb_endpoint_ss_comp_descriptor 55512bd3c8bSSascha Wildner usb_endpoint_ss_comp_descriptor_t; 55612bd3c8bSSascha Wildner 55712bd3c8bSSascha Wildner struct usb_string_descriptor { 55812bd3c8bSSascha Wildner uByte bLength; 55912bd3c8bSSascha Wildner uByte bDescriptorType; 56012bd3c8bSSascha Wildner uWord bString[126]; 56112bd3c8bSSascha Wildner uByte bUnused; 56212bd3c8bSSascha Wildner } __packed; 56312bd3c8bSSascha Wildner typedef struct usb_string_descriptor usb_string_descriptor_t; 56412bd3c8bSSascha Wildner 56512bd3c8bSSascha Wildner #define USB_MAKE_STRING_DESC(m,name) \ 5668922de18SMarkus Pfeiffer static const struct { \ 56712bd3c8bSSascha Wildner uByte bLength; \ 56812bd3c8bSSascha Wildner uByte bDescriptorType; \ 56912bd3c8bSSascha Wildner uByte bData[sizeof((uint8_t []){m})]; \ 5708922de18SMarkus Pfeiffer } __packed name = { \ 5718922de18SMarkus Pfeiffer .bLength = sizeof(name), \ 57212bd3c8bSSascha Wildner .bDescriptorType = UDESC_STRING, \ 57312bd3c8bSSascha Wildner .bData = { m }, \ 57412bd3c8bSSascha Wildner } 57512bd3c8bSSascha Wildner 5768922de18SMarkus Pfeiffer struct usb_string_lang { 5778922de18SMarkus Pfeiffer uByte bLength; 5788922de18SMarkus Pfeiffer uByte bDescriptorType; 5798922de18SMarkus Pfeiffer uByte bData[2]; 5808922de18SMarkus Pfeiffer } __packed; 5818922de18SMarkus Pfeiffer typedef struct usb_string_lang usb_string_lang_t; 5828922de18SMarkus Pfeiffer 58312bd3c8bSSascha Wildner struct usb_hub_descriptor { 58412bd3c8bSSascha Wildner uByte bDescLength; 58512bd3c8bSSascha Wildner uByte bDescriptorType; 58612bd3c8bSSascha Wildner uByte bNbrPorts; 58712bd3c8bSSascha Wildner uWord wHubCharacteristics; 58812bd3c8bSSascha Wildner #define UHD_PWR 0x0003 58912bd3c8bSSascha Wildner #define UHD_PWR_GANGED 0x0000 59012bd3c8bSSascha Wildner #define UHD_PWR_INDIVIDUAL 0x0001 59112bd3c8bSSascha Wildner #define UHD_PWR_NO_SWITCH 0x0002 59212bd3c8bSSascha Wildner #define UHD_COMPOUND 0x0004 59312bd3c8bSSascha Wildner #define UHD_OC 0x0018 59412bd3c8bSSascha Wildner #define UHD_OC_GLOBAL 0x0000 59512bd3c8bSSascha Wildner #define UHD_OC_INDIVIDUAL 0x0008 59612bd3c8bSSascha Wildner #define UHD_OC_NONE 0x0010 59712bd3c8bSSascha Wildner #define UHD_TT_THINK 0x0060 59812bd3c8bSSascha Wildner #define UHD_TT_THINK_8 0x0000 59912bd3c8bSSascha Wildner #define UHD_TT_THINK_16 0x0020 60012bd3c8bSSascha Wildner #define UHD_TT_THINK_24 0x0040 60112bd3c8bSSascha Wildner #define UHD_TT_THINK_32 0x0060 60212bd3c8bSSascha Wildner #define UHD_PORT_IND 0x0080 60312bd3c8bSSascha Wildner uByte bPwrOn2PwrGood; /* delay in 2 ms units */ 60412bd3c8bSSascha Wildner #define UHD_PWRON_FACTOR 2 60512bd3c8bSSascha Wildner uByte bHubContrCurrent; 60612bd3c8bSSascha Wildner uByte DeviceRemovable[32]; /* max 255 ports */ 60712bd3c8bSSascha Wildner #define UHD_NOT_REMOV(desc, i) \ 60812bd3c8bSSascha Wildner (((desc)->DeviceRemovable[(i)/8] >> ((i) % 8)) & 1) 60912bd3c8bSSascha Wildner uByte PortPowerCtrlMask[1]; /* deprecated */ 61012bd3c8bSSascha Wildner } __packed; 61112bd3c8bSSascha Wildner typedef struct usb_hub_descriptor usb_hub_descriptor_t; 61212bd3c8bSSascha Wildner 61312bd3c8bSSascha Wildner struct usb_hub_ss_descriptor { 61412bd3c8bSSascha Wildner uByte bLength; 61512bd3c8bSSascha Wildner uByte bDescriptorType; 61612bd3c8bSSascha Wildner uByte bNbrPorts; 61712bd3c8bSSascha Wildner uWord wHubCharacteristics; 61812bd3c8bSSascha Wildner uByte bPwrOn2PwrGood; /* delay in 2 ms units */ 61912bd3c8bSSascha Wildner uByte bHubContrCurrent; 62012bd3c8bSSascha Wildner uByte bHubHdrDecLat; 62112bd3c8bSSascha Wildner uWord wHubDelay; 62212bd3c8bSSascha Wildner uByte DeviceRemovable[32]; /* max 255 ports */ 62312bd3c8bSSascha Wildner } __packed; 62412bd3c8bSSascha Wildner typedef struct usb_hub_ss_descriptor usb_hub_ss_descriptor_t; 62512bd3c8bSSascha Wildner 62612bd3c8bSSascha Wildner /* minimum HUB descriptor (8-ports maximum) */ 62712bd3c8bSSascha Wildner struct usb_hub_descriptor_min { 62812bd3c8bSSascha Wildner uByte bDescLength; 62912bd3c8bSSascha Wildner uByte bDescriptorType; 63012bd3c8bSSascha Wildner uByte bNbrPorts; 63112bd3c8bSSascha Wildner uWord wHubCharacteristics; 63212bd3c8bSSascha Wildner uByte bPwrOn2PwrGood; 63312bd3c8bSSascha Wildner uByte bHubContrCurrent; 63412bd3c8bSSascha Wildner uByte DeviceRemovable[1]; 63512bd3c8bSSascha Wildner uByte PortPowerCtrlMask[1]; 63612bd3c8bSSascha Wildner } __packed; 63712bd3c8bSSascha Wildner typedef struct usb_hub_descriptor_min usb_hub_descriptor_min_t; 63812bd3c8bSSascha Wildner 63912bd3c8bSSascha Wildner struct usb_device_qualifier { 64012bd3c8bSSascha Wildner uByte bLength; 64112bd3c8bSSascha Wildner uByte bDescriptorType; 64212bd3c8bSSascha Wildner uWord bcdUSB; 64312bd3c8bSSascha Wildner uByte bDeviceClass; 64412bd3c8bSSascha Wildner uByte bDeviceSubClass; 64512bd3c8bSSascha Wildner uByte bDeviceProtocol; 64612bd3c8bSSascha Wildner uByte bMaxPacketSize0; 64712bd3c8bSSascha Wildner uByte bNumConfigurations; 64812bd3c8bSSascha Wildner uByte bReserved; 64912bd3c8bSSascha Wildner } __packed; 65012bd3c8bSSascha Wildner typedef struct usb_device_qualifier usb_device_qualifier_t; 65112bd3c8bSSascha Wildner 65212bd3c8bSSascha Wildner struct usb_otg_descriptor { 65312bd3c8bSSascha Wildner uByte bLength; 65412bd3c8bSSascha Wildner uByte bDescriptorType; 65512bd3c8bSSascha Wildner uByte bmAttributes; 65612bd3c8bSSascha Wildner #define UOTG_SRP 0x01 65712bd3c8bSSascha Wildner #define UOTG_HNP 0x02 65812bd3c8bSSascha Wildner } __packed; 65912bd3c8bSSascha Wildner typedef struct usb_otg_descriptor usb_otg_descriptor_t; 66012bd3c8bSSascha Wildner 66112bd3c8bSSascha Wildner /* OTG feature selectors */ 66212bd3c8bSSascha Wildner #define UOTG_B_HNP_ENABLE 3 66312bd3c8bSSascha Wildner #define UOTG_A_HNP_SUPPORT 4 66412bd3c8bSSascha Wildner #define UOTG_A_ALT_HNP_SUPPORT 5 66512bd3c8bSSascha Wildner 66612bd3c8bSSascha Wildner struct usb_status { 66712bd3c8bSSascha Wildner uWord wStatus; 66812bd3c8bSSascha Wildner /* Device status flags */ 66912bd3c8bSSascha Wildner #define UDS_SELF_POWERED 0x0001 67012bd3c8bSSascha Wildner #define UDS_REMOTE_WAKEUP 0x0002 67112bd3c8bSSascha Wildner /* Endpoint status flags */ 67212bd3c8bSSascha Wildner #define UES_HALT 0x0001 67312bd3c8bSSascha Wildner } __packed; 67412bd3c8bSSascha Wildner typedef struct usb_status usb_status_t; 67512bd3c8bSSascha Wildner 67612bd3c8bSSascha Wildner struct usb_hub_status { 67712bd3c8bSSascha Wildner uWord wHubStatus; 67812bd3c8bSSascha Wildner #define UHS_LOCAL_POWER 0x0001 67912bd3c8bSSascha Wildner #define UHS_OVER_CURRENT 0x0002 68012bd3c8bSSascha Wildner uWord wHubChange; 68112bd3c8bSSascha Wildner } __packed; 68212bd3c8bSSascha Wildner typedef struct usb_hub_status usb_hub_status_t; 68312bd3c8bSSascha Wildner 68412bd3c8bSSascha Wildner struct usb_port_status { 68512bd3c8bSSascha Wildner uWord wPortStatus; 68612bd3c8bSSascha Wildner #define UPS_CURRENT_CONNECT_STATUS 0x0001 68712bd3c8bSSascha Wildner #define UPS_PORT_ENABLED 0x0002 68812bd3c8bSSascha Wildner #define UPS_SUSPEND 0x0004 68912bd3c8bSSascha Wildner #define UPS_OVERCURRENT_INDICATOR 0x0008 69012bd3c8bSSascha Wildner #define UPS_RESET 0x0010 6918922de18SMarkus Pfeiffer #define UPS_PORT_L1 0x0020 /* USB 2.0 only */ 69212bd3c8bSSascha Wildner /* The link-state bits are valid for Super-Speed USB HUBs */ 69312bd3c8bSSascha Wildner #define UPS_PORT_LINK_STATE_GET(x) (((x) >> 5) & 0xF) 69412bd3c8bSSascha Wildner #define UPS_PORT_LINK_STATE_SET(x) (((x) & 0xF) << 5) 69512bd3c8bSSascha Wildner #define UPS_PORT_LS_U0 0x00 69612bd3c8bSSascha Wildner #define UPS_PORT_LS_U1 0x01 69712bd3c8bSSascha Wildner #define UPS_PORT_LS_U2 0x02 69812bd3c8bSSascha Wildner #define UPS_PORT_LS_U3 0x03 69912bd3c8bSSascha Wildner #define UPS_PORT_LS_SS_DIS 0x04 70012bd3c8bSSascha Wildner #define UPS_PORT_LS_RX_DET 0x05 70112bd3c8bSSascha Wildner #define UPS_PORT_LS_SS_INA 0x06 70212bd3c8bSSascha Wildner #define UPS_PORT_LS_POLL 0x07 70312bd3c8bSSascha Wildner #define UPS_PORT_LS_RECOVER 0x08 70412bd3c8bSSascha Wildner #define UPS_PORT_LS_HOT_RST 0x09 70512bd3c8bSSascha Wildner #define UPS_PORT_LS_COMP_MODE 0x0A 70612bd3c8bSSascha Wildner #define UPS_PORT_LS_LOOPBACK 0x0B 70712bd3c8bSSascha Wildner #define UPS_PORT_LS_RESUME 0x0F 70812bd3c8bSSascha Wildner #define UPS_PORT_POWER 0x0100 70912bd3c8bSSascha Wildner #define UPS_PORT_POWER_SS 0x0200 /* super-speed only */ 71012bd3c8bSSascha Wildner #define UPS_LOW_SPEED 0x0200 71112bd3c8bSSascha Wildner #define UPS_HIGH_SPEED 0x0400 71212bd3c8bSSascha Wildner #define UPS_OTHER_SPEED 0x0600 /* currently FreeBSD specific */ 71312bd3c8bSSascha Wildner #define UPS_PORT_TEST 0x0800 71412bd3c8bSSascha Wildner #define UPS_PORT_INDICATOR 0x1000 71512bd3c8bSSascha Wildner #define UPS_PORT_MODE_DEVICE 0x8000 /* currently FreeBSD specific */ 71612bd3c8bSSascha Wildner uWord wPortChange; 71712bd3c8bSSascha Wildner #define UPS_C_CONNECT_STATUS 0x0001 71812bd3c8bSSascha Wildner #define UPS_C_PORT_ENABLED 0x0002 71912bd3c8bSSascha Wildner #define UPS_C_SUSPEND 0x0004 72012bd3c8bSSascha Wildner #define UPS_C_OVERCURRENT_INDICATOR 0x0008 72112bd3c8bSSascha Wildner #define UPS_C_PORT_RESET 0x0010 7228922de18SMarkus Pfeiffer #define UPS_C_PORT_L1 0x0020 /* USB 2.0 only */ 7238922de18SMarkus Pfeiffer #define UPS_C_BH_PORT_RESET 0x0020 /* USB 3.0 only */ 72412bd3c8bSSascha Wildner #define UPS_C_PORT_LINK_STATE 0x0040 72512bd3c8bSSascha Wildner #define UPS_C_PORT_CONFIG_ERROR 0x0080 72612bd3c8bSSascha Wildner } __packed; 72712bd3c8bSSascha Wildner typedef struct usb_port_status usb_port_status_t; 72812bd3c8bSSascha Wildner 72912bd3c8bSSascha Wildner /* 73012bd3c8bSSascha Wildner * The "USB_SPEED" macros defines all the supported USB speeds. 73112bd3c8bSSascha Wildner */ 73212bd3c8bSSascha Wildner enum usb_dev_speed { 73312bd3c8bSSascha Wildner USB_SPEED_VARIABLE, 73412bd3c8bSSascha Wildner USB_SPEED_LOW, 73512bd3c8bSSascha Wildner USB_SPEED_FULL, 73612bd3c8bSSascha Wildner USB_SPEED_HIGH, 73712bd3c8bSSascha Wildner USB_SPEED_SUPER, 73812bd3c8bSSascha Wildner }; 73912bd3c8bSSascha Wildner #define USB_SPEED_MAX (USB_SPEED_SUPER+1) 74012bd3c8bSSascha Wildner 74112bd3c8bSSascha Wildner /* 74212bd3c8bSSascha Wildner * The "USB_REV" macros defines all the supported USB revisions. 74312bd3c8bSSascha Wildner */ 74412bd3c8bSSascha Wildner enum usb_revision { 74512bd3c8bSSascha Wildner USB_REV_UNKNOWN, 74612bd3c8bSSascha Wildner USB_REV_PRE_1_0, 74712bd3c8bSSascha Wildner USB_REV_1_0, 74812bd3c8bSSascha Wildner USB_REV_1_1, 74912bd3c8bSSascha Wildner USB_REV_2_0, 75012bd3c8bSSascha Wildner USB_REV_2_5, 75112bd3c8bSSascha Wildner USB_REV_3_0 75212bd3c8bSSascha Wildner }; 75312bd3c8bSSascha Wildner #define USB_REV_MAX (USB_REV_3_0+1) 75412bd3c8bSSascha Wildner 75512bd3c8bSSascha Wildner /* 7568922de18SMarkus Pfeiffer * Supported host controller modes. 75712bd3c8bSSascha Wildner */ 75812bd3c8bSSascha Wildner enum usb_hc_mode { 75912bd3c8bSSascha Wildner USB_MODE_HOST, /* initiates transfers */ 76012bd3c8bSSascha Wildner USB_MODE_DEVICE, /* bus transfer target */ 76112bd3c8bSSascha Wildner USB_MODE_DUAL /* can be host or device */ 76212bd3c8bSSascha Wildner }; 76312bd3c8bSSascha Wildner #define USB_MODE_MAX (USB_MODE_DUAL+1) 76412bd3c8bSSascha Wildner 76512bd3c8bSSascha Wildner /* 7668922de18SMarkus Pfeiffer * The "USB_STATE" enums define all the supported device states. 76712bd3c8bSSascha Wildner */ 76812bd3c8bSSascha Wildner enum usb_dev_state { 76912bd3c8bSSascha Wildner USB_STATE_DETACHED, 77012bd3c8bSSascha Wildner USB_STATE_ATTACHED, 77112bd3c8bSSascha Wildner USB_STATE_POWERED, 77212bd3c8bSSascha Wildner USB_STATE_ADDRESSED, 77312bd3c8bSSascha Wildner USB_STATE_CONFIGURED, 77412bd3c8bSSascha Wildner }; 77512bd3c8bSSascha Wildner #define USB_STATE_MAX (USB_STATE_CONFIGURED+1) 7765e41ab93SMarkus Pfeiffer 7775e41ab93SMarkus Pfeiffer /* 7785e41ab93SMarkus Pfeiffer * The "USB_EP_MODE" macros define all the currently supported 7795e41ab93SMarkus Pfeiffer * endpoint modes. 7805e41ab93SMarkus Pfeiffer */ 7815e41ab93SMarkus Pfeiffer enum usb_ep_mode { 7825e41ab93SMarkus Pfeiffer USB_EP_MODE_DEFAULT, 7835e41ab93SMarkus Pfeiffer USB_EP_MODE_STREAMS, /* USB3.0 specific */ 7845e41ab93SMarkus Pfeiffer USB_EP_MODE_HW_MASS_STORAGE, 7855e41ab93SMarkus Pfeiffer USB_EP_MODE_HW_SERIAL, 7865e41ab93SMarkus Pfeiffer USB_EP_MODE_HW_ETHERNET_CDC, 7875e41ab93SMarkus Pfeiffer USB_EP_MODE_HW_ETHERNET_NCM, 7885e41ab93SMarkus Pfeiffer USB_EP_MODE_MAX 7895e41ab93SMarkus Pfeiffer }; 79012bd3c8bSSascha Wildner #endif /* _USB_STANDARD_H_ */ 791