| /*++ | |
| 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; | |
| } |