1 /** @file
2   Support for USB 2.0 standard.
3 
4   Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
5   SPDX-License-Identifier: BSD-2-Clause-Patent
6 
7 **/
8 
9 #ifndef __USB_H__
10 #define __USB_H__
11 
12 //
13 // Subset of Class and Subclass definitions from USB Specs
14 //
15 
16 //
17 // Usb mass storage class code
18 //
19 #define USB_MASS_STORE_CLASS  0x08
20 
21 //
22 // Usb mass storage subclass code, specify the command set used.
23 //
24 #define USB_MASS_STORE_RBC    0x01   ///< Reduced Block Commands
25 #define USB_MASS_STORE_8020I  0x02   ///< SFF-8020i, typically a CD/DVD device
26 #define USB_MASS_STORE_QIC    0x03   ///< Typically a tape device
27 #define USB_MASS_STORE_UFI    0x04   ///< Typically a floppy disk driver device
28 #define USB_MASS_STORE_8070I  0x05   ///< SFF-8070i, typically a floppy disk driver device.
29 #define USB_MASS_STORE_SCSI   0x06   ///< SCSI transparent command set
30 
31 //
32 // Usb mass storage protocol code, specify the transport protocol
33 //
34 #define USB_MASS_STORE_CBI0  0x00    ///< CBI protocol with command completion interrupt
35 #define USB_MASS_STORE_CBI1  0x01    ///< CBI protocol without command completion interrupt
36 #define USB_MASS_STORE_BOT   0x50    ///< Bulk-Only Transport
37 
38 //
39 // Standard device request and request type
40 // USB 2.0 spec, Section 9.4
41 //
42 #define USB_DEV_GET_STATUS             0x00
43 #define USB_DEV_GET_STATUS_REQ_TYPE_D  0x80      // Receiver : Device
44 #define USB_DEV_GET_STATUS_REQ_TYPE_I  0x81      // Receiver : Interface
45 #define USB_DEV_GET_STATUS_REQ_TYPE_E  0x82      // Receiver : Endpoint
46 
47 #define USB_DEV_CLEAR_FEATURE             0x01
48 #define USB_DEV_CLEAR_FEATURE_REQ_TYPE_D  0x00   // Receiver : Device
49 #define USB_DEV_CLEAR_FEATURE_REQ_TYPE_I  0x01   // Receiver : Interface
50 #define USB_DEV_CLEAR_FEATURE_REQ_TYPE_E  0x02   // Receiver : Endpoint
51 
52 #define USB_DEV_SET_FEATURE             0x03
53 #define USB_DEV_SET_FEATURE_REQ_TYPE_D  0x00     // Receiver : Device
54 #define USB_DEV_SET_FEATURE_REQ_TYPE_I  0x01     // Receiver : Interface
55 #define USB_DEV_SET_FEATURE_REQ_TYPE_E  0x02     // Receiver : Endpoint
56 
57 #define USB_DEV_SET_ADDRESS           0x05
58 #define USB_DEV_SET_ADDRESS_REQ_TYPE  0x00
59 
60 #define USB_DEV_GET_DESCRIPTOR           0x06
61 #define USB_DEV_GET_DESCRIPTOR_REQ_TYPE  0x80
62 
63 #define USB_DEV_SET_DESCRIPTOR           0x07
64 #define USB_DEV_SET_DESCRIPTOR_REQ_TYPE  0x00
65 
66 #define USB_DEV_GET_CONFIGURATION           0x08
67 #define USB_DEV_GET_CONFIGURATION_REQ_TYPE  0x80
68 
69 #define USB_DEV_SET_CONFIGURATION           0x09
70 #define USB_DEV_SET_CONFIGURATION_REQ_TYPE  0x00
71 
72 #define USB_DEV_GET_INTERFACE           0x0A
73 #define USB_DEV_GET_INTERFACE_REQ_TYPE  0x81
74 
75 #define USB_DEV_SET_INTERFACE           0x0B
76 #define USB_DEV_SET_INTERFACE_REQ_TYPE  0x01
77 
78 #define USB_DEV_SYNCH_FRAME           0x0C
79 #define USB_DEV_SYNCH_FRAME_REQ_TYPE  0x82
80 
81 //
82 // USB standard descriptors and reqeust
83 //
84 #pragma pack(1)
85 
86 ///
87 /// Format of Setup Data for USB Device Requests
88 /// USB 2.0 spec, Section 9.3
89 ///
90 typedef struct {
91   UINT8     RequestType;
92   UINT8     Request;
93   UINT16    Value;
94   UINT16    Index;
95   UINT16    Length;
96 } USB_DEVICE_REQUEST;
97 
98 ///
99 /// Standard Device Descriptor
100 /// USB 2.0 spec, Section 9.6.1
101 ///
102 typedef struct {
103   UINT8     Length;
104   UINT8     DescriptorType;
105   UINT16    BcdUSB;
106   UINT8     DeviceClass;
107   UINT8     DeviceSubClass;
108   UINT8     DeviceProtocol;
109   UINT8     MaxPacketSize0;
110   UINT16    IdVendor;
111   UINT16    IdProduct;
112   UINT16    BcdDevice;
113   UINT8     StrManufacturer;
114   UINT8     StrProduct;
115   UINT8     StrSerialNumber;
116   UINT8     NumConfigurations;
117 } USB_DEVICE_DESCRIPTOR;
118 
119 ///
120 /// Standard Configuration Descriptor
121 /// USB 2.0 spec, Section 9.6.3
122 ///
123 typedef struct {
124   UINT8     Length;
125   UINT8     DescriptorType;
126   UINT16    TotalLength;
127   UINT8     NumInterfaces;
128   UINT8     ConfigurationValue;
129   UINT8     Configuration;
130   UINT8     Attributes;
131   UINT8     MaxPower;
132 } USB_CONFIG_DESCRIPTOR;
133 
134 ///
135 /// Standard Interface Descriptor
136 /// USB 2.0 spec, Section 9.6.5
137 ///
138 typedef struct {
139   UINT8    Length;
140   UINT8    DescriptorType;
141   UINT8    InterfaceNumber;
142   UINT8    AlternateSetting;
143   UINT8    NumEndpoints;
144   UINT8    InterfaceClass;
145   UINT8    InterfaceSubClass;
146   UINT8    InterfaceProtocol;
147   UINT8    Interface;
148 } USB_INTERFACE_DESCRIPTOR;
149 
150 ///
151 /// Standard Endpoint Descriptor
152 /// USB 2.0 spec, Section 9.6.6
153 ///
154 typedef struct {
155   UINT8     Length;
156   UINT8     DescriptorType;
157   UINT8     EndpointAddress;
158   UINT8     Attributes;
159   UINT16    MaxPacketSize;
160   UINT8     Interval;
161 } USB_ENDPOINT_DESCRIPTOR;
162 
163 ///
164 /// UNICODE String Descriptor
165 /// USB 2.0 spec, Section 9.6.7
166 ///
167 typedef struct {
168   UINT8     Length;
169   UINT8     DescriptorType;
170   CHAR16    String[1];
171 } EFI_USB_STRING_DESCRIPTOR;
172 
173 #pragma pack()
174 
175 typedef enum {
176   //
177   // USB request type
178   //
179   USB_REQ_TYPE_STANDARD = (0x00 << 5),
180   USB_REQ_TYPE_CLASS    = (0x01 << 5),
181   USB_REQ_TYPE_VENDOR   = (0x02 << 5),
182 
183   //
184   // Standard control transfer request type, or the value
185   // to fill in EFI_USB_DEVICE_REQUEST.Request
186   //
187   USB_REQ_GET_STATUS     = 0x00,
188   USB_REQ_CLEAR_FEATURE  = 0x01,
189   USB_REQ_SET_FEATURE    = 0x03,
190   USB_REQ_SET_ADDRESS    = 0x05,
191   USB_REQ_GET_DESCRIPTOR = 0x06,
192   USB_REQ_SET_DESCRIPTOR = 0x07,
193   USB_REQ_GET_CONFIG     = 0x08,
194   USB_REQ_SET_CONFIG     = 0x09,
195   USB_REQ_GET_INTERFACE  = 0x0A,
196   USB_REQ_SET_INTERFACE  = 0x0B,
197   USB_REQ_SYNCH_FRAME    = 0x0C,
198 
199   //
200   // Usb control transfer target
201   //
202   USB_TARGET_DEVICE    = 0,
203   USB_TARGET_INTERFACE = 0x01,
204   USB_TARGET_ENDPOINT  = 0x02,
205   USB_TARGET_OTHER     = 0x03,
206 
207   //
208   // USB Descriptor types
209   //
210   USB_DESC_TYPE_DEVICE    = 0x01,
211   USB_DESC_TYPE_CONFIG    = 0x02,
212   USB_DESC_TYPE_STRING    = 0x03,
213   USB_DESC_TYPE_INTERFACE = 0x04,
214   USB_DESC_TYPE_ENDPOINT  = 0x05,
215   USB_DESC_TYPE_HID       = 0x21,
216   USB_DESC_TYPE_REPORT    = 0x22,
217 
218   //
219   // Features to be cleared by CLEAR_FEATURE requests
220   //
221   USB_FEATURE_ENDPOINT_HALT = 0,
222 
223   //
224   // USB endpoint types: 00: control, 01: isochronous, 10: bulk, 11: interrupt
225   //
226   USB_ENDPOINT_CONTROL   = 0x00,
227   USB_ENDPOINT_ISO       = 0x01,
228   USB_ENDPOINT_BULK      = 0x02,
229   USB_ENDPOINT_INTERRUPT = 0x03,
230 
231   USB_ENDPOINT_TYPE_MASK = 0x03,
232   USB_ENDPOINT_DIR_IN    = 0x80,
233 
234   //
235   // Use 200 ms to increase the error handling response time
236   //
237   EFI_USB_INTERRUPT_DELAY = 2000000
238 } USB_TYPES_DEFINITION;
239 
240 //
241 // HID constants definition, see Device Class Definition
242 // for Human Interface Devices (HID) rev1.11
243 //
244 
245 //
246 // HID standard GET_DESCRIPTOR request.
247 //
248 #define USB_HID_GET_DESCRIPTOR_REQ_TYPE  0x81
249 
250 //
251 // HID specific requests.
252 //
253 #define USB_HID_CLASS_GET_REQ_TYPE  0xa1
254 #define USB_HID_CLASS_SET_REQ_TYPE  0x21
255 
256 //
257 // HID report item format
258 //
259 #define HID_ITEM_FORMAT_SHORT  0
260 #define HID_ITEM_FORMAT_LONG   1
261 
262 //
263 // Special tag indicating long items
264 //
265 #define HID_ITEM_TAG_LONG  15
266 
267 //
268 // HID report descriptor item type (prefix bit 2,3)
269 //
270 #define HID_ITEM_TYPE_MAIN      0
271 #define HID_ITEM_TYPE_GLOBAL    1
272 #define HID_ITEM_TYPE_LOCAL     2
273 #define HID_ITEM_TYPE_RESERVED  3
274 
275 //
276 // HID report descriptor main item tags
277 //
278 #define HID_MAIN_ITEM_TAG_INPUT             8
279 #define HID_MAIN_ITEM_TAG_OUTPUT            9
280 #define HID_MAIN_ITEM_TAG_FEATURE           11
281 #define HID_MAIN_ITEM_TAG_BEGIN_COLLECTION  10
282 #define HID_MAIN_ITEM_TAG_END_COLLECTION    12
283 
284 //
285 // HID report descriptor main item contents
286 //
287 #define HID_MAIN_ITEM_CONSTANT       0x001
288 #define HID_MAIN_ITEM_VARIABLE       0x002
289 #define HID_MAIN_ITEM_RELATIVE       0x004
290 #define HID_MAIN_ITEM_WRAP           0x008
291 #define HID_MAIN_ITEM_NONLINEAR      0x010
292 #define HID_MAIN_ITEM_NO_PREFERRED   0x020
293 #define HID_MAIN_ITEM_NULL_STATE     0x040
294 #define HID_MAIN_ITEM_VOLATILE       0x080
295 #define HID_MAIN_ITEM_BUFFERED_BYTE  0x100
296 
297 //
298 // HID report descriptor collection item types
299 //
300 #define HID_COLLECTION_PHYSICAL     0
301 #define HID_COLLECTION_APPLICATION  1
302 #define HID_COLLECTION_LOGICAL      2
303 
304 //
305 // HID report descriptor global item tags
306 //
307 #define HID_GLOBAL_ITEM_TAG_USAGE_PAGE        0
308 #define HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM   1
309 #define HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM   2
310 #define HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM  3
311 #define HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM  4
312 #define HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT     5
313 #define HID_GLOBAL_ITEM_TAG_UNIT              6
314 #define HID_GLOBAL_ITEM_TAG_REPORT_SIZE       7
315 #define HID_GLOBAL_ITEM_TAG_REPORT_ID         8
316 #define HID_GLOBAL_ITEM_TAG_REPORT_COUNT      9
317 #define HID_GLOBAL_ITEM_TAG_PUSH              10
318 #define HID_GLOBAL_ITEM_TAG_POP               11
319 
320 //
321 // HID report descriptor local item tags
322 //
323 #define HID_LOCAL_ITEM_TAG_USAGE               0
324 #define HID_LOCAL_ITEM_TAG_USAGE_MINIMUM       1
325 #define HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM       2
326 #define HID_LOCAL_ITEM_TAG_DESIGNATOR_INDEX    3
327 #define HID_LOCAL_ITEM_TAG_DESIGNATOR_MINIMUM  4
328 #define HID_LOCAL_ITEM_TAG_DESIGNATOR_MAXIMUM  5
329 #define HID_LOCAL_ITEM_TAG_STRING_INDEX        7
330 #define HID_LOCAL_ITEM_TAG_STRING_MINIMUM      8
331 #define HID_LOCAL_ITEM_TAG_STRING_MAXIMUM      9
332 #define HID_LOCAL_ITEM_TAG_DELIMITER           10
333 
334 //
335 // HID report types
336 //
337 #define HID_INPUT_REPORT    1
338 #define HID_OUTPUT_REPORT   2
339 #define HID_FEATURE_REPORT  3
340 
341 //
342 // HID class protocol request
343 //
344 #define EFI_USB_GET_REPORT_REQUEST    0x01
345 #define EFI_USB_GET_IDLE_REQUEST      0x02
346 #define EFI_USB_GET_PROTOCOL_REQUEST  0x03
347 #define EFI_USB_SET_REPORT_REQUEST    0x09
348 #define EFI_USB_SET_IDLE_REQUEST      0x0a
349 #define EFI_USB_SET_PROTOCOL_REQUEST  0x0b
350 
351 #pragma pack(1)
352 ///
353 /// Descriptor header for Report/Physical Descriptors
354 /// HID 1.1, section 6.2.1
355 ///
356 typedef struct hid_class_descriptor {
357   UINT8     DescriptorType;
358   UINT16    DescriptorLength;
359 } EFI_USB_HID_CLASS_DESCRIPTOR;
360 
361 ///
362 /// The HID descriptor identifies the length and type
363 /// of subordinate descriptors for a device.
364 /// HID 1.1, section 6.2.1
365 ///
366 typedef struct hid_descriptor {
367   UINT8                           Length;
368   UINT8                           DescriptorType;
369   UINT16                          BcdHID;
370   UINT8                           CountryCode;
371   UINT8                           NumDescriptors;
372   EFI_USB_HID_CLASS_DESCRIPTOR    HidClassDesc[1];
373 } EFI_USB_HID_DESCRIPTOR;
374 
375 #pragma pack()
376 
377 #endif
378