mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-18 15:27:48 +01:00
135 lines
3.6 KiB
C
135 lines
3.6 KiB
C
|
/** @file
|
||
|
Common Libarary for PEI USB.
|
||
|
|
||
|
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
|
||
|
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
**/
|
||
|
|
||
|
#include "UsbPeim.h"
|
||
|
#include "PeiUsbLib.h"
|
||
|
|
||
|
|
||
|
/**
|
||
|
Clear a given usb feature.
|
||
|
|
||
|
@param PeiServices General-purpose services that are available to every PEIM.
|
||
|
@param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
|
||
|
@param Recipient The recipient of ClearFeature Request, should be one of Device/Interface/Endpoint.
|
||
|
@param Value Request Value.
|
||
|
@param Target Request Index.
|
||
|
|
||
|
@retval EFI_SUCCESS Usb feature is cleared successfully.
|
||
|
@retval EFI_DEVICE_ERROR Cannot clear the usb feature due to a hardware error.
|
||
|
@retval Others Other failure occurs.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
PeiUsbClearDeviceFeature (
|
||
|
IN EFI_PEI_SERVICES **PeiServices,
|
||
|
IN PEI_USB_IO_PPI *UsbIoPpi,
|
||
|
IN EFI_USB_RECIPIENT Recipient,
|
||
|
IN UINT16 Value,
|
||
|
IN UINT16 Target
|
||
|
)
|
||
|
{
|
||
|
EFI_USB_DEVICE_REQUEST DevReq;
|
||
|
|
||
|
ASSERT (UsbIoPpi != NULL);
|
||
|
|
||
|
switch (Recipient) {
|
||
|
case EfiUsbDevice:
|
||
|
DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_D;
|
||
|
break;
|
||
|
|
||
|
case EfiUsbInterface:
|
||
|
DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_I;
|
||
|
break;
|
||
|
|
||
|
case EfiUsbEndpoint:
|
||
|
DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_E;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
DevReq.Request = USB_DEV_CLEAR_FEATURE;
|
||
|
DevReq.Value = Value;
|
||
|
DevReq.Index = Target;
|
||
|
DevReq.Length = 0;
|
||
|
|
||
|
return UsbIoPpi->UsbControlTransfer (
|
||
|
PeiServices,
|
||
|
UsbIoPpi,
|
||
|
&DevReq,
|
||
|
EfiUsbNoData,
|
||
|
PcdGet32 (PcdUsbTransferTimeoutValue),
|
||
|
NULL,
|
||
|
0
|
||
|
);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
Clear Endpoint Halt.
|
||
|
|
||
|
@param PeiServices General-purpose services that are available to every PEIM.
|
||
|
@param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
|
||
|
@param EndpointAddress The endpoint address.
|
||
|
|
||
|
@retval EFI_SUCCESS Endpoint halt is cleared successfully.
|
||
|
@retval EFI_DEVICE_ERROR Cannot clear the endpoint halt status due to a hardware error.
|
||
|
@retval Others Other failure occurs.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
PeiUsbClearEndpointHalt (
|
||
|
IN EFI_PEI_SERVICES **PeiServices,
|
||
|
IN PEI_USB_IO_PPI *UsbIoPpi,
|
||
|
IN UINT8 EndpointAddress
|
||
|
)
|
||
|
{
|
||
|
EFI_STATUS Status;
|
||
|
EFI_USB_INTERFACE_DESCRIPTOR *InterfaceDesc;
|
||
|
EFI_USB_ENDPOINT_DESCRIPTOR *EndpointDescriptor;
|
||
|
UINT8 EndpointIndex;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Check its interface
|
||
|
//
|
||
|
Status = UsbIoPpi->UsbGetInterfaceDescriptor (
|
||
|
PeiServices,
|
||
|
UsbIoPpi,
|
||
|
&InterfaceDesc
|
||
|
);
|
||
|
if (EFI_ERROR (Status)) {
|
||
|
return Status;
|
||
|
}
|
||
|
for (EndpointIndex = 0; EndpointIndex < InterfaceDesc->NumEndpoints; EndpointIndex++) {
|
||
|
Status = UsbIoPpi->UsbGetEndpointDescriptor (PeiServices, UsbIoPpi, EndpointIndex, &EndpointDescriptor);
|
||
|
if (EFI_ERROR (Status)) {
|
||
|
return EFI_INVALID_PARAMETER;
|
||
|
}
|
||
|
|
||
|
if (EndpointDescriptor->EndpointAddress == EndpointAddress) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (EndpointIndex == InterfaceDesc->NumEndpoints) {
|
||
|
return EFI_INVALID_PARAMETER;
|
||
|
}
|
||
|
|
||
|
Status = PeiUsbClearDeviceFeature (
|
||
|
PeiServices,
|
||
|
UsbIoPpi,
|
||
|
EfiUsbEndpoint,
|
||
|
EfiUsbEndpointHalt,
|
||
|
EndpointAddress
|
||
|
);
|
||
|
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
|