1. Import UsbKbDxe and UsbMouseDxe into MdeModulePkg
[people/mcb30/edk2.git] / edk2 / MdePkg / Library / UefiUsbLib / UsbDxeLib.c
1 /** @file\r
2 \r
3 Copyright (c) 2004 - 2007, Intel Corporation\r
4 All rights reserved. This program and the accompanying materials\r
5 are licensed and made available under the terms and conditions of the BSD License\r
6 which accompanies this distribution.  The full text of the license may be found at\r
7 http://opensource.org/licenses/bsd-license.php\r
8 \r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11 \r
12  Module Name:\r
13 \r
14     UsbDxeLib.c\r
15 \r
16  Abstract:\r
17 \r
18    Common Dxe Libarary  for USB\r
19 \r
20  Revision History\r
21 \r
22 \r
23 **/\r
24 \r
25 //\r
26 // The package level header files this module uses\r
27 //\r
28 #include <PiDxe.h>\r
29 //\r
30 // The Library classes this module consumes\r
31 //\r
32 #include <Library/BaseMemoryLib.h>\r
33 #include <Library/UsbLib.h>\r
34 \r
35 /**\r
36   Usb Get Descriptor\r
37 \r
38   @param  UsbIo                  EFI_USB_IO_PROTOCOL\r
39   @param  Value                  Device Request Value\r
40   @param  Index                  Device Request Index\r
41   @param  DescriptorLength       Descriptor Length\r
42   @param  Descriptor             Descriptor buffer to contain result\r
43   @param  Status                 Transfer Status\r
44 \r
45   @retval EFI_INVALID_PARAMETER  Parameter is error\r
46   @retval EFI_SUCCESS            Success\r
47   @retval EFI_TIMEOUT            Device has no response\r
48 \r
49 **/\r
50 EFI_STATUS\r
51 UsbGetDescriptor (\r
52   IN  EFI_USB_IO_PROTOCOL     *UsbIo,\r
53   IN  UINT16                  Value,\r
54   IN  UINT16                  Index,\r
55   IN  UINT16                  DescriptorLength,\r
56   OUT VOID                    *Descriptor,\r
57   OUT UINT32                  *Status\r
58   )\r
59 {\r
60   EFI_USB_DEVICE_REQUEST  DevReq;\r
61 \r
62   if (UsbIo == NULL) {\r
63     return EFI_INVALID_PARAMETER;\r
64   }\r
65 \r
66   ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
67 \r
68   DevReq.RequestType  = USB_DEV_GET_DESCRIPTOR_REQ_TYPE;\r
69   DevReq.Request      = USB_REQ_GET_DESCRIPTOR;\r
70   DevReq.Value        = Value;\r
71   DevReq.Index        = Index;\r
72   DevReq.Length       = DescriptorLength;\r
73 \r
74   return UsbIo->UsbControlTransfer (\r
75                   UsbIo,\r
76                   &DevReq,\r
77                   EfiUsbDataIn,\r
78                   TIMEOUT_VALUE,\r
79                   Descriptor,\r
80                   DescriptorLength,\r
81                   Status\r
82                   );\r
83 }\r
84 \r
85 \r
86 /**\r
87   Usb Set Descriptor\r
88 \r
89   @param  UsbIo                  EFI_USB_IO_PROTOCOL\r
90   @param  Value                  Device Request Value\r
91   @param  Index                  Device Request Index\r
92   @param  DescriptorLength       Descriptor Length\r
93   @param  Descriptor             Descriptor buffer to set\r
94   @param  Status                 Transfer Status\r
95 \r
96   @retval EFI_INVALID_PARAMETER  Parameter is error\r
97   @retval EFI_SUCCESS            Success\r
98   @retval EFI_TIMEOUT            Device has no response\r
99 \r
100 **/\r
101 EFI_STATUS\r
102 UsbSetDescriptor (\r
103   IN  EFI_USB_IO_PROTOCOL     *UsbIo,\r
104   IN  UINT16                  Value,\r
105   IN  UINT16                  Index,\r
106   IN  UINT16                  DescriptorLength,\r
107   IN  VOID                    *Descriptor,\r
108   OUT UINT32                  *Status\r
109   )\r
110 {\r
111   EFI_USB_DEVICE_REQUEST  DevReq;\r
112 \r
113   if (UsbIo == NULL) {\r
114     return EFI_INVALID_PARAMETER;\r
115   }\r
116 \r
117   ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
118 \r
119   DevReq.RequestType  = USB_DEV_SET_DESCRIPTOR_REQ_TYPE;\r
120   DevReq.Request      = USB_REQ_SET_DESCRIPTOR;\r
121   DevReq.Value        = Value;\r
122   DevReq.Index        = Index;\r
123   DevReq.Length       = DescriptorLength;\r
124 \r
125   return UsbIo->UsbControlTransfer (\r
126                   UsbIo,\r
127                   &DevReq,\r
128                   EfiUsbDataOut,\r
129                   TIMEOUT_VALUE,\r
130                   Descriptor,\r
131                   DescriptorLength,\r
132                   Status\r
133                   );\r
134 }\r
135 \r
136 \r
137 /**\r
138   Usb Get Device Interface\r
139 \r
140   @param  UsbIo                  EFI_USB_IO_PROTOCOL\r
141   @param  Index                  Interface index value\r
142   @param  AltSetting             Alternate setting\r
143   @param  Status                 Trasnsfer status\r
144 \r
145   @retval EFI_INVALID_PARAMETER  Parameter is error\r
146   @retval EFI_SUCCESS            Success\r
147   @retval EFI_TIMEOUT            Device has no response\r
148 \r
149 **/\r
150 EFI_STATUS\r
151 UsbGetInterface (\r
152   IN  EFI_USB_IO_PROTOCOL     *UsbIo,\r
153   IN  UINT16                  Index,\r
154   OUT UINT8                   *AltSetting,\r
155   OUT UINT32                  *Status\r
156   )\r
157 {\r
158   EFI_USB_DEVICE_REQUEST  DevReq;\r
159 \r
160   if (UsbIo == NULL) {\r
161     return EFI_INVALID_PARAMETER;\r
162   }\r
163 \r
164   ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
165 \r
166   DevReq.RequestType  = USB_DEV_GET_INTERFACE_REQ_TYPE;\r
167   DevReq.Request      = USB_REQ_GET_INTERFACE;\r
168   DevReq.Index        = Index;\r
169   DevReq.Length       = 1;\r
170 \r
171   return UsbIo->UsbControlTransfer (\r
172                   UsbIo,\r
173                   &DevReq,\r
174                   EfiUsbDataIn,\r
175                   TIMEOUT_VALUE,\r
176                   AltSetting,\r
177                   1,\r
178                   Status\r
179                   );\r
180 }\r
181 \r
182 \r
183 /**\r
184   Usb Set Device Interface\r
185 \r
186   @param  UsbIo                  EFI_USB_IO_PROTOCOL\r
187   @param  InterfaceNo            Interface Number\r
188   @param  AltSetting             Alternate setting\r
189   @param  Status                 Trasnsfer status\r
190 \r
191   @retval EFI_INVALID_PARAMETER  Parameter is error\r
192   @retval EFI_SUCCESS            Success\r
193   @retval EFI_TIMEOUT            Device has no response\r
194 \r
195 **/\r
196 EFI_STATUS\r
197 UsbSetInterface (\r
198   IN  EFI_USB_IO_PROTOCOL     *UsbIo,\r
199   IN  UINT16                  InterfaceNo,\r
200   IN  UINT16                  AltSetting,\r
201   OUT UINT32                  *Status\r
202   )\r
203 {\r
204   EFI_USB_DEVICE_REQUEST  DevReq;\r
205 \r
206   if (UsbIo == NULL) {\r
207     return EFI_INVALID_PARAMETER;\r
208   }\r
209 \r
210   ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
211 \r
212   DevReq.RequestType  = USB_DEV_SET_INTERFACE_REQ_TYPE;\r
213   DevReq.Request      = USB_REQ_SET_INTERFACE;\r
214   DevReq.Value        = AltSetting;\r
215   DevReq.Index        = InterfaceNo;\r
216 \r
217 \r
218   return UsbIo->UsbControlTransfer (\r
219                   UsbIo,\r
220                   &DevReq,\r
221                   EfiUsbNoData,\r
222                   TIMEOUT_VALUE,\r
223                   NULL,\r
224                   0,\r
225                   Status\r
226                   );\r
227 }\r
228 \r
229 \r
230 /**\r
231   Usb Get Device Configuration\r
232 \r
233   @param  UsbIo                  EFI_USB_IO_PROTOCOL\r
234   @param  ConfigValue            Config Value\r
235   @param  Status                 Transfer Status\r
236 \r
237   @retval EFI_INVALID_PARAMETER  Parameter is error\r
238   @retval EFI_SUCCESS            Success\r
239   @retval EFI_TIMEOUT            Device has no response\r
240 \r
241 **/\r
242 EFI_STATUS\r
243 UsbGetConfiguration (\r
244   IN  EFI_USB_IO_PROTOCOL     *UsbIo,\r
245   OUT UINT8                   *ConfigValue,\r
246   OUT UINT32                  *Status\r
247   )\r
248 {\r
249   EFI_USB_DEVICE_REQUEST  DevReq;\r
250 \r
251   if (UsbIo == NULL) {\r
252     return EFI_INVALID_PARAMETER;\r
253   }\r
254 \r
255   ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
256 \r
257   DevReq.RequestType  = USB_DEV_GET_CONFIGURATION_REQ_TYPE;\r
258   DevReq.Request      = USB_REQ_GET_CONFIG;\r
259   DevReq.Length       = 1;\r
260 \r
261   return UsbIo->UsbControlTransfer (\r
262                   UsbIo,\r
263                   &DevReq,\r
264                   EfiUsbDataIn,\r
265                   TIMEOUT_VALUE,\r
266                   ConfigValue,\r
267                   1,\r
268                   Status\r
269                   );\r
270 }\r
271 \r
272 \r
273 /**\r
274   Usb Set Device Configuration\r
275 \r
276   @param  UsbIo                  EFI_USB_IO_PROTOCOL\r
277   @param  Value                  Configuration Value to set\r
278   @param  Status                 Transfer status\r
279 \r
280   @retval EFI_INVALID_PARAMETER  Parameter is error\r
281   @retval EFI_SUCCESS            Success\r
282   @retval EFI_TIMEOUT            Device has no response\r
283 \r
284 **/\r
285 EFI_STATUS\r
286 UsbSetConfiguration (\r
287   IN  EFI_USB_IO_PROTOCOL     *UsbIo,\r
288   IN  UINT16                  Value,\r
289   OUT UINT32                  *Status\r
290   )\r
291 {\r
292   EFI_USB_DEVICE_REQUEST  DevReq;\r
293 \r
294   if (UsbIo == NULL) {\r
295     return EFI_INVALID_PARAMETER;\r
296   }\r
297 \r
298   ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
299 \r
300   DevReq.RequestType  = USB_DEV_SET_CONFIGURATION_REQ_TYPE;\r
301   DevReq.Request      = USB_REQ_SET_CONFIG;\r
302   DevReq.Value        = Value;\r
303 \r
304   return UsbIo->UsbControlTransfer (\r
305                   UsbIo,\r
306                   &DevReq,\r
307                   EfiUsbNoData,\r
308                   TIMEOUT_VALUE,\r
309                   NULL,\r
310                   0,\r
311                   Status\r
312                   );\r
313 }\r
314 \r
315 \r
316 /**\r
317   Usb Set Device Feature\r
318 \r
319   @param  UsbIo                  EFI_USB_IO_PROTOCOL\r
320   @param  Recipient              Interface/Device/Endpoint\r
321   @param  Value                  Request value\r
322   @param  Target                 Request Index\r
323   @param  Status                 Transfer status\r
324 \r
325   @retval EFI_INVALID_PARAMETER  Parameter is error\r
326   @retval EFI_SUCCESS            Success\r
327   @retval EFI_TIMEOUT            Device has no response\r
328 \r
329 **/\r
330 EFI_STATUS\r
331 UsbSetFeature (\r
332   IN  EFI_USB_IO_PROTOCOL     *UsbIo,\r
333   IN  UINTN       Recipient,\r
334   IN  UINT16                  Value,\r
335   IN  UINT16                  Target,\r
336   OUT UINT32                  *Status\r
337   )\r
338 {\r
339   EFI_USB_DEVICE_REQUEST  DevReq;\r
340 \r
341   if (UsbIo == NULL) {\r
342     return EFI_INVALID_PARAMETER;\r
343   }\r
344 \r
345   ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
346 \r
347   switch (Recipient) {\r
348 \r
349   case USB_TARGET_DEVICE:\r
350     DevReq.RequestType = USB_DEV_SET_FEATURE_REQ_TYPE_D;\r
351     break;\r
352 \r
353   case USB_TARGET_INTERFACE:\r
354     DevReq.RequestType = USB_DEV_SET_FEATURE_REQ_TYPE_I;\r
355     break;\r
356 \r
357   case USB_TARGET_ENDPOINT:\r
358     DevReq.RequestType = USB_DEV_SET_FEATURE_REQ_TYPE_E;\r
359     break;\r
360   }\r
361   //\r
362   // Fill device request, see USB1.1 spec\r
363   //\r
364   DevReq.Request  = USB_REQ_SET_FEATURE;\r
365   DevReq.Value    = Value;\r
366   DevReq.Index    = Target;\r
367 \r
368 \r
369   return UsbIo->UsbControlTransfer (\r
370                   UsbIo,\r
371                   &DevReq,\r
372                   EfiUsbNoData,\r
373                   TIMEOUT_VALUE,\r
374                   NULL,\r
375                   0,\r
376                   Status\r
377                   );\r
378 }\r
379 \r
380 \r
381 /**\r
382   Usb Clear Device Feature\r
383 \r
384   @param  UsbIo                  EFI_USB_IO_PROTOCOL\r
385   @param  Recipient              Interface/Device/Endpoint\r
386   @param  Value                  Request value\r
387   @param  Target                 Request Index\r
388   @param  Status                 Transfer status\r
389 \r
390   @retval EFI_INVALID_PARAMETER  Parameter is error\r
391   @retval EFI_SUCCESS            Success\r
392   @retval EFI_TIMEOUT            Device has no response\r
393 \r
394 **/\r
395 EFI_STATUS\r
396 UsbClearFeature (\r
397   IN  EFI_USB_IO_PROTOCOL     *UsbIo,\r
398   IN  UINTN       Recipient,\r
399   IN  UINT16                  Value,\r
400   IN  UINT16                  Target,\r
401   OUT UINT32                  *Status\r
402   )\r
403 {\r
404   EFI_USB_DEVICE_REQUEST  DevReq;\r
405 \r
406   if (UsbIo == NULL) {\r
407     return EFI_INVALID_PARAMETER;\r
408   }\r
409 \r
410   ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
411 \r
412   switch (Recipient) {\r
413 \r
414   case USB_TARGET_DEVICE:\r
415     DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_D;\r
416     break;\r
417 \r
418   case USB_TARGET_INTERFACE:\r
419     DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_I;\r
420     break;\r
421 \r
422   case USB_TARGET_ENDPOINT:\r
423     DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_E;\r
424     break;\r
425   }\r
426   //\r
427   // Fill device request, see USB1.1 spec\r
428   //\r
429   DevReq.Request  = USB_REQ_CLEAR_FEATURE;\r
430   DevReq.Value    = Value;\r
431   DevReq.Index    = Target;\r
432 \r
433 \r
434   return UsbIo->UsbControlTransfer (\r
435                   UsbIo,\r
436                   &DevReq,\r
437                   EfiUsbNoData,\r
438                   TIMEOUT_VALUE,\r
439                   NULL,\r
440                   0,\r
441                   Status\r
442                   );\r
443 }\r
444 \r
445 \r
446 /**\r
447   Usb Get Device Status\r
448 \r
449   @param  UsbIo                  EFI_USB_IO_PROTOCOL\r
450   @param  Recipient              Interface/Device/Endpoint\r
451   @param  Target                 Request index\r
452   @param  DevStatus              Device status\r
453   @param  Status                 Transfer status\r
454 \r
455   @retval EFI_INVALID_PARAMETER  Parameter is error\r
456   @retval EFI_SUCCESS            Success\r
457   @retval EFI_TIMEOUT            Device has no response\r
458 \r
459 **/\r
460 EFI_STATUS\r
461 UsbGetStatus (\r
462   IN  EFI_USB_IO_PROTOCOL     *UsbIo,\r
463   IN  UINTN       Recipient,\r
464   IN  UINT16                  Target,\r
465   OUT UINT16                  *DevStatus,\r
466   OUT UINT32                  *Status\r
467   )\r
468 {\r
469   EFI_USB_DEVICE_REQUEST  DevReq;\r
470 \r
471   if (UsbIo == NULL) {\r
472     return EFI_INVALID_PARAMETER;\r
473   }\r
474 \r
475   ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
476 \r
477   switch (Recipient) {\r
478 \r
479   case USB_TARGET_DEVICE:\r
480     DevReq.RequestType = USB_DEV_GET_STATUS_REQ_TYPE_D;\r
481     break;\r
482 \r
483   case USB_TARGET_INTERFACE:\r
484     DevReq.RequestType = USB_DEV_GET_STATUS_REQ_TYPE_I;\r
485     break;\r
486 \r
487   case USB_TARGET_ENDPOINT:\r
488     DevReq.RequestType = USB_DEV_GET_STATUS_REQ_TYPE_E;\r
489     break;\r
490   }\r
491   //\r
492   // Fill device request, see USB1.1 spec\r
493   //\r
494   DevReq.Request  = USB_REQ_GET_STATUS;\r
495   DevReq.Value    = 0;\r
496   DevReq.Index    = Target;\r
497   DevReq.Length   = 2;\r
498 \r
499   return UsbIo->UsbControlTransfer (\r
500                   UsbIo,\r
501                   &DevReq,\r
502                   EfiUsbDataIn,\r
503                   TIMEOUT_VALUE,\r
504                   DevStatus,\r
505                   2,\r
506                   Status\r
507                   );\r
508 }\r
509 \r
510 \r
511 \r
512 /**\r
513   Clear endpoint stall\r
514 \r
515   @param  UsbIo                  EFI_USB_IO_PROTOCOL\r
516   @param  EndpointNo             Endpoint Number\r
517   @param  Status                 Transfer Status\r
518 \r
519   @retval EFI_NOT_FOUND          Can't find the Endpoint\r
520   @retval EFI_DEVICE_ERROR       Hardware error\r
521   @retval EFI_SUCCESS            Success\r
522 \r
523 **/\r
524 EFI_STATUS\r
525 UsbClearEndpointHalt (\r
526   IN  EFI_USB_IO_PROTOCOL     *UsbIo,\r
527   IN  UINT8                   EndpointNo,\r
528   OUT UINT32                  *Status\r
529   )\r
530 {\r
531   EFI_STATUS                    Result;\r
532   EFI_USB_ENDPOINT_DESCRIPTOR   EndpointDescriptor;\r
533   EFI_USB_INTERFACE_DESCRIPTOR  InterfaceDescriptor;\r
534   UINT8                         Index;\r
535 \r
536   ZeroMem (&EndpointDescriptor, sizeof (EFI_USB_ENDPOINT_DESCRIPTOR));\r
537   //\r
538   // First seach the endpoint descriptor for that endpoint addr\r
539   //\r
540   Result = UsbIo->UsbGetInterfaceDescriptor (\r
541                     UsbIo,\r
542                     &InterfaceDescriptor\r
543                     );\r
544   if (EFI_ERROR (Result)) {\r
545     return Result;\r
546   }\r
547 \r
548   for (Index = 0; Index < InterfaceDescriptor.NumEndpoints; Index++) {\r
549     Result = UsbIo->UsbGetEndpointDescriptor (\r
550                       UsbIo,\r
551                       Index,\r
552                       &EndpointDescriptor\r
553                       );\r
554     if (EFI_ERROR (Result)) {\r
555       continue;\r
556     }\r
557 \r
558     if (EndpointDescriptor.EndpointAddress == EndpointNo) {\r
559       break;\r
560     }\r
561   }\r
562 \r
563   if (Index == InterfaceDescriptor.NumEndpoints) {\r
564     //\r
565     // No such endpoint\r
566     //\r
567     return EFI_NOT_FOUND;\r
568   }\r
569 \r
570   Result = UsbClearFeature (\r
571             UsbIo,\r
572             USB_TARGET_ENDPOINT,\r
573             EfiUsbEndpointHalt,\r
574             EndpointDescriptor.EndpointAddress,\r
575             Status\r
576             );\r
577 \r
578   return Result;\r
579 }\r