/*++ | |
Copyright (c) 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: | |
hid.c | |
Abstract: | |
HID class request | |
Revision History | |
--*/ | |
// | |
// Function to get HID descriptor | |
// | |
EFI_STATUS | |
UsbGetHidDescriptor ( | |
IN EFI_USB_IO_PROTOCOL *UsbIo, | |
IN UINT8 InterfaceNum, | |
OUT EFI_USB_HID_DESCRIPTOR *HidDescriptor | |
) | |
/*++ | |
Routine Description: | |
Get Hid Descriptor | |
Arguments: | |
UsbIo - EFI_USB_IO_PROTOCOL | |
InterfaceNum - Hid interface number | |
HidDescriptor - Caller allocated buffer to store Usb hid descriptor | |
if successfully returned. | |
Returns: | |
EFI_SUCCESS | |
EFI_DEVICE_ERROR | |
EFI_TIMEOUT | |
--*/ | |
{ | |
UINT32 Status; | |
EFI_STATUS Result; | |
EFI_USB_DEVICE_REQUEST Request; | |
Request.RequestType = 0x81; | |
Request.Request = 0x06; | |
Request.Value = (UINT16) (0x21 << 8); | |
Request.Index = InterfaceNum; | |
Request.Length = sizeof (EFI_USB_HID_DESCRIPTOR); | |
Result = UsbIo->UsbControlTransfer ( | |
UsbIo, | |
&Request, | |
EfiUsbDataIn, | |
TIMEOUT_VALUE, | |
HidDescriptor, | |
sizeof (EFI_USB_HID_DESCRIPTOR), | |
&Status | |
); | |
return Result; | |
} | |
// | |
// Function to get Report Class descriptor | |
// | |
EFI_STATUS | |
UsbGetReportDescriptor ( | |
IN EFI_USB_IO_PROTOCOL *UsbIo, | |
IN UINT8 InterfaceNum, | |
IN UINT16 DescriptorSize, | |
OUT UINT8 *DescriptorBuffer | |
) | |
/*++ | |
Routine Description: | |
get Report Class descriptor | |
Arguments: | |
UsbIo - EFI_USB_IO_PROTOCOL. | |
InterfaceNum - Report interface number. | |
DescriptorSize - Length of DescriptorBuffer. | |
DescriptorBuffer - Caller allocated buffer to store Usb report descriptor | |
if successfully returned. | |
Returns: | |
EFI_SUCCESS | |
EFI_DEVICE_ERROR | |
EFI_TIMEOUT | |
--*/ | |
{ | |
UINT32 Status; | |
EFI_STATUS Result; | |
EFI_USB_DEVICE_REQUEST Request; | |
// | |
// Fill Device request packet | |
// | |
Request.RequestType = 0x81; | |
Request.Request = 0x06; | |
Request.Value = (UINT16) (0x22 << 8); | |
Request.Index = InterfaceNum; | |
Request.Length = DescriptorSize; | |
Result = UsbIo->UsbControlTransfer ( | |
UsbIo, | |
&Request, | |
EfiUsbDataIn, | |
TIMEOUT_VALUE, | |
DescriptorBuffer, | |
DescriptorSize, | |
&Status | |
); | |
return Result; | |
} | |
// | |
// Following are HID class request | |
// | |
EFI_STATUS | |
UsbGetProtocolRequest ( | |
IN EFI_USB_IO_PROTOCOL *UsbIo, | |
IN UINT8 Interface, | |
IN UINT8 *Protocol | |
) | |
/*++ | |
Routine Description: | |
Get Hid Protocol Request | |
Arguments: | |
UsbIo - EFI_USB_IO_PROTOCOL | |
Interface - Which interface the caller wants to get protocol | |
Protocol - Protocol value returned. | |
Returns: | |
EFI_SUCCESS | |
EFI_DEVICE_ERROR | |
EFI_TIMEOUT | |
--*/ | |
{ | |
UINT32 Status; | |
EFI_STATUS Result; | |
EFI_USB_DEVICE_REQUEST Request; | |
// | |
// Fill Device request packet | |
// | |
Request.RequestType = 0xa1; | |
// | |
// 10100001b; | |
// | |
Request.Request = EFI_USB_GET_PROTOCOL_REQUEST; | |
Request.Value = 0; | |
Request.Index = Interface; | |
Request.Length = 1; | |
Result = UsbIo->UsbControlTransfer ( | |
UsbIo, | |
&Request, | |
EfiUsbDataIn, | |
TIMEOUT_VALUE, | |
Protocol, | |
sizeof (UINT8), | |
&Status | |
); | |
return Result; | |
} | |
EFI_STATUS | |
UsbSetProtocolRequest ( | |
IN EFI_USB_IO_PROTOCOL *UsbIo, | |
IN UINT8 Interface, | |
IN UINT8 Protocol | |
) | |
/*++ | |
Routine Description: | |
Set Hid Protocol Request | |
Arguments: | |
UsbIo - EFI_USB_IO_PROTOCOL | |
Interface - Which interface the caller wants to set protocol | |
Protocol - Protocol value the caller wants to set. | |
Returns: | |
EFI_SUCCESS | |
EFI_DEVICE_ERROR | |
EFI_TIMEOUT | |
--*/ | |
{ | |
UINT32 Status; | |
EFI_STATUS Result; | |
EFI_USB_DEVICE_REQUEST Request; | |
// | |
// Fill Device request packet | |
// | |
Request.RequestType = 0x21; | |
// | |
// 00100001b; | |
// | |
Request.Request = EFI_USB_SET_PROTOCOL_REQUEST; | |
Request.Value = Protocol; | |
Request.Index = Interface; | |
Request.Length = 0; | |
Result = UsbIo->UsbControlTransfer ( | |
UsbIo, | |
&Request, | |
EfiUsbNoData, | |
TIMEOUT_VALUE, | |
NULL, | |
0, | |
&Status | |
); | |
return Result; | |
} | |
EFI_STATUS | |
UsbSetIdleRequest ( | |
IN EFI_USB_IO_PROTOCOL *UsbIo, | |
IN UINT8 Interface, | |
IN UINT8 ReportId, | |
IN UINT8 Duration | |
) | |
/*++ | |
Routine Description: | |
Set Idel request. | |
Arguments: | |
UsbIo - EFI_USB_IO_PROTOCOL | |
Interface - Which interface the caller wants to set. | |
ReportId - Which report the caller wants to set. | |
Duration - Idle rate the caller wants to set. | |
Returns: | |
EFI_SUCCESS | |
EFI_DEVICE_ERROR | |
EFI_TIMEOUT | |
--*/ | |
{ | |
UINT32 Status; | |
EFI_STATUS Result; | |
EFI_USB_DEVICE_REQUEST Request; | |
// | |
// Fill Device request packet | |
// | |
Request.RequestType = 0x21; | |
// | |
// 00100001b; | |
// | |
Request.Request = EFI_USB_SET_IDLE_REQUEST; | |
Request.Value = (UINT16) ((Duration << 8) | ReportId); | |
Request.Index = Interface; | |
Request.Length = 0; | |
Result = UsbIo->UsbControlTransfer ( | |
UsbIo, | |
&Request, | |
EfiUsbNoData, | |
TIMEOUT_VALUE, | |
NULL, | |
0, | |
&Status | |
); | |
return Result; | |
} | |
EFI_STATUS | |
UsbGetIdleRequest ( | |
IN EFI_USB_IO_PROTOCOL *UsbIo, | |
IN UINT8 Interface, | |
IN UINT8 ReportId, | |
OUT UINT8 *Duration | |
) | |
/*++ | |
Routine Description: | |
Get Idel request. | |
Arguments: | |
UsbIo - EFI_USB_IO_PROTOCOL | |
Interface - Which interface the caller wants to get. | |
ReportId - Which report the caller wants to get. | |
Duration - Idle rate the caller wants to get. | |
Returns: | |
EFI_SUCCESS | |
EFI_DEVICE_ERROR | |
EFI_TIMEOUT | |
--*/ | |
{ | |
UINT32 Status; | |
EFI_STATUS Result; | |
EFI_USB_DEVICE_REQUEST Request; | |
// | |
// Fill Device request packet | |
// | |
Request.RequestType = 0xa1; | |
// | |
// 10100001b; | |
// | |
Request.Request = EFI_USB_GET_IDLE_REQUEST; | |
Request.Value = ReportId; | |
Request.Index = Interface; | |
Request.Length = 1; | |
Result = UsbIo->UsbControlTransfer ( | |
UsbIo, | |
&Request, | |
EfiUsbDataIn, | |
TIMEOUT_VALUE, | |
Duration, | |
1, | |
&Status | |
); | |
return Result; | |
} | |
EFI_STATUS | |
UsbSetReportRequest ( | |
IN EFI_USB_IO_PROTOCOL *UsbIo, | |
IN UINT8 Interface, | |
IN UINT8 ReportId, | |
IN UINT8 ReportType, | |
IN UINT16 ReportLen, | |
IN UINT8 *Report | |
) | |
/*++ | |
Routine Description: | |
Hid Set Report request. | |
Arguments: | |
UsbIo - EFI_USB_IO_PROTOCOL | |
Interface - Which interface the caller wants to set. | |
ReportId - Which report the caller wants to set. | |
ReportType - Type of report. | |
ReportLen - Length of report descriptor. | |
Report - Report Descriptor buffer. | |
Returns: | |
EFI_SUCCESS | |
EFI_DEVICE_ERROR | |
EFI_TIMEOUT | |
--*/ | |
{ | |
UINT32 Status; | |
EFI_STATUS Result; | |
EFI_USB_DEVICE_REQUEST Request; | |
// | |
// Fill Device request packet | |
// | |
Request.RequestType = 0x21; | |
// | |
// 00100001b; | |
// | |
Request.Request = EFI_USB_SET_REPORT_REQUEST; | |
Request.Value = (UINT16) ((ReportType << 8) | ReportId); | |
Request.Index = Interface; | |
Request.Length = ReportLen; | |
Result = UsbIo->UsbControlTransfer ( | |
UsbIo, | |
&Request, | |
EfiUsbDataOut, | |
TIMEOUT_VALUE, | |
Report, | |
ReportLen, | |
&Status | |
); | |
return Result; | |
} | |
EFI_STATUS | |
UsbGetReportRequest ( | |
IN EFI_USB_IO_PROTOCOL *UsbIo, | |
IN UINT8 Interface, | |
IN UINT8 ReportId, | |
IN UINT8 ReportType, | |
IN UINT16 ReportLen, | |
IN UINT8 *Report | |
) | |
/*++ | |
Routine Description: | |
Hid Set Report request. | |
Arguments: | |
UsbIo - EFI_USB_IO_PROTOCOL | |
Interface - Which interface the caller wants to set. | |
ReportId - Which report the caller wants to set. | |
ReportType - Type of report. | |
ReportLen - Length of report descriptor. | |
Report - Caller allocated buffer to store Report Descriptor. | |
Returns: | |
EFI_SUCCESS | |
EFI_DEVICE_ERROR | |
EFI_TIMEOUT | |
--*/ | |
{ | |
UINT32 Status; | |
EFI_STATUS Result; | |
EFI_USB_DEVICE_REQUEST Request; | |
// | |
// Fill Device request packet | |
// | |
Request.RequestType = 0xa1; | |
// | |
// 10100001b; | |
// | |
Request.Request = EFI_USB_GET_REPORT_REQUEST; | |
Request.Value = (UINT16) ((ReportType << 8) | ReportId); | |
Request.Index = Interface; | |
Request.Length = ReportLen; | |
Result = UsbIo->UsbControlTransfer ( | |
UsbIo, | |
&Request, | |
EfiUsbDataIn, | |
TIMEOUT_VALUE, | |
Report, | |
ReportLen, | |
&Status | |
); | |
return Result; | |
} |