--- /dev/null
+/** @file\r
+\r
+Copyright (c) 2004, Intel Corporation\r
+All rights reserved. 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
+\r
+Module Name:\r
+\r
+ Mousehid.c\r
+\r
+Abstract:\r
+ Parse mouse hid descriptor\r
+\r
+\r
+**/\r
+\r
+#include "mousehid.h"\r
+\r
+\r
+//\r
+// Get an item from report descriptor\r
+//\r
+\r
+/**\r
+ Get Next Item\r
+\r
+ @param StartPos Start Position\r
+ @param EndPos End Position\r
+ @param HidItem HidItem to return\r
+\r
+ @return Position\r
+\r
+**/\r
+STATIC\r
+UINT8 *\r
+GetNextItem (\r
+ IN UINT8 *StartPos,\r
+ IN UINT8 *EndPos,\r
+ OUT HID_ITEM *HidItem\r
+ )\r
+{\r
+ UINT8 Temp;\r
+\r
+ if ((EndPos - StartPos) <= 0) {\r
+ return NULL;\r
+ }\r
+\r
+ Temp = *StartPos;\r
+ StartPos++;\r
+ //\r
+ // bit 2,3\r
+ //\r
+ HidItem->Type = (UINT8) ((Temp >> 2) & 0x03);\r
+ //\r
+ // bit 4-7\r
+ //\r
+ HidItem->Tag = (UINT8) ((Temp >> 4) & 0x0F);\r
+\r
+ if (HidItem->Tag == HID_ITEM_TAG_LONG) {\r
+ //\r
+ // Long Items are not supported by HID rev1.0,\r
+ // although we try to parse it.\r
+ //\r
+ HidItem->Format = HID_ITEM_FORMAT_LONG;\r
+\r
+ if ((EndPos - StartPos) >= 2) {\r
+ HidItem->Size = *StartPos++;\r
+ HidItem->Tag = *StartPos++;\r
+\r
+ if ((EndPos - StartPos) >= HidItem->Size) {\r
+ HidItem->Data.LongData = StartPos;\r
+ StartPos += HidItem->Size;\r
+ return StartPos;\r
+ }\r
+ }\r
+ } else {\r
+ HidItem->Format = HID_ITEM_FORMAT_SHORT;\r
+ //\r
+ // bit 0, 1\r
+ //\r
+ HidItem->Size = (UINT8) (Temp & 0x03);\r
+ switch (HidItem->Size) {\r
+\r
+ case 0:\r
+ //\r
+ // No data\r
+ //\r
+ return StartPos;\r
+\r
+ case 1:\r
+ //\r
+ // One byte data\r
+ //\r
+ if ((EndPos - StartPos) >= 1) {\r
+ HidItem->Data.U8 = *StartPos++;\r
+ return StartPos;\r
+ }\r
+\r
+ case 2:\r
+ //\r
+ // Two byte data\r
+ //\r
+ if ((EndPos - StartPos) >= 2) {\r
+ CopyMem (&HidItem->Data.U16, 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++;\r
+ if ((EndPos - StartPos) >= 4) {\r
+ CopyMem (&HidItem->Data.U32, StartPos, sizeof (UINT32));\r
+ StartPos += 4;\r
+ return StartPos;\r
+ }\r
+ }\r
+ }\r
+\r
+ return NULL;\r
+}\r
+\r
+\r
+/**\r
+ Get Item Data\r
+\r
+ @param HidItem HID_ITEM\r
+\r
+ @return HidItem Data\r
+\r
+**/\r
+STATIC\r
+UINT32\r
+GetItemData (\r
+ IN HID_ITEM *HidItem\r
+ )\r
+{\r
+ //\r
+ // Get Data from HID_ITEM structure\r
+ //\r
+ switch (HidItem->Size) {\r
+\r
+ case 1:\r
+ return HidItem->Data.U8;\r
+\r
+ case 2:\r
+ return HidItem->Data.U16;\r
+\r
+ case 4:\r
+ return HidItem->Data.U32;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+\r
+/**\r
+ Parse Local Item\r
+\r
+ @param UsbMouse USB_MOUSE_DEV\r
+ @param LocalItem Local Item\r
+\r
+\r
+**/\r
+STATIC\r
+VOID\r
+ParseLocalItem (\r
+ IN USB_MOUSE_DEV *UsbMouse,\r
+ IN HID_ITEM *LocalItem\r
+ )\r
+{\r
+ UINT32 Data;\r
+\r
+ if (LocalItem->Size == 0) {\r
+ //\r
+ // No expected data for local item\r
+ //\r
+ return ;\r
+ }\r
+\r
+ Data = GetItemData (LocalItem);\r
+\r
+ switch (LocalItem->Tag) {\r
+\r
+ case HID_LOCAL_ITEM_TAG_DELIMITER:\r
+ //\r
+ // we don't support delimiter here\r
+ //\r
+ return ;\r
+\r
+ case HID_LOCAL_ITEM_TAG_USAGE:\r
+ return ;\r
+\r
+ case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:\r
+ if (UsbMouse->PrivateData.ButtonDetected) {\r
+ UsbMouse->PrivateData.ButtonMinIndex = (UINT8) Data;\r
+ }\r
+\r
+ return ;\r
+\r
+ case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:\r
+ {\r
+ if (UsbMouse->PrivateData.ButtonDetected) {\r
+ UsbMouse->PrivateData.ButtonMaxIndex = (UINT8) Data;\r
+ }\r
+\r
+ return ;\r
+ }\r
+ }\r
+}\r
+\r
+STATIC\r
+VOID\r
+ParseGlobalItem (\r
+ IN USB_MOUSE_DEV *UsbMouse,\r
+ IN HID_ITEM *GlobalItem\r
+ )\r
+{\r
+ UINT8 UsagePage;\r
+\r
+ switch (GlobalItem->Tag) {\r
+ case HID_GLOBAL_ITEM_TAG_USAGE_PAGE:\r
+ {\r
+ UsagePage = (UINT8) GetItemData (GlobalItem);\r
+\r
+ //\r
+ // We only care Button Page here\r
+ //\r
+ if (UsagePage == 0x09) {\r
+ //\r
+ // Button Page\r
+ //\r
+ UsbMouse->PrivateData.ButtonDetected = TRUE;\r
+ return ;\r
+ }\r
+ break;\r
+ }\r
+\r
+ }\r
+}\r
+\r
+\r
+\r
+/**\r
+ Parse Main Item\r
+\r
+ @param UsbMouse TODO: add argument description\r
+ @param MainItem HID_ITEM to parse\r
+\r
+ @return VOID\r
+\r
+**/\r
+STATIC\r
+VOID\r
+ParseMainItem (\r
+ IN USB_MOUSE_DEV *UsbMouse,\r
+ IN HID_ITEM *MainItem\r
+ )\r
+{\r
+ //\r
+ // we don't care any main items, just skip\r
+ //\r
+ return ;\r
+}\r
+\r
+\r
+/**\r
+ Parse Hid Item\r
+\r
+ @param UsbMouse USB_MOUSE_DEV\r
+ @param HidItem HidItem to parse\r
+\r
+ @return VOID\r
+\r
+**/\r
+STATIC\r
+VOID\r
+ParseHidItem (\r
+ IN USB_MOUSE_DEV *UsbMouse,\r
+ IN HID_ITEM *HidItem\r
+ )\r
+{\r
+ switch (HidItem->Type) {\r
+\r
+ case HID_ITEM_TYPE_MAIN:\r
+ //\r
+ // For Main Item, parse main item\r
+ //\r
+ ParseMainItem (UsbMouse, HidItem);\r
+ break;\r
+\r
+ case HID_ITEM_TYPE_GLOBAL:\r
+ //\r
+ // For global Item, parse global item\r
+ //\r
+ ParseGlobalItem (UsbMouse, HidItem);\r
+ break;\r
+\r
+ case HID_ITEM_TYPE_LOCAL:\r
+ //\r
+ // For Local Item, parse local item\r
+ //\r
+ ParseLocalItem (UsbMouse, HidItem);\r
+ break;\r
+ }\r
+}\r
+//\r
+// A simple parse just read some field we are interested in\r
+//\r
+\r
+/**\r
+ Parse Mouse Report Descriptor\r
+\r
+ @param UsbMouse USB_MOUSE_DEV\r
+ @param ReportDescriptor Report descriptor to parse\r
+ @param ReportSize Report descriptor size\r
+\r
+ @retval EFI_DEVICE_ERROR Report descriptor error\r
+ @retval EFI_SUCCESS Success\r
+\r
+**/\r
+EFI_STATUS\r
+ParseMouseReportDescriptor (\r
+ IN USB_MOUSE_DEV *UsbMouse,\r
+ IN UINT8 *ReportDescriptor,\r
+ IN UINTN ReportSize\r
+ )\r
+{\r
+ UINT8 *DescriptorEnd;\r
+ UINT8 *ptr;\r
+ HID_ITEM HidItem;\r
+\r
+ DescriptorEnd = ReportDescriptor + ReportSize;\r
+\r
+ ptr = GetNextItem (ReportDescriptor, DescriptorEnd, &HidItem);\r
+\r
+ while (ptr != NULL) {\r
+ if (HidItem.Format != HID_ITEM_FORMAT_SHORT) {\r
+ //\r
+ // Long Format Item is not supported at current HID revision\r
+ //\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+\r
+ ParseHidItem (UsbMouse, &HidItem);\r
+\r
+ ptr = GetNextItem (ptr, DescriptorEnd, &HidItem);\r
+ }\r
+\r
+ UsbMouse->NumberOfButtons = (UINT8) (UsbMouse->PrivateData.ButtonMaxIndex - UsbMouse->PrivateData.ButtonMinIndex + 1);\r
+ UsbMouse->XLogicMax = UsbMouse->YLogicMax = 127;\r
+ UsbMouse->XLogicMin = UsbMouse->YLogicMin = -127;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+++ /dev/null
-/** @file\r
-\r
-Copyright (c) 2004, Intel Corporation\r
-All rights reserved. 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
-\r
-Module Name:\r
-\r
- Mousehid.c\r
-\r
-Abstract:\r
- Parse mouse hid descriptor\r
-\r
-\r
-**/\r
-\r
-#include "mousehid.h"\r
-\r
-\r
-//\r
-// Get an item from report descriptor\r
-//\r
-\r
-/**\r
- Get Next Item\r
-\r
- @param StartPos Start Position\r
- @param EndPos End Position\r
- @param HidItem HidItem to return\r
-\r
- @return Position\r
-\r
-**/\r
-STATIC\r
-UINT8 *\r
-GetNextItem (\r
- IN UINT8 *StartPos,\r
- IN UINT8 *EndPos,\r
- OUT HID_ITEM *HidItem\r
- )\r
-{\r
- UINT8 Temp;\r
-\r
- if ((EndPos - StartPos) <= 0) {\r
- return NULL;\r
- }\r
-\r
- Temp = *StartPos;\r
- StartPos++;\r
- //\r
- // bit 2,3\r
- //\r
- HidItem->Type = (UINT8) ((Temp >> 2) & 0x03);\r
- //\r
- // bit 4-7\r
- //\r
- HidItem->Tag = (UINT8) ((Temp >> 4) & 0x0F);\r
-\r
- if (HidItem->Tag == HID_ITEM_TAG_LONG) {\r
- //\r
- // Long Items are not supported by HID rev1.0,\r
- // although we try to parse it.\r
- //\r
- HidItem->Format = HID_ITEM_FORMAT_LONG;\r
-\r
- if ((EndPos - StartPos) >= 2) {\r
- HidItem->Size = *StartPos++;\r
- HidItem->Tag = *StartPos++;\r
-\r
- if ((EndPos - StartPos) >= HidItem->Size) {\r
- HidItem->Data.LongData = StartPos;\r
- StartPos += HidItem->Size;\r
- return StartPos;\r
- }\r
- }\r
- } else {\r
- HidItem->Format = HID_ITEM_FORMAT_SHORT;\r
- //\r
- // bit 0, 1\r
- //\r
- HidItem->Size = (UINT8) (Temp & 0x03);\r
- switch (HidItem->Size) {\r
-\r
- case 0:\r
- //\r
- // No data\r
- //\r
- return StartPos;\r
-\r
- case 1:\r
- //\r
- // One byte data\r
- //\r
- if ((EndPos - StartPos) >= 1) {\r
- HidItem->Data.U8 = *StartPos++;\r
- return StartPos;\r
- }\r
-\r
- case 2:\r
- //\r
- // Two byte data\r
- //\r
- if ((EndPos - StartPos) >= 2) {\r
- CopyMem (&HidItem->Data.U16, 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++;\r
- if ((EndPos - StartPos) >= 4) {\r
- CopyMem (&HidItem->Data.U32, StartPos, sizeof (UINT32));\r
- StartPos += 4;\r
- return StartPos;\r
- }\r
- }\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-\r
-/**\r
- Get Item Data\r
-\r
- @param HidItem HID_ITEM\r
-\r
- @return HidItem Data\r
-\r
-**/\r
-STATIC\r
-UINT32\r
-GetItemData (\r
- IN HID_ITEM *HidItem\r
- )\r
-{\r
- //\r
- // Get Data from HID_ITEM structure\r
- //\r
- switch (HidItem->Size) {\r
-\r
- case 1:\r
- return HidItem->Data.U8;\r
-\r
- case 2:\r
- return HidItem->Data.U16;\r
-\r
- case 4:\r
- return HidItem->Data.U32;\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-\r
-/**\r
- Parse Local Item\r
-\r
- @param UsbMouse USB_MOUSE_DEV\r
- @param LocalItem Local Item\r
-\r
-\r
-**/\r
-STATIC\r
-VOID\r
-ParseLocalItem (\r
- IN USB_MOUSE_DEV *UsbMouse,\r
- IN HID_ITEM *LocalItem\r
- )\r
-{\r
- UINT32 Data;\r
-\r
- if (LocalItem->Size == 0) {\r
- //\r
- // No expected data for local item\r
- //\r
- return ;\r
- }\r
-\r
- Data = GetItemData (LocalItem);\r
-\r
- switch (LocalItem->Tag) {\r
-\r
- case HID_LOCAL_ITEM_TAG_DELIMITER:\r
- //\r
- // we don't support delimiter here\r
- //\r
- return ;\r
-\r
- case HID_LOCAL_ITEM_TAG_USAGE:\r
- return ;\r
-\r
- case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:\r
- if (UsbMouse->PrivateData.ButtonDetected) {\r
- UsbMouse->PrivateData.ButtonMinIndex = (UINT8) Data;\r
- }\r
-\r
- return ;\r
-\r
- case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:\r
- {\r
- if (UsbMouse->PrivateData.ButtonDetected) {\r
- UsbMouse->PrivateData.ButtonMaxIndex = (UINT8) Data;\r
- }\r
-\r
- return ;\r
- }\r
- }\r
-}\r
-\r
-STATIC\r
-VOID\r
-ParseGlobalItem (\r
- IN USB_MOUSE_DEV *UsbMouse,\r
- IN HID_ITEM *GlobalItem\r
- )\r
-{\r
- UINT8 UsagePage;\r
-\r
- switch (GlobalItem->Tag) {\r
- case HID_GLOBAL_ITEM_TAG_USAGE_PAGE:\r
- {\r
- UsagePage = (UINT8) GetItemData (GlobalItem);\r
-\r
- //\r
- // We only care Button Page here\r
- //\r
- if (UsagePage == 0x09) {\r
- //\r
- // Button Page\r
- //\r
- UsbMouse->PrivateData.ButtonDetected = TRUE;\r
- return ;\r
- }\r
- break;\r
- }\r
-\r
- }\r
-}\r
-\r
-\r
-\r
-/**\r
- Parse Main Item\r
-\r
- @param UsbMouse TODO: add argument description\r
- @param MainItem HID_ITEM to parse\r
-\r
- @return VOID\r
-\r
-**/\r
-STATIC\r
-VOID\r
-ParseMainItem (\r
- IN USB_MOUSE_DEV *UsbMouse,\r
- IN HID_ITEM *MainItem\r
- )\r
-{\r
- //\r
- // we don't care any main items, just skip\r
- //\r
- return ;\r
-}\r
-\r
-\r
-/**\r
- Parse Hid Item\r
-\r
- @param UsbMouse USB_MOUSE_DEV\r
- @param HidItem HidItem to parse\r
-\r
- @return VOID\r
-\r
-**/\r
-STATIC\r
-VOID\r
-ParseHidItem (\r
- IN USB_MOUSE_DEV *UsbMouse,\r
- IN HID_ITEM *HidItem\r
- )\r
-{\r
- switch (HidItem->Type) {\r
-\r
- case HID_ITEM_TYPE_MAIN:\r
- //\r
- // For Main Item, parse main item\r
- //\r
- ParseMainItem (UsbMouse, HidItem);\r
- break;\r
-\r
- case HID_ITEM_TYPE_GLOBAL:\r
- //\r
- // For global Item, parse global item\r
- //\r
- ParseGlobalItem (UsbMouse, HidItem);\r
- break;\r
-\r
- case HID_ITEM_TYPE_LOCAL:\r
- //\r
- // For Local Item, parse local item\r
- //\r
- ParseLocalItem (UsbMouse, HidItem);\r
- break;\r
- }\r
-}\r
-//\r
-// A simple parse just read some field we are interested in\r
-//\r
-\r
-/**\r
- Parse Mouse Report Descriptor\r
-\r
- @param UsbMouse USB_MOUSE_DEV\r
- @param ReportDescriptor Report descriptor to parse\r
- @param ReportSize Report descriptor size\r
-\r
- @retval EFI_DEVICE_ERROR Report descriptor error\r
- @retval EFI_SUCCESS Success\r
-\r
-**/\r
-EFI_STATUS\r
-ParseMouseReportDescriptor (\r
- IN USB_MOUSE_DEV *UsbMouse,\r
- IN UINT8 *ReportDescriptor,\r
- IN UINTN ReportSize\r
- )\r
-{\r
- UINT8 *DescriptorEnd;\r
- UINT8 *ptr;\r
- HID_ITEM HidItem;\r
-\r
- DescriptorEnd = ReportDescriptor + ReportSize;\r
-\r
- ptr = GetNextItem (ReportDescriptor, DescriptorEnd, &HidItem);\r
-\r
- while (ptr != NULL) {\r
- if (HidItem.Format != HID_ITEM_FORMAT_SHORT) {\r
- //\r
- // Long Format Item is not supported at current HID revision\r
- //\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- ParseHidItem (UsbMouse, &HidItem);\r
-\r
- ptr = GetNextItem (ptr, DescriptorEnd, &HidItem);\r
- }\r
-\r
- UsbMouse->NumberOfButtons = (UINT8) (UsbMouse->PrivateData.ButtonMaxIndex - UsbMouse->PrivateData.ButtonMinIndex + 1);\r
- UsbMouse->XLogicMax = UsbMouse->YLogicMax = 127;\r
- UsbMouse->XLogicMin = UsbMouse->YLogicMin = -127;\r
-\r
- return EFI_SUCCESS;\r
-}\r