HID规范
+ -

HID报告描述符的GLOBAL ITEM

2022-05-16 451 0

HID报告描述符的GLOBAL ITEM相当于报告描述符的全部变量,只能不更新,以前的值就永远有意义。

ITEM_PREFIX的BIT2,BIT3为01,bit4-7的值为:
GLOBAL ITEM包括的内容有:

#define ITEM_TAG_GLOBAL_USAGE_PAGE            0x0
#define ITEM_TAG_GLOBAL_LOGICAL_MINIMUM        0x1
#define ITEM_TAG_GLOBAL_LOGICAL_MAXIMUM        0x2
#define ITEM_TAG_GLOBAL_PHYSICAL_MINIMUM    0x3
#define ITEM_TAG_GLOBAL_PHYSICAL_MAXIMUM    0x4
#define ITEM_TAG_GLOBAL_UNIT_EXPONENT        0x5
#define ITEM_TAG_GLOBAL_UNIT                0x6
#define ITEM_TAG_GLOBAL_REPORT_SIZE            0x7
#define ITEM_TAG_GLOBAL_REPORT_ID            0x8
#define ITEM_TAG_GLOBAL_REPORT_COUNT        0x9
#define ITEM_TAG_GLOBAL_PUSH                0xa
#define ITEM_TAG_GLOBAL_POP                    0xb
UCHAR Size:2 UCHAR Type:2 UCHAR Tag:4
ITEM_TAG_GLOBAL_USAGE_PAGE XX ITEM_TYPE_GLOBAL=1 0
ITEM_TAG_GLOBAL_LOGICAL_MINIMUM XX ITEM_TYPE_GLOBAL=1 1
ITEM_TAG_GLOBAL_LOGICAL_MAXIMUM XX ITEM_TYPE_GLOBAL=1 2
ITEM_TAG_GLOBAL_PHYSICAL_MINIMUM XX ITEM_TYPE_GLOBAL=1 3
ITEM_TAG_GLOBAL_PHYSICAL_MAXIMUM XX ITEM_TYPE_GLOBAL=1 4
ITEM_TAG_GLOBAL_UNIT_EXPONENT XX IITEM_TYPE_GLOBAL=1 5
ITEM_TAG_GLOBAL_UNIT XX ITEM_TYPE_GLOBAL=1 6
ITEM_TAG_GLOBAL_REPORT_SIZE XX ITEM_TYPE_GLOBAL=1 7
ITEM_TAG_GLOBAL_REPORT_ID XX ITEM_TYPE_GLOBAL=1 8
ITEM_TAG_GLOBAL_REPORT_COUNT XX ITEM_TYPE_GLOBAL=1 9
ITEM_TAG_GLOBAL_PUSH XX ITEM_TYPE_GLOBAL=1 0x0a
ITEM_TAG_GLOBAL_POP XX ITEM_TYPE_GLOBAL=1 0x0B

全局项的功能比较简单,就是更新GLOBAL_ITEM_STATE GlobalItemState相关的参数。

typedef struct
{
...
    //
    // global item state
    //
    GLOBAL_ITEM_STATE GlobalItemState;
...
}HID_PARSER_CONTEXT, *PHID_PARSER_CONTEXT;

GLOBAL_ITEM_STATE的定义如下:

typedef struct __GLOBAL_ITEM_STATE_
{
    USHORT UsagePage;
    ULONG  LogicalMinimum;
    ULONG  LogicialMaximum;
    ULONG  PhysicalMinimum;
    ULONG  PhysicalMaximum;
    UCHAR  UnitExponent;
    UCHAR  Unit;
    ULONG  ReportSize;
    ULONG  ReportCount;
    UCHAR  ReportId;
    struct __GLOBAL_ITEM_STATE__ * Next;
}GLOBAL_ITEM_STATE, *PGLOBAL_ITEM_STATE;

