usbio.c

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

C
1,196
字号
  // to perform other parameters checking
  //
  GetDeviceEndPointMaxPacketLength (
    This,
    DeviceEndpoint,
    &MaxPacketLength
    );
  GetDataToggleBit (
    This,
    DeviceEndpoint,
    &DataToggle
    );

  OldToggle = DataToggle;

  //
  // using HostController's BulkTransfer to complete the request
  //
  RetStatus = UsbVirtualHcBulkTransfer (
                UsbIoDev->BusController,
                UsbIoDev->DeviceAddress,
                DeviceEndpoint,
                UsbIoDev->DeviceSpeed,
                MaxPacketLength,
                DataBuffersNumber,
                &Data,
                DataLength,
                &DataToggle,
                Timeout,
                UsbIoDev->Translator,
                &TransferResult
                );

  if (OldToggle != DataToggle) {
    //
    // Write the toggle back
    //
    SetDataToggleBit (
      This,
      DeviceEndpoint,
      DataToggle
      );
  }

  *Status = TransferResult;

  return RetStatus;
}

STATIC
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
  )
/*++

  Routine Description:
    Usb Sync Interrupt Transfer

  Arguments:
    This            - Indicates calling context.
    DeviceEndpoint  - The destination USB device endpoint to which the device
                      request is being sent.
    Data            - A pointer to the buffer of data that will be transmitted
                      to USB device or received from USB device.
    DataLength      - On input, the size, in bytes, of the data buffer
                      specified by Data.  On output, the number of bytes that
                      were actually transferred.
    Timeout         - Indicates the transfer should be completed within this
                      time frame.
    Status          - This parameter indicates the USB transfer status.

  Returns:
    EFI_SUCCESS
    EFI_INVALID_PARAMETER
    EFI_OUT_OF_RESOURCES
    EFI_TIMEOUT
    EFI_DEVICE_ERROR

--*/
{
  USB_IO_DEVICE             *UsbIoDev;
  UINTN                     MaxPacketLength;
  UINT8                     DataToggle;
  UINT8                     OldToggle;
  EFI_STATUS                RetStatus;
  //
  // EFI_USB_HC_PROTOCOL         *UsbHCInterface;
  //
  USB_IO_CONTROLLER_DEVICE  *UsbIoController;
  ENDPOINT_DESC_LIST_ENTRY  *EndPointListEntry;

  //
  // Parameters Checking
  //
  if ((DeviceEndpoint & 0x7F) == 0) {
    return EFI_INVALID_PARAMETER;
  }

  if ((DeviceEndpoint & 0x7F) > 15) {
    return EFI_INVALID_PARAMETER;
  }

  if (Status == NULL) {
    return EFI_INVALID_PARAMETER;
  }

  EndPointListEntry = FindEndPointListEntry (
                        This,
                        DeviceEndpoint
                        );

  if (EndPointListEntry == NULL) {
    return EFI_INVALID_PARAMETER;
  }

  if ((EndPointListEntry->EndpointDescriptor.Attributes & 0x03) != 0x03) {
    return EFI_INVALID_PARAMETER;
  }
  //
  // leave the HostController's SyncInterruptTransfer
  // to perform other parameters checking
  //
  UsbIoController = USB_IO_CONTROLLER_DEVICE_FROM_USB_IO_THIS (This);
  UsbIoDev        = UsbIoController->UsbDevice;
  //
  // UsbHCInterface  = UsbIoDev->BusController->UsbHCInterface;
  //
  GetDeviceEndPointMaxPacketLength (
    This,
    DeviceEndpoint,
    &MaxPacketLength
    );

  GetDataToggleBit (
    This,
    DeviceEndpoint,
    &DataToggle
    );

  OldToggle = DataToggle;
  //
  // using HostController's SyncInterruptTransfer to complete the request
  //
  RetStatus = UsbVirtualHcSyncInterruptTransfer (
                UsbIoDev->BusController,
                UsbIoDev->DeviceAddress,
                DeviceEndpoint,
                UsbIoDev->DeviceSpeed,
                MaxPacketLength,
                Data,
                DataLength,
                &DataToggle,
                Timeout,
                UsbIoDev->Translator,
                Status
                );

  if (OldToggle != DataToggle) {
    //
    // Write the toggle back
    //
    SetDataToggleBit (
      This,
      DeviceEndpoint,
      DataToggle
      );
  }

  return RetStatus;
}

STATIC
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
  )
