Helper functions to parse HID report descriptor and items.\r
\r
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include "UsbMouse.h"\r
\r
-\r
/**\r
Get next HID item from report descriptor.\r
\r
Only short item is supported here.\r
\r
@param StartPos Start position of the HID item to get.\r
- @param EndPos End position of the range to get the the next HID item.\r
+ @param EndPos End position of the range to get the next HID item.\r
@param HidItem Buffer for the HID Item to return.\r
\r
@return Pointer to end of the HID item returned.\r
**/\r
UINT8 *\r
GetNextHidItem (\r
- IN UINT8 *StartPos,\r
- IN UINT8 *EndPos,\r
- OUT HID_ITEM *HidItem\r
+ IN UINT8 *StartPos,\r
+ IN UINT8 *EndPos,\r
+ OUT HID_ITEM *HidItem\r
)\r
{\r
- UINT8 Temp;\r
+ UINT8 Temp;\r
\r
if (EndPos <= StartPos) {\r
return NULL;\r
\r
if ((EndPos - StartPos) >= HidItem->Size) {\r
HidItem->Data.LongData = StartPos;\r
- StartPos += HidItem->Size;\r
+ StartPos += HidItem->Size;\r
return StartPos;\r
}\r
}\r
HidItem->Size = BitFieldRead8 (Temp, 0, 1);\r
\r
switch (HidItem->Size) {\r
- case 0:\r
- //\r
- // No data\r
- //\r
- return StartPos;\r
-\r
- case 1:\r
- //\r
- // 1-byte data\r
- //\r
- if ((EndPos - StartPos) >= 1) {\r
- HidItem->Data.Uint8 = *StartPos++;\r
+ case 0:\r
+ //\r
+ // No data\r
+ //\r
return StartPos;\r
- }\r
\r
- case 2:\r
- //\r
- // 2-byte data\r
- //\r
- if ((EndPos - StartPos) >= 2) {\r
- CopyMem (&HidItem->Data.Uint16, StartPos, sizeof (UINT16));\r
- StartPos += 2;\r
- return StartPos;\r
- }\r
+ case 1:\r
+ //\r
+ // 1-byte data\r
+ //\r
+ if ((EndPos - StartPos) >= 1) {\r
+ HidItem->Data.Uint8 = *StartPos++;\r
+ return StartPos;\r
+ }\r
\r
- case 3:\r
- //\r
- // 4-byte data, adjust size\r
- //\r
- HidItem->Size = 4;\r
- if ((EndPos - StartPos) >= 4) {\r
- CopyMem (&HidItem->Data.Uint32, StartPos, sizeof (UINT32));\r
- StartPos += 4;\r
- return StartPos;\r
- }\r
+ case 2:\r
+ //\r
+ // 2-byte data\r
+ //\r
+ if ((EndPos - StartPos) >= 2) {\r
+ CopyMem (&HidItem->Data.Uint16, StartPos, sizeof (UINT16));\r
+ StartPos += 2;\r
+ return StartPos;\r
+ }\r
+\r
+ case 3:\r
+ //\r
+ // 4-byte data, adjust size\r
+ //\r
+ HidItem->Size = 4;\r
+ if ((EndPos - StartPos) >= 4) {\r
+ CopyMem (&HidItem->Data.Uint32, StartPos, sizeof (UINT32));\r
+ StartPos += 4;\r
+ return StartPos;\r
+ }\r
}\r
}\r
\r
return NULL;\r
}\r
\r
-\r
/**\r
Get data from HID item.\r
\r
**/\r
UINT32\r
GetItemData (\r
- IN HID_ITEM *HidItem\r
+ IN HID_ITEM *HidItem\r
)\r
{\r
//\r
// Get data from HID item.\r
//\r
switch (HidItem->Size) {\r
- case 1:\r
- return HidItem->Data.Uint8;\r
- case 2:\r
- return HidItem->Data.Uint16;\r
- case 4:\r
- return HidItem->Data.Uint32;\r
+ case 1:\r
+ return HidItem->Data.Uint8;\r
+ case 2:\r
+ return HidItem->Data.Uint16;\r
+ case 4:\r
+ return HidItem->Data.Uint32;\r
}\r
+\r
return 0;\r
}\r
\r
**/\r
VOID\r
ParseHidItem (\r
- IN USB_MOUSE_DEV *UsbMouse,\r
- IN HID_ITEM *HidItem\r
+ IN USB_MOUSE_DEV *UsbMouse,\r
+ IN HID_ITEM *HidItem\r
)\r
{\r
UINT8 Data;\r
\r
switch (HidItem->Type) {\r
+ case HID_ITEM_TYPE_MAIN:\r
+ //\r
+ // we don't care any main items, just skip\r
+ //\r
+ return;\r
\r
- case HID_ITEM_TYPE_MAIN:\r
- //\r
- // we don't care any main items, just skip\r
- //\r
- return;\r
+ case HID_ITEM_TYPE_GLOBAL:\r
+ //\r
+ // For global items, we only care Usage Page tag for Button Page here\r
+ //\r
+ if (HidItem->Tag == HID_GLOBAL_ITEM_TAG_USAGE_PAGE) {\r
+ Data = (UINT8)GetItemData (HidItem);\r
+ if (Data == 0x09) {\r
+ //\r
+ // Button Page\r
+ //\r
+ UsbMouse->PrivateData.ButtonDetected = TRUE;\r
+ }\r
+ }\r
\r
- case HID_ITEM_TYPE_GLOBAL:\r
- //\r
- // For global items, we only care Usage Page tag for Button Page here\r
- //\r
- if (HidItem->Tag == HID_GLOBAL_ITEM_TAG_USAGE_PAGE) {\r
- Data = (UINT8) GetItemData (HidItem);\r
- if (Data == 0x09) {\r
+ return;\r
+\r
+ case HID_ITEM_TYPE_LOCAL:\r
+ if (HidItem->Size == 0) {\r
//\r
- // Button Page\r
+ // No expected data for local item\r
//\r
- UsbMouse->PrivateData.ButtonDetected = TRUE;\r
+ return;\r
}\r
- }\r
- return;\r
\r
- case HID_ITEM_TYPE_LOCAL:\r
- if (HidItem->Size == 0) {\r
- //\r
- // No expected data for local item\r
- //\r
- return ;\r
- }\r
+ Data = (UINT8)GetItemData (HidItem);\r
\r
- Data = (UINT8) GetItemData (HidItem);\r
+ switch (HidItem->Tag) {\r
+ case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:\r
+ if (UsbMouse->PrivateData.ButtonDetected) {\r
+ UsbMouse->PrivateData.ButtonMinIndex = Data;\r
+ }\r
\r
- switch (HidItem->Tag) {\r
- case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:\r
- if (UsbMouse->PrivateData.ButtonDetected) {\r
- UsbMouse->PrivateData.ButtonMinIndex = Data;\r
- }\r
- return ;\r
+ return;\r
\r
- case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:\r
- {\r
- if (UsbMouse->PrivateData.ButtonDetected) {\r
- UsbMouse->PrivateData.ButtonMaxIndex = Data;\r
- }\r
- return ;\r
- }\r
+ case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:\r
+ {\r
+ if (UsbMouse->PrivateData.ButtonDetected) {\r
+ UsbMouse->PrivateData.ButtonMaxIndex = Data;\r
+ }\r
\r
- default:\r
- return;\r
- }\r
+ return;\r
+ }\r
+\r
+ default:\r
+ return;\r
+ }\r
}\r
}\r
\r
-\r
/**\r
Parse Mouse Report Descriptor.\r
\r
**/\r
EFI_STATUS\r
ParseMouseReportDescriptor (\r
- OUT USB_MOUSE_DEV *UsbMouse,\r
- IN UINT8 *ReportDescriptor,\r
- IN UINTN ReportSize\r
+ OUT USB_MOUSE_DEV *UsbMouse,\r
+ IN UINT8 *ReportDescriptor,\r
+ IN UINTN ReportSize\r
)\r
{\r
UINT8 *DescriptorEnd;\r
Ptr = GetNextHidItem (Ptr, DescriptorEnd, &HidItem);\r
}\r
\r
- UsbMouse->NumberOfButtons = (UINT8) (UsbMouse->PrivateData.ButtonMaxIndex - UsbMouse->PrivateData.ButtonMinIndex + 1);\r
- UsbMouse->XLogicMax = 127;\r
- UsbMouse->YLogicMax = 127;\r
- UsbMouse->XLogicMin = -127;\r
- UsbMouse->YLogicMin = -127;\r
+ UsbMouse->NumberOfButtons = (UINT8)(UsbMouse->PrivateData.ButtonMaxIndex - UsbMouse->PrivateData.ButtonMinIndex + 1);\r
+ UsbMouse->XLogicMax = 127;\r
+ UsbMouse->YLogicMax = 127;\r
+ UsbMouse->XLogicMin = -127;\r
+ UsbMouse->YLogicMin = -127;\r
\r
return EFI_SUCCESS;\r
}\r