HID规范
+ -

HID报告描述符INPUT ITEM,OUTPUT ITEM,FEATERU ITEM Bit 1{Array (0) | Variable (1)}和HID_REPORT_ITEM的关系

2022-05-19 769 0

HID的MAIN ITEM的INPUT ITEM,OUTPUT ITEM,FEATERU ITEM Bit定义如下:

  • 0:代表是数组
  • 1:代表变量

INPUT ITEM,OUTPUT ITEM,FEATERU ITEM

我们在 HID主条目input item、output item和feature item详解http://www.usbzh.com/article/detail-527.html 一文对此有详细的解释。不过这里我们从源代码的逻辑来解释其和HID_REPORT_ITEM的关系。

HID_REPORT_ITEM结构体在报告描述符的分析过程中至关重要,共代表着一个HID报告数据的最小颗料单元,其描述着数据的大小,最大最小值等情况。大家可以参考使用USB鼠标HID报告描述符分析HID_REPORT及成员HID_REPORT_ITEM关系http://www.usbzh.com/article/detail-967.html 一文来查看。

在HID报告描述符其定义数据功能时,一般会通过以下几种方法:

  • 第一种是直接使用LOCAL ITEM的USAGE来定义。一般定义几个USAGE,在其GLOBAL ITEM中会指定REPORT_COUNT为多少。如鼠标的XY定义如下:
      USAGE (X)                               09 30
      USAGE (Y)                               09 31
      LOGICAL_MINIMUM (-127)                  15 81 
      LOGICAL_MAXIMUM (127)                   25 7F 
      REPORT_SIZE (8)                         75 08 
      REPORT_COUNT (2)                        95 02 
     INPUT (Data,Var,Rel)                    81 06
    

另一种情况是可能由于功能比较多,且USAGE的编号连续,可以通过LOGICAL_MINIMUM和LOGICAL_MAXIMUM 来定义,如USB的按键功能.

   USAGE_PAGE (Button)                     05 09
    USAGE_MINIMUM (Button 1)                19 01
    USAGE_MAXIMUM (Button 3)                29 03
    LOGICAL_MINIMUM (0)                     15 00 
    LOGICAL_MAXIMUM (1)                     25 01 
    REPORT_COUNT (3)                        95 03 
    REPORT_SIZE (1)                         75 01 
   INPUT (Data,Var,Abs)                    81 02

所以这个最小和最大的范围内的数量一般也等于REPORT_COUNT。
以上都是INPUT ITEM,OUTPUT ITEM,FEATERU ITEM Bit 1{Array (0)}的情况。

在看多了HID报告描述符的时候,我们也见过USB键盘的报告描述符使用了数组定义,如:

  REPORT_COUNT (6)                              95 06 
  REPORT_SIZE (8)                               75 08 
  LOGICAL_MINIMUM (0)                           15 00 
  LOGICAL_MAXIMUM (101)                         25 65 
  USAGE_PAGE (Keyboard)                         05 07
  USAGE_MINIMUM (Reserved (no event indicated))    19 00
  USAGE_MAXIMUM (Keyboard Application)          29 65
  INPUT (Data,Ary,Abs)                          81 00

这里使用数组的方式来一定要义,而USAGE_MINIMUM 和USAGE_MAXIMUM退化成和LOGICAL_MINIMUM、LOGICAL_MAXIMUM的功能。这里的含义就变成了定义了1个数组,数组大小为6,每个成员为1个字节。其值范围可以为00~0x65。

其实在使用HidParser_InitReportItem对每个HID_REPORT_ITEM初始化时,就会分为三种情况:

  • 第一种为数组时
  • 第二种为变量时,未指定USAGE_MINIMUM和USAGE_MAXIMUM,这时使用解析生成的UsageStack按顺序初始化。
  • 第三种为变量时,指定了USAGE_MINIMUM和USAGE_MAXIMUM,则从SAGE_MINIMUM+index索引进行初始化HID_REPORT_ITEM的USAGE.

这三种情况在源代码中可以清晰地看到:

