⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mousehid.c

📁 Next BIOS Source code : Extensible Firmware Interface
💻 C
字号:
/*++

Copyright (c)  1999 - 2002 Intel Corporation. All rights reserved
This software and associated documentation (if any) is furnished
under a license and may only be used or copied in accordance
with the terms of the license. Except as permitted by such
license, no part of this software or documentation may be
reproduced, stored in a retrieval system, or transmitted in any
form or by any means without the express written consent of
Intel Corporation.


Module Name:

  Mousehid.c

Abstract:
  Parse mouse hid descriptor

--*/

#include "Efi.h"
#include "EfiDriverLib.h"
#include EFI_PROTOCOL_DEFINITION(SimplePointer)
#include "hid.h"
#include "mousehid.h"

//
// Get an item from report descriptor
//
static 
UINT8 *GetNextItem(
  IN  UINT8   *StartPos, 
  IN  UINT8   *EndPos,
  OUT HID_ITEM *HidItem
  )
{
  UINT8   Temp;

  if((EndPos - StartPos) <= 0) {
    return NULL;
  }
  
  Temp = *StartPos;
  StartPos++;
  
  HidItem->Type = (UINT8)((Temp >> 2) & 0x03); //bit 2,3
  HidItem->Tag = (UINT8)((Temp >> 4) & 0x0F);  //bit 4-7

  if(HidItem->Tag == HID_ITEM_TAG_LONG) 
  {
  //
  // Long Items are not supported by HID rev1.0,
  // although we try to parse it.
  //
    HidItem->Format = HID_ITEM_FORMAT_LONG;

    if ((EndPos - StartPos) >= 2) 
    {
      HidItem->Size = *StartPos++;
      HidItem->Tag  = *StartPos++;

      if((EndPos - StartPos) >= HidItem->Size) 
      {
        HidItem->Data.LongData = StartPos;
        StartPos += HidItem->Size;
        return StartPos;
      }
    }
  } 
  else 
  {
    HidItem->Format = HID_ITEM_FORMAT_SHORT;
    HidItem->Size = (UINT8)(Temp & 0x03); //bit 0, 1

    switch (HidItem->Size) 
    {
    case 0:
      //
      // No data
      //
      return StartPos;

    case 1: 
      //
      // One byte data
      //
      if ((EndPos - StartPos) >= 1) 
      {
        HidItem->Data.U8 = *StartPos++;
        return StartPos;
      }

    case 2: 
      //
      // Two byte data
      //
      if ((EndPos - StartPos) >= 2) 
      {
        EfiCopyMem (&HidItem->Data.U16, StartPos, sizeof (UINT16));
        StartPos += 2;
        return StartPos;
      }

    case 3: 
      //
      // 4 byte data, adjust size
      //
      HidItem->Size++;
      if ((EndPos - StartPos) >= 4) 
      {
        EfiCopyMem (&HidItem->Data.U32, StartPos, sizeof (UINT32));
        StartPos += 4;
        return StartPos;
      }
    }
  }
  return NULL;
}

static 
UINT32 
GetItemData(
  IN  HID_ITEM *HidItem
  )
{
  //
  // Get Data from HID_ITEM structure
  //
  switch (HidItem->Size) {
    case 1: return HidItem->Data.U8;
    case 2: return HidItem->Data.U16;
    case 4: return HidItem->Data.U32;
  }
  return 0;
}


static 
VOID
ParseLocalItem(
  IN  USB_MOUSE_DEV   *UsbMouse,
  IN  HID_ITEM        *LocalItem
  )
{
  UINT32 Data;

  if (LocalItem->Size == 0) 
  {
    //
    // No expected data for local item
    //
    return;
  }

  Data = GetItemData(LocalItem);

  switch (LocalItem->Tag) 
  {
  case HID_LOCAL_ITEM_TAG_DELIMITER:

    //
    // we don't support delimiter here
    //
    return;

  case HID_LOCAL_ITEM_TAG_USAGE:
    return;

  case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:
    if(UsbMouse->PrivateData.ButtonDetected) {
      UsbMouse->PrivateData.ButtonMinIndex = (UINT8)Data;
    }
    return;

  case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:
    {
      if(UsbMouse->PrivateData.ButtonDetected) {
        UsbMouse->PrivateData.ButtonMaxIndex = (UINT8)Data;
      }
      return;
    }
  }
}

static 
VOID
ParseGlobalItem(
  IN  USB_MOUSE_DEV   *UsbMouse,
  IN  HID_ITEM        *GlobalItem
  )
{
  
  switch (GlobalItem->Tag) 
  {
  case HID_GLOBAL_ITEM_TAG_USAGE_PAGE:
    {
      UINT8  UsagePage;

      UsagePage = (UINT8)GetItemData(GlobalItem);

      //
      // We only care Button Page here
      //
      if(UsagePage == 0x09) //Button Page
      {
        UsbMouse->PrivateData.ButtonDetected = TRUE;
        return;
      }
      break;
    }

  }
}

static
VOID
ParseMainItem(
  IN  USB_MOUSE_DEV   *UsbMouse,
  IN  HID_ITEM        *MainItem
  )
{
    //
    // we don't care any main items, just skip
    //
    return;
}

static
void
ParseHidItem(
  IN  USB_MOUSE_DEV   *UsbMouse,
  IN  HID_ITEM        *HidItem
  )
{
  switch(HidItem->Type)
  {
  case HID_ITEM_TYPE_MAIN:
    //
    // For Main Item, parse main item
    //
    ParseMainItem(UsbMouse, HidItem);
    break;

  case HID_ITEM_TYPE_GLOBAL:
    //
    // For global Item, parse global item
    //
    ParseGlobalItem(UsbMouse, HidItem);
    break;

  case HID_ITEM_TYPE_LOCAL:
    //
    // For Local Item, parse local item
    //
    ParseLocalItem(UsbMouse, HidItem);
    break;
  }
}


//
// A simple parse just read some field we are interested in
//
EFI_STATUS
ParseMouseReportDescriptor (
  IN  USB_MOUSE_DEV   *UsbMouse,
  IN  UINT8           *ReportDescriptor,
  IN  UINTN           ReportSize
  )
{
  UINT8       *DescriptorEnd;
  UINT8       *ptr;
  HID_ITEM    HidItem;

  DescriptorEnd = ReportDescriptor + ReportSize;

  ptr = GetNextItem(ReportDescriptor, DescriptorEnd, &HidItem);

  while (ptr != NULL) 
  {
    if (HidItem.Format != HID_ITEM_FORMAT_SHORT) 
    {
      //
      // Long Format Item is not supported at current HID revision
      //
      return EFI_DEVICE_ERROR;
    }

    ParseHidItem(UsbMouse, &HidItem);

    ptr = GetNextItem(ptr, DescriptorEnd, &HidItem);
  }

  UsbMouse->NumberOfButtons = (UINT8)(UsbMouse->PrivateData.ButtonMaxIndex - UsbMouse->PrivateData.ButtonMinIndex + 1);
  UsbMouse->XLogicMax = UsbMouse->YLogicMax = 127;
  UsbMouse->XLogicMin = UsbMouse->YLogicMin = -127;

  return EFI_SUCCESS;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -