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