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 + -
显示快捷键?