uhci.c

来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 2,473 行 · 第 1/5 页

C
2,473
字号
/*++

Copyright (c) 2004 - 2006, Intel Corporation                                                         
All rights reserved. This program and the accompanying materials                          
are licensed and made available under the terms and conditions of the BSD License         
which accompanies this distribution.  The full text of the license may be found at        
http://opensource.org/licenses/bsd-license.php                                            
                                                                                          
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             

Module Name:

    Uhci.c
    
Abstract: 
    

Revision History
--*/

#include "uhci.h"

//
// Prototypes
// Driver model protocol interface
//

EFI_STATUS
EFIAPI
UHCIDriverEntryPoint (
  IN EFI_HANDLE           ImageHandle,
  IN EFI_SYSTEM_TABLE     *SystemTable
  );

EFI_STATUS
EFIAPI
UHCIDriverBindingSupported (
  IN EFI_DRIVER_BINDING_PROTOCOL     *This,
  IN EFI_HANDLE                      Controller,
  IN EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
  );

EFI_STATUS
EFIAPI
UHCIDriverBindingStart (
  IN EFI_DRIVER_BINDING_PROTOCOL     *This,
  IN EFI_HANDLE                      Controller,
  IN EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
  );

EFI_STATUS
EFIAPI
UHCIDriverBindingStop (
  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
  IN  EFI_HANDLE                      Controller,
  IN  UINTN                           NumberOfChildren,
  IN  EFI_HANDLE                      *ChildHandleBuffer
  );

//
// UHCI interface functions
//

EFI_STATUS
EFIAPI
UHCIReset (
  IN  EFI_USB_HC_PROTOCOL     *This,
  IN  UINT16                  Attributes
  );

EFI_STATUS
EFIAPI
UHCIGetState (
  IN  EFI_USB_HC_PROTOCOL     *This,
  OUT EFI_USB_HC_STATE        *State
  );

EFI_STATUS
EFIAPI
UHCISetState (
  IN  EFI_USB_HC_PROTOCOL     *This,
  IN  EFI_USB_HC_STATE        State
  );

EFI_STATUS
EFIAPI
UHCIControlTransfer (
  IN       EFI_USB_HC_PROTOCOL        *This,
  IN       UINT8                      DeviceAddress,
  IN       BOOLEAN                    IsSlowDevice,
  IN       UINT8                      MaximumPacketLength,
  IN       EFI_USB_DEVICE_REQUEST     *Request,
  IN       EFI_USB_DATA_DIRECTION     TransferDirection,
  IN OUT   VOID                       *Data,
  IN OUT   UINTN                      *DataLength,
  IN       UINTN                      TimeOut,
  OUT      UINT32                     *TransferResult
  );

EFI_STATUS
EFIAPI
UHCIBulkTransfer (
  IN       EFI_USB_HC_PROTOCOL     *This,
  IN       UINT8                   DeviceAddress,
  IN       UINT8                   EndPointAddress,
  IN       UINT8                   MaximumPacketLength,
  IN OUT   VOID                    *Data,
  IN OUT   UINTN                   *DataLength,
  IN OUT   UINT8                   *DataToggle,
  IN       UINTN                   TimeOut,
  OUT      UINT32                  *TransferResult
  );

EFI_STATUS
EFIAPI
UHCIAsyncInterruptTransfer (
  IN       EFI_USB_HC_PROTOCOL                * This,
  IN       UINT8                              DeviceAddress,
  IN       UINT8                              EndPointAddress,
  IN       BOOLEAN                            IsSlowDevice,
  IN       UINT8                              MaximumPacketLength,
  IN       BOOLEAN                            IsNewTransfer,
  IN OUT   UINT8                              *DataToggle,
  IN       UINTN                              PollingInterval,
  IN       UINTN                              DataLength,
  IN       EFI_ASYNC_USB_TRANSFER_CALLBACK    CallBackFunction,
  IN       VOID                               *Context
  );

