]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/UefiUsbLib/UsbDxeLib.c
1. Import UsbKbDxe and UsbMouseDxe into MdeModulePkg
[mirror_edk2.git] / MdePkg / Library / UefiUsbLib / UsbDxeLib.c
CommitLineData
ed838d0c 1/** @file\r
7bc232b2 2\r
ed838d0c 3Copyright (c) 2004 - 2007, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
7bc232b2
LG
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
7bc232b2 22\r
ed838d0c 23**/\r
7bc232b2
LG
24\r
25//\r
ed838d0c 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
7bc232b2 31//\r
ed838d0c 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
7bc232b2
LG
50EFI_STATUS\r
51UsbGetDescriptor (\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
7bc232b2
LG
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
ed838d0c 69 DevReq.Request = USB_REQ_GET_DESCRIPTOR;\r
7bc232b2
LG
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
ed838d0c 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
7bc232b2
LG
101EFI_STATUS\r
102UsbSetDescriptor (\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
7bc232b2
LG
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
ed838d0c 120 DevReq.Request = USB_REQ_SET_DESCRIPTOR;\r
7bc232b2
LG
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
ed838d0c 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
7bc232b2 150EFI_STATUS\r
ed838d0c 151UsbGetInterface (\r
7bc232b2
LG
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
7bc232b2
LG
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
ed838d0c 167 DevReq.Request = USB_REQ_GET_INTERFACE;\r
7bc232b2
LG
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
7bc232b2 181\r
7bc232b2 182\r
ed838d0c 183/**\r
7bc232b2
LG
184 Usb Set Device Interface\r
185\r
ed838d0c 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
7bc232b2 190\r
ed838d0c 191 @retval EFI_INVALID_PARAMETER Parameter is error\r
192 @retval EFI_SUCCESS Success\r
193 @retval EFI_TIMEOUT Device has no response\r
7bc232b2 194\r
ed838d0c 195**/\r
196EFI_STATUS\r
197UsbSetInterface (\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
7bc232b2
LG
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
ed838d0c 213 DevReq.Request = USB_REQ_SET_INTERFACE;\r
7bc232b2
LG
214 DevReq.Value = AltSetting;\r
215 DevReq.Index = InterfaceNo;\r
ed838d0c 216\r
7bc232b2
LG
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
7bc232b2 228\r
7bc232b2 229\r
ed838d0c 230/**\r
7bc232b2
LG
231 Usb Get Device Configuration\r
232\r
ed838d0c 233 @param UsbIo EFI_USB_IO_PROTOCOL\r
234 @param ConfigValue Config Value\r
235 @param Status Transfer Status\r
7bc232b2 236\r
ed838d0c 237 @retval EFI_INVALID_PARAMETER Parameter is error\r
238 @retval EFI_SUCCESS Success\r
239 @retval EFI_TIMEOUT Device has no response\r
7bc232b2 240\r
ed838d0c 241**/\r
242EFI_STATUS\r
243UsbGetConfiguration (\r
244 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
245 OUT UINT8 *ConfigValue,\r
246 OUT UINT32 *Status\r
247 )\r
7bc232b2
LG
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
ed838d0c 258 DevReq.Request = USB_REQ_GET_CONFIG;\r
7bc232b2
LG
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
7bc232b2 271\r
7bc232b2 272\r
ed838d0c 273/**\r
7bc232b2
LG
274 Usb Set Device Configuration\r
275\r
ed838d0c 276 @param UsbIo EFI_USB_IO_PROTOCOL\r
277 @param Value Configuration Value to set\r
278 @param Status Transfer status\r
7bc232b2 279\r
ed838d0c 280 @retval EFI_INVALID_PARAMETER Parameter is error\r
281 @retval EFI_SUCCESS Success\r
282 @retval EFI_TIMEOUT Device has no response\r
7bc232b2 283\r
ed838d0c 284**/\r
285EFI_STATUS\r
286UsbSetConfiguration (\r
287 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
288 IN UINT16 Value,\r
289 OUT UINT32 *Status\r
290 )\r
7bc232b2
LG
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
ed838d0c 301 DevReq.Request = USB_REQ_SET_CONFIG;\r
7bc232b2 302 DevReq.Value = Value;\r
ed838d0c 303\r
7bc232b2
LG
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
7bc232b2 314\r
7bc232b2 315\r
ed838d0c 316/**\r
7bc232b2
LG
317 Usb Set Device Feature\r
318\r
ed838d0c 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
7bc232b2 324\r
ed838d0c 325 @retval EFI_INVALID_PARAMETER Parameter is error\r
326 @retval EFI_SUCCESS Success\r
327 @retval EFI_TIMEOUT Device has no response\r
7bc232b2 328\r
ed838d0c 329**/\r
330EFI_STATUS\r
331UsbSetFeature (\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
7bc232b2
LG
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
ed838d0c 349 case USB_TARGET_DEVICE:\r
350 DevReq.RequestType = USB_DEV_SET_FEATURE_REQ_TYPE_D;\r
7bc232b2
LG
351 break;\r
352\r
ed838d0c 353 case USB_TARGET_INTERFACE:\r
354 DevReq.RequestType = USB_DEV_SET_FEATURE_REQ_TYPE_I;\r
7bc232b2
LG
355 break;\r
356\r
ed838d0c 357 case USB_TARGET_ENDPOINT:\r
358 DevReq.RequestType = USB_DEV_SET_FEATURE_REQ_TYPE_E;\r
7bc232b2
LG
359 break;\r
360 }\r
361 //\r
362 // Fill device request, see USB1.1 spec\r
363 //\r
ed838d0c 364 DevReq.Request = USB_REQ_SET_FEATURE;\r
7bc232b2
LG
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
7bc232b2 379\r
7bc232b2 380\r
ed838d0c 381/**\r
7bc232b2
LG
382 Usb Clear Device Feature\r
383\r
ed838d0c 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
7bc232b2 389\r
ed838d0c 390 @retval EFI_INVALID_PARAMETER Parameter is error\r
391 @retval EFI_SUCCESS Success\r
392 @retval EFI_TIMEOUT Device has no response\r
7bc232b2 393\r
ed838d0c 394**/\r
395EFI_STATUS\r
396UsbClearFeature (\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
7bc232b2
LG
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
ed838d0c 414 case USB_TARGET_DEVICE:\r
415 DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_D;\r
7bc232b2
LG
416 break;\r
417\r
ed838d0c 418 case USB_TARGET_INTERFACE:\r
419 DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_I;\r
7bc232b2
LG
420 break;\r
421\r
ed838d0c 422 case USB_TARGET_ENDPOINT:\r
423 DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_E;\r
7bc232b2
LG
424 break;\r
425 }\r
426 //\r
427 // Fill device request, see USB1.1 spec\r
428 //\r
ed838d0c 429 DevReq.Request = USB_REQ_CLEAR_FEATURE;\r
7bc232b2
LG
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
7bc232b2 444\r
7bc232b2 445\r
ed838d0c 446/**\r
7bc232b2
LG
447 Usb Get Device Status\r
448\r
ed838d0c 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
7bc232b2 454\r
ed838d0c 455 @retval EFI_INVALID_PARAMETER Parameter is error\r
456 @retval EFI_SUCCESS Success\r
457 @retval EFI_TIMEOUT Device has no response\r
7bc232b2 458\r
ed838d0c 459**/\r
460EFI_STATUS\r
461UsbGetStatus (\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
7bc232b2
LG
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
ed838d0c 479 case USB_TARGET_DEVICE:\r
480 DevReq.RequestType = USB_DEV_GET_STATUS_REQ_TYPE_D;\r
7bc232b2
LG
481 break;\r
482\r
ed838d0c 483 case USB_TARGET_INTERFACE:\r
484 DevReq.RequestType = USB_DEV_GET_STATUS_REQ_TYPE_I;\r
7bc232b2
LG
485 break;\r
486\r
ed838d0c 487 case USB_TARGET_ENDPOINT:\r
488 DevReq.RequestType = USB_DEV_GET_STATUS_REQ_TYPE_E;\r
7bc232b2
LG
489 break;\r
490 }\r
491 //\r
492 // Fill device request, see USB1.1 spec\r
493 //\r
ed838d0c 494 DevReq.Request = USB_REQ_GET_STATUS;\r
7bc232b2
LG
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
7bc232b2 509\r
7bc232b2 510\r
7bc232b2 511\r
ed838d0c 512/**\r
513 Clear endpoint stall\r
7bc232b2 514\r
ed838d0c 515 @param UsbIo EFI_USB_IO_PROTOCOL\r
516 @param EndpointNo Endpoint Number\r
517 @param Status Transfer Status\r
7bc232b2 518\r
ed838d0c 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
7bc232b2 522\r
ed838d0c 523**/\r
7bc232b2
LG
524EFI_STATUS\r
525UsbClearEndpointHalt (\r
526 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
527 IN UINT8 EndpointNo,\r
528 OUT UINT32 *Status\r
529 )\r
7bc232b2
LG
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
ed838d0c 570 Result = UsbClearFeature (\r
7bc232b2 571 UsbIo,\r
ed838d0c 572 USB_TARGET_ENDPOINT,\r
7bc232b2
LG
573 EfiUsbEndpointHalt,\r
574 EndpointDescriptor.EndpointAddress,\r
575 Status\r
576 );\r
577\r
578 return Result;\r
579}\r