HID规范
+ -

HID报告描述符的四种类型MAIN ITEM/LOCAL ITEM/GLOBAL ITEM/LONG ITEM源码解析

2022-05-17 570 0

HID的报告描述我们之前分为两大全,分别为短项和长项,其中短项又分为3种,分别为main,local,global,而长项只分为long。
HID报告描述符的项分类使用其首字节的BIT2,BIT3的值来区分,如下:

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

我们也可以通过定义一个结构体ITEM_PREFIX来判断,ITEM_PREFIX的定义我们之前说过,其结构定义如下:

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

可以通过如下代码来进行解析:

static UCHAR ItemSize[4] = { 0, 1, 2, 4 };

PUCHAR CurrentOffset = HidReportPoint;
ULONG  HidReportLength = 实际的报告描述符长度;
do
{

    PITEM_PREFIX CurrentItem = (PITEM_PREFIX)CurrentOffset;

    //参数个数
    ULONG CurrentItemSize = ItemSize[CurrentItem->Size];

    //长项类型
     if (CurrentItem->Type == ITEM_TYPE_LONG)
     {
         //
         // increment item size with size of data item
         //
         CurrentLongItem = (PLONG_ITEM)CurrentItem;
         CurrentItemSize += CurrentLongItem->DataSize;
     }
     else
     {
         if (CurrentItem->Type == ITEM_TYPE_MAIN)
         {
             //main item
         }
         else if (CurrentItem->Type == ITEM_TYPE_GLOBAL)
         {
             //globa item
         }
         else if (CurrentItem->Type == ITEM_TYPE_LOCAL)
         {
             //local item
         }
        else 
         {
             //never run here
         }
     }

    //
    // move to next item
    //
    CurrentOffset += CurrentItemSize + sizeof(ITEM_PREFIX);

}while (CurrentOffset < ReportEnd);
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 篇笔记 写笔记

HID 全局条目(Global Item)
全局项目主要用来选择用途页(Usage Page),定义数据域的长度(Report Count)、数量(Report Size)、报告ID(ReportId)等。全局项目描述对后续的所有项目有效,除非遇到有新的全局项目。常见的全局项目有:Usage Page(用途页)Logical Mini......
HID报告描述符主项ITEM_TYPE_MAIN-COLLECTION和END COLLECTION
主项ITEM_TYPE_MAIN时,ITEM_PREFIX的Type(BIT2,BIT3)为0时。#define ITEM_TYPE_MAIN 0x0主项主要包括以下几个:ITEM_TAG_MAIN_COLLECTIONITEM_TAG_MAIN......
HID报告描述符LOCAL ITEM解析
HID报告描述符的LOCAL ITEM相当于报告描述符的局部变量,只能当前属性有效,超过作用域不再有意义。LOCAL ITEM包括的内容有:#define ITEM_TAG_LOCAL_USAGE 0x0#define ITEM_TAG_LOCAL_USAGE_MI......
HID报告描述符的GLOBAL ITEM
HID报告描述符的GLOBAL ITEM相当于报告描述符的全部变量,只能不更新,以前的值就永远有意义。ITEM_PREFIX的BIT2,BIT3为01,bit4-7的值为:GLOBAL ITEM包括的内容有:#define ITEM_TAG_GLOBAL_USAGE_PAGE ......
HID报告描述符的四种类型MAIN ITEM/LOCAL ITEM/GLOBAL ITEM/LONG ITEM源码解析
HID的报告描述我们之前分为两大全,分别为短项和长项,其中短项又分为3种,分别为main,local,global,而长项只分为long。HID报告描述符的项分类使用其首字节的BIT2,BIT3的值来区分,如下:#define ITEM_TYPE_MAIN ......
HID报告描述符全局项REPORT_COUNT和REPORT_SIZE
HID报告描述符全局项ReportCount和ReportSize用于指示报告描述符数据项的大小,其中:REPORT_COUNT:用于指定LOCAL USAGE的个数REPORT_SIZE:用于指定每个USAGE的数据大小。如鼠标的X和Y坐标 USAGE (X) ......
USB音频设备注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\MediaCategories下GUID分析
windows系统下的注册表:计算机HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlMediaCategories在很多的GUID,从MediaCategories来看,是多媒体设备的目录分类,所以以下的GUID应与多媒体设备相关。该目......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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