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