HID规范
+ -

使用USB鼠标HID报告描述符分析HID_REPORT及成员HID_REPORT_ITEM关系

2022-05-19 1318 0

HID报告描述分过程比较麻烦,对于MAIN ITEM,相对来说比较简单,就是一个简单的树形结构。但对于GLOBAL ITEM和LOCAL ITEM组织的数据结构定义,还是相对比较麻烦的。
每一个HID报告描述符都会有很多集合,这是由MAIN ITEM的Collection关键字定义的,无论它是Application类型的还是Physical类型的,反正其形成的树形关系只要报告描述符不变,其树形关系就不变。
对于每个COLLECTION,可能会有HID的报告信息,每个报告使用HID_REPORT结构体定义,而每个报告的数据结构组成是由HID_REPORT_ITEM定义的。

typedef struct __HID_COLLECTION__
{
    UCHAR Type;
    ULONG Usage;
    UCHAR StringID;
    UCHAR PhysicalID;

    ULONG ReportCount;
    ULONG NodeCount;
    struct __HID_COLLECTION__ ** Nodes;//ChildeCount
    struct __HID_COLLECTION__ * Root;
    struct _HID_REPORT ** Reports; //ReportCount
    ULONG Offsets[1];
}HID_COLLECTION, *PHID_COLLECTION;

typedef struct _HID_REPORT
{
    UCHAR Type;
    UCHAR ReportID;
    ULONG ReportSize;
    ULONG ItemCount;
    ULONG ItemAllocated;
    HID_REPORT_ITEM Items[1];
}HID_REPORT, *PHID_REPORT;

typedef struct
{
    ULONG ByteOffset;
    UCHAR Shift;
    ULONG Mask;
    UCHAR BitCount;
    UCHAR HasData;
    UCHAR Array;
    UCHAR Relative;
    ULONG Minimum;
    ULONG Maximum;
    ULONG UsageMinimum;
    ULONG UsageMaximum;
    ULONG Data;
    UCHAR Valid;
}HID_REPORT_ITEM, *PHID_REPORT_ITEM;

这里我们以USB鼠标的报告描述符来分析这些数据结构的关系:

 0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
 0x09, 0x02,        // Usage (Mouse)
 0xA1, 0x01,        // Collection (Application)
 0x09, 0x01,        //   Usage (Pointer)
 0xA1, 0x00,        //   Collection (Physical)
 0x95, 0x03,        //     Report Count (3)
 0x75, 0x01,        //     Report Size (1)
 0x05, 0x09,        //     Usage Page (Button)
 0x19, 0x01,        //     Usage Minimum (0x01)
 0x29, 0x03,        //     Usage Maximum (0x03)
 0x15, 0x00,        //     Logical Minimum (0)
 0x25, 0x01,        //     Logical Maximum (1)
 0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
 0x95, 0x01,        //     Report Count (1)
 0x75, 0x05,        //     Report Size (5)
 0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
 0x95, 0x03,        //     Report Count (3)
 0x75, 0x08,        //     Report Size (8)
 0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
 0x09, 0x30,        //     Usage (X)
 0x09, 0x31,        //     Usage (Y)
 0x09, 0x38,        //     Usage (Wheel)
 0x15, 0x81,        //     Logical Minimum (-127)
 0x25, 0x7F,        //     Logical Maximum (127)
 0x81, 0x06,        //     Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
 0xC0,              //   End Collection

以上的数据结构经过分析后的数据结构如下:
USB鼠标HID报告描述符
可以看到,其总共会有7个HID_REPORT_ITEM。我们分别来看一下看个的内容:

CurrentCollection->Reports[0]->Items[0]

类型 成员
unsigned long ByteOffset 0x00000000
unsigned char Shift 0x00 ‘\0’
unsigned long Mask 0x00000001
unsigned char BitCount 0x01 ‘\x1’
unsigned char HasData 0x01 ‘\x1’
unsigned char Array 0x00 ‘\0’
unsigned char Relative 0x00 ‘\0’
unsigned long Minimum 0x00000000
unsigned long Maximum 0x00000001
unsigned long UsageMinimum 0x00090001
unsigned long UsageMaximum 0x00090001
unsigned long Data 0x00000000
unsigned char Valid 0x00 ‘\0’

CurrentCollection->Reports[0]->Items[1]

类型 成员
unsigned long ByteOffset 0x00000000
unsigned char Shift 0x01 ‘\x1’
unsigned long Mask 0x00000001
unsigned char BitCount 0x01 ‘\x1’
unsigned char HasData 0x01 ‘\x1’
unsigned char Array 0x00 ‘\0’
unsigned char Relative 0x00 ‘\0’
unsigned long Minimum 0x00000000
unsigned long Maximum 0x00000001
unsigned long UsageMinimum 0x00090002
unsigned long UsageMaximum 0x00090002
unsigned long Data 0x00000000
unsigned char Valid 0x00 ‘\0’

