+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
- Module Name:\r
- usbutil.c\r
-\r
- Abstract:\r
-\r
- Helper functions for USB\r
-\r
- Revision History\r
-\r
---*/\r
-\r
-#include "usbbus.h"\r
-\r
-//\r
-// Following APIs are used to query Port Status\r
-//\r
-BOOLEAN\r
-IsPortConnect (\r
- IN UINT16 PortStatus\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Tell if there is a device connected to that port according to\r
- the Port Status.\r
-\r
- Arguments:\r
- PortStatus - The status value of that port.\r
-\r
- Returns:\r
- TRUE\r
- FALSE\r
-\r
---*/\r
-{\r
- //\r
- // return the bit 0 value of PortStatus\r
- //\r
- if ((PortStatus & USB_PORT_STAT_CONNECTION) != 0) {\r
- return TRUE;\r
- } else {\r
- return FALSE;\r
- }\r
-}\r
-\r
-BOOLEAN\r
-IsPortEnable (\r
- IN UINT16 PortStatus\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Tell if Port is enabled.\r
-\r
- Arguments:\r
- PortStatus - The status value of that port.\r
-\r
- Returns:\r
- TRUE - Port is enable\r
- FALSE - Port is disable\r
-\r
---*/\r
-{\r
- //\r
- // return the bit 1 value of PortStatus\r
- //\r
- if ((PortStatus & USB_PORT_STAT_ENABLE) != 0) {\r
- return TRUE;\r
- } else {\r
- return FALSE;\r
- }\r
-}\r
-\r
-BOOLEAN\r
-IsPortInReset (\r
- IN UINT16 PortStatus\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Tell if the port is being reset.\r
-\r
- Arguments:\r
- PortStatus - The status value of that port.\r
-\r
- Returns:\r
- TRUE\r
- FALSE\r
-\r
---*/\r
-{\r
- //\r
- // return the bit 4 value of PortStatus\r
- //\r
- if ((PortStatus & USB_PORT_STAT_RESET) != 0) {\r
- return TRUE;\r
- } else {\r
- return FALSE;\r
- }\r
-}\r
-\r
-BOOLEAN\r
-IsPortPowerApplied (\r
- IN UINT16 PortStatus\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Tell if there is power applied to that port.\r
-\r
- Arguments:\r
- PortStatus - The status value of that port.\r
-\r
- Returns:\r
- TRUE\r
- FALSE\r
-\r
---*/\r
-{\r
- //\r
- // return the bit 8 value of PortStatus\r
- //\r
- if ((PortStatus & USB_PORT_STAT_POWER) != 0) {\r
- return TRUE;\r
- } else {\r
- return FALSE;\r
- }\r
-}\r
-\r
-BOOLEAN\r
-IsPortLowSpeedDeviceAttached (\r
- IN UINT16 PortStatus\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Tell if the connected device is a low device.\r
-\r
- Arguments:\r
- PortStatus - The status value of that port.\r
-\r
- Returns:\r
- TRUE\r
- FALSE\r
-\r
---*/\r
-{\r
- //\r
- // return the bit 9 value of PortStatus\r
- //\r
- if ((PortStatus & USB_PORT_STAT_LOW_SPEED) != 0) {\r
- return TRUE;\r
- } else {\r
- return FALSE;\r
- }\r
-}\r
-\r
-BOOLEAN\r
-IsPortSuspend (\r
- IN UINT16 PortStatus\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Tell if the port is suspend.\r
-\r
- Arguments:\r
- PortStatus - The status value of that port.\r
-\r
- Returns:\r
- TRUE\r
- FALSE\r
-\r
---*/\r
-{\r
- //\r
- // return the bit 2 value of PortStatus\r
- //\r
- if ((PortStatus & USB_PORT_STAT_SUSPEND) != 0) {\r
- return TRUE;\r
- } else {\r
- return FALSE;\r
- }\r
-}\r
-//\r
-// Following APIs are used to query Port Change Status\r
-//\r
-BOOLEAN\r
-IsPortConnectChange (\r
- IN UINT16 PortChangeStatus\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Tell if there is a Connect Change status in that port.\r
-\r
- Arguments:\r
- PortChangeStatus - The status value of that port.\r
-\r
- Returns:\r
- TRUE\r
- FALSE\r
-\r
---*/\r
-{\r
- //\r
- // return the bit 0 value of PortChangeStatus\r
- //\r
- if ((PortChangeStatus & USB_PORT_STAT_C_CONNECTION) != 0) {\r
- return TRUE;\r
- } else {\r
- return FALSE;\r
- }\r
-}\r
-\r
-BOOLEAN\r
-IsPortEnableDisableChange (\r
- IN UINT16 PortChangeStatus\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Tell if there is a Enable/Disable change in that port.\r
-\r
- Arguments:\r
- PortChangeStatus - The status value of that port.\r
-\r
- Returns:\r
- TRUE\r
- FALSE\r
-\r
---*/\r
-{\r
- //\r
- // return the bit 1 value of PortChangeStatus\r
- //\r
- if ((PortChangeStatus & USB_PORT_STAT_C_ENABLE) != 0) {\r
- return TRUE;\r
- } else {\r
- return FALSE;\r
- }\r
-}\r
-\r
-BOOLEAN\r
-IsPortResetChange (\r
- IN UINT16 PortChangeStatus\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Tell if there is a Port Reset Change status in that port.\r
-\r
- Arguments:\r
- PortChangeStatus - The status value of that port.\r
-\r
- Returns:\r
- TRUE\r
- FALSE\r
-\r
---*/\r
-{\r
- //\r
- // return the bit 4 value of PortChangeStatus\r
- //\r
- if ((PortChangeStatus & USB_PORT_STAT_C_RESET) != 0) {\r
- return TRUE;\r
- } else {\r
- return FALSE;\r
- }\r
-}\r
-\r
-BOOLEAN\r
-IsPortSuspendChange (\r
- IN UINT16 PortChangeStatus\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Tell if there is a Suspend Change Status in that port.\r
-\r
- Arguments:\r
- PortChangeStatus - The status value of that port.\r
-\r
- Returns:\r
- TRUE\r
- FALSE\r
-\r
---*/\r
-{\r
- //\r
- // return the bit 2 value of PortChangeStatus\r
- //\r
- if ((PortChangeStatus & USB_PORT_STAT_C_SUSPEND) != 0) {\r
- return TRUE;\r
- } else {\r
- return FALSE;\r
- }\r
-}\r
-\r
-INTERFACE_DESC_LIST_ENTRY *\r
-FindInterfaceListEntry (\r
- IN EFI_USB_IO_PROTOCOL *This\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Find Interface ListEntry.\r
-\r
- Arguments:\r
- This - EFI_USB_IO_PROTOCOL \r
- \r
- Returns:\r
- INTERFACE_DESC_LIST_ENTRY pointer\r
-\r
---*/\r
-{\r
- USB_IO_CONTROLLER_DEVICE *UsbIoController;\r
- USB_IO_DEVICE *UsbIoDev;\r
- LIST_ENTRY *InterfaceListHead;\r
- INTERFACE_DESC_LIST_ENTRY *InterfaceListEntry;\r
-\r
- UsbIoController = USB_IO_CONTROLLER_DEVICE_FROM_USB_IO_THIS (This);\r
- UsbIoDev = UsbIoController->UsbDevice;\r
-\r
- if (!UsbIoDev->IsConfigured) {\r
- return NULL;\r
- }\r
-\r
- InterfaceListHead = &UsbIoDev->ActiveConfig->InterfaceDescListHead;\r
- InterfaceListEntry = (INTERFACE_DESC_LIST_ENTRY *) (InterfaceListHead->ForwardLink);\r
-\r
- //\r
- // Loop all interface descriptor to get match one.\r
- //\r
- while (InterfaceListEntry != (INTERFACE_DESC_LIST_ENTRY *) InterfaceListHead) {\r
- if (InterfaceListEntry->InterfaceDescriptor.InterfaceNumber == UsbIoController->InterfaceNumber) {\r
- return InterfaceListEntry;\r
- }\r
-\r
- InterfaceListEntry = (INTERFACE_DESC_LIST_ENTRY *) InterfaceListEntry->Link.ForwardLink;\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-ENDPOINT_DESC_LIST_ENTRY* \r
-FindEndPointListEntry (\r
- IN EFI_USB_IO_PROTOCOL *This,\r
- IN UINT8 EndPointAddress\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Find EndPoint ListEntry.\r
-\r
- Arguments:\r
- This - EFI_USB_IO_PROTOCOL \r
- EndPointAddress - Endpoint address.\r
- \r
- Returns:\r
- ENDPOINT_DESC_LIST_ENTRY pointer\r
-\r
---*/\r
-{\r
- INTERFACE_DESC_LIST_ENTRY *InterfaceListEntry;\r
- LIST_ENTRY *EndpointDescListHead;\r
- ENDPOINT_DESC_LIST_ENTRY *EndPointListEntry;\r
-\r
- InterfaceListEntry = FindInterfaceListEntry (This);\r
- if (InterfaceListEntry != NULL) {\r
- EndpointDescListHead = &InterfaceListEntry->EndpointDescListHead;\r
- EndPointListEntry = (ENDPOINT_DESC_LIST_ENTRY *) (EndpointDescListHead->ForwardLink);\r
-\r
- //\r
- // Loop all interface descriptor to get match one.\r
- //\r
- while (EndPointListEntry != (ENDPOINT_DESC_LIST_ENTRY *) EndpointDescListHead) {\r
- if (EndPointListEntry->EndpointDescriptor.EndpointAddress == EndPointAddress) {\r
- return EndPointListEntry;\r
- }\r
-\r
- EndPointListEntry = (ENDPOINT_DESC_LIST_ENTRY *) EndPointListEntry->Link.ForwardLink;\r
- }\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-VOID\r
-GetDataToggleBit (\r
- IN EFI_USB_IO_PROTOCOL *UsbIo,\r
- IN UINT8 EndpointAddr,\r
- OUT UINT8 *DataToggle\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Get the datatoggle of a specified endpoint.\r
-\r
- Arguments:\r
- UsbIo - Given Usb Controller device.\r
- EndpointAddr - Given Endpoint address.\r
- DataToggle - The current data toggle of that endpoint\r
-\r
- Returns:\r
- N/A\r
-\r
---*/\r
-{\r
-\r
- ENDPOINT_DESC_LIST_ENTRY *EndpointListEntry;\r
-\r
- *DataToggle = 0;\r
-\r
- EndpointListEntry = FindEndPointListEntry (UsbIo, EndpointAddr);\r
- if (EndpointListEntry == NULL) {\r
- return ;\r
- }\r
-\r
- *DataToggle = (UINT8) (EndpointListEntry->Toggle);\r
- return ;\r
-}\r
-\r
-VOID\r
-SetDataToggleBit (\r
- IN EFI_USB_IO_PROTOCOL *UsbIo,\r
- IN UINT8 EndpointAddr,\r
- IN UINT8 DataToggle\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Set the datatoggle of a specified endpoint\r
-\r
- Arguments:\r
- UsbIo - Given Usb Controller device.\r
- EndpointAddr - Given Endpoint address.\r
- DataToggle - The current data toggle of that endpoint to be set\r
-\r
- Returns:\r
- N/A\r
-\r
---*/\r
-{\r
-\r
- ENDPOINT_DESC_LIST_ENTRY *EndpointListEntry;\r
-\r
- EndpointListEntry = FindEndPointListEntry (UsbIo, EndpointAddr);\r
- if (EndpointListEntry == NULL) {\r
- return ;\r
- }\r
-\r
- EndpointListEntry->Toggle = DataToggle;\r
- return ;\r
-}\r
-\r
-VOID\r
-GetDeviceEndPointMaxPacketLength (\r
- IN EFI_USB_IO_PROTOCOL *UsbIo,\r
- IN UINT8 EndpointAddr,\r
- OUT UINTN *MaxPacketLength\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Get the Max Packet Length of the speified Endpoint.\r
-\r
- Arguments:\r
- UsbIo - Given Usb Controller device.\r
- EndpointAddr - Given Endpoint address.\r
- MaxPacketLength - The max packet length of that endpoint\r
-\r
- Returns:\r
- N/A\r
-\r
---*/\r
-{\r
-\r
- ENDPOINT_DESC_LIST_ENTRY *EndpointListEntry;\r
-\r
- *MaxPacketLength = 0;\r
-\r
- EndpointListEntry = FindEndPointListEntry (UsbIo, EndpointAddr);\r
- if (EndpointListEntry == NULL) {\r
- return ;\r
- }\r
-\r
- *MaxPacketLength = (UINTN) (EndpointListEntry->EndpointDescriptor.MaxPacketSize);\r
-\r
- return ;\r
-}\r
-\r
-\r
-EFI_STATUS\r
-UsbSetDeviceAddress (\r
- IN EFI_USB_IO_PROTOCOL *UsbIo,\r
- IN UINT16 AddressValue,\r
- OUT UINT32 *Status\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Usb Set Device Address\r
-\r
-Arguments:\r
-\r
- UsbIo - EFI_USB_IO_PROTOCOL\r
- AddressValue - Device address \r
- Status - Transfer status\r
-\r
-Returns:\r
-\r
- EFI_INVALID_PARAMETER - Parameter is error\r
- EFI_SUCCESS - Success\r
- EFI_TIMEOUT - Device has no response \r
-\r
-\r
---*/\r
-{\r
- EFI_USB_DEVICE_REQUEST DevReq;\r
-\r
- if (UsbIo == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
-\r
- DevReq.RequestType = USB_DEV_SET_ADDRESS_REQ_TYPE;\r
- DevReq.Request = USB_DEV_SET_ADDRESS;\r
- DevReq.Value = AddressValue;\r
- \r
- return UsbIo->UsbControlTransfer (\r
- UsbIo,\r
- &DevReq,\r
- EfiUsbNoData,\r
- TIMEOUT_VALUE,\r
- NULL,\r
- 0,\r
- Status\r
- );\r
-}\r
-\r