HIDPARSER_STATUS
HidParser_InitReportItem(
    IN PHID_REPORT Report,
    IN PHID_REPORT_ITEM ReportItem,
    IN PGLOBAL_ITEM_STATE GlobalItemState,
    IN PLOCAL_ITEM_STATE LocalItemState,
    IN PMAIN_ITEM_DATA ItemData,
    IN ULONG ReportItemIndex)
{
    ULONG LogicalMinimum;
    ULONG LogicalMaximum;
    ULONG PhysicalMinimum;
    ULONG PhysicalMaximum;
    ULONG UsageMinimum;
    ULONG UsageMaximum;
    USAGE_VALUE UsageValue;

    //
    // get logical bounds
    //
    LogicalMinimum = GlobalItemState->LogicalMinimum;
    LogicalMaximum = GlobalItemState->LogicialMaximum;
    if (LogicalMinimum > LogicalMaximum)
    {
        //
        // make them signed
        //
        HidParser_SignRange(LogicalMinimum, LogicalMaximum, &LogicalMinimum, &LogicalMaximum);
    }
    //ASSERT(LogicalMinimum <= LogicalMaximum);

    //
    // get physical bounds
    //
    PhysicalMinimum = GlobalItemState->PhysicalMinimum;
    PhysicalMaximum = GlobalItemState->PhysicalMaximum;
    if (PhysicalMinimum > PhysicalMaximum)
    {
        //
        // make them signed
        //
        HidParser_SignRange(PhysicalMinimum, PhysicalMaximum, &PhysicalMinimum, &PhysicalMaximum);
    }
    //ASSERT(PhysicalMinimum <= PhysicalMaximum);

    //
    // get usage bounds
    //
    UsageMinimum = 0;
    UsageMaximum = 0;
    //Array==0 ARRAY ,Variable==1
    if (ItemData->ArrayVariable == FALSE)
    {
        //
        // get usage bounds
        //
        UsageMinimum = LocalItemState->UsageMinimum.u.Extended;
        UsageMaximum = LocalItemState->UsageMaximum.u.Extended;
    }
    else
    {
        //
        // get usage value from stack
        //
        if (ReportItemIndex < LocalItemState->UsageStackUsed)
        {
            //
            // use stack item
            //
            UsageValue = LocalItemState->UsageStack[ReportItemIndex];//使用用户指定的USAGE
        }
        else
        {
            //
            // get usage minimum from local state
            //
            UsageValue = LocalItemState->UsageMinimum;

            //
            // append item index
            //
            UsageValue.u.Extended += ReportItemIndex;//USAGEid+1

            if (LocalItemState->UsageMaximumSet)
            {
                if (UsageValue.u.Extended > LocalItemState->UsageMaximum.u.Extended)
                {
                    //
                    // maximum reached
                    //
                    UsageValue.u.Extended = LocalItemState->UsageMaximum.u.Extended;
                }
            }
        }

        //
        // usage usage bounds
        //
        UsageMinimum = UsageMaximum = UsageValue.u.Extended;
    }

    //
    // now store all values
    //
    ReportItem->ByteOffset = (Report->ReportSize / 8);
    ReportItem->Shift = (Report->ReportSize % 8);
    ReportItem->Mask = ~(0xFFFFFFFF << GlobalItemState->ReportSize);
    ReportItem->BitCount = GlobalItemState->ReportSize;
    ReportItem->HasData = (ItemData->DataConstant == FALSE);
    ReportItem->Array = (ItemData->ArrayVariable == 0);
    ReportItem->Relative = (ItemData->Relative != FALSE);
    ReportItem->Minimum = LogicalMinimum;
    ReportItem->Maximum = LogicalMaximum;
    ReportItem->UsageMinimum = UsageMinimum;
    ReportItem->UsageMaximum = UsageMaximum;

    //
    // increment report size
    //
    Report->ReportSize += GlobalItemState->ReportSize;

    //
    // completed successfully
    //
    return HIDPARSER_STATUS_SUCCESS;
}
HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

