/** @file Header file for USB bus driver Interface ;****************************************************************************** ;* Copyright (c) 2012 - 2021, Insyde Software Corp. All Rights Reserved. ;* ;* You may not reproduce, distribute, publish, display, perform, modify, adapt, ;* transmit, broadcast, present, recite, release, license or otherwise exploit ;* any part of this publication in any form, by any means, without the prior ;* written permission of Insyde Software Corporation. ;* ;****************************************************************************** */ #ifndef _EFI_USB_BUS_H #define _EFI_USB_BUS_H #include #include #include #include #include #include #include #include #include #include #include #include #ifndef MDEPKG_NDEBUG extern UINTN gUSBDebugLevel; extern UINTN gUSBErrorLevel; #endif #define MAX_LOW_SPEED_HC 16 #define MICROSECOND 10000 #define ONESECOND (1000 * MICROSECOND) #define BUSPOLLING_PERIOD ONESECOND // // Legacy pause related definitions // #define CLASS_HID 3 #define SUBCLASS_BOOT 1 #define PROTOCOL_KEYBOARD 1 #define PAUSE_IN_PROGRESS ((*(UINT8*)(UINTN)0x418) & 0x08) // // We define some maximun value here // #define USB_MAXCONFIG 8 #define USB_MAXALTSETTING 4 #define USB_MAXINTERFACES 32 #define USB_MAXENDPOINTS 16 #define USB_MAXSTRINGS 16 #define USB_MAXLANID 16 #define USB_MAXCHILDREN 32 #define IMAGE_DRIVER_NAME L"Usb Bus Driver" #define USB_IO_CONTROLLER_SIGNATURE SIGNATURE_32 ('u', 's', 'b', 'd') typedef struct { UINT16 ChangedBit; EFI_USB_PORT_FEATURE Feature; } USB_CHANGE_FEATURE_MAP; typedef struct { LIST_ENTRY Link; UINT16 StringIndex; CHAR16 *String; } STR_LIST_ENTRY; typedef struct { LIST_ENTRY Link; UINT16 Toggle; EFI_USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; } ENDPOINT_DESC_LIST_ENTRY; typedef struct { LIST_ENTRY Link; EFI_USB_INTERFACE_DESCRIPTOR InterfaceDescriptor; EFI_USB_HID_DESCRIPTOR HidDescriptor; UINT8 Reserved[0x100]; LIST_ENTRY EndpointDescListHead; } INTERFACE_DESC_LIST_ENTRY; typedef struct { LIST_ENTRY Link; EFI_USB_CONFIG_DESCRIPTOR CongfigDescriptor; LIST_ENTRY InterfaceDescListHead; UINTN ActiveInterface; } CONFIG_DESC_LIST_ENTRY; // // Forward declaring // struct usb_io_device; // // This is used to form the USB Controller Handle // typedef struct usb_io_controller_device { UINTN Signature; EFI_USB_IO_PROTOCOL UsbIo; EFI_HANDLE Handle; EFI_DEVICE_PATH_PROTOCOL *UefiDevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath; EFI_HANDLE HostController; UINT8 CurrentConfigValue; UINT8 InterfaceNumber; UINT8 AlternateSetting; BOOLEAN Inactive; struct usb_io_device *UsbDevice; BOOLEAN IsUsbHub; BOOLEAN IsManagedByDriver; BOOLEAN PortResetProcessing; // // Fields specified for USB Hub // EFI_EVENT HubNotify; UINT8 HubEndpointAddress; UINT16 StatusChangePort; UINT8 DownstreamPorts; UINT8 MultiTT; UINT8 ParentPort; struct usb_io_controller_device *Parent; struct usb_io_device *Children[USB_MAXCHILDREN]; } USB_IO_CONTROLLER_DEVICE; #define USB_IO_CONTROLLER_DEVICE_FROM_USB_IO_THIS(a) \ CR (a, \ USB_IO_CONTROLLER_DEVICE, \ UsbIo, \ USB_IO_CONTROLLER_SIGNATURE \ ) // // This is used to keep the topology of USB bus // struct _usb_bus_controller_device; typedef struct usb_io_device { UINT8 DeviceAddress; BOOLEAN IsConfigured; UINT8 DeviceSpeed; UINT8 HubDepth; EFI_USB3_HC_TRANSACTION_TRANSLATOR Translator; EFI_USB_DEVICE_DESCRIPTOR DeviceDescriptor; LIST_ENTRY ConfigDescListHead; CONFIG_DESC_LIST_ENTRY *ActiveConfig; BOOLEAN LangIDConfigured; UINT16 LangID[USB_MAXLANID]; struct _usb_bus_controller_device *BusController; // // Track the controller handle // UINT8 NumOfInterfaces; USB_IO_CONTROLLER_DEVICE *UsbController[USB_MAXINTERFACES]; } USB_IO_DEVICE; // // Usb Bus Controller device strcuture // #define EFI_USB_BUS_PROTOCOL_GUID \ { \ 0x2B2F68CC, 0x0CD2, 0x44cf, 0x8E, 0x8B, 0xBB, 0xA2, 0x0B, 0x1B, 0x5B, 0x75 \ } typedef struct _EFI_USB_BUS_PROTOCOL { UINT64 Reserved; } EFI_USB_BUS_PROTOCOL; #define USB_BUS_DEVICE_SIGNATURE SIGNATURE_32 ('u', 'b', 'u', 's') typedef struct _usb_bus_controller_device { UINTN Signature; EFI_USB_BUS_PROTOCOL BusIdentify; EFI_USB3_HC_PROTOCOL *Usb3HCInterface; EFI_DEVICE_PATH_PROTOCOL *DevicePath; UINT8 AddressPool[32]; USB_IO_DEVICE *Root; UINTN AsyncRetry; } USB_BUS_CONTROLLER_DEVICE; #define USB_BUS_CONTROLLER_DEVICE_FROM_THIS(a) CR (a, USB_BUS_CONTROLLER_DEVICE, BusIdentify, USB_BUS_DEVICE_SIGNATURE) typedef struct { EFI_HANDLE Controller; UINT8 SegNum; UINT8 BusNum; UINT8 DevNum; UINT8 FuncNum; } USB_HC_DESC; typedef struct { UINTN Signature; EFI_USB_IO_PROTOCOL UsbIoInterface; INTN NumLowSpeedHc; USB_HC_DESC LowSpeedHc[MAX_LOW_SPEED_HC]; EFI_HANDLE DriverBindingHandle; } USB_BUS_PRIVATE; extern USB_BUS_PRIVATE *mPrivate; extern EFI_USB_CORE_PROTOCOL *mUsbCore; extern BOOLEAN mInSmram; #define USB_BUS_SIGNATURE SIGNATURE_32 ('b', 'u', 's', 'p') // // Global Variables // extern EFI_DRIVER_BINDING_PROTOCOL gUsbBusDriverBinding; extern EFI_COMPONENT_NAME_PROTOCOL gUsbBusComponentName; extern EFI_COMPONENT_NAME2_PROTOCOL gUsbBusComponentName2; /** Remove Device, Device Handles, Uninstall Protocols. @param UsbIoDev The device to be deconfigured. @retval EFI_SUCCESS @retval EFI_DEVICE_ERROR **/ EFI_STATUS UsbDeviceDeConfiguration ( IN USB_IO_DEVICE *UsbIoDevice ); // // USB I/O Support Function Prototypes // EFI_STATUS EFIAPI UsbControlTransfer ( IN EFI_USB_IO_PROTOCOL *This, IN EFI_USB_DEVICE_REQUEST *Request, IN EFI_USB_DATA_DIRECTION Direction, IN UINT32 Timeout, IN OUT VOID *Data, OPTIONAL IN UINTN DataLength, OPTIONAL OUT UINT32 *Status ); EFI_STATUS EFIAPI UsbBulkTransfer ( IN EFI_USB_IO_PROTOCOL *This, IN UINT8 DeviceEndpoint, IN OUT VOID *Data, IN OUT UINTN *DataLength, IN UINTN Timeout, OUT UINT32 *Status ); EFI_STATUS EFIAPI UsbAsyncInterruptTransfer ( IN EFI_USB_IO_PROTOCOL *This, IN UINT8 DeviceEndpoint, IN BOOLEAN IsNewTransfer, IN UINTN PollingInterval, OPTIONAL IN UINTN DataLength, OPTIONAL IN EFI_ASYNC_USB_TRANSFER_CALLBACK InterruptCallBack, OPTIONAL IN VOID *Context OPTIONAL ); EFI_STATUS EFIAPI UsbSyncInterruptTransfer ( IN EFI_USB_IO_PROTOCOL *This, IN UINT8 DeviceEndpoint, IN OUT VOID *Data, IN OUT UINTN *DataLength, IN UINTN Timeout, OUT UINT32 *Status ); EFI_STATUS EFIAPI UsbIsochronousTransfer ( IN EFI_USB_IO_PROTOCOL *This, IN UINT8 DeviceEndpoint, IN OUT VOID *Data, IN UINTN DataLength, OUT UINT32 *Status ); EFI_STATUS EFIAPI UsbAsyncIsochronousTransfer ( IN EFI_USB_IO_PROTOCOL *This, IN UINT8 DeviceEndpoint, IN OUT VOID *Data, IN UINTN DataLength, IN EFI_ASYNC_USB_TRANSFER_CALLBACK IsochronousCallBack, IN VOID *Context OPTIONAL ); EFI_STATUS EFIAPI UsbPortReset ( IN EFI_USB_IO_PROTOCOL *This ); EFI_STATUS EFIAPI UsbGetDeviceDescriptor ( IN EFI_USB_IO_PROTOCOL *This, OUT EFI_USB_DEVICE_DESCRIPTOR *DeviceDescriptor ); EFI_STATUS EFIAPI UsbGetActiveConfigDescriptor ( IN EFI_USB_IO_PROTOCOL *This, OUT EFI_USB_CONFIG_DESCRIPTOR *ConfigurationDescriptor ); EFI_STATUS EFIAPI UsbGetInterfaceDescriptor ( IN EFI_USB_IO_PROTOCOL *This, OUT EFI_USB_INTERFACE_DESCRIPTOR *InterfaceDescriptor ); EFI_STATUS EFIAPI UsbGetEndpointDescriptor ( IN EFI_USB_IO_PROTOCOL *This, IN UINT8 EndpointIndex, OUT EFI_USB_ENDPOINT_DESCRIPTOR *EndpointDescriptor ); EFI_STATUS EFIAPI UsbGetStringDescriptor ( IN EFI_USB_IO_PROTOCOL *This, IN UINT16 LangID, IN UINT8 StringIndex, OUT CHAR16 **String ); EFI_STATUS EFIAPI UsbGetSupportedLanguages ( IN EFI_USB_IO_PROTOCOL *This, OUT UINT16 **LangIDTable, OUT UINT16 *TableSize ); #endif