]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Bus/Usb/UsbBus/Dxe/usbutil.c
Initial import.
[mirror_edk2.git] / EdkModulePkg / Bus / Usb / UsbBus / Dxe / usbutil.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 usbutil.c\r
14\r
15 Abstract:\r
16\r
17 Helper functions for USB\r
18\r
19 Revision History\r
20\r
21--*/\r
22\r
23#include "usbbus.h"\r
24\r
25//\r
26// Following APIs are used to query Port Status\r
27//\r
28BOOLEAN\r
29IsPortConnect (\r
30 IN UINT16 PortStatus\r
31 )\r
32/*++\r
33\r
34 Routine Description:\r
35 Tell if there is a device connected to that port according to\r
36 the Port Status.\r
37\r
38 Parameters:\r
39 PortStatus - The status value of that port.\r
40\r
41 Return Value:\r
42 TRUE\r
43 FALSE\r
44\r
45--*/\r
46{\r
47 //\r
48 // return the bit 0 value of PortStatus\r
49 //\r
50 if ((PortStatus & USB_PORT_STAT_CONNECTION) != 0) {\r
51 return TRUE;\r
52 } else {\r
53 return FALSE;\r
54 }\r
55}\r
56\r
57BOOLEAN\r
58IsPortEnable (\r
59 IN UINT16 PortStatus\r
60 )\r
61/*++\r
62\r
63 Routine Description:\r
64 Tell if Port is enabled.\r
65\r
66 Arguments:\r
67 PortStatus - The status value of that port.\r
68\r
69 Returns:\r
70 TRUE - Port is enable\r
71 FALSE - Port is disable\r
72\r
73--*/\r
74{\r
75 //\r
76 // return the bit 1 value of PortStatus\r
77 //\r
78 if ((PortStatus & USB_PORT_STAT_ENABLE) != 0) {\r
79 return TRUE;\r
80 } else {\r
81 return FALSE;\r
82 }\r
83}\r
84\r
85BOOLEAN\r
86IsPortInReset (\r
87 IN UINT16 PortStatus\r
88 )\r
89/*++\r
90\r
91 Routine Description:\r
92 Tell if the port is being reset.\r
93\r
94 Arguments:\r
95 PortStatus - The status value of that port.\r
96\r
97 Returns:\r
98 TRUE\r
99 FALSE\r
100\r
101--*/\r
102{\r
103 //\r
104 // return the bit 4 value of PortStatus\r
105 //\r
106 if ((PortStatus & USB_PORT_STAT_RESET) != 0) {\r
107 return TRUE;\r
108 } else {\r
109 return FALSE;\r
110 }\r
111}\r
112\r
113BOOLEAN\r
114IsPortPowerApplied (\r
115 IN UINT16 PortStatus\r
116 )\r
117/*++\r
118\r
119 Routine Description:\r
120 Tell if there is power applied to that port.\r
121\r
122 Arguments:\r
123 PortStatus - The status value of that port.\r
124\r
125 Returns:\r
126 TRUE\r
127 FALSE\r
128\r
129--*/\r
130{\r
131 //\r
132 // return the bit 8 value of PortStatus\r
133 //\r
134 if ((PortStatus & USB_PORT_STAT_POWER) != 0) {\r
135 return TRUE;\r
136 } else {\r
137 return FALSE;\r
138 }\r
139}\r
140\r
141BOOLEAN\r
142IsPortLowSpeedDeviceAttached (\r
143 IN UINT16 PortStatus\r
144 )\r
145/*++\r
146\r
147 Routine Description:\r
148 Tell if the connected device is a low device.\r
149\r
150 Arguments:\r
151 PortStatus - The status value of that port.\r
152\r
153 Returns:\r
154 TRUE\r
155 FALSE\r
156\r
157--*/\r
158{\r
159 //\r
160 // return the bit 9 value of PortStatus\r
161 //\r
162 if ((PortStatus & USB_PORT_STAT_LOW_SPEED) != 0) {\r
163 return TRUE;\r
164 } else {\r
165 return FALSE;\r
166 }\r
167}\r
168\r
169BOOLEAN\r
170IsPortSuspend (\r
171 IN UINT16 PortStatus\r
172 )\r
173/*++\r
174\r
175 Routine Description:\r
176 Tell if the port is suspend.\r
177\r
178 Arguments:\r
179 PortStatus - The status value of that port.\r
180\r
181 Returns:\r
182 TRUE\r
183 FALSE\r
184\r
185--*/\r
186{\r
187 //\r
188 // return the bit 2 value of PortStatus\r
189 //\r
190 if ((PortStatus & USB_PORT_STAT_SUSPEND) != 0) {\r
191 return TRUE;\r
192 } else {\r
193 return FALSE;\r
194 }\r
195}\r
196//\r
197// Following APIs are used to query Port Change Status\r
198//\r
199BOOLEAN\r
200IsPortConnectChange (\r
201 IN UINT16 PortChangeStatus\r
202 )\r
203/*++\r
204\r
205 Routine Description:\r
206 Tell if there is a Connect Change status in that port.\r
207\r
208 Arguments:\r
209 PortChangeStatus - The status value of that port.\r
210\r
211 Returns:\r
212 TRUE\r
213 FALSE\r
214\r
215--*/\r
216{\r
217 //\r
218 // return the bit 0 value of PortChangeStatus\r
219 //\r
220 if ((PortChangeStatus & USB_PORT_STAT_C_CONNECTION) != 0) {\r
221 return TRUE;\r
222 } else {\r
223 return FALSE;\r
224 }\r
225}\r
226\r
227BOOLEAN\r
228IsPortEnableDisableChange (\r
229 IN UINT16 PortChangeStatus\r
230 )\r
231/*++\r
232\r
233 Routine Description:\r
234 Tell if there is a Enable/Disable change in that port.\r
235\r
236 Arguments:\r
237 PortChangeStatus - The status value of that port.\r
238\r
239 Returns:\r
240 TRUE\r
241 FALSE\r
242\r
243--*/\r
244{\r
245 //\r
246 // return the bit 1 value of PortChangeStatus\r
247 //\r
248 if ((PortChangeStatus & USB_PORT_STAT_C_ENABLE) != 0) {\r
249 return TRUE;\r
250 } else {\r
251 return FALSE;\r
252 }\r
253}\r
254\r
255BOOLEAN\r
256IsPortResetChange (\r
257 IN UINT16 PortChangeStatus\r
258 )\r
259/*++\r
260\r
261 Routine Description:\r
262 Tell if there is a Port Reset Change status in that port.\r
263\r
264 Arguments:\r
265 PortChangeStatus - The status value of that port.\r
266\r
267 Returns:\r
268 TRUE\r
269 FALSE\r
270\r
271--*/\r
272{\r
273 //\r
274 // return the bit 4 value of PortChangeStatus\r
275 //\r
276 if ((PortChangeStatus & USB_PORT_STAT_C_RESET) != 0) {\r
277 return TRUE;\r
278 } else {\r
279 return FALSE;\r
280 }\r
281}\r
282\r
283\r
284BOOLEAN\r
285IsPortSuspendChange (\r
286 IN UINT16 PortChangeStatus\r
287 )\r
288/*++\r
289\r
290 Routine Description:\r
291 Tell if there is a Suspend Change Status in that port.\r
292\r
293 Arguments:\r
294 PortChangeStatus - The status value of that port.\r
295\r
296 Returns:\r
297 TRUE\r
298 FALSE\r
299\r
300--*/\r
301{\r
302 //\r
303 // return the bit 2 value of PortChangeStatus\r
304 //\r
305 if ((PortChangeStatus & USB_PORT_STAT_C_SUSPEND) != 0) {\r
306 return TRUE;\r
307 } else {\r
308 return FALSE;\r
309 }\r
310}\r
311\r
312\r
313INTERFACE_DESC_LIST_ENTRY* \r
314FindInterfaceListEntry (\r
315 IN EFI_USB_IO_PROTOCOL *This\r
316 )\r
317/*++\r
318\r
319 Routine Description:\r
320 Find Interface ListEntry.\r
321\r
322 Arguments:\r
323 This - EFI_USB_IO_PROTOCOL \r
324 \r
325 Returns:\r
326 INTERFACE_DESC_LIST_ENTRY pointer\r
327\r
328--*/\r
329{\r
330 USB_IO_CONTROLLER_DEVICE *UsbIoController;\r
331 USB_IO_DEVICE *UsbIoDev;\r
332 LIST_ENTRY *InterfaceListHead;\r
333 INTERFACE_DESC_LIST_ENTRY *InterfaceListEntry;\r
334\r
335 UsbIoController = USB_IO_CONTROLLER_DEVICE_FROM_USB_IO_THIS (This);\r
336 UsbIoDev = UsbIoController->UsbDevice;\r
337\r
338 if (!UsbIoDev->IsConfigured) {\r
339 return NULL;\r
340 }\r
341\r
342 InterfaceListHead = &UsbIoDev->ActiveConfig->InterfaceDescListHead;\r
343 InterfaceListEntry = (INTERFACE_DESC_LIST_ENTRY *) (InterfaceListHead->ForwardLink);\r
344\r
345 //\r
346 // Loop all interface descriptor to get match one.\r
347 //\r
348 while (InterfaceListEntry != (INTERFACE_DESC_LIST_ENTRY *) InterfaceListHead) {\r
349 if (InterfaceListEntry->InterfaceDescriptor.InterfaceNumber == UsbIoController->InterfaceNumber) {\r
350 return InterfaceListEntry;\r
351 }\r
352\r
353 InterfaceListEntry = (INTERFACE_DESC_LIST_ENTRY *) InterfaceListEntry->Link.ForwardLink;\r
354 }\r
355\r
356 return NULL;\r
357}\r
358\r
359ENDPOINT_DESC_LIST_ENTRY* \r
360FindEndPointListEntry (\r
361 IN EFI_USB_IO_PROTOCOL *This,\r
362 IN UINT8 EndPointAddress\r
363 )\r
364/*++\r
365\r
366 Routine Description:\r
367 Find EndPoint ListEntry.\r
368\r
369 Arguments:\r
370 This - EFI_USB_IO_PROTOCOL \r
371 EndpointAddr - Endpoint address.\r
372 \r
373 Returns:\r
374 ENDPOINT_DESC_LIST_ENTRY pointer\r
375\r
376--*/\r
377{\r
378 INTERFACE_DESC_LIST_ENTRY *InterfaceListEntry;\r
379 LIST_ENTRY *EndpointDescListHead;\r
380 ENDPOINT_DESC_LIST_ENTRY *EndPointListEntry;\r
381\r
382 InterfaceListEntry = FindInterfaceListEntry (This);\r
383 if (InterfaceListEntry != NULL) {\r
384 EndpointDescListHead = &InterfaceListEntry->EndpointDescListHead;\r
385 EndPointListEntry = (ENDPOINT_DESC_LIST_ENTRY *) (EndpointDescListHead->ForwardLink);\r
386\r
387 //\r
388 // Loop all interface descriptor to get match one.\r
389 //\r
390 while (EndPointListEntry != (ENDPOINT_DESC_LIST_ENTRY *) EndpointDescListHead) {\r
391 if (EndPointListEntry->EndpointDescriptor.EndpointAddress == EndPointAddress) {\r
392 return EndPointListEntry;\r
393 }\r
394\r
395 EndPointListEntry = (ENDPOINT_DESC_LIST_ENTRY *) EndPointListEntry->Link.ForwardLink;\r
396 }\r
397 }\r
398\r
399 return NULL;\r
400}\r
401\r
402VOID\r
403GetDataToggleBit (\r
404 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
405 IN UINT8 EndpointAddr,\r
406 OUT UINT8 *DataToggle\r
407 )\r
408/*++\r
409\r
410 Routine Description:\r
411 Get the datatoggle of a specified endpoint.\r
412\r
413 Arguments:\r
414 UsbIo - Given Usb Controller device.\r
415 EndpointAddr - Given Endpoint address.\r
416 DataToggle - The current data toggle of that endpoint\r
417\r
418 Returns:\r
419 N/A\r
420\r
421--*/\r
422{\r
423\r
424 ENDPOINT_DESC_LIST_ENTRY *EndpointListEntry;\r
425\r
426 *DataToggle = 0;\r
427\r
428 EndpointListEntry = FindEndPointListEntry (UsbIo, EndpointAddr);\r
429 if (EndpointListEntry == NULL) {\r
430 return ;\r
431 }\r
432\r
433 *DataToggle = (UINT8) (EndpointListEntry->Toggle);\r
434 return ;\r
435}\r
436\r
437VOID\r
438SetDataToggleBit (\r
439 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
440 IN UINT8 EndpointAddr,\r
441 IN UINT8 DataToggle\r
442 )\r
443/*++\r
444\r
445 Routine Description:\r
446 Set the datatoggle of a specified endpoint\r
447\r
448 Arguments:\r
449 UsbIo - Given Usb Controller device.\r
450 EndpointAddr - Given Endpoint address.\r
451 DataToggle - The current data toggle of that endpoint to be set\r
452\r
453 Returns:\r
454 N/A\r
455\r
456--*/\r
457{\r
458\r
459 ENDPOINT_DESC_LIST_ENTRY *EndpointListEntry;\r
460\r
461 EndpointListEntry = FindEndPointListEntry (UsbIo, EndpointAddr);\r
462 if (EndpointListEntry == NULL) {\r
463 return ;\r
464 }\r
465\r
466 EndpointListEntry->Toggle = DataToggle;\r
467 return ;\r
468}\r
469\r
470VOID\r
471GetDeviceEndPointMaxPacketLength (\r
472 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
473 IN UINT8 EndpointAddr,\r
474 OUT UINT8 *MaxPacketLength\r
475 )\r
476/*++\r
477\r
478 Routine Description:\r
479 Get the Max Packet Length of the speified Endpoint.\r
480\r
481 Arguments:\r
482 UsbIo - Given Usb Controller device.\r
483 EndpointAddr - Given Endpoint address.\r
484 MaxPacketLength - The max packet length of that endpoint\r
485\r
486 Returns:\r
487 N/A\r
488\r
489--*/\r
490{\r
491\r
492 ENDPOINT_DESC_LIST_ENTRY *EndpointListEntry;\r
493\r
494 *MaxPacketLength = 0;\r
495\r
496 EndpointListEntry = FindEndPointListEntry (UsbIo, EndpointAddr);\r
497 if (EndpointListEntry == NULL) {\r
498 return ;\r
499 }\r
500\r
501 *MaxPacketLength = (UINT8) (EndpointListEntry->EndpointDescriptor.MaxPacketSize);\r
502\r
503 return ;\r
504}\r
505\r
506\r
507EFI_STATUS\r
508UsbSetDeviceAddress (\r
509 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
510 IN UINT16 AddressValue,\r
511 OUT UINT32 *Status\r
512 )\r
513/*++\r
514\r
515Routine Description:\r
516\r
517 Usb Set Device Address\r
518\r
519Arguments:\r
520\r
521 UsbIo - EFI_USB_IO_PROTOCOL\r
522 AddressValue - Device address \r
523 Status - Transfer status\r
524\r
525Returns:\r
526\r
527 EFI_INVALID_PARAMETER - Parameter is error\r
528 EFI_SUCCESS - Success\r
529 EFI_TIMEOUT - Device has no response \r
530\r
531\r
532--*/\r
533{\r
534 EFI_USB_DEVICE_REQUEST DevReq;\r
535\r
536 if (UsbIo == NULL) {\r
537 return EFI_INVALID_PARAMETER;\r
538 }\r
539\r
540 ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
541\r
542 DevReq.RequestType = USB_DEV_SET_ADDRESS_REQ_TYPE;\r
543 DevReq.Request = USB_DEV_SET_ADDRESS;\r
544 DevReq.Value = AddressValue;\r
545 \r
546 return UsbIo->UsbControlTransfer (\r
547 UsbIo,\r
548 &DevReq,\r
549 EfiUsbNoData,\r
550 TIMEOUT_VALUE,\r
551 NULL,\r
552 0,\r
553 Status\r
554 );\r
555}\r
556\r