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