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