]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Bus/Usb/UsbBus/Dxe/usbutil.c
Remove Static declaration for the related driver binding functions.
[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
562d2849 38 Arguments:\r
878ddf1f 39 PortStatus - The status value of that port.\r
40\r
562d2849 41 Returns:\r
878ddf1f 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
878ddf1f 283BOOLEAN\r
284IsPortSuspendChange (\r
285 IN UINT16 PortChangeStatus\r
286 )\r
287/*++\r
288\r
289 Routine Description:\r
290 Tell if there is a Suspend Change Status in that port.\r
291\r
292 Arguments:\r
293 PortChangeStatus - The status value of that port.\r
294\r
295 Returns:\r
296 TRUE\r
297 FALSE\r
298\r
299--*/\r
300{\r
301 //\r
302 // return the bit 2 value of PortChangeStatus\r
303 //\r
304 if ((PortChangeStatus & USB_PORT_STAT_C_SUSPEND) != 0) {\r
305 return TRUE;\r
306 } else {\r
307 return FALSE;\r
308 }\r
309}\r
310\r
562d2849 311INTERFACE_DESC_LIST_ENTRY *\r
878ddf1f 312FindInterfaceListEntry (\r
313 IN EFI_USB_IO_PROTOCOL *This\r
314 )\r
315/*++\r
316\r
317 Routine Description:\r
318 Find Interface ListEntry.\r
319\r
320 Arguments:\r
321 This - EFI_USB_IO_PROTOCOL \r
322 \r
323 Returns:\r
324 INTERFACE_DESC_LIST_ENTRY pointer\r
325\r
326--*/\r
327{\r
328 USB_IO_CONTROLLER_DEVICE *UsbIoController;\r
329 USB_IO_DEVICE *UsbIoDev;\r
562d2849 330 LIST_ENTRY *InterfaceListHead;\r
878ddf1f 331 INTERFACE_DESC_LIST_ENTRY *InterfaceListEntry;\r
332\r
333 UsbIoController = USB_IO_CONTROLLER_DEVICE_FROM_USB_IO_THIS (This);\r
334 UsbIoDev = UsbIoController->UsbDevice;\r
335\r
336 if (!UsbIoDev->IsConfigured) {\r
337 return NULL;\r
338 }\r
339\r
340 InterfaceListHead = &UsbIoDev->ActiveConfig->InterfaceDescListHead;\r
341 InterfaceListEntry = (INTERFACE_DESC_LIST_ENTRY *) (InterfaceListHead->ForwardLink);\r
342\r
343 //\r
344 // Loop all interface descriptor to get match one.\r
345 //\r
346 while (InterfaceListEntry != (INTERFACE_DESC_LIST_ENTRY *) InterfaceListHead) {\r
347 if (InterfaceListEntry->InterfaceDescriptor.InterfaceNumber == UsbIoController->InterfaceNumber) {\r
348 return InterfaceListEntry;\r
349 }\r
350\r
351 InterfaceListEntry = (INTERFACE_DESC_LIST_ENTRY *) InterfaceListEntry->Link.ForwardLink;\r
352 }\r
353\r
354 return NULL;\r
355}\r
356\r
357ENDPOINT_DESC_LIST_ENTRY* \r
358FindEndPointListEntry (\r
359 IN EFI_USB_IO_PROTOCOL *This,\r
360 IN UINT8 EndPointAddress\r
361 )\r
362/*++\r
363\r
364 Routine Description:\r
365 Find EndPoint ListEntry.\r
366\r
367 Arguments:\r
562d2849 368 This - EFI_USB_IO_PROTOCOL \r
369 EndPointAddress - Endpoint address.\r
878ddf1f 370 \r
371 Returns:\r
372 ENDPOINT_DESC_LIST_ENTRY pointer\r
373\r
374--*/\r
375{\r
376 INTERFACE_DESC_LIST_ENTRY *InterfaceListEntry;\r
377 LIST_ENTRY *EndpointDescListHead;\r
378 ENDPOINT_DESC_LIST_ENTRY *EndPointListEntry;\r
379\r
380 InterfaceListEntry = FindInterfaceListEntry (This);\r
381 if (InterfaceListEntry != NULL) {\r
382 EndpointDescListHead = &InterfaceListEntry->EndpointDescListHead;\r
383 EndPointListEntry = (ENDPOINT_DESC_LIST_ENTRY *) (EndpointDescListHead->ForwardLink);\r
384\r
385 //\r
386 // Loop all interface descriptor to get match one.\r
387 //\r
388 while (EndPointListEntry != (ENDPOINT_DESC_LIST_ENTRY *) EndpointDescListHead) {\r
389 if (EndPointListEntry->EndpointDescriptor.EndpointAddress == EndPointAddress) {\r
390 return EndPointListEntry;\r
391 }\r
392\r
393 EndPointListEntry = (ENDPOINT_DESC_LIST_ENTRY *) EndPointListEntry->Link.ForwardLink;\r
394 }\r
395 }\r
396\r
397 return NULL;\r
398}\r
399\r
400VOID\r
401GetDataToggleBit (\r
402 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
403 IN UINT8 EndpointAddr,\r
404 OUT UINT8 *DataToggle\r
405 )\r
406/*++\r
407\r
408 Routine Description:\r
409 Get the datatoggle of a specified endpoint.\r
410\r
411 Arguments:\r
412 UsbIo - Given Usb Controller device.\r
413 EndpointAddr - Given Endpoint address.\r
414 DataToggle - The current data toggle of that endpoint\r
415\r
416 Returns:\r
417 N/A\r
418\r
419--*/\r
420{\r
421\r
422 ENDPOINT_DESC_LIST_ENTRY *EndpointListEntry;\r
423\r
424 *DataToggle = 0;\r
425\r
426 EndpointListEntry = FindEndPointListEntry (UsbIo, EndpointAddr);\r
427 if (EndpointListEntry == NULL) {\r
428 return ;\r
429 }\r
430\r
431 *DataToggle = (UINT8) (EndpointListEntry->Toggle);\r
432 return ;\r
433}\r
434\r
435VOID\r
436SetDataToggleBit (\r
437 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
438 IN UINT8 EndpointAddr,\r
439 IN UINT8 DataToggle\r
440 )\r
441/*++\r
442\r
443 Routine Description:\r
444 Set the datatoggle of a specified endpoint\r
445\r
446 Arguments:\r
447 UsbIo - Given Usb Controller device.\r
448 EndpointAddr - Given Endpoint address.\r
449 DataToggle - The current data toggle of that endpoint to be set\r
450\r
451 Returns:\r
452 N/A\r
453\r
454--*/\r
455{\r
456\r
457 ENDPOINT_DESC_LIST_ENTRY *EndpointListEntry;\r
458\r
459 EndpointListEntry = FindEndPointListEntry (UsbIo, EndpointAddr);\r
460 if (EndpointListEntry == NULL) {\r
461 return ;\r
462 }\r
463\r
464 EndpointListEntry->Toggle = DataToggle;\r
465 return ;\r
466}\r
467\r
468VOID\r
469GetDeviceEndPointMaxPacketLength (\r
470 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
471 IN UINT8 EndpointAddr,\r
562d2849 472 OUT UINTN *MaxPacketLength\r
878ddf1f 473 )\r
474/*++\r
475\r
476 Routine Description:\r
477 Get the Max Packet Length of the speified Endpoint.\r
478\r
479 Arguments:\r
480 UsbIo - Given Usb Controller device.\r
481 EndpointAddr - Given Endpoint address.\r
482 MaxPacketLength - The max packet length of that endpoint\r
483\r
484 Returns:\r
485 N/A\r
486\r
487--*/\r
488{\r
489\r
490 ENDPOINT_DESC_LIST_ENTRY *EndpointListEntry;\r
491\r
492 *MaxPacketLength = 0;\r
493\r
494 EndpointListEntry = FindEndPointListEntry (UsbIo, EndpointAddr);\r
495 if (EndpointListEntry == NULL) {\r
496 return ;\r
497 }\r
498\r
562d2849 499 *MaxPacketLength = (UINTN) (EndpointListEntry->EndpointDescriptor.MaxPacketSize);\r
878ddf1f 500\r
501 return ;\r
502}\r
503\r
504\r
505EFI_STATUS\r
506UsbSetDeviceAddress (\r
507 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
508 IN UINT16 AddressValue,\r
509 OUT UINT32 *Status\r
510 )\r
511/*++\r
512\r
513Routine Description:\r
514\r
515 Usb Set Device Address\r
516\r
517Arguments:\r
518\r
519 UsbIo - EFI_USB_IO_PROTOCOL\r
520 AddressValue - Device address \r
521 Status - Transfer status\r
522\r
523Returns:\r
524\r
525 EFI_INVALID_PARAMETER - Parameter is error\r
526 EFI_SUCCESS - Success\r
527 EFI_TIMEOUT - Device has no response \r
528\r
529\r
530--*/\r
531{\r
532 EFI_USB_DEVICE_REQUEST DevReq;\r
533\r
534 if (UsbIo == NULL) {\r
535 return EFI_INVALID_PARAMETER;\r
536 }\r
537\r
538 ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
539\r
540 DevReq.RequestType = USB_DEV_SET_ADDRESS_REQ_TYPE;\r
541 DevReq.Request = USB_DEV_SET_ADDRESS;\r
542 DevReq.Value = AddressValue;\r
543 \r
544 return UsbIo->UsbControlTransfer (\r
545 UsbIo,\r
546 &DevReq,\r
547 EfiUsbNoData,\r
548 TIMEOUT_VALUE,\r
549 NULL,\r
550 0,\r
551 Status\r
552 );\r
553}\r
554\r