]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - MdePkg/Library/UefiUsbLib/UsbDxeLib.c
[Description]
[mirror_edk2.git] / MdePkg / Library / UefiUsbLib / UsbDxeLib.c
... / ...
CommitLineData
1/** @file\r
2\r
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
16\r
17**/\r
18\r
19#include <UefiUsbLibInternal.h>\r
20\r
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
37EFI_STATUS\r
38EFIAPI\r
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
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
57 DevReq.Request = USB_REQ_GET_DESCRIPTOR;\r
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
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
89EFI_STATUS\r
90EFIAPI\r
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
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
109 DevReq.Request = USB_REQ_SET_DESCRIPTOR;\r
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
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
139EFI_STATUS\r
140EFIAPI\r
141UsbGetInterface (\r
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
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
157 DevReq.Request = USB_REQ_GET_INTERFACE;\r
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
171\r
172\r
173/**\r
174 Usb Set Device Interface\r
175\r
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
180\r
181 @retval EFI_INVALID_PARAMETER Parameter is error\r
182 @retval EFI_SUCCESS Success\r
183 @retval EFI_TIMEOUT Device has no response\r
184\r
185**/\r
186EFI_STATUS\r
187EFIAPI\r
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
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
204 DevReq.Request = USB_REQ_SET_INTERFACE;\r
205 DevReq.Value = AltSetting;\r
206 DevReq.Index = InterfaceNo;\r
207\r
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
219\r
220\r
221/**\r
222 Usb Get Device Configuration\r
223\r
224 @param UsbIo EFI_USB_IO_PROTOCOL\r
225 @param ConfigValue Config Value\r
226 @param Status Transfer Status\r
227\r
228 @retval EFI_INVALID_PARAMETER Parameter is error\r
229 @retval EFI_SUCCESS Success\r
230 @retval EFI_TIMEOUT Device has no response\r
231\r
232**/\r
233EFI_STATUS\r
234EFIAPI\r
235UsbGetConfiguration (\r
236 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
237 OUT UINT8 *ConfigValue,\r
238 OUT UINT32 *Status\r
239 )\r
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
250 DevReq.Request = USB_REQ_GET_CONFIG;\r
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
263\r
264\r
265/**\r
266 Usb Set Device Configuration\r
267\r
268 @param UsbIo EFI_USB_IO_PROTOCOL\r
269 @param Value Configuration Value to set\r
270 @param Status Transfer status\r
271\r
272 @retval EFI_INVALID_PARAMETER Parameter is error\r
273 @retval EFI_SUCCESS Success\r
274 @retval EFI_TIMEOUT Device has no response\r
275\r
276**/\r
277EFI_STATUS\r
278EFIAPI\r
279UsbSetConfiguration (\r
280 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
281 IN UINT16 Value,\r
282 OUT UINT32 *Status\r
283 )\r
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
294 DevReq.Request = USB_REQ_SET_CONFIG;\r
295 DevReq.Value = Value;\r
296\r
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
307\r
308\r
309/**\r
310 Usb Set Device Feature\r
311\r
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
317\r
318 @retval EFI_INVALID_PARAMETER Parameter is error\r
319 @retval EFI_SUCCESS Success\r
320 @retval EFI_TIMEOUT Device has no response\r
321\r
322**/\r
323EFI_STATUS\r
324EFIAPI\r
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
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
343 case USB_TARGET_DEVICE:\r
344 DevReq.RequestType = USB_DEV_SET_FEATURE_REQ_TYPE_D;\r
345 break;\r
346\r
347 case USB_TARGET_INTERFACE:\r
348 DevReq.RequestType = USB_DEV_SET_FEATURE_REQ_TYPE_I;\r
349 break;\r
350\r
351 case USB_TARGET_ENDPOINT:\r
352 DevReq.RequestType = USB_DEV_SET_FEATURE_REQ_TYPE_E;\r
353 break;\r
354 }\r
355 //\r
356 // Fill device request, see USB1.1 spec\r
357 //\r
358 DevReq.Request = USB_REQ_SET_FEATURE;\r
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
373\r
374\r
375/**\r
376 Usb Clear Device Feature\r
377\r
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
383\r
384 @retval EFI_INVALID_PARAMETER Parameter is error\r
385 @retval EFI_SUCCESS Success\r
386 @retval EFI_TIMEOUT Device has no response\r
387\r
388**/\r
389EFI_STATUS\r
390EFIAPI\r
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
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
409 case USB_TARGET_DEVICE:\r
410 DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_D;\r
411 break;\r
412\r
413 case USB_TARGET_INTERFACE:\r
414 DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_I;\r
415 break;\r
416\r
417 case USB_TARGET_ENDPOINT:\r
418 DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_E;\r
419 break;\r
420 }\r
421 //\r
422 // Fill device request, see USB1.1 spec\r
423 //\r
424 DevReq.Request = USB_REQ_CLEAR_FEATURE;\r
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
439\r
440\r
441/**\r
442 Usb Get Device Status\r
443\r
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
449\r
450 @retval EFI_INVALID_PARAMETER Parameter is error\r
451 @retval EFI_SUCCESS Success\r
452 @retval EFI_TIMEOUT Device has no response\r
453\r
454**/\r
455EFI_STATUS\r
456EFIAPI\r
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
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
475 case USB_TARGET_DEVICE:\r
476 DevReq.RequestType = USB_DEV_GET_STATUS_REQ_TYPE_D;\r
477 break;\r
478\r
479 case USB_TARGET_INTERFACE:\r
480 DevReq.RequestType = USB_DEV_GET_STATUS_REQ_TYPE_I;\r
481 break;\r
482\r
483 case USB_TARGET_ENDPOINT:\r
484 DevReq.RequestType = USB_DEV_GET_STATUS_REQ_TYPE_E;\r
485 break;\r
486 }\r
487 //\r
488 // Fill device request, see USB1.1 spec\r
489 //\r
490 DevReq.Request = USB_REQ_GET_STATUS;\r
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
505\r
506\r
507\r
508/**\r
509 Clear endpoint stall\r
510\r
511 @param UsbIo EFI_USB_IO_PROTOCOL\r
512 @param EndpointNo Endpoint Number\r
513 @param Status Transfer Status\r
514\r
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
518\r
519**/\r
520EFI_STATUS\r
521EFIAPI\r
522UsbClearEndpointHalt (\r
523 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
524 IN UINT8 EndpointNo,\r
525 OUT UINT32 *Status\r
526 )\r
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
533 if (UsbIo == NULL) {\r
534 return EFI_INVALID_PARAMETER;\r
535 }\r
536\r
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
571 Result = UsbClearFeature (\r
572 UsbIo,\r
573 USB_TARGET_ENDPOINT,\r
574 USB_FEATURE_ENDPOINT_HALT,\r
575 EndpointDescriptor.EndpointAddress,\r
576 Status\r
577 );\r
578\r
579 return Result;\r
580}\r