/*++

  Routine Description:
    Usb Async Interrput Transfer

  Arguments:
    This              -   Indicates calling context.
    DeviceEndpoint    -   The destination USB device endpoint to which the
                          device request is being sent.
    IsNewTransfer     -   If TRUE, a new transfer will be submitted to USB
                          controller.  If FALSE,  the interrupt transfer is
                          deleted from the device's interrupt transfer queue.
    PollingInterval   -   Indicates the periodic rate, in milliseconds, that
                          the transfer is to be executed.
    DataLength        -   Specifies the length, in bytes, of the data to be
                          received from the USB device.
    InterruptCallBack -   The Callback function.  This function is called if
                          the asynchronous interrupt transfer is completed.
    Context           -   Passed to InterruptCallback 
    
  Returns:
    EFI_SUCCESS
    EFI_INVALID_PARAMETER
    EFI_OUT_OF_RESOURCES

--*/
{
  USB_IO_DEVICE             *UsbIoDev;
  UINTN                     MaxPacketLength;
  UINT8                     DataToggle;
  //
  // EFI_USB_HC_PROTOCOL         *UsbHCInterface;
  //
  EFI_STATUS                RetStatus;
  USB_IO_CONTROLLER_DEVICE  *UsbIoController;
  ENDPOINT_DESC_LIST_ENTRY  *EndpointListEntry;

  //
  // Check endpoint
  //
  if ((DeviceEndpoint & 0x7F) == 0) {
    return EFI_INVALID_PARAMETER;
  }

  if ((DeviceEndpoint & 0x7F) > 15) {
    return EFI_INVALID_PARAMETER;
  }

  EndpointListEntry = FindEndPointListEntry (
                        This,
                        DeviceEndpoint
                        );

  if (EndpointListEntry == NULL) {
    return EFI_INVALID_PARAMETER;
  }

  if ((EndpointListEntry->EndpointDescriptor.Attributes & 0x03) != 0x03) {
    return EFI_INVALID_PARAMETER;
  }

  UsbIoController = USB_IO_CONTROLLER_DEVICE_FROM_USB_IO_THIS (This);
  UsbIoDev        = UsbIoController->UsbDevice;
  //
  // UsbHCInterface  = UsbIoDev->BusController->UsbHCInterface;
  //
  if (!IsNewTransfer) {
    //
    // Delete this transfer
    //
    UsbVirtualHcAsyncInterruptTransfer (
      UsbIoDev->BusController,
      UsbIoDev->DeviceAddress,
      DeviceEndpoint,
      UsbIoDev->DeviceSpeed,
      0,
      FALSE,
      &DataToggle,
      PollingInterval,
      DataLength,
      UsbIoDev->Translator,
      NULL,
      NULL
      );

    //
    // We need to store the toggle value
    //
    SetDataToggleBit (
      This,
      DeviceEndpoint,
      DataToggle
      );

    return EFI_SUCCESS;
  }

  GetDeviceEndPointMaxPacketLength (
    This,
    DeviceEndpoint,
    &MaxPacketLength
    );

  GetDataToggleBit (
    This,
    DeviceEndpoint,
    &DataToggle
    );

  RetStatus = UsbVirtualHcAsyncInterruptTransfer (
                UsbIoDev->BusController,
                UsbIoDev->DeviceAddress,
                DeviceEndpoint,
                UsbIoDev->DeviceSpeed,
                MaxPacketLength,
                TRUE,
                &DataToggle,
                PollingInterval,
                DataLength,
                UsbIoDev->Translator,
                InterruptCallBack,
                Context
                );

  return RetStatus;
}

STATIC
EFI_STATUS
EFIAPI
UsbIsochronousTransfer (
  IN       EFI_USB_IO_PROTOCOL     *This,
  IN       UINT8                   DeviceEndpoint,
  IN OUT   VOID                    *Data,
  IN       UINTN                   DataLength,
  OUT      UINT32                  *Status
  )
/*++

  Routine Description:
    Usb Isochronous Transfer

  Arguments:
    This              -   Indicates calling context.
    DeviceEndpoint    -   The destination USB device endpoint to which the
                          device request is being sent.
    Data              -   A pointer to the buffer of data that will be
                          transmitted to USB device or received from USB device.
    DataLength        -   The size, in bytes, of the data buffer specified by
                          Data.
    Status            -   This parameter indicates the USB transfer status.

  Returns:
    EFI_SUCCESS
    EFI_INVALID_PARAMETER
    EFI_OUT_OF_RESOURCES
    EFI_TIMEOUT
    EFI_DEVICE_ERROR
    EFI_UNSUPPORTED
--*/
{
  //
  // Currently we don't support this transfer
  //
  return EFI_UNSUPPORTED;
}

STATIC
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
  )
/*++

Routine Description:

  Usb Async Isochronous Transfer

Arguments:

  This                - EFI_USB_IO_PROTOCOL
  DeviceEndpoint      - DeviceEndpoint number
  Data                - Data to transfer
  DataLength          - DataLength
  IsochronousCallBack - Isochronous CallBack function
  Context             - Passed to IsochronousCallBack function
Returns:

  EFI_UNSUPPORTED     - Unsupported now

--*/
{
  //
  // Currently we don't support this transfer
  //
  return EFI_UNSUPPORTED;
}
//
// Here is new definitions
//
STATIC
EFI_STATUS
EFIAPI

⌨️ 快捷键说明

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