HID规范
+ -

HID报告描述符ITEM的数据结构及代码分析过程

2022-05-16 816 0

HID报告描述符是数据流的形式,其中最小单位是项英文ITEM,根据定义分为4种。分别为GLOBA,LOCAK和MAIN

项分为长项和短项,这里我们只介绍短项。

短项头的一字节定义为:

typedef struct
{
    UCHAR Size:2;
    UCHAR Type:2;
    UCHAR Tag:4;
}ITEM_PREFIX, *PITEM_PREFIX;

BIT0,BIT1代表的后续数据的个数:

  • 0 = 0 bytes
  • 1 = 1 byte
  • 2 = 2 bytes
  • 3 = 4 bytes

BIT2,BIT3代表项的类型,其中:

#define ITEM_TYPE_MAIN                        0x0
#define ITEM_TYPE_GLOBAL                    0x1
#define ITEM_TYPE_LOCAL                        0x2
#define ITEM_TYPE_LONG                        0x3

而BIT4-7代表着功能号。

HID项的分析

这里使用C语言来分析,其中ReportDescriptor是报告描述符指针,ReportLength中长度。


   CurrentOffset = ReportDescriptor; //报告描述符指针
   ReportEnd = ReportDescriptor + ReportLength;//报告描述符的指针结尾

  do
    {
        //
        // get current item
        //
        CurrentItem = (PITEM_PREFIX)CurrentOffset;

        //
        // get item size
        //
        CurrentItemSize = ItemSize[CurrentItem->Size];
        Data = 0;

        if (CurrentItem->Type == ITEM_TYPE_LONG)
        {
            //
            // increment item size with size of data item
            //
            CurrentLongItem = (PLONG_ITEM)CurrentItem;
            CurrentItemSize += CurrentLongItem->DataSize;
        }
        else
        {
            //
            // get short item
            //
            CurrentShortItem = (PSHORT_ITEM)CurrentItem;

            //
            // get associated data
            //
            //ASSERT(CurrentItemSize == 1 || CurrentItemSize == 2 || CurrentItemSize == 4);
            if (CurrentItemSize == 1)
                Data = CurrentShortItem->Data.UData8[0];
            else if (CurrentItemSize == 2)
                Data = CurrentShortItem->Data.UData16[0];
            else if (CurrentItemSize == 4)
                Data = CurrentShortItem->Data.UData32;
            else
            {
                //
                // invalid item size
                //
                //Parser->Debug("CurrentItem invalid item size %lu\n", CurrentItemSize);
            }

        }

     CurrentOffset += CurrentItemSize + sizeof(ITEM_PREFIX);
    }while (CurrentOffset < ReportEnd);

其中短项和长项的结构定义如下:

typedef struct
{
    ITEM_PREFIX Prefix;

    union
    {
        UCHAR UData8[4];
        CHAR  SData8[4];
        USHORT UData16[2];
        SHORT SData16[2];
        ULONG UData32;
        LONG SData32;
    }Data;

}SHORT_ITEM, *PSHORT_ITEM;

typedef struct
{
    ITEM_PREFIX Prefix;
    UCHAR DataSize;
    UCHAR LongItemTag;
    UCHAR Data[0];

}LONG_ITEM,*PLONG_ITEM;
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 篇笔记 写笔记

