1*4f2df630SAndroid Build Coastguard Worker /* Copyright 2013 The ChromiumOS Authors 2*4f2df630SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 3*4f2df630SAndroid Build Coastguard Worker * found in the LICENSE file. 4*4f2df630SAndroid Build Coastguard Worker * 5*4f2df630SAndroid Build Coastguard Worker * USB definitions. 6*4f2df630SAndroid Build Coastguard Worker */ 7*4f2df630SAndroid Build Coastguard Worker 8*4f2df630SAndroid Build Coastguard Worker #ifndef __CROS_EC_USB_DESCRIPTOR_H 9*4f2df630SAndroid Build Coastguard Worker #define __CROS_EC_USB_DESCRIPTOR_H 10*4f2df630SAndroid Build Coastguard Worker 11*4f2df630SAndroid Build Coastguard Worker #include <stddef.h> /* for wchar_t */ 12*4f2df630SAndroid Build Coastguard Worker 13*4f2df630SAndroid Build Coastguard Worker #define USB_MAX_PACKET_SIZE 64 14*4f2df630SAndroid Build Coastguard Worker 15*4f2df630SAndroid Build Coastguard Worker /* USB 2.0 chapter 9 definitions */ 16*4f2df630SAndroid Build Coastguard Worker 17*4f2df630SAndroid Build Coastguard Worker /* Descriptor types */ 18*4f2df630SAndroid Build Coastguard Worker #define USB_DT_DEVICE 0x01 19*4f2df630SAndroid Build Coastguard Worker #define USB_DT_CONFIGURATION 0x02 20*4f2df630SAndroid Build Coastguard Worker #define USB_DT_STRING 0x03 21*4f2df630SAndroid Build Coastguard Worker #define USB_DT_INTERFACE 0x04 22*4f2df630SAndroid Build Coastguard Worker #define USB_DT_ENDPOINT 0x05 23*4f2df630SAndroid Build Coastguard Worker #define USB_DT_DEVICE_QUALIFIER 0x06 24*4f2df630SAndroid Build Coastguard Worker #define USB_DT_OTHER_SPEED_CONFIG 0x07 25*4f2df630SAndroid Build Coastguard Worker #define USB_DT_INTERFACE_POWER 0x08 26*4f2df630SAndroid Build Coastguard Worker #define USB_DT_DEBUG 0x0a 27*4f2df630SAndroid Build Coastguard Worker #define USB_DT_BOS 0x0f 28*4f2df630SAndroid Build Coastguard Worker #define USB_DT_DEVICE_CAPABILITY 0x10 29*4f2df630SAndroid Build Coastguard Worker 30*4f2df630SAndroid Build Coastguard Worker /* USB Device Descriptor */ 31*4f2df630SAndroid Build Coastguard Worker struct usb_device_descriptor { 32*4f2df630SAndroid Build Coastguard Worker uint8_t bLength; 33*4f2df630SAndroid Build Coastguard Worker uint8_t bDescriptorType; 34*4f2df630SAndroid Build Coastguard Worker uint16_t bcdUSB; 35*4f2df630SAndroid Build Coastguard Worker uint8_t bDeviceClass; 36*4f2df630SAndroid Build Coastguard Worker uint8_t bDeviceSubClass; 37*4f2df630SAndroid Build Coastguard Worker uint8_t bDeviceProtocol; 38*4f2df630SAndroid Build Coastguard Worker uint8_t bMaxPacketSize0; 39*4f2df630SAndroid Build Coastguard Worker uint16_t idVendor; 40*4f2df630SAndroid Build Coastguard Worker uint16_t idProduct; 41*4f2df630SAndroid Build Coastguard Worker uint16_t bcdDevice; 42*4f2df630SAndroid Build Coastguard Worker uint8_t iManufacturer; 43*4f2df630SAndroid Build Coastguard Worker uint8_t iProduct; 44*4f2df630SAndroid Build Coastguard Worker uint8_t iSerialNumber; 45*4f2df630SAndroid Build Coastguard Worker uint8_t bNumConfigurations; 46*4f2df630SAndroid Build Coastguard Worker } __packed; 47*4f2df630SAndroid Build Coastguard Worker #define USB_DT_DEVICE_SIZE 18 48*4f2df630SAndroid Build Coastguard Worker 49*4f2df630SAndroid Build Coastguard Worker /* BOS Descriptor ( USB3.1 rev1 Section 9.6.2 ) */ 50*4f2df630SAndroid Build Coastguard Worker struct bos_context { 51*4f2df630SAndroid Build Coastguard Worker void *descp; 52*4f2df630SAndroid Build Coastguard Worker int size; 53*4f2df630SAndroid Build Coastguard Worker }; 54*4f2df630SAndroid Build Coastguard Worker 55*4f2df630SAndroid Build Coastguard Worker struct usb_bos_hdr_descriptor { 56*4f2df630SAndroid Build Coastguard Worker uint8_t bLength; 57*4f2df630SAndroid Build Coastguard Worker uint8_t bDescriptorType; /* USB_DT_BOS */ 58*4f2df630SAndroid Build Coastguard Worker uint16_t wTotalLength; /* Total length of of hdr + all dev caps */ 59*4f2df630SAndroid Build Coastguard Worker uint8_t bNumDeviceCaps; /* Container ID Descriptor + others */ 60*4f2df630SAndroid Build Coastguard Worker } __packed; 61*4f2df630SAndroid Build Coastguard Worker #define USB_DT_BOS_SIZE 5 62*4f2df630SAndroid Build Coastguard Worker 63*4f2df630SAndroid Build Coastguard Worker /* Container ID Descriptor */ 64*4f2df630SAndroid Build Coastguard Worker struct usb_contid_caps_descriptor { 65*4f2df630SAndroid Build Coastguard Worker uint8_t bLength; 66*4f2df630SAndroid Build Coastguard Worker uint8_t bDescriptorType; /* USB_DT_DEVICE_CAPABILITY */ 67*4f2df630SAndroid Build Coastguard Worker uint8_t bDevCapabilityType; /* USB_DC_DTYPE_xxx */ 68*4f2df630SAndroid Build Coastguard Worker uint8_t bReserved; /* SBZ */ 69*4f2df630SAndroid Build Coastguard Worker uint8_t ContainerID[16]; /* UUID */ 70*4f2df630SAndroid Build Coastguard Worker } __packed; 71*4f2df630SAndroid Build Coastguard Worker #define USB_DT_CONTID_SIZE 20 72*4f2df630SAndroid Build Coastguard Worker 73*4f2df630SAndroid Build Coastguard Worker /* Device Cap Type Codes ( offset 2 of Device Capability Descriptor */ 74*4f2df630SAndroid Build Coastguard Worker #define USB_DC_DTYPE_WIRELESS 0x01 75*4f2df630SAndroid Build Coastguard Worker #define USB_DC_DTYPE_USB20EXT 0x02 76*4f2df630SAndroid Build Coastguard Worker #define USB_DC_DTYPE_USBSS 0x03 77*4f2df630SAndroid Build Coastguard Worker #define USB_DC_DTYPE_CONTID 0x04 78*4f2df630SAndroid Build Coastguard Worker #define USB_DC_DTYPE_PLATFORM 0x05 79*4f2df630SAndroid Build Coastguard Worker #define USB_DC_DTYPE_PD 0x06 80*4f2df630SAndroid Build Coastguard Worker #define USB_DC_DTYPE_BATTINFO 0x07 81*4f2df630SAndroid Build Coastguard Worker #define USB_DC_DTYPE_CONSUMER 0x08 82*4f2df630SAndroid Build Coastguard Worker #define USB_DC_DTYPE_PRODUCER 0x09 83*4f2df630SAndroid Build Coastguard Worker #define USB_DC_DTYPE_USBSSP 0x0a 84*4f2df630SAndroid Build Coastguard Worker #define USB_DC_DTYPE_PCSTIME 0x0b 85*4f2df630SAndroid Build Coastguard Worker #define USB_DC_DTYPE_WUSBEXT 0x0c 86*4f2df630SAndroid Build Coastguard Worker #define USB_DC_DTYPE_BILLBOARD 0x0d 87*4f2df630SAndroid Build Coastguard Worker /* RESERVED 0x00, 0xOe - 0xff */ 88*4f2df630SAndroid Build Coastguard Worker 89*4f2df630SAndroid Build Coastguard Worker /* Platform descriptor */ 90*4f2df630SAndroid Build Coastguard Worker struct usb_platform_descriptor { 91*4f2df630SAndroid Build Coastguard Worker uint8_t bLength; 92*4f2df630SAndroid Build Coastguard Worker uint8_t bDescriptorType; /* USB_DT_DEVICE_CAPABILITY */ 93*4f2df630SAndroid Build Coastguard Worker uint8_t bDevCapabilityType; /* USB_DC_DTYPE_PLATFORM */ 94*4f2df630SAndroid Build Coastguard Worker uint8_t bReserved; /* SBZ */ 95*4f2df630SAndroid Build Coastguard Worker uint8_t PlatformCapUUID[16]; /* USB_PLAT_CAP_xxx */ 96*4f2df630SAndroid Build Coastguard Worker uint16_t bcdVersion; /* 0x0100 */ 97*4f2df630SAndroid Build Coastguard Worker uint8_t bVendorCode; 98*4f2df630SAndroid Build Coastguard Worker uint8_t iLandingPage; 99*4f2df630SAndroid Build Coastguard Worker } __packed; 100*4f2df630SAndroid Build Coastguard Worker #define USB_DT_PLATFORM_SIZE 24 101*4f2df630SAndroid Build Coastguard Worker 102*4f2df630SAndroid Build Coastguard Worker /* Platform Capability UUIDs */ 103*4f2df630SAndroid Build Coastguard Worker #define USB_PLAT_CAP_WEBUSB /*{3408b638-09a9-47a0-8bfd-a0768815b665}*/ \ 104*4f2df630SAndroid Build Coastguard Worker {0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, \ 105*4f2df630SAndroid Build Coastguard Worker 0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65} 106*4f2df630SAndroid Build Coastguard Worker 107*4f2df630SAndroid Build Coastguard Worker /* Qualifier Descriptor */ 108*4f2df630SAndroid Build Coastguard Worker struct usb_qualifier_descriptor { 109*4f2df630SAndroid Build Coastguard Worker uint8_t bLength; 110*4f2df630SAndroid Build Coastguard Worker uint8_t bDescriptorType; 111*4f2df630SAndroid Build Coastguard Worker uint16_t bcdUSB; 112*4f2df630SAndroid Build Coastguard Worker uint8_t bDeviceClass; 113*4f2df630SAndroid Build Coastguard Worker uint8_t bDeviceSubClass; 114*4f2df630SAndroid Build Coastguard Worker uint8_t bDeviceProtocol; 115*4f2df630SAndroid Build Coastguard Worker uint8_t bMaxPacketSize0; 116*4f2df630SAndroid Build Coastguard Worker uint8_t bNumConfigurations; 117*4f2df630SAndroid Build Coastguard Worker uint8_t bReserved; 118*4f2df630SAndroid Build Coastguard Worker } __packed; 119*4f2df630SAndroid Build Coastguard Worker #define USB_DT_QUALIFIER_SIZE 10 120*4f2df630SAndroid Build Coastguard Worker 121*4f2df630SAndroid Build Coastguard Worker /* Configuration Descriptor */ 122*4f2df630SAndroid Build Coastguard Worker struct usb_config_descriptor { 123*4f2df630SAndroid Build Coastguard Worker uint8_t bLength; 124*4f2df630SAndroid Build Coastguard Worker uint8_t bDescriptorType; 125*4f2df630SAndroid Build Coastguard Worker uint16_t wTotalLength; 126*4f2df630SAndroid Build Coastguard Worker uint8_t bNumInterfaces; 127*4f2df630SAndroid Build Coastguard Worker uint8_t bConfigurationValue; 128*4f2df630SAndroid Build Coastguard Worker uint8_t iConfiguration; 129*4f2df630SAndroid Build Coastguard Worker uint8_t bmAttributes; 130*4f2df630SAndroid Build Coastguard Worker uint8_t bMaxPower; 131*4f2df630SAndroid Build Coastguard Worker } __packed; 132*4f2df630SAndroid Build Coastguard Worker #define USB_DT_CONFIG_SIZE 9 133*4f2df630SAndroid Build Coastguard Worker 134*4f2df630SAndroid Build Coastguard Worker /* String Descriptor */ 135*4f2df630SAndroid Build Coastguard Worker struct usb_string_descriptor { 136*4f2df630SAndroid Build Coastguard Worker uint8_t bLength; 137*4f2df630SAndroid Build Coastguard Worker uint8_t bDescriptorType; 138*4f2df630SAndroid Build Coastguard Worker uint16_t wData[1]; 139*4f2df630SAndroid Build Coastguard Worker } __packed; 140*4f2df630SAndroid Build Coastguard Worker 141*4f2df630SAndroid Build Coastguard Worker /* Interface Descriptor */ 142*4f2df630SAndroid Build Coastguard Worker struct usb_interface_descriptor { 143*4f2df630SAndroid Build Coastguard Worker uint8_t bLength; 144*4f2df630SAndroid Build Coastguard Worker uint8_t bDescriptorType; 145*4f2df630SAndroid Build Coastguard Worker uint8_t bInterfaceNumber; 146*4f2df630SAndroid Build Coastguard Worker uint8_t bAlternateSetting; 147*4f2df630SAndroid Build Coastguard Worker uint8_t bNumEndpoints; 148*4f2df630SAndroid Build Coastguard Worker uint8_t bInterfaceClass; 149*4f2df630SAndroid Build Coastguard Worker uint8_t bInterfaceSubClass; 150*4f2df630SAndroid Build Coastguard Worker uint8_t bInterfaceProtocol; 151*4f2df630SAndroid Build Coastguard Worker uint8_t iInterface; 152*4f2df630SAndroid Build Coastguard Worker } __packed; 153*4f2df630SAndroid Build Coastguard Worker #define USB_DT_INTERFACE_SIZE 9 154*4f2df630SAndroid Build Coastguard Worker 155*4f2df630SAndroid Build Coastguard Worker /* Endpoint Descriptor */ 156*4f2df630SAndroid Build Coastguard Worker struct usb_endpoint_descriptor { 157*4f2df630SAndroid Build Coastguard Worker uint8_t bLength; 158*4f2df630SAndroid Build Coastguard Worker uint8_t bDescriptorType; 159*4f2df630SAndroid Build Coastguard Worker uint8_t bEndpointAddress; 160*4f2df630SAndroid Build Coastguard Worker uint8_t bmAttributes; 161*4f2df630SAndroid Build Coastguard Worker uint16_t wMaxPacketSize; 162*4f2df630SAndroid Build Coastguard Worker uint8_t bInterval; 163*4f2df630SAndroid Build Coastguard Worker } __packed; 164*4f2df630SAndroid Build Coastguard Worker #define USB_DT_ENDPOINT_SIZE 7 165*4f2df630SAndroid Build Coastguard Worker 166*4f2df630SAndroid Build Coastguard Worker /* USB Class codes */ 167*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_PER_INTERFACE 0x00 168*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_AUDIO 0x01 169*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_COMM 0x02 170*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_HID 0x03 171*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_PHYSICAL 0x05 172*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_STILL_IMAGE 0x06 173*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_PRINTER 0x07 174*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_MASS_STORAGE 0x08 175*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_HUB 0x09 176*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_CDC_DATA 0x0a 177*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_CSCID 0x0b 178*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_CONTENT_SEC 0x0d 179*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_VIDEO 0x0e 180*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_BILLBOARD 0x11 181*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_WIRELESS_CONTROLLER 0xe0 182*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_MISC 0xef 183*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_APP_SPEC 0xfe 184*4f2df630SAndroid Build Coastguard Worker #define USB_CLASS_VENDOR_SPEC 0xff 185*4f2df630SAndroid Build Coastguard Worker 186*4f2df630SAndroid Build Coastguard Worker /* USB Vendor ID assigned to Google Inc. */ 187*4f2df630SAndroid Build Coastguard Worker #define USB_VID_GOOGLE 0x18d1 188*4f2df630SAndroid Build Coastguard Worker 189*4f2df630SAndroid Build Coastguard Worker /* Google specific SubClass/Protocol assignments */ 190*4f2df630SAndroid Build Coastguard Worker #define USB_SUBCLASS_GOOGLE_SERIAL 0x50 191*4f2df630SAndroid Build Coastguard Worker #define USB_PROTOCOL_GOOGLE_SERIAL 0x01 192*4f2df630SAndroid Build Coastguard Worker 193*4f2df630SAndroid Build Coastguard Worker #define USB_SUBCLASS_GOOGLE_SPI 0x51 194*4f2df630SAndroid Build Coastguard Worker #ifdef CONFIG_USB_SPI_V2 195*4f2df630SAndroid Build Coastguard Worker #define USB_PROTOCOL_GOOGLE_SPI 0x02 196*4f2df630SAndroid Build Coastguard Worker #else 197*4f2df630SAndroid Build Coastguard Worker #define USB_PROTOCOL_GOOGLE_SPI 0x01 198*4f2df630SAndroid Build Coastguard Worker #endif 199*4f2df630SAndroid Build Coastguard Worker 200*4f2df630SAndroid Build Coastguard Worker #define USB_SUBCLASS_GOOGLE_I2C 0x52 201*4f2df630SAndroid Build Coastguard Worker #define USB_PROTOCOL_GOOGLE_I2C 0x01 202*4f2df630SAndroid Build Coastguard Worker 203*4f2df630SAndroid Build Coastguard Worker #define USB_SUBCLASS_GOOGLE_UPDATE 0x53 204*4f2df630SAndroid Build Coastguard Worker #define USB_PROTOCOL_GOOGLE_UPDATE 0xff 205*4f2df630SAndroid Build Coastguard Worker 206*4f2df630SAndroid Build Coastguard Worker /* Double define for cr50 code freeze. 207*4f2df630SAndroid Build Coastguard Worker * TODO(vbendeb): dedupe this. */ 208*4f2df630SAndroid Build Coastguard Worker #define USB_SUBCLASS_GOOGLE_CR50 0x53 209*4f2df630SAndroid Build Coastguard Worker /* We can use any protocol we want */ 210*4f2df630SAndroid Build Coastguard Worker #define USB_PROTOCOL_GOOGLE_CR50_NON_HC_FW_UPDATE 0xff 211*4f2df630SAndroid Build Coastguard Worker 212*4f2df630SAndroid Build Coastguard Worker #define USB_SUBCLASS_GOOGLE_POWER 0x54 213*4f2df630SAndroid Build Coastguard Worker #define USB_PROTOCOL_GOOGLE_POWER 0x01 214*4f2df630SAndroid Build Coastguard Worker 215*4f2df630SAndroid Build Coastguard Worker #define USB_SUBCLASS_GOOGLE_HEATMAP 0x55 216*4f2df630SAndroid Build Coastguard Worker #define USB_PROTOCOL_GOOGLE_HEATMAP 0x01 217*4f2df630SAndroid Build Coastguard Worker 218*4f2df630SAndroid Build Coastguard Worker /* Control requests */ 219*4f2df630SAndroid Build Coastguard Worker 220*4f2df630SAndroid Build Coastguard Worker /* bRequestType fields */ 221*4f2df630SAndroid Build Coastguard Worker /* direction field */ 222*4f2df630SAndroid Build Coastguard Worker #define USB_DIR_OUT 0 /* from host to uC */ 223*4f2df630SAndroid Build Coastguard Worker #define USB_DIR_IN 0x80 /* from uC to host */ 224*4f2df630SAndroid Build Coastguard Worker /* type field */ 225*4f2df630SAndroid Build Coastguard Worker #define USB_TYPE_MASK (0x03 << 5) 226*4f2df630SAndroid Build Coastguard Worker #define USB_TYPE_STANDARD (0x00 << 5) 227*4f2df630SAndroid Build Coastguard Worker #define USB_TYPE_CLASS (0x01 << 5) 228*4f2df630SAndroid Build Coastguard Worker #define USB_TYPE_VENDOR (0x02 << 5) 229*4f2df630SAndroid Build Coastguard Worker #define USB_TYPE_RESERVED (0x03 << 5) 230*4f2df630SAndroid Build Coastguard Worker /* recipient field */ 231*4f2df630SAndroid Build Coastguard Worker #define USB_RECIP_MASK 0x1f 232*4f2df630SAndroid Build Coastguard Worker #define USB_RECIP_DEVICE 0x00 233*4f2df630SAndroid Build Coastguard Worker #define USB_RECIP_INTERFACE 0x01 234*4f2df630SAndroid Build Coastguard Worker #define USB_RECIP_ENDPOINT 0x02 235*4f2df630SAndroid Build Coastguard Worker #define USB_RECIP_OTHER 0x03 236*4f2df630SAndroid Build Coastguard Worker 237*4f2df630SAndroid Build Coastguard Worker /* Standard requests for bRequest field in a SETUP packet. */ 238*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_GET_STATUS 0x00 239*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_GET_STATUS_SELF_POWERED BIT(0) 240*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_GET_STATUS_REMOTE_WAKEUP BIT(1) 241*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_CLEAR_FEATURE 0x01 242*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_SET_FEATURE 0x03 243*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_FEATURE_ENDPOINT_HALT 0x0000 244*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_FEATURE_DEVICE_REMOTE_WAKEUP 0x0001 245*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_FEATURE_TEST_MODE 0x0002 246*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_SET_ADDRESS 0x05 247*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_GET_DESCRIPTOR 0x06 248*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_SET_DESCRIPTOR 0x07 249*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_GET_CONFIGURATION 0x08 250*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_SET_CONFIGURATION 0x09 251*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_GET_INTERFACE 0x0A 252*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_SET_INTERFACE 0x0B 253*4f2df630SAndroid Build Coastguard Worker #define USB_REQ_SYNCH_FRAME 0x0C 254*4f2df630SAndroid Build Coastguard Worker 255*4f2df630SAndroid Build Coastguard Worker /* WebUSB URL descriptors */ 256*4f2df630SAndroid Build Coastguard Worker #define WEBUSB_REQ_GET_URL 0x02 257*4f2df630SAndroid Build Coastguard Worker #define USB_DT_WEBUSB_URL 0x03 258*4f2df630SAndroid Build Coastguard Worker 259*4f2df630SAndroid Build Coastguard Worker #define USB_URL_SCHEME_HTTP 0x00 260*4f2df630SAndroid Build Coastguard Worker #define USB_URL_SCHEME_HTTPS 0x01 261*4f2df630SAndroid Build Coastguard Worker #define USB_URL_SCHEME_NONE 0xff 262*4f2df630SAndroid Build Coastguard Worker 263*4f2df630SAndroid Build Coastguard Worker /* 264*4f2df630SAndroid Build Coastguard Worker * URL descriptor helper. 265*4f2df630SAndroid Build Coastguard Worker * (similar to string descriptor but UTF-8 instead of UTF-16) 266*4f2df630SAndroid Build Coastguard Worker */ 267*4f2df630SAndroid Build Coastguard Worker #define USB_URL_DESC(scheme, str) \ 268*4f2df630SAndroid Build Coastguard Worker (const void *)&(const struct { \ 269*4f2df630SAndroid Build Coastguard Worker uint8_t _len; \ 270*4f2df630SAndroid Build Coastguard Worker uint8_t _type; \ 271*4f2df630SAndroid Build Coastguard Worker uint8_t _scheme; \ 272*4f2df630SAndroid Build Coastguard Worker char _data[sizeof(str)]; \ 273*4f2df630SAndroid Build Coastguard Worker }) { \ 274*4f2df630SAndroid Build Coastguard Worker /* Total size of the descriptor is : \ 275*4f2df630SAndroid Build Coastguard Worker * size of the UTF-8 text plus the len/type fields \ 276*4f2df630SAndroid Build Coastguard Worker * minus the string 0-termination \ 277*4f2df630SAndroid Build Coastguard Worker */ \ 278*4f2df630SAndroid Build Coastguard Worker sizeof(str) + 3 - 1, \ 279*4f2df630SAndroid Build Coastguard Worker USB_DT_WEBUSB_URL, \ 280*4f2df630SAndroid Build Coastguard Worker USB_URL_SCHEME_##scheme, \ 281*4f2df630SAndroid Build Coastguard Worker str \ 282*4f2df630SAndroid Build Coastguard Worker } 283*4f2df630SAndroid Build Coastguard Worker 284*4f2df630SAndroid Build Coastguard Worker /* Setup Packet */ 285*4f2df630SAndroid Build Coastguard Worker struct usb_setup_packet { 286*4f2df630SAndroid Build Coastguard Worker uint8_t bmRequestType; 287*4f2df630SAndroid Build Coastguard Worker uint8_t bRequest; 288*4f2df630SAndroid Build Coastguard Worker uint16_t wValue; 289*4f2df630SAndroid Build Coastguard Worker uint16_t wIndex; 290*4f2df630SAndroid Build Coastguard Worker uint16_t wLength; 291*4f2df630SAndroid Build Coastguard Worker }; 292*4f2df630SAndroid Build Coastguard Worker 293*4f2df630SAndroid Build Coastguard Worker /* Helpers for descriptors */ 294*4f2df630SAndroid Build Coastguard Worker 295*4f2df630SAndroid Build Coastguard Worker #define WIDESTR(quote) WIDESTR2(quote) 296*4f2df630SAndroid Build Coastguard Worker #define WIDESTR2(quote) L##quote 297*4f2df630SAndroid Build Coastguard Worker 298*4f2df630SAndroid Build Coastguard Worker #define USB_STRING_DESC(str) \ 299*4f2df630SAndroid Build Coastguard Worker (const void *)&(const struct { \ 300*4f2df630SAndroid Build Coastguard Worker uint8_t _len; \ 301*4f2df630SAndroid Build Coastguard Worker uint8_t _type; \ 302*4f2df630SAndroid Build Coastguard Worker wchar_t _data[sizeof(str)]; \ 303*4f2df630SAndroid Build Coastguard Worker }) { \ 304*4f2df630SAndroid Build Coastguard Worker /* Total size of the descriptor is : \ 305*4f2df630SAndroid Build Coastguard Worker * size of the UTF-16 text plus the len/type fields \ 306*4f2df630SAndroid Build Coastguard Worker * minus the string 0-termination \ 307*4f2df630SAndroid Build Coastguard Worker */ \ 308*4f2df630SAndroid Build Coastguard Worker sizeof(WIDESTR(str)) + 2 - 2, \ 309*4f2df630SAndroid Build Coastguard Worker USB_DT_STRING, \ 310*4f2df630SAndroid Build Coastguard Worker WIDESTR(str) \ 311*4f2df630SAndroid Build Coastguard Worker } 312*4f2df630SAndroid Build Coastguard Worker 313*4f2df630SAndroid Build Coastguard Worker #ifdef CONFIG_USB_SERIALNO 314*4f2df630SAndroid Build Coastguard Worker /* String Descriptor for USB, for editable strings. */ 315*4f2df630SAndroid Build Coastguard Worker #define USB_STRING_LEN 28 316*4f2df630SAndroid Build Coastguard Worker struct usb_string_desc { 317*4f2df630SAndroid Build Coastguard Worker uint8_t _len; 318*4f2df630SAndroid Build Coastguard Worker uint8_t _type; 319*4f2df630SAndroid Build Coastguard Worker wchar_t _data[USB_STRING_LEN]; 320*4f2df630SAndroid Build Coastguard Worker }; 321*4f2df630SAndroid Build Coastguard Worker #define USB_WR_STRING_DESC(str) \ 322*4f2df630SAndroid Build Coastguard Worker (&(struct usb_string_desc) { \ 323*4f2df630SAndroid Build Coastguard Worker /* As above, two bytes metadata, no null terminator. */ \ 324*4f2df630SAndroid Build Coastguard Worker sizeof(WIDESTR(str)) + 2 - 2, \ 325*4f2df630SAndroid Build Coastguard Worker USB_DT_STRING, \ 326*4f2df630SAndroid Build Coastguard Worker WIDESTR(str) \ 327*4f2df630SAndroid Build Coastguard Worker }) 328*4f2df630SAndroid Build Coastguard Worker extern struct usb_string_desc *usb_serialno_desc; 329*4f2df630SAndroid Build Coastguard Worker #endif 330*4f2df630SAndroid Build Coastguard Worker 331*4f2df630SAndroid Build Coastguard Worker /* Use these macros for declaring descriptors, to order them properly */ 332*4f2df630SAndroid Build Coastguard Worker #define USB_CONF_DESC_VAR(name, varname) varname \ 333*4f2df630SAndroid Build Coastguard Worker __keep __attribute__((section(".rodata.usb_desc_" STRINGIFY(name)))) 334*4f2df630SAndroid Build Coastguard Worker #define USB_CONF_DESC(name) USB_CONF_DESC_VAR(name, CONCAT2(usb_desc_, name)) 335*4f2df630SAndroid Build Coastguard Worker #define USB_IFACE_DESC(num) USB_CONF_DESC(CONCAT3(iface, num, _0iface)) 336*4f2df630SAndroid Build Coastguard Worker #define USB_CUSTOM_DESC_VAR(i, name, varname) \ 337*4f2df630SAndroid Build Coastguard Worker USB_CONF_DESC_VAR(CONCAT4(iface, i, _1, name), varname) 338*4f2df630SAndroid Build Coastguard Worker #define USB_CUSTOM_DESC(i, name) USB_CONF_DESC(CONCAT4(iface, i, _1, name)) 339*4f2df630SAndroid Build Coastguard Worker #define USB_EP_DESC(i, num) USB_CONF_DESC(CONCAT4(iface, i, _2ep, num)) 340*4f2df630SAndroid Build Coastguard Worker 341*4f2df630SAndroid Build Coastguard Worker /* USB Linker data */ 342*4f2df630SAndroid Build Coastguard Worker extern const uint8_t __usb_desc[]; 343*4f2df630SAndroid Build Coastguard Worker extern const uint8_t __usb_desc_end[]; 344*4f2df630SAndroid Build Coastguard Worker #define USB_DESC_SIZE (__usb_desc_end - __usb_desc) 345*4f2df630SAndroid Build Coastguard Worker 346*4f2df630SAndroid Build Coastguard Worker /* These descriptors defined in board code */ 347*4f2df630SAndroid Build Coastguard Worker extern const void * const usb_strings[]; 348*4f2df630SAndroid Build Coastguard Worker extern const uint8_t usb_string_desc[]; 349*4f2df630SAndroid Build Coastguard Worker /* USB string descriptor with the firmware version */ 350*4f2df630SAndroid Build Coastguard Worker extern const void * const usb_fw_version; 351*4f2df630SAndroid Build Coastguard Worker extern const struct bos_context bos_ctx; 352*4f2df630SAndroid Build Coastguard Worker extern const void *webusb_url; 353*4f2df630SAndroid Build Coastguard Worker 354*4f2df630SAndroid Build Coastguard Worker #endif /* __CROS_EC_USB_DESCRIPTOR_H */ 355