xref: /aosp_15_r20/external/gsc-utils/include/usb_descriptor.h (revision 4f2df630800bdcf1d4f0decf95d8a1cb87344f5f)
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