USB复合HID设备报告描述符的区分
在USB规范中,设备的功能是通过接口来承载的,在USB规格书中就是接口描述符。对于一般的设备,一般一个接口就是一个功能,这个功能可以是鼠标,键盘或其它设备类型。当然这个只是对USB简易设备而言的,对于一些USB复杂设备如UVC摄像头,UAC音频等是多接口相互配合来实现其功能的,为了整合这么多接口使......
HID报告描述符详解
HID的报告描述符和其它描述符不一样,不是具有固定的数据结构,而是由固件开发商根据上报的数据自行组装的。这个组装的原材料是HID规范定义的ITEM。所以说HID报告描述符就像搭积木一样,其最终的数据结构和设计图纸是什么,都是由固件开发商决定的,但是其最终的产品又是由HID规范提供的各个标准积木模块搭......
USB键盘报告描述符数据格式分析
USB键盘的HID报表描述符的内容参见下表。数据的输入端点为中断方式,当有键盘敲击事件时,会上报数据长度为8字节的数据报告。0x05,0x01,// Global Generic Desktop0x09,0x06,// Local KeyBoard 0xA1,0x01,// Main app col......
USB鼠标HID报告描述符数据格式分析
注意:这里的鼠标为普通鼠标报告描述符的信息解释,其并不适用于全鼠标报表描述符。一个示例如下:0x05,0x01, // Global Generic Desktop0x09,0x02, // Local Mouse0xa1,0x01, // Main app collection0x09,......
USB中文网出品-HID报告描述符分析工具
HidReportParser.exe工具已经网页化,可访问http://www.usbzh.com/tool/usb.html 在线分析USB-HID报告描述符USB HID规范中有一个很重要的概念,就是HID的报告描述符。本人搞了这么久的HID设备开发,其中一项最头疼的是HID报告描述符的......
Windows系统HidD_GetPreparsedData数据结构PHIDP_PREPARSED_DATA研究
上天开了一个玩笑,研究了REACTOS的HidD_GetPreparsedData函数的数据结构(http://www.usbzh.com/article/detail-980.html ),竟然发现这和Windows体统的不兼容。所以这一节我们来研究一下Windows下的HidD_GetPrepa......
HID 报表描述符/报告描述符
报表描述符用于描述USB HID设备与主机之间数据交互的格式。根据数据的传输方向,分为输入报告和输出报告。输入报告是USB设备发送数据给主机的。大部分的USB HID设备主要实现的是输入报告。如我们平常使用的USB鼠标,就是通过我们点击鼠标按键或滑动鼠标流轮实现给主机上报鼠标的报告信息。输出报告......
HID报告描述符协议
HID报告描述符通过报告描述符的条目定义了HID报告数据的格式。对于大部分的HID设备来说,数据的传输方向都是输入的,即使用输入端点数据从设备端到主机端,并且使用的是中断的方式。当然HID设备不仅仅为数据的输入,有时也需要数据的输出。这时就需要一个输出中断端点来实现。报告描述符包含了属于特定Rep......
USB官网HID报告描述符生成工具
USB规范官网提供了一个HID报告描述符生成工具,https://www.usb.org/document-library/hid-descriptor-tool 使用我们此工具,我们可以:创建、编辑和验证HID报告描述符。输出多种输出(.txt、.inc、.h等)查看一些标准的设备报告描述符......
VS2019分析HID报告描述符解析源代码
常有人问,有没有HID解析的工具,好像除了usb官网提供的dt.exe,没有其它的好的东东了。Linux下有相关的工具,在本站的社区里:http://www.usbzh.com/zone/detail-12.html 可以查看做HID开发,其实最麻烦的就是HID报表描述符了。这里本人移植了Reac......
HID主条目input item、output item和feature item详解
HID的main条目按数据相关性可分为两种:与数据相关的 input、output、featureinput item、output item和feature item描述由一个或多个物理控件提供的数据的信息。 应用程序可以使用此信息来解释设备提供的数据。 单个item中定义的所有数据字段共享......
HID报告描述符Report Descriptor解析分析
HID独有的报告描述符也叫报表描述符对于初学者来说比较复杂,但是如果真正理解了它,我们又不得不惊吧于设计者的巧妙设计。HID报告描述符是由一系列的条目(item)组成的,一个item一般是又包括头部信息(bTag,bType,bSize)和数据内容。所以说item在HID的报告描述符中是最小的信息单......
HID报告描述符Usage
Usage是HID报告描述符的一部分,用于应用开发人员提供有关控制测量内容的信息。Usage标签指示了设备供应商对其设备的控制或者设备控制组的特定用途建议。例如虽然报告描述符中定义了数据格式(例如,三个 8 位字段),但使用Usages定义了应对数据执行的操作含义,例如 x、y 和 z 输入。 此功......
HID报告描述符分类大全
下表列出的是全部的项目的前缀字和简要功能说明。项目类型项目标志(Tag)项目前缀,nn为数据长度功能说明MainInput8x1000 00 nn定义输入报表,主机利用该信息解析设备提供的数据。主机向控制端口发送Get_Report实现输入MainOutpu......
HID 全局条目(Global Item)
全局项目主要用来选择用途页(Usage Page),定义数据域的长度(Report Count)、数量(Report Size)、报告ID(ReportId)等。全局项目描述对后续的所有项目有效,除非遇到有新的全局项目。常见的全局项目有:Usage Page(用途页)Logical Mini......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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