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