分析过程如下:

 case ITEM_TYPE_GLOBAL:
 {
     switch (CurrentItem->Tag) {
         case ITEM_TAG_GLOBAL_USAGE_PAGE:
             Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_USAGE_PAGE %x\n", Data);
             ParserContext->GlobalItemState.UsagePage = Data;
             break;
         case ITEM_TAG_GLOBAL_LOGICAL_MINIMUM:
             Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_LOGICAL_MINIMUM %x\n", Data);
             ParserContext->GlobalItemState.LogicalMinimum = Data;
             break;

         case ITEM_TAG_GLOBAL_LOGICAL_MAXIMUM:
             Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_LOCAL_MAXIMUM %x\n", Data);
             ParserContext->GlobalItemState.LogicialMaximum = Data;
             break;

         case ITEM_TAG_GLOBAL_PHYSICAL_MINIMUM:
             Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_PHYSICAL_MINIMUM %x\n", Data);
             ParserContext->GlobalItemState.PhysicalMinimum = Data;
             break;

         case ITEM_TAG_GLOBAL_PHYSICAL_MAXIMUM:
             Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_PHYSICAL_MAXIMUM %x\n", Data);
             ParserContext->GlobalItemState.PhysicalMaximum = Data;
             break;

         case ITEM_TAG_GLOBAL_UNIT_EXPONENT:
             Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_REPORT_UNIT_EXPONENT %x\n", Data);
             ParserContext->GlobalItemState.UnitExponent = Data;
             break;

         case ITEM_TAG_GLOBAL_UNIT:
             Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_REPORT_UNIT %x\n", Data);
             ParserContext->GlobalItemState.Unit = Data;
             break;

         case ITEM_TAG_GLOBAL_REPORT_SIZE:
             Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_REPORT_SIZE %x\n", Data);
             ParserContext->GlobalItemState.ReportSize = Data;
             break;

         case ITEM_TAG_GLOBAL_REPORT_ID:
             Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_REPORT_ID %x\n", Data);
             ParserContext->GlobalItemState.ReportId = Data;
             ParserContext->UseReportIDs = TRUE;
             break;

         case ITEM_TAG_GLOBAL_REPORT_COUNT:
             Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_REPORT_COUNT %x\n", Data);
             ParserContext->GlobalItemState.ReportCount = Data;
             break;

         case ITEM_TAG_GLOBAL_PUSH:
         {
             Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_PUSH\n");
             //
             // allocate global item state
             //
             LinkedGlobalItemState = (PGLOBAL_ITEM_STATE)Parser->Alloc(sizeof(GLOBAL_ITEM_STATE));
             ASSERT(LinkedGlobalItemState);

             //
             // copy global item state
             //
             Parser->Copy(LinkedGlobalItemState, &ParserContext->GlobalItemState, sizeof(GLOBAL_ITEM_STATE));

             //
             // store pushed item in link member
             //
             ParserContext->GlobalItemState.Next = (struct __GLOBAL_ITEM_STATE__*)LinkedGlobalItemState;
             break;
         }
         case ITEM_TAG_GLOBAL_POP:
         {
             Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_POP\n");
             if (ParserContext->GlobalItemState.Next == NULL) 
             {
                 //
                 // pop without push
                 //
                 ASSERT(FALSE);
                 break;
             }

             //
             // get link
             //
             LinkedGlobalItemState = (PGLOBAL_ITEM_STATE)ParserContext->GlobalItemState.Next;

             //
             // replace current item with linked one
             //
             Parser->Copy(&ParserContext->GlobalItemState, LinkedGlobalItemState, sizeof(GLOBAL_ITEM_STATE));

             //
             // free item
             //
             Parser->Free(LinkedGlobalItemState);
             break;
         }

         default:
             //
             // unknown  / unsupported tag
             //
             ASSERT(FALSE);
             break;
     }

     break;
 }
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 HID鼠标是相对的描述符,鼠标的移动是相对当前位置的相对移动。如相对当前位置左移,右移等。这种相对的坐标描述符有的时候在使用上有一定麻烦的,最重要的原因就是需要计算鼠标指针的当前位置。如本人之前做的一个USB鼠标挂机测试脚本,内容详见:http://www.usbzh.com/ar......
HID全局条目ReportId
大多数设备都是通过一个数据报告给主机的,但也可以通过ReportId实现实现一个设备返回多个数据报告。例如,带有触摸设备的键盘可以独立报告同一端点上的“按键”数据和“指点”数据。ReportId用于区分不同的数据。Report ID固定为1字节长度,在数据传输前位数据的头部。如果报告描述符中不存在......
HID 全局条目(Global Item)
全局项目主要用来选择用途页(Usage Page),定义数据域的长度(Report Count)、数量(Report Size)、报告ID(ReportId)等。全局项目描述对后续的所有项目有效,除非遇到有新的全局项目。常见的全局项目有:Usage Page(用途页)Logical Mini......
USB中文网出品-HID虚拟全局坐标鼠标
以往我们的鼠标指针移动都是相对当前的坐标进行移动,如果要移动到指定的位置,需要不停地获取当前应用层的鼠标指针进行逼近,这样实现鼠标的定位移动或者按下等动作。但是在实际的USB鼠标分类中,还存在另一种鼠标类型,叫做全局坐标鼠标类型,即通过在指定相关的XY坐标进行相应的鼠标动作,其实现原理也和触摸屏类似......
HID_PARSER_CONTEXT解析报告描述符生成的COLLECTION树形结构
通过前面的代码,我们简单的说明了一下HIDP_DEVICE_DESC和HIDP_COLLECTION_DESC、HIDP_REPORT_IDS关系:其实我们在分析其代码的时候,都是通过ParserContext来实现的,这个指针的定义实质上为:typedef struct{ // ......
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报告描述符解析过程中的数据结构关系
Hid报告描述符的短项定义了MAIN,GLOBAL,LOCAL三种类型的项。其中MAIN项主要定义了三个类型,分别为集合(COLLECTION),输入报告(Input Report),输出报告(Output Report)和特性报告(Feature Report).在Windows系统的Pars......
HID报告描述符全局项REPORT_COUNT和REPORT_SIZE
HID报告描述符全局项ReportCount和ReportSize用于指示报告描述符数据项的大小,其中:REPORT_COUNT:用于指定LOCAL USAGE的个数REPORT_SIZE:用于指定每个USAGE的数据大小。如鼠标的X和Y坐标 USAGE (X) ......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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