Windows系统HidD_GetPreparsedData数据结构PHIDP_PREPARSED_DATA研究
上天开了一个玩笑,研究了REACTOS的HidD_GetPreparsedData函数的数据结构(http://www.usbzh.com/article/detail-980.html ),竟然发现这和Windows体统的不兼容。所以这一节我们来研究一下Windows下的HidD_GetPrepa......
HID主条目input item、output item和feature item详解
HID的main条目按数据相关性可分为两种:与数据相关的 input、output、featureinput item、output item和feature item描述由一个或多个物理控件提供的数据的信息。 应用程序可以使用此信息来解释设备提供的数据。 单个item中定义的所有数据字段共享......
HID规范、HID Usage Tables版本及文档分类
HID是Human Interface Devices的缩写,传统意义我们使用HID设备一般特指USB HID键盘和USB HID鼠标,但实际上USB HID规范不仅包括USB HID键盘和USB HID鼠标,也包括很多其它的标准USB HID设备如游戏手柄、HID触摸屏等,也包括一些自定义的USB......
HID报告描述符Usage
Usage是HID报告描述符的一部分,用于应用开发人员提供有关控制测量内容的信息。Usage标签指示了设备供应商对其设备的控制或者设备控制组的特定用途建议。例如虽然报告描述符中定义了数据格式(例如,三个 8 位字段),但使用Usages定义了应对数据执行的操作含义,例如 x、y 和 z 输入。 此功......
Teams 标准HID Usage Tables
设备的电话功能必须基于USB HID使用表的USB HID电话设备页面。下表显示了客户端支持的USB HID使用命令的子集。Device Page (0x08) UsagesMicrosoft Team和Skype for Business支持的电话设备页面(0x0B)Usages.Usa......
HID.DLL导出函数HidD_GetInputReport探究
HidD_GetInputReport的功能HidD_GetInputReport用于获取输入报告(input report)。说明:不过微软关于此函数有一个特别的说明,就是只能获取当前的输入报告,不能连续的获取,因为可能会丢数据。所以如果要连续的获取输入报告,需要使用ReadFile函数。同时,......
Windows系统HID设备获取输入报告ReadFile和HidD_GetInputReport区别
在Windows系统提供的HID接口中获取输入报告内容一般通过两个接口,分别为ReadFile和HidD_GetInputReport。不过大家有没有发现,在实际的使用过程中,大家还是使用ReadFile多一些,在某些的时候也会用HidD_GetInputReport,不过它们之间的区别,好像有时很......
HID报告描述符主项InputReport、OutputReport,FeatureReport
HID报告描述符主项除过COLLECTION项,就是输入报告InputReport,输出报告OutputReport和特性报告FeatureReport。ITEM_PREFIX的BIT2,BIT3为00,bit4-7的值为:#define ITEM_TAG_MAIN_INPUT ......
HID报告描述符LOCAL ITEM解析
HID报告描述符的LOCAL ITEM相当于报告描述符的局部变量,只能当前属性有效,超过作用域不再有意义。LOCAL ITEM包括的内容有:#define ITEM_TAG_LOCAL_USAGE 0x0#define ITEM_TAG_LOCAL_USAGE_MI......
使用USB鼠标HID报告描述符分析HID_REPORT及成员HID_REPORT_ITEM关系
HID报告描述分过程比较麻烦,对于MAIN ITEM,相对来说比较简单,就是一个简单的树形结构。但对于GLOBAL ITEM和LOCAL ITEM组织的数据结构定义,还是相对比较麻烦的。每一个HID报告描述符都会有很多集合,这是由MAIN ITEM的Collection关键字定义的,无论它是Appl......
HID报告描述符INPUT ITEM,OUTPUT ITEM,FEATERU ITEM Bit 1{Array (0) | Variable (1)}和HID_REPORT_ITEM的关系
HID的MAIN ITEM的INPUT ITEM,OUTPUT ITEM,FEATERU ITEM Bit定义如下:0:代表是数组1:代表变量我们在 HID主条目input item、output item和feature item详解http://www.usbzh.com/article......
HID报告描述符USAGE_PAGE分类
下表列出了当前定义的USAGE PAGE分类ID.USAGE PAGE IDPage Name00Undefined 01Generic Desktop Controls 02Simulation Controls 03VR Controls 04......
Digitizers Page (0x0D)
Usage IDUsage NameUsage TypesSection0Undefined1DigitizerCA16.12PenCA16.13Light PenCA16.14Touch ScreenCA16.15......
Haptics Page (0x0E)
Usage IDUsage NameUsage TypesSection0Undefined1Simple Haptic ControllerCA/CL17.102-0FReserved10Waveform ListNAry17.1......
Eye and Head Trackers Page(0x12)
Usage IDUsage NameUsage TypesSection0Undefined1Eye TrackerCA19.12Head TrackerCA19.103-0FReserved10Tracking DataCP......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!