CurrentCollection->Reports[0]->Items[2]

类型 成员
unsigned long ByteOffset 0x00000000
unsigned char Shift 0x02 ‘\x2’
unsigned long Mask 0x00000001
unsigned char BitCount 0x01 ‘\x1’
unsigned char HasData 0x01 ‘\x1’
unsigned char Array 0x00 ‘\0’
unsigned char Relative 0x00 ‘\0’
unsigned long Minimum 0x00000000
unsigned long Maximum 0x00000001
unsigned long UsageMinimum 0x00090003
unsigned long UsageMaximum 0x00090003
unsigned long Data 0x00000000
unsigned char Valid 0x00 ‘\0’

CurrentCollection->Reports[0]->Items[3]

类型 成员
unsigned long ByteOffset 0x00000000
unsigned char Shift 0x03 ‘\x3’
unsigned long Mask 0x0000001f
unsigned char BitCount 0x05 ‘\x5’
unsigned char HasData 0x00 ‘\0’
unsigned char Array 0x00 ‘\0’
unsigned char Relative 0x00 ‘\0’
unsigned long Minimum 0x00000000
unsigned long Maximum 0x00000001
unsigned long UsageMinimum 0x00090000
unsigned long UsageMaximum 0x00090000
unsigned long Data 0x00000000
unsigned char Valid 0x00 ‘\0’

CurrentCollection->Reports[0]->Items[4]

类型 成员
unsigned long ByteOffset 0x00000001
unsigned char Shift 0x00 ‘\0’
unsigned long Mask 0x000000ff
unsigned char BitCount 0x08 ‘\b’
unsigned char HasData 0x01 ‘\x1’
unsigned char Array 0x00 ‘\0’
unsigned char Relative 0x01 ‘\x1’
unsigned long Minimum 0x00000081
unsigned long Maximum 0x0000007f
unsigned long UsageMinimum 0x00010030
unsigned long UsageMaximum 0x00010030
unsigned long Data 0x00000000
unsigned char Valid 0x00 ‘\0’

CurrentCollection->Reports[0]->Items[5]

类型 成员
unsigned long ByteOffset 0x00000002
unsigned char Shift 0x00 ‘\0’
unsigned long Mask 0x000000ff
unsigned char BitCount 0x08 ‘\b’
unsigned char HasData 0x01 ‘\x1’
unsigned char Array 0x00 ‘\0’
unsigned char Relative 0x01 ‘\x1’
unsigned long Minimum 0x00000081
unsigned long Maximum 0x0000007f
unsigned long UsageMinimum 0x00010031
unsigned long UsageMaximum 0x00010031
unsigned long Data 0x00000000
unsigned char Valid 0x00 ‘\0’

CurrentCollection->Reports[0]->Items[6]

