+/** @file\r
+Copyright (c) 2004 - 2007, 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
+\r
+ UsbBus.h\r
+\r
+ Abstract:\r
+\r
+ Usb Bus Driver Binding and Bus IO Protocol\r
+\r
+ Revision History\r
+\r
+\r
+**/\r
+\r
+#ifndef _EFI_USB_BUS_H_\r
+#define _EFI_USB_BUS_H_\r
+\r
+\r
+#include <PiDxe.h>\r
+\r
+#include <Protocol/Usb2HostController.h>\r
+#include <Protocol/UsbHostController.h>\r
+#include <Protocol/UsbIo.h>\r
+#include <Protocol/DevicePath.h>\r
+\r
+#include <library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/UefiDriverEntryPoint.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/DevicePathLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+\r
+\r
+#include <IndustryStandard/Usb.h>\r
+\r
+typedef struct _USB_DEVICE USB_DEVICE;\r
+typedef struct _USB_INTERFACE USB_INTERFACE;\r
+typedef struct _USB_BUS USB_BUS;\r
+typedef struct _USB_HUB_API USB_HUB_API;\r
+\r
+\r
+#include "UsbUtility.h"\r
+#include "UsbDesc.h"\r
+#include "UsbHub.h"\r
+#include "UsbEnumer.h"\r
+\r
+enum {\r
+ USB_MAX_LANG_ID = 16,\r
+ USB_MAX_INTERFACE = 16,\r
+ USB_MAX_DEVICES = 128,\r
+\r
+ USB_BUS_1_MILLISECOND = 1000,\r
+\r
+ //\r
+ // Roothub and hub's polling interval, set by experience,\r
+ // The unit of roothub is 100us, means 1s as interval, and\r
+ // the unit of hub is 1ms, means 64ms as interval.\r
+ //\r
+ USB_ROOTHUB_POLL_INTERVAL = 1000 * 10000U,\r
+ USB_HUB_POLL_INTERVAL = 64,\r
+\r
+ //\r
+ // Wait for port stable to work, refers to specification\r
+ // [USB20-9.1.2]\r
+ //\r
+ USB_WAIT_PORT_STABLE_STALL = 100 * USB_BUS_1_MILLISECOND,\r
+\r
+ //\r
+ // Wait for port statue reg change, set by experience\r
+ //\r
+ USB_WAIT_PORT_STS_CHANGE_STALL = 5 * USB_BUS_1_MILLISECOND,\r
+\r
+ //\r
+ // Wait for set device address, refers to specification\r
+ // [USB20-9.2.6.3, it says 2ms]\r
+ //\r
+ USB_SET_DEVICE_ADDRESS_STALL = 20 * USB_BUS_1_MILLISECOND,\r
+\r
+ //\r
+ // Wait for retry max packet size, set by experience\r
+ //\r
+ USB_RETRY_MAX_PACK_SIZE_STALL = 100 * USB_BUS_1_MILLISECOND,\r
+\r
+ //\r
+ // Wait for hub port power-on, refers to specification\r
+ // [USB20-11.23.2]\r
+ //\r
+ USB_SET_PORT_POWER_STALL = 2 * USB_BUS_1_MILLISECOND,\r
+\r
+ //\r
+ // Wait for port reset, refers to specification\r
+ // [USB20-7.1.7.5, it says 10ms for hub and 50ms for\r
+ // root hub]\r
+ //\r
+ USB_SET_PORT_RESET_STALL = 20 * USB_BUS_1_MILLISECOND,\r
+ USB_SET_ROOT_PORT_RESET_STALL = 50 * USB_BUS_1_MILLISECOND,\r
+\r
+ //\r
+ // Wait for clear roothub port reset, set by experience\r
+ //\r
+ USB_CLR_ROOT_PORT_RESET_STALL = 1 * USB_BUS_1_MILLISECOND,\r
+\r
+ //\r
+ // Wait for set roothub port enable, set by experience\r
+ //\r
+ USB_SET_ROOT_PORT_ENABLE_STALL = 20 * USB_BUS_1_MILLISECOND,\r
+\r
+ //\r
+ // Send general device request timeout, refers to\r
+ // specification[USB20-11.24.1]\r
+ //\r
+ USB_GENERAL_DEVICE_REQUEST_TIMEOUT = 50 * USB_BUS_1_MILLISECOND,\r
+\r
+ //\r
+ // Send clear feature request timeout, set by experience\r
+ //\r
+ USB_CLEAR_FEATURE_REQUEST_TIMEOUT = 10 * USB_BUS_1_MILLISECOND,\r
+\r
+ //\r
+ // Bus raises TPL to TPL_NOTIFY to serialize all its operations\r
+ // to protect shared data structures.\r
+ //\r
+ USB_BUS_TPL = TPL_NOTIFY,\r
+\r
+ USB_INTERFACE_SIGNATURE = EFI_SIGNATURE_32 ('U', 'S', 'B', 'I'),\r
+ USB_BUS_SIGNATURE = EFI_SIGNATURE_32 ('U', 'S', 'B', 'B')\r
+};\r
+\r
+#define USB_BIT(a) ((UINTN)(1 << (a)))\r
+#define USB_BIT_IS_SET(Data, Bit) ((BOOLEAN)(((Data) & (Bit)) == (Bit)))\r
+\r
+#define EFI_USB_BUS_PROTOCOL_GUID \\r
+ {0x2B2F68CC, 0x0CD2, 0x44cf, {0x8E, 0x8B, 0xBB, 0xA2, 0x0B, 0x1B, 0x5B, 0x75}}\r
+\r
+#define USB_INTERFACE_FROM_USBIO(a) \\r
+ CR(a, USB_INTERFACE, UsbIo, USB_INTERFACE_SIGNATURE)\r
+\r
+#define USB_BUS_FROM_THIS(a) \\r
+ CR(a, USB_BUS, BusId, USB_BUS_SIGNATURE)\r
+\r
+//\r
+// Used to locate USB_BUS\r
+//\r
+typedef struct _EFI_USB_BUS_PROTOCOL {\r
+ UINT64 Reserved;\r
+} EFI_USB_BUS_PROTOCOL;\r
+\r
+\r
+//\r
+// Stands for the real USB device. Each device may\r
+// has several seperately working interfaces.\r
+//\r
+struct _USB_DEVICE {\r
+ USB_BUS *Bus;\r
+\r
+ //\r
+ // Configuration information\r
+ //\r
+ UINT8 Speed;\r
+ UINT8 Address;\r
+ UINT8 MaxPacket0;\r
+\r
+ //\r
+ // The device's descriptors and its configuration\r
+ //\r
+ USB_DEVICE_DESC *DevDesc;\r
+ USB_CONFIG_DESC *ActiveConfig;\r
+\r
+ UINT16 LangId [USB_MAX_LANG_ID];\r
+ UINT16 TotalLangId;\r
+\r
+ UINT8 NumOfInterface;\r
+ USB_INTERFACE *Interfaces [USB_MAX_INTERFACE];\r
+\r
+ //\r
+ // Parent child relationship\r
+ //\r
+ EFI_USB2_HC_TRANSACTION_TRANSLATOR Translator;\r
+\r
+ UINT8 ParentAddr;\r
+ USB_INTERFACE *ParentIf;\r
+ UINT8 ParentPort; // Start at 0\r
+};\r
+\r
+//\r
+// Stands for different functions of USB device\r
+//\r
+struct _USB_INTERFACE {\r
+ UINTN Signature;\r
+ USB_DEVICE *Device;\r
+ USB_INTERFACE_DESC *IfDesc;\r
+ USB_INTERFACE_SETTING *IfSetting;\r
+\r
+ //\r
+ // Handles and protocols\r
+ //\r
+ EFI_HANDLE Handle;\r
+ EFI_USB_IO_PROTOCOL UsbIo;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ BOOLEAN IsManaged;\r
+\r
+ //\r
+ // Hub device special data\r
+ //\r
+ BOOLEAN IsHub;\r
+ USB_HUB_API *HubApi;\r
+ UINT8 NumOfPort;\r
+ EFI_EVENT HubNotify;\r
+\r
+ //\r
+ // Data used only by normal hub devices\r
+ //\r
+ USB_ENDPOINT_DESC *HubEp;\r
+ UINT8 *ChangeMap;\r
+\r
+ //\r
+ // Data used only by root hub to hand over device to\r
+ // companion UHCI driver if low/full speed devices are\r
+ // connected to EHCI.\r
+ //\r
+ UINT8 MaxSpeed;\r
+};\r
+\r
+//\r
+// Stands for the current USB Bus\r
+//\r
+struct _USB_BUS {\r
+ UINTN Signature;\r
+ EFI_USB_BUS_PROTOCOL BusId;\r
+\r
+ //\r
+ // Managed USB host controller\r
+ //\r
+ EFI_HANDLE HostHandle;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ EFI_USB2_HC_PROTOCOL *Usb2Hc;\r
+ EFI_USB_HC_PROTOCOL *UsbHc;\r
+\r
+ //\r
+ // An array of device that is on the bus. Devices[0] is\r
+ // for root hub. Device with address i is at Devices[i].\r
+ //\r
+ USB_DEVICE *Devices[USB_MAX_DEVICES];\r
+\r
+ //\r
+ // USB Bus driver need to control the recursive connect policy of the bus, only those wanted\r
+ // usb child device will be recursively connected.\r
+ //\r
+ // WantedUsbIoDPList tracks the Usb child devices which user want to recursivly fully connecte,\r
+ // every wanted child device is stored in a item of the WantedUsbIoDPList, whose structrure is\r
+ // DEVICE_PATH_LIST_ITEM\r
+ //\r
+ LIST_ENTRY WantedUsbIoDPList;\r
+\r
+};\r
+\r
+#define USB_US_LAND_ID 0x0409\r
+\r
+#define DEVICE_PATH_LIST_ITEM_SIGNATURE EFI_SIGNATURE_32('d','p','l','i')\r
+typedef struct _DEVICE_PATH_LIST_ITEM{\r
+ UINTN Signature;\r
+ LIST_ENTRY Link;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+} DEVICE_PATH_LIST_ITEM;\r
+\r
+typedef struct {\r
+ USB_CLASS_DEVICE_PATH UsbClass;\r
+ EFI_DEVICE_PATH_PROTOCOL End;\r
+} USB_CLASS_FORMAT_DEVICE_PATH;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UsbBusFreeUsbDPList (\r
+ IN LIST_ENTRY *UsbIoDPList\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UsbBusAddWantedUsbIoDP (\r
+ IN EFI_USB_BUS_PROTOCOL *UsbBusId,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ );\r
+\r
+BOOLEAN\r
+EFIAPI\r
+UsbBusIsWantedUsbIO (\r
+ IN USB_BUS *Bus,\r
+ IN USB_INTERFACE *UsbIf\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UsbBusRecursivelyConnectWantedUsbIo (\r
+ IN EFI_USB_BUS_PROTOCOL *UsbBusId\r
+ );\r
+\r
+extern EFI_USB_IO_PROTOCOL mUsbIoProtocol;\r
+extern EFI_DRIVER_BINDING_PROTOCOL mUsbBusDriverBinding;\r
+extern EFI_COMPONENT_NAME_PROTOCOL mUsbBusComponentName;\r
+extern EFI_COMPONENT_NAME2_PROTOCOL mUsbBusComponentName2;\r
+\r
+#endif\r