1 /** @file
2 Common Library for PEI USB
3 
4 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved. <BR>
5 
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7 
8 **/
9 
10 #ifndef _PEI_USB_LIB_H_
11 #define _PEI_USB_LIB_H_
12 
13 
14 //
15 // Standard device request and request type
16 // By [Spec-USB20/Chapter-9.4]
17 //
18 #define USB_DEV_GET_STATUS                  0x00
19 #define USB_DEV_GET_STATUS_REQ_TYPE_D       0x80 // Receiver : Device
20 #define USB_DEV_GET_STATUS_REQ_TYPE_I       0x81 // Receiver : Interface
21 #define USB_DEV_GET_STATUS_REQ_TYPE_E       0x82 // Receiver : Endpoint
22 
23 #define USB_DEV_CLEAR_FEATURE               0x01
24 #define USB_DEV_CLEAR_FEATURE_REQ_TYPE_D    0x00 // Receiver : Device
25 #define USB_DEV_CLEAR_FEATURE_REQ_TYPE_I    0x01 // Receiver : Interface
26 #define USB_DEV_CLEAR_FEATURE_REQ_TYPE_E    0x02 // Receiver : Endpoint
27 
28 #define USB_DEV_SET_FEATURE                 0x03
29 #define USB_DEV_SET_FEATURE_REQ_TYPE_D      0x00 // Receiver : Device
30 #define USB_DEV_SET_FEATURE_REQ_TYPE_I      0x01 // Receiver : Interface
31 #define USB_DEV_SET_FEATURE_REQ_TYPE_E      0x02 // Receiver : Endpoint
32 
33 #define USB_DEV_SET_ADDRESS                 0x05
34 #define USB_DEV_SET_ADDRESS_REQ_TYPE        0x00
35 
36 #define USB_DEV_GET_DESCRIPTOR              0x06
37 #define USB_DEV_GET_DESCRIPTOR_REQ_TYPE     0x80
38 
39 #define USB_DEV_SET_DESCRIPTOR              0x07
40 #define USB_DEV_SET_DESCRIPTOR_REQ_TYPE     0x00
41 
42 #define USB_DEV_GET_CONFIGURATION           0x08
43 #define USB_DEV_GET_CONFIGURATION_REQ_TYPE  0x80
44 
45 #define USB_DEV_SET_CONFIGURATION           0x09
46 #define USB_DEV_SET_CONFIGURATION_REQ_TYPE  0x00
47 
48 #define USB_DEV_GET_INTERFACE               0x0A
49 #define USB_DEV_GET_INTERFACE_REQ_TYPE      0x81
50 
51 #define USB_DEV_SET_INTERFACE               0x0B
52 #define USB_DEV_SET_INTERFACE_REQ_TYPE      0x01
53 
54 #define USB_DEV_SYNCH_FRAME                 0x0C
55 #define USB_DEV_SYNCH_FRAME_REQ_TYPE        0x82
56 
57 //
58 // USB Descriptor types
59 //
60 #define USB_DT_DEVICE     0x01
61 #define USB_DT_CONFIG     0x02
62 #define USB_DT_STRING     0x03
63 #define USB_DT_INTERFACE  0x04
64 #define USB_DT_ENDPOINT   0x05
65 #define USB_DT_HUB        0x29
66 #define USB_DT_SUPERSPEED_HUB 0x2A
67 #define USB_DT_HID        0x21
68 
69 //
70 // USB request type
71 //
72 #define USB_TYPE_STANDARD (0x00 << 5)
73 #define USB_TYPE_CLASS    (0x01 << 5)
74 #define USB_TYPE_VENDOR   (0x02 << 5)
75 #define USB_TYPE_RESERVED (0x03 << 5)
76 
77 //
78 // USB request targer device
79 //
80 #define USB_RECIP_DEVICE    0x00
81 #define USB_RECIP_INTERFACE 0x01
82 #define USB_RECIP_ENDPOINT  0x02
83 #define USB_RECIP_OTHER     0x03
84 
85 typedef enum {
86   EfiUsbEndpointHalt,
87   EfiUsbDeviceRemoteWakeup
88 } EFI_USB_STANDARD_FEATURE_SELECTOR;
89 
90 //
91 // Usb Data recipient type
92 //
93 typedef enum {
94   EfiUsbDevice,
95   EfiUsbInterface,
96   EfiUsbEndpoint
97 } EFI_USB_RECIPIENT;
98 
99 /**
100   Get a given usb descriptor.
101 
102   @param  PeiServices        General-purpose services that are available to every PEIM.
103   @param  UsbIoPpi           Indicates the PEI_USB_IO_PPI instance.
104   @param  Value              Request Value.
105   @param  Index              Request Index.
106   @param  DescriptorLength   Request descriptor Length.
107   @param  Descriptor         Request descriptor.
108 
109 
110   @retval EFI_SUCCESS       Usb descriptor is obtained successfully.
111   @retval EFI_DEVICE_ERROR  Cannot get the usb descriptor due to a hardware error.
112   @retval Others            Other failure occurs.
113 
114 **/
115 EFI_STATUS
116 PeiUsbGetDescriptor (
117   IN  EFI_PEI_SERVICES         **PeiServices,
118   IN  PEI_USB_IO_PPI           *UsbIoPpi,
119   IN  UINT16                   Value,
120   IN  UINT16                   Index,
121   IN  UINT16                   DescriptorLength,
122   OUT VOID                     *Descriptor
123   );
124 
125 /**
126   Set a usb device with a specified address.
127 
128   @param  PeiServices        General-purpose services that are available to every PEIM.
129   @param  UsbIoPpi           Indicates the PEI_USB_IO_PPI instance.
130   @param  AddressValue       The address to assign.
131 
132   @retval EFI_SUCCESS        Usb device address is set successfully.
133   @retval EFI_DEVICE_ERROR   Cannot set the usb address due to a hardware error.
134   @retval Others             Other failure occurs.
135 
136 **/
137 EFI_STATUS
138 PeiUsbSetDeviceAddress (
139   IN EFI_PEI_SERVICES         **PeiServices,
140   IN PEI_USB_IO_PPI           *UsbIoPpi,
141   IN UINT16                   AddressValue
142   );
143 
144 
145 /**
146   Configure a usb device to Configuration 1.
147 
148   @param  PeiServices        General-purpose services that are available to every PEIM.
149   @param  UsbIoPpi           Indicates the PEI_USB_IO_PPI instance.
150 
151   @retval EFI_SUCCESS        Usb device is set to use Configuration 1 successfully.
152   @retval EFI_DEVICE_ERROR   Cannot set the usb device due to a hardware error.
153   @retval Others             Other failure occurs.
154 
155 **/
156 EFI_STATUS
157 PeiUsbSetConfiguration (
158   IN EFI_PEI_SERVICES         **PeiServices,
159   IN PEI_USB_IO_PPI           *UsbIoPpi
160   );
161 
162 /**
163   Judge if the port is connected with a usb device or not.
164 
165   @param  PortStatus  The usb port status gotten.
166 
167   @retval TRUE        A usb device is connected with the port.
168   @retval FALSE       No usb device is connected with the port.
169 
170 **/
171 BOOLEAN
172 IsPortConnect (
173   IN UINT16  PortStatus
174   );
175 
176 /**
177   Get device speed according to port status.
178 
179   @param    PortStatus  The usb port status gotten.
180 
181   @return   Device speed value.
182 
183 **/
184 UINTN
185 PeiUsbGetDeviceSpeed (
186   IN UINT16 PortStatus
187   );
188 
189 #endif
190