EFI_STATUS
EFIAPI
UHCISyncInterruptTransfer (
  IN       EFI_USB_HC_PROTOCOL     *This,
  IN       UINT8                   DeviceAddress,
  IN       UINT8                   EndPointAddress,
  IN       BOOLEAN                 IsSlowDevice,
  IN       UINT8                   MaximumPacketLength,
  IN OUT   VOID                    *Data,
  IN OUT   UINTN                   *DataLength,
  IN OUT   UINT8                   *DataToggle,
  IN       UINTN                   TimeOut,
  OUT      UINT32                  *TransferResult
  );

EFI_STATUS
EFIAPI
UHCIIsochronousTransfer (
  IN       EFI_USB_HC_PROTOCOL     *This,
  IN       UINT8                   DeviceAddress,
  IN       UINT8                   EndPointAddress,
  IN       UINT8                   MaximumPacketLength,
  IN OUT   VOID                    *Data,
  IN       UINTN                   DataLength,
  OUT      UINT32                  *TransferResult
  );

EFI_STATUS
EFIAPI
UHCIAsyncIsochronousTransfer (
  IN       EFI_USB_HC_PROTOCOL                 * This,
  IN       UINT8                               DeviceAddress,
  IN       UINT8                               EndPointAddress,
  IN       UINT8                               MaximumPacketLength,
  IN OUT   VOID                                *Data,
  IN       UINTN                               DataLength,
  IN       EFI_ASYNC_USB_TRANSFER_CALLBACK     IsochronousCallBack,
  IN       VOID                                *Context
  );

EFI_STATUS
EFIAPI
UHCIGetRootHubPortNumber (
  IN  EFI_USB_HC_PROTOCOL     *This,
  OUT UINT8                   *PortNumber
  );

EFI_STATUS
EFIAPI
UHCIGetRootHubPortStatus (
  IN  EFI_USB_HC_PROTOCOL     *This,
  IN  UINT8                   PortNumber,
  OUT EFI_USB_PORT_STATUS     *PortStatus
  );

EFI_STATUS
EFIAPI
UHCISetRootHubPortFeature (
  IN  EFI_USB_HC_PROTOCOL     *This,
  IN  UINT8                   PortNumber,
  IN  EFI_USB_PORT_FEATURE    PortFeature
  );

EFI_STATUS
EFIAPI
UHCIClearRootHubPortFeature (
  IN  EFI_USB_HC_PROTOCOL     *This,
  IN  UINT8                   PortNumber,
  IN  EFI_USB_PORT_FEATURE    PortFeature
  );

//
// UEFI 2.0 Protocol
//

EFI_STATUS
EFIAPI
UHCI2GetCapability(
  IN  EFI_USB2_HC_PROTOCOL  * This,
  OUT UINT8                 *MaxSpeed,
  OUT UINT8                 *PortNumber,
  OUT UINT8                 *Is64BitCapable
  );

EFI_STATUS
EFIAPI
UHCI2Reset (
  IN EFI_USB2_HC_PROTOCOL   * This,
  IN UINT16                 Attributes
  );

EFI_STATUS
EFIAPI
UHCI2GetState (
  IN  EFI_USB2_HC_PROTOCOL   * This,
  OUT EFI_USB_HC_STATE       * State
  );

EFI_STATUS
EFIAPI
UHCI2SetState (
  IN EFI_USB2_HC_PROTOCOL   * This,
  IN EFI_USB_HC_STATE       State
  );

EFI_STATUS
EFIAPI
UHCI2ControlTransfer (
  IN     EFI_USB2_HC_PROTOCOL      * This,
  IN     UINT8                     DeviceAddress,
  IN     UINT8                     DeviceSpeed,
  IN     UINTN                     MaximumPacketLength,
  IN     EFI_USB_DEVICE_REQUEST    * Request,
  IN     EFI_USB_DATA_DIRECTION    TransferDirection,
  IN OUT VOID                      *Data OPTIONAL,
  IN OUT UINTN                     *DataLength OPTIONAL,
  IN     UINTN                     TimeOut,
  IN     EFI_USB2_HC_TRANSACTION_TRANSLATOR            *Translator,
  OUT    UINT32                    *TransferResult
  );

