]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Library/EdkUsbLib/UsbDxeLib.c
Ensure the validity of Ffs Sections when adding a new Sections to Ffs.
[mirror_edk2.git] / EdkModulePkg / Library / EdkUsbLib / UsbDxeLib.c
CommitLineData
878ddf1f 1/*++\r
2\r
3Copyright (c) 2006, 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
11\r
12 Module Name:\r
13\r
14 UsbDxeLib.c\r
15\r
16 Abstract:\r
17\r
18 Common Dxe Libarary for USB\r
19\r
20 Revision History\r
21\r
22--*/\r
23\r
24//\r
25// Get Device Descriptor\r
26//\r
27EFI_STATUS\r
28UsbGetDescriptor (\r
29 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
30 IN UINT16 Value,\r
31 IN UINT16 Index,\r
32 IN UINT16 DescriptorLength,\r
33 OUT VOID *Descriptor,\r
34 OUT UINT32 *Status\r
35 )\r
36/*++\r
37\r
38Routine Description:\r
39\r
40 Usb Get Descriptor\r
41\r
42Arguments:\r
43\r
44 UsbIo - EFI_USB_IO_PROTOCOL\r
45 Value - Device Request Value\r
46 Index - Device Request Index \r
47 DescriptorLength - Descriptor Length\r
48 Descriptor - Descriptor buffer to contain result\r
49 Status - Transfer Status\r
50Returns:\r
51 EFI_INVALID_PARAMETER - Parameter is error\r
52 EFI_SUCCESS - Success\r
53 EFI_TIMEOUT - Device has no response \r
54\r
55--*/\r
56{\r
57 EFI_USB_DEVICE_REQUEST DevReq;\r
58\r
59 if (UsbIo == NULL) {\r
60 return EFI_INVALID_PARAMETER;\r
61 }\r
62\r
63 ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
64\r
65 DevReq.RequestType = USB_DEV_GET_DESCRIPTOR_REQ_TYPE;\r
66 DevReq.Request = USB_DEV_GET_DESCRIPTOR;\r
67 DevReq.Value = Value;\r
68 DevReq.Index = Index;\r
69 DevReq.Length = DescriptorLength;\r
70\r
71 return UsbIo->UsbControlTransfer (\r
72 UsbIo,\r
73 &DevReq,\r
74 EfiUsbDataIn,\r
75 TIMEOUT_VALUE,\r
76 Descriptor,\r
77 DescriptorLength,\r
78 Status\r
79 );\r
80}\r
81//\r
82// Set Device Descriptor\r
83//\r
84EFI_STATUS\r
85UsbSetDescriptor (\r
86 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
87 IN UINT16 Value,\r
88 IN UINT16 Index,\r
89 IN UINT16 DescriptorLength,\r
90 IN VOID *Descriptor,\r
91 OUT UINT32 *Status\r
92 )\r
93/*++\r
94\r
95Routine Description:\r
96\r
97 Usb Set Descriptor\r
98\r
99Arguments:\r
100\r
101 UsbIo - EFI_USB_IO_PROTOCOL\r
102 Value - Device Request Value\r
103 Index - Device Request Index \r
104 DescriptorLength - Descriptor Length\r
105 Descriptor - Descriptor buffer to set\r
106 Status - Transfer Status\r
107Returns:\r
108 EFI_INVALID_PARAMETER - Parameter is error\r
109 EFI_SUCCESS - Success\r
110 EFI_TIMEOUT - Device has no response \r
111\r
112--*/\r
113{\r
114 EFI_USB_DEVICE_REQUEST DevReq;\r
115\r
116 if (UsbIo == NULL) {\r
117 return EFI_INVALID_PARAMETER;\r
118 }\r
119\r
120 ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
121\r
122 DevReq.RequestType = USB_DEV_SET_DESCRIPTOR_REQ_TYPE;\r
123 DevReq.Request = USB_DEV_SET_DESCRIPTOR;\r
124 DevReq.Value = Value;\r
125 DevReq.Index = Index;\r
126 DevReq.Length = DescriptorLength;\r
127\r
128 return UsbIo->UsbControlTransfer (\r
129 UsbIo,\r
130 &DevReq,\r
131 EfiUsbDataOut,\r
132 TIMEOUT_VALUE,\r
133 Descriptor,\r
134 DescriptorLength,\r
135 Status\r
136 );\r
137}\r
138\r
139//\r
140// Get device Interface\r
141//\r
142EFI_STATUS\r
143UsbGetDeviceInterface (\r
144 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
145 IN UINT16 Index,\r
146 OUT UINT8 *AltSetting,\r
147 OUT UINT32 *Status\r
148 )\r
149/*++\r
150\r
151Routine Description:\r
152\r
153 Usb Get Device Interface\r
154\r
155Arguments:\r
156\r
157 UsbIo - EFI_USB_IO_PROTOCOL\r
158 Index - Interface index value\r
159 AltSetting - Alternate setting\r
160 Status - Trasnsfer status\r
161\r
162Returns:\r
163\r
164 EFI_INVALID_PARAMETER - Parameter is error\r
165 EFI_SUCCESS - Success\r
166 EFI_TIMEOUT - Device has no response \r
167\r
168\r
169--*/\r
170{\r
171 EFI_USB_DEVICE_REQUEST DevReq;\r
172\r
173 if (UsbIo == NULL) {\r
174 return EFI_INVALID_PARAMETER;\r
175 }\r
176\r
177 ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
178\r
179 DevReq.RequestType = USB_DEV_GET_INTERFACE_REQ_TYPE;\r
180 DevReq.Request = USB_DEV_GET_INTERFACE;\r
181 DevReq.Index = Index;\r
182 DevReq.Length = 1;\r
183\r
184 return UsbIo->UsbControlTransfer (\r
185 UsbIo,\r
186 &DevReq,\r
187 EfiUsbDataIn,\r
188 TIMEOUT_VALUE,\r
189 AltSetting,\r
190 1,\r
191 Status\r
192 );\r
193}\r
194//\r
195// Set device interface\r
196//\r
197EFI_STATUS\r
198UsbSetDeviceInterface (\r
199 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
200 IN UINT16 InterfaceNo,\r
201 IN UINT16 AltSetting,\r
202 OUT UINT32 *Status\r
203 )\r
204/*++\r
205\r
206Routine Description:\r
207\r
208 Usb Set Device Interface\r
209\r
210Arguments:\r
211\r
212 UsbIo - EFI_USB_IO_PROTOCOL\r
213 InterfaceNo - Interface Number\r
214 AltSetting - Alternate setting\r
215 Status - Trasnsfer status\r
216\r
217Returns:\r
218\r
219 EFI_INVALID_PARAMETER - Parameter is error\r
220 EFI_SUCCESS - Success\r
221 EFI_TIMEOUT - Device has no response \r
222\r
223--*/\r
224{\r
225 EFI_USB_DEVICE_REQUEST DevReq;\r
226\r
227 if (UsbIo == NULL) {\r
228 return EFI_INVALID_PARAMETER;\r
229 }\r
230\r
231 ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
232\r
233 DevReq.RequestType = USB_DEV_SET_INTERFACE_REQ_TYPE;\r
234 DevReq.Request = USB_DEV_SET_INTERFACE;\r
235 DevReq.Value = AltSetting;\r
236 DevReq.Index = InterfaceNo;\r
237 \r
238\r
239 return UsbIo->UsbControlTransfer (\r
240 UsbIo,\r
241 &DevReq,\r
242 EfiUsbNoData,\r
243 TIMEOUT_VALUE,\r
244 NULL,\r
245 0,\r
246 Status\r
247 );\r
248}\r
249//\r
250// Get device configuration\r
251//\r
252EFI_STATUS\r
253UsbGetDeviceConfiguration (\r
254 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
255 OUT UINT8 *ConfigValue,\r
256 OUT UINT32 *Status\r
257 )\r
258/*++\r
259\r
260Routine Description:\r
261\r
262 Usb Get Device Configuration\r
263\r
264Arguments:\r
265\r
266 UsbIo - EFI_USB_IO_PROTOCOL\r
267 ConfigValue - Config Value\r
268 Status - Transfer Status\r
269\r
270Returns:\r
271\r
272 EFI_INVALID_PARAMETER - Parameter is error\r
273 EFI_SUCCESS - Success\r
274 EFI_TIMEOUT - Device has no response \r
275\r
276--*/\r
277{\r
278 EFI_USB_DEVICE_REQUEST DevReq;\r
279\r
280 if (UsbIo == NULL) {\r
281 return EFI_INVALID_PARAMETER;\r
282 }\r
283\r
284 ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
285\r
286 DevReq.RequestType = USB_DEV_GET_CONFIGURATION_REQ_TYPE;\r
287 DevReq.Request = USB_DEV_GET_CONFIGURATION;\r
288 DevReq.Length = 1;\r
289\r
290 return UsbIo->UsbControlTransfer (\r
291 UsbIo,\r
292 &DevReq,\r
293 EfiUsbDataIn,\r
294 TIMEOUT_VALUE,\r
295 ConfigValue,\r
296 1,\r
297 Status\r
298 );\r
299}\r
300//\r
301// Set device configuration\r
302//\r
303EFI_STATUS\r
304UsbSetDeviceConfiguration (\r
305 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
306 IN UINT16 Value,\r
307 OUT UINT32 *Status\r
308 )\r
309/*++\r
310\r
311Routine Description:\r
312\r
313 Usb Set Device Configuration\r
314\r
315Arguments:\r
316\r
317 UsbIo - EFI_USB_IO_PROTOCOL\r
318 Value - Configuration Value to set\r
319 Status - Transfer status\r
320\r
321Returns:\r
322\r
323 EFI_INVALID_PARAMETER - Parameter is error\r
324 EFI_SUCCESS - Success\r
325 EFI_TIMEOUT - Device has no response \r
326\r
327--*/\r
328{\r
329 EFI_USB_DEVICE_REQUEST DevReq;\r
330\r
331 if (UsbIo == NULL) {\r
332 return EFI_INVALID_PARAMETER;\r
333 }\r
334\r
335 ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
336\r
337 DevReq.RequestType = USB_DEV_SET_CONFIGURATION_REQ_TYPE;\r
338 DevReq.Request = USB_DEV_SET_CONFIGURATION;\r
339 DevReq.Value = Value;\r
340 \r
341 return UsbIo->UsbControlTransfer (\r
342 UsbIo,\r
343 &DevReq,\r
344 EfiUsbNoData,\r
345 TIMEOUT_VALUE,\r
346 NULL,\r
347 0,\r
348 Status\r
349 );\r
350}\r
351//\r
352// Set Device Feature\r
353//\r
354EFI_STATUS\r
355UsbSetDeviceFeature (\r
356 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
357 IN EFI_USB_RECIPIENT Recipient,\r
358 IN UINT16 Value,\r
359 IN UINT16 Target,\r
360 OUT UINT32 *Status\r
361 )\r
362/*++\r
363\r
364Routine Description:\r
365\r
366 Usb Set Device Feature\r
367\r
368Arguments:\r
369\r
370 UsbIo - EFI_USB_IO_PROTOCOL\r
371 Recipient - Interface/Device/Endpoint\r
372 Value - Request value\r
373 Target - Request Index\r
374 Status - Transfer status\r
375\r
376Returns:\r
377 \r
378 EFI_INVALID_PARAMETER - Parameter is error\r
379 EFI_SUCCESS - Success\r
380 EFI_TIMEOUT - Device has no response \r
381\r
382--*/\r
383{\r
384 EFI_USB_DEVICE_REQUEST DevReq;\r
385\r
386 if (UsbIo == NULL) {\r
387 return EFI_INVALID_PARAMETER;\r
388 }\r
389\r
390 ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
391\r
392 switch (Recipient) {\r
393\r
394 case EfiUsbDevice:\r
395 DevReq.RequestType = 0x00;\r
396 break;\r
397\r
398 case EfiUsbInterface:\r
399 DevReq.RequestType = 0x01;\r
400 break;\r
401\r
402 case EfiUsbEndpoint:\r
403 DevReq.RequestType = 0x02;\r
404 break;\r
405 }\r
406 //\r
407 // Fill device request, see USB1.1 spec\r
408 //\r
409 DevReq.Request = USB_DEV_SET_FEATURE;\r
410 DevReq.Value = Value;\r
411 DevReq.Index = Target;\r
412\r
413\r
414 return UsbIo->UsbControlTransfer (\r
415 UsbIo,\r
416 &DevReq,\r
417 EfiUsbNoData,\r
418 TIMEOUT_VALUE,\r
419 NULL,\r
420 0,\r
421 Status\r
422 );\r
423}\r
424//\r
425// Clear Device Feature\r
426//\r
427EFI_STATUS\r
428UsbClearDeviceFeature (\r
429 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
430 IN EFI_USB_RECIPIENT Recipient,\r
431 IN UINT16 Value,\r
432 IN UINT16 Target,\r
433 OUT UINT32 *Status\r
434 )\r
435/*++\r
436\r
437Routine Description:\r
438\r
439 Usb Clear Device Feature\r
440\r
441Arguments:\r
442\r
443 UsbIo - EFI_USB_IO_PROTOCOL\r
444 Recipient - Interface/Device/Endpoint\r
445 Value - Request value\r
446 Target - Request Index\r
447 Status - Transfer status\r
448\r
449Returns:\r
450 \r
451 EFI_INVALID_PARAMETER - Parameter is error\r
452 EFI_SUCCESS - Success\r
453 EFI_TIMEOUT - Device has no response \r
454\r
455--*/\r
456{\r
457 EFI_USB_DEVICE_REQUEST DevReq;\r
458\r
459 if (UsbIo == NULL) {\r
460 return EFI_INVALID_PARAMETER;\r
461 }\r
462\r
463 ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
464\r
465 switch (Recipient) {\r
466\r
467 case EfiUsbDevice:\r
468 DevReq.RequestType = 0x00;\r
469 break;\r
470\r
471 case EfiUsbInterface:\r
472 DevReq.RequestType = 0x01;\r
473 break;\r
474\r
475 case EfiUsbEndpoint:\r
476 DevReq.RequestType = 0x02;\r
477 break;\r
478 }\r
479 //\r
480 // Fill device request, see USB1.1 spec\r
481 //\r
482 DevReq.Request = USB_DEV_CLEAR_FEATURE;\r
483 DevReq.Value = Value;\r
484 DevReq.Index = Target;\r
485\r
486\r
487 return UsbIo->UsbControlTransfer (\r
488 UsbIo,\r
489 &DevReq,\r
490 EfiUsbNoData,\r
491 TIMEOUT_VALUE,\r
492 NULL,\r
493 0,\r
494 Status\r
495 );\r
496}\r
497//\r
498// Get Device Status\r
499//\r
500EFI_STATUS\r
501UsbGetDeviceStatus (\r
502 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
503 IN EFI_USB_RECIPIENT Recipient,\r
504 IN UINT16 Target,\r
505 OUT UINT16 *DevStatus,\r
506 OUT UINT32 *Status\r
507 )\r
508/*++\r
509\r
510Routine Description:\r
511\r
512 Usb Get Device Status\r
513\r
514Arguments:\r
515\r
516 UsbIo - EFI_USB_IO_PROTOCOL\r
517 Recipient - Interface/Device/Endpoint\r
518 Target - Request index\r
519 DevStatus - Device status\r
520 Status - Transfer status\r
521\r
522Returns:\r
523 \r
524 EFI_INVALID_PARAMETER - Parameter is error\r
525 EFI_SUCCESS - Success\r
526 EFI_TIMEOUT - Device has no response \r
527\r
528--*/\r
529{\r
530 EFI_USB_DEVICE_REQUEST DevReq;\r
531\r
532 if (UsbIo == NULL) {\r
533 return EFI_INVALID_PARAMETER;\r
534 }\r
535\r
536 ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
537\r
538 switch (Recipient) {\r
539\r
540 case EfiUsbDevice:\r
541 DevReq.RequestType = 0x80;\r
542 break;\r
543\r
544 case EfiUsbInterface:\r
545 DevReq.RequestType = 0x81;\r
546 break;\r
547\r
548 case EfiUsbEndpoint:\r
549 DevReq.RequestType = 0x82;\r
550 break;\r
551 }\r
552 //\r
553 // Fill device request, see USB1.1 spec\r
554 //\r
555 DevReq.Request = USB_DEV_GET_STATUS;\r
556 DevReq.Value = 0;\r
557 DevReq.Index = Target;\r
558 DevReq.Length = 2;\r
559\r
560 return UsbIo->UsbControlTransfer (\r
561 UsbIo,\r
562 &DevReq,\r
563 EfiUsbDataIn,\r
564 TIMEOUT_VALUE,\r
565 DevStatus,\r
566 2,\r
567 Status\r
568 );\r
569}\r
570//\r
571// Usb Get String\r
572//\r
573EFI_STATUS\r
574UsbGetString (\r
575 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
576 IN UINT16 LangID,\r
577 IN UINT8 Index,\r
578 IN VOID *Buf,\r
579 IN UINTN BufSize,\r
580 OUT UINT32 *Status\r
581 )\r
582/*++\r
583\r
584Routine Description:\r
585\r
586 Usb Get String\r
587\r
588Arguments:\r
589\r
590 UsbIo - EFI_USB_IO_PROTOCOL\r
591 LangID - Language ID\r
592 Index - Request index\r
593 Buf - Buffer to store string\r
594 BufSize - Buffer size\r
595 Status - Transfer status\r
596\r
597Returns:\r
598 \r
599 EFI_INVALID_PARAMETER - Parameter is error\r
600 EFI_SUCCESS - Success\r
601 EFI_TIMEOUT - Device has no response \r
602\r
603--*/\r
604{\r
605 UINT16 Value;\r
606\r
607 if (UsbIo == NULL) {\r
608 return EFI_INVALID_PARAMETER;\r
609 }\r
610 //\r
611 // Fill value, see USB1.1 spec\r
612 //\r
613 Value = (UINT16) ((USB_DT_STRING << 8) | Index);\r
614\r
615 return UsbGetDescriptor (\r
616 UsbIo,\r
617 Value,\r
618 LangID,\r
619 (UINT16) BufSize,\r
620 Buf,\r
621 Status\r
622 );\r
623}\r
624\r
625EFI_STATUS\r
626UsbClearEndpointHalt (\r
627 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
628 IN UINT8 EndpointNo,\r
629 OUT UINT32 *Status\r
630 )\r
631/*++\r
632\r
633Routine Description:\r
634\r
635 Clear endpoint stall\r
636\r
637Arguments:\r
638\r
639 UsbIo - EFI_USB_IO_PROTOCOL\r
640 EndpointNo - Endpoint Number\r
641 Status - Transfer Status\r
642\r
643Returns:\r
644\r
645 EFI_NOT_FOUND - Can't find the Endpoint\r
646 EFI_DEVICE_ERROR - Hardware error\r
647 EFI_SUCCESS - Success\r
648\r
649--*/\r
650{\r
651 EFI_STATUS Result;\r
652 EFI_USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;\r
653 EFI_USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;\r
654 UINT8 Index;\r
655\r
656 ZeroMem (&EndpointDescriptor, sizeof (EFI_USB_ENDPOINT_DESCRIPTOR));\r
657 //\r
658 // First seach the endpoint descriptor for that endpoint addr\r
659 //\r
660 Result = UsbIo->UsbGetInterfaceDescriptor (\r
661 UsbIo,\r
662 &InterfaceDescriptor\r
663 );\r
664 if (EFI_ERROR (Result)) {\r
665 return Result;\r
666 }\r
667\r
668 for (Index = 0; Index < InterfaceDescriptor.NumEndpoints; Index++) {\r
669 Result = UsbIo->UsbGetEndpointDescriptor (\r
670 UsbIo,\r
671 Index,\r
672 &EndpointDescriptor\r
673 );\r
674 if (EFI_ERROR (Result)) {\r
675 continue;\r
676 }\r
677\r
678 if (EndpointDescriptor.EndpointAddress == EndpointNo) {\r
679 break;\r
680 }\r
681 }\r
682\r
683 if (Index == InterfaceDescriptor.NumEndpoints) {\r
684 //\r
685 // No such endpoint\r
686 //\r
687 return EFI_NOT_FOUND;\r
688 }\r
689\r
690 Result = UsbClearDeviceFeature (\r
691 UsbIo,\r
692 EfiUsbEndpoint,\r
693 EfiUsbEndpointHalt,\r
694 EndpointDescriptor.EndpointAddress,\r
695 Status\r
696 );\r
697\r
698 return Result;\r
699}\r