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