EFI_STATUS
EFIAPI
UHCI2BulkTransfer (
  IN     EFI_USB2_HC_PROTOCOL   * This,
  IN     UINT8                  DeviceAddress,
  IN     UINT8                  EndPointAddress,
  IN     UINT8                  DeviceSpeed,
  IN     UINTN                  MaximumPacketLength,
  IN     UINT8                  DataBuffersNumber,
  IN OUT VOID                   *Data[EFI_USB_MAX_BULK_BUFFER_NUM],
  IN OUT UINTN                  *DataLength,
  IN OUT UINT8                  *DataToggle,
  IN     UINTN                  TimeOut,
  IN     EFI_USB2_HC_TRANSACTION_TRANSLATOR            *Translator,
  OUT    UINT32                 *TransferResult
  );

EFI_STATUS
EFIAPI
UHCI2AsyncInterruptTransfer (
  IN     EFI_USB2_HC_PROTOCOL   * This,
  IN     UINT8                  DeviceAddress,
  IN     UINT8                  EndPointAddress,
  IN     UINT8                  DeviceSpeed,
  IN     UINTN                  MaximumPacketLength,
  IN     BOOLEAN                IsNewTransfer,
  IN OUT UINT8                  *DataToggle,
  IN     UINTN                  PollingInterval,
  IN     UINTN                  DataLength,
  IN     EFI_USB2_HC_TRANSACTION_TRANSLATOR            *Translator,
  IN     EFI_ASYNC_USB_TRANSFER_CALLBACK               CallBackFunction,
  IN     VOID                   *Context
  );

EFI_STATUS
EFIAPI
UHCI2SyncInterruptTransfer (
  IN     EFI_USB2_HC_PROTOCOL   * This,
  IN     UINT8                  DeviceAddress,
  IN     UINT8                  EndPointAddress,
  IN     UINT8                  DeviceSpeed,
  IN     UINTN                  MaximumPacketLength,
  IN OUT VOID                   *Data,
  IN OUT UINTN                  *DataLength,
  IN OUT UINT8                  *DataToggle,
  IN     UINTN                  TimeOut,
  IN     EFI_USB2_HC_TRANSACTION_TRANSLATOR           *Translator,
  OUT    UINT32                 *TransferResult
  );

EFI_STATUS
EFIAPI
UHCI2IsochronousTransfer (
  IN     EFI_USB2_HC_PROTOCOL   * This,
  IN     UINT8                  DeviceAddress,
  IN     UINT8                  EndPointAddress,
  IN     UINT8                  DeviceSpeed,
  IN     UINTN                  MaximumPacketLength,
  IN     UINT8                  DataBuffersNumber,
  IN OUT VOID                   *Data[EFI_USB_MAX_ISO_BUFFER_NUM],
  IN     UINTN                  DataLength,
  IN     EFI_USB2_HC_TRANSACTION_TRANSLATOR           *Translator,
  OUT    UINT32                 *TransferResult
  );

EFI_STATUS
EFIAPI
UHCI2AsyncIsochronousTransfer (
  IN     EFI_USB2_HC_PROTOCOL   * This,
  IN     UINT8                  DeviceAddress,
  IN     UINT8                  EndPointAddress,
  IN     UINT8                  DeviceSpeed,
  IN     UINTN                  MaximumPacketLength,
  IN     UINT8                  DataBuffersNumber,
  IN OUT VOID                   *Data[EFI_USB_MAX_ISO_BUFFER_NUM],
  IN     UINTN                  DataLength,
  IN     EFI_USB2_HC_TRANSACTION_TRANSLATOR           *Translator,
  IN     EFI_ASYNC_USB_TRANSFER_CALLBACK              IsochronousCallBack,
  IN     VOID                   *Context
  );

EFI_STATUS
EFIAPI
UHCI2GetRootHubPortStatus (
  IN  EFI_USB2_HC_PROTOCOL   * This,
  IN  UINT8                  PortNumber,
  OUT EFI_USB_PORT_STATUS    * PortStatus
  );

EFI_STATUS
EFIAPI
UHCI2SetRootHubPortFeature (
  IN EFI_USB2_HC_PROTOCOL    * This,
  IN UINT8                   PortNumber,
  IN EFI_USB_PORT_FEATURE    PortFeature
  );