类型 成员
unsigned long ByteOffset 0x00000003
unsigned char Shift 0x00 ‘\0’
unsigned long Mask 0x000000ff
unsigned char BitCount 0x08 ‘\b’
unsigned char HasData 0x01 ‘\x1’
unsigned char Array 0x00 ‘\0’
unsigned char Relative 0x01 ‘\x1’
unsigned long Minimum 0x00000081
unsigned long Maximum 0x0000007f
unsigned long UsageMinimum 0x00010038
unsigned long UsageMaximum 0x00010038
unsigned long Data 0x00000000
unsigned char Valid 0x00 ‘\0’
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报告描述符数据格式分析
注意:这里的鼠标为普通鼠标报告描述符的信息解释,其并不适用于全鼠标报表描述符。一个示例如下:0x05,0x01, // Global Generic Desktop0x09,0x02, // Local Mouse0xa1,0x01, // Main app collection0x09,......
Windows系统HidD_GetPreparsedData数据结构PHIDP_PREPARSED_DATA研究
上天开了一个玩笑,研究了REACTOS的HidD_GetPreparsedData函数的数据结构(http://www.usbzh.com/article/detail-980.html ),竟然发现这和Windows体统的不兼容。所以这一节我们来研究一下Windows下的HidD_GetPrepa......
为什么Windows7重新安装系统后插在USB3.0端口的鼠标不能使用?
在 Windows 7 及更早版本的操作系统中,USB 3.0 驱动程序堆栈由第三方提供,操作系统不提供USB3.0驱动栈。 因此,Windows7重新安装系统后插在USB3.0端口上的所有设备都无法工作,需要安装第三方提供的USB控制器和集线器驱动,这样才能识别出挂接在该USB总线下的设备。从Wi......
HID 报表描述符鼠标实例
USAGE_PAGE (Generic Desktop) 05 01USAGE (Mouse) 09 02COLLECTION (Application) A1 01 ......
Win10使用虚拟USB鼠标实现自动挂机测试功能
昨天要测试一个软件不停的整机的功能:在整机软件中需要不停地点击某个软件的按钮,启动会议功能,然后隔一段时间后,需要再次呼出关闭按钮,并点击将该按钮停止会议,如此往复的操作。当然这些操作是需要人工操作点击软件界面的某些按钮实现的。本以为是一个很简单的东西,没想到还是弄出了花样。初始版本 - 脚本方......
USB鼠标HID全局坐标报表描述符
常用的USB HID鼠标是相对的描述符,鼠标的移动是相对当前位置的相对移动。如相对当前位置左移,右移等。这种相对的坐标描述符有的时候在使用上有一定麻烦的,最重要的原因就是需要计算鼠标指针的当前位置。如本人之前做的一个USB鼠标挂机测试脚本,内容详见:http://www.usbzh.com/ar......
HID复合设备(键盘、鼠标)的实现
在使用一些USB键盘或鼠标的时候,特别是一些电竟高档HID设备时,经常发现这些设备会额外定义一些特别的快捷键,使得这些设备不仅有基础设备(如键盘,鼠标)的功能,也有一些特别的快捷功能(如系统声音的放大放小)。甚至更有一些复杂的设备,只需要一个USB接口,就同时支持鼠标键盘功能或在键盘的额外区域支持触......
Windows10下开发虚拟USB鼠标之枚举子设备失败(STATUS_DEVICE_DATA_ERROR)
之前发过一篇文章:Win10使用虚拟USB鼠标实现自动挂机测试功能(文章地址:http://www.usbzh.com/article/detail-476.html ) 使用的是虚拟驱动实现的一个虚拟USB鼠标,实现了产品的自动测试功能。生成的设备在设备管理器中如下:但在开发过程中,并不是一帆......
Windows下通过USB虚拟的键盘鼠标总结
产品级详见:https://www.usbzh.com/article/detail-1182.html哐哐铛铛的,终于把以前搞的虚拟键盘、鼠标的驱动代码重新整理完成,并且在此基础上将USB虚拟的键盘和鼠标整合到一个驱动中。将键盘和鼠标的代码合并在一起的原因很简单:第一是为了验证自己写的这个虚......
USB虚拟鼠标功能演示
该功能是USB中文网的开发例程,其设计原理见:http://www.usbzh.com/article/detail-476.html使用驱动程序实现的是虚拟USB鼠标功能。鼠标的事件由应用应用层下发:当前完成的功能:鼠标指针的移动鼠标的点击事件动态创建和销毁鼠标设备支持WIN7,WIN10 ......
USB鼠标HID设备示例
本示例的鼠标是一个最简单的USB鼠标,不包括任何其它附加设备。该设备在设备管理器中如下图所示:该USB鼠标的枚举过程如示:Device Length Phase Data Descriptio......
USB中文网出品-HID虚拟全局坐标鼠标
以往我们的鼠标指针移动都是相对当前的坐标进行移动,如果要移动到指定的位置,需要不停地获取当前应用层的鼠标指针进行逼近,这样实现鼠标的定位移动或者按下等动作。但是在实际的USB鼠标分类中,还存在另一种鼠标类型,叫做全局坐标鼠标类型,即通过在指定相关的XY坐标进行相应的鼠标动作,其实现原理也和触摸屏类似......
USB键盘鼠标芯片选型
型号协议功能时钟工作温度封装 CH93292.0 全速 Device串口转HID键盘/鼠标/自定义HID芯片,支持多种工作模式和串口通讯模式内置-40~+85℃SOP16 CH93282.0 全速 Device串口转HID键盘芯片,实现串口数据转US......
BIOS下HID鼠标枚举实例及数据抓包分析
通过BIOS下识别USB键盘一节可以知道,一个鼠标想要在BIOS下使用,使用系统默认的报告描述符即主机不再主动获取报告描述符,并且这的一个前提条件是接口描述符的bInterfaceSubClass必须为1,表示HID设备符是一个启动设备(Boot Device)。实际在使用时,发现有获取这个报告......
HID报告描述符教程
USB HID报告描述符是USB主机可以从USB设备请求获取的描述符之一。HID 设备使用报告向主机发送数据,HID报告描述符告诉主机如何解释数据。这里我们将尝试向您展示如何编写这些描述符。什么是USB HID 报告描述符?HID 协议使设备的实现非常简单。设备定义它们的数据包,然后向主机提供一个......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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