EFI_STATUS
EFIAPI
UHCI2ClearRootHubPortFeature (
  IN EFI_USB2_HC_PROTOCOL    * This,
  IN UINT8                   PortNumber,
  IN EFI_USB_PORT_FEATURE    PortFeature
  );

//
// Asynchronous interrupt transfer monitor function
//
VOID
EFIAPI
MonitorInterruptTrans (
  IN EFI_EVENT     Event,
  IN VOID          *Context
  );

//
// UHCI Driver Global Variables
//
EFI_DRIVER_BINDING_PROTOCOL gUhciDriverBinding = {
  UHCIDriverBindingSupported,
  UHCIDriverBindingStart,
  UHCIDriverBindingStop,
  0x10,
  NULL,
  NULL
};


EFI_DRIVER_ENTRY_POINT (UHCIDriverEntryPoint)

EFI_STATUS
EFIAPI
UHCIDriverEntryPoint (
  IN EFI_HANDLE           ImageHandle,
  IN EFI_SYSTEM_TABLE     *SystemTable
  )
/*++

  Routine Description:
    Entry point for EFI drivers.

  Arguments:
    ImageHandle - EFI_HANDLE
    SystemTable - EFI_SYSTEM_TABLE
  Returns:
    EFI_SUCCESS
    others

--*/   
{
  return EfiLibInstallAllDriverProtocols (
           ImageHandle,
           SystemTable,
           &gUhciDriverBinding,
           ImageHandle,
           &gUhciComponentName,
           NULL,
           NULL
           );
}

EFI_STATUS
EFIAPI
UHCIDriverBindingSupported (
  IN EFI_DRIVER_BINDING_PROTOCOL     *This,
  IN EFI_HANDLE                      Controller,
  IN EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
  )
/*++

  Routine Description:
    Test to see if this driver supports ControllerHandle. Any ControllerHandle
    that has UsbHcProtocol installed will be supported.

  Arguments:
    This                - Protocol instance pointer.
    Controller          - Handle of device to test
    RemainingDevicePath - Not used

  Returns:
    EFI_SUCCESS         - This driver supports this device.
    EFI_UNSUPPORTED     - This driver does not support this device.

--*/
{
  EFI_STATUS          OpenStatus;
  EFI_STATUS          Status;
  EFI_PCI_IO_PROTOCOL *PciIo;
  USB_CLASSC          UsbClassCReg;
  //
  // Test whether there is PCI IO Protocol attached on the controller handle.
  //
  OpenStatus = gBS->OpenProtocol (
                      Controller,
                      &gEfiPciIoProtocolGuid,
                      &PciIo,
                      This->DriverBindingHandle,
                      Controller,
                      EFI_OPEN_PROTOCOL_BY_DRIVER
                      );
  if (EFI_ERROR (OpenStatus)) {
    return OpenStatus;
  }

  Status = PciIo->Pci.Read (
                        PciIo,
                        EfiPciIoWidthUint8,
                        CLASSC,
                        sizeof (USB_CLASSC) / sizeof (UINT8),
                        &UsbClassCReg
                        );
  if (EFI_ERROR (Status)) {
    gBS->CloseProtocol (
          Controller,
          &gEfiPciIoProtocolGuid,
          This->DriverBindingHandle,
          Controller
          );
    return EFI_UNSUPPORTED;
  }
  //
  // Test whether the controller belongs to UHCI type
  //
  if ((UsbClassCReg.BaseCode != PCI_CLASS_SERIAL)         ||
      (UsbClassCReg.SubClassCode != PCI_CLASS_SERIAL_USB) ||
      (UsbClassCReg.PI != PCI_CLASSC_PI_UHCI)) {

    gBS->CloseProtocol (
           Controller,
           &gEfiPciIoProtocolGuid,
           This->DriverBindingHandle,
           Controller
           );

    return EFI_UNSUPPORTED;
  }
  gBS->CloseProtocol (
         Controller,
         &gEfiPciIoProtocolGuid,
         This->DriverBindingHandle,
         Controller
         );
  return EFI_SUCCESS;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?