HID规范
+ -

HID报告描述符的GLOBAL ITEM

2022-05-16 703 0

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

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

  1. #define ITEM_TAG_GLOBAL_USAGE_PAGE 0x0
  2. #define ITEM_TAG_GLOBAL_LOGICAL_MINIMUM 0x1
  3. #define ITEM_TAG_GLOBAL_LOGICAL_MAXIMUM 0x2
  4. #define ITEM_TAG_GLOBAL_PHYSICAL_MINIMUM 0x3
  5. #define ITEM_TAG_GLOBAL_PHYSICAL_MAXIMUM 0x4
  6. #define ITEM_TAG_GLOBAL_UNIT_EXPONENT 0x5
  7. #define ITEM_TAG_GLOBAL_UNIT 0x6
  8. #define ITEM_TAG_GLOBAL_REPORT_SIZE 0x7
  9. #define ITEM_TAG_GLOBAL_REPORT_ID 0x8
  10. #define ITEM_TAG_GLOBAL_REPORT_COUNT 0x9
  11. #define ITEM_TAG_GLOBAL_PUSH 0xa
  12. #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相关的参数。

  1. typedef struct
  2. {
  3. ...
  4. //
  5. // global item state
  6. //
  7. GLOBAL_ITEM_STATE GlobalItemState;
  8. ...
  9. }HID_PARSER_CONTEXT, *PHID_PARSER_CONTEXT;

GLOBAL_ITEM_STATE的定义如下:

  1. typedef struct __GLOBAL_ITEM_STATE_
  2. {
  3. USHORT UsagePage;
  4. ULONG LogicalMinimum;
  5. ULONG LogicialMaximum;
  6. ULONG PhysicalMinimum;
  7. ULONG PhysicalMaximum;
  8. UCHAR UnitExponent;
  9. UCHAR Unit;
  10. ULONG ReportSize;
  11. ULONG ReportCount;
  12. UCHAR ReportId;
  13. struct __GLOBAL_ITEM_STATE__ * Next;
  14. }GLOBAL_ITEM_STATE, *PGLOBAL_ITEM_STATE;

分析过程如下:

  1. case ITEM_TYPE_GLOBAL:
  2. {
  3. switch (CurrentItem->Tag) {
  4. case ITEM_TAG_GLOBAL_USAGE_PAGE:
  5. Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_USAGE_PAGE %x\n", Data);
  6. ParserContext->GlobalItemState.UsagePage = Data;
  7. break;
  8. case ITEM_TAG_GLOBAL_LOGICAL_MINIMUM:
  9. Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_LOGICAL_MINIMUM %x\n", Data);
  10. ParserContext->GlobalItemState.LogicalMinimum = Data;
  11. break;
  12. case ITEM_TAG_GLOBAL_LOGICAL_MAXIMUM:
  13. Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_LOCAL_MAXIMUM %x\n", Data);
  14. ParserContext->GlobalItemState.LogicialMaximum = Data;
  15. break;
  16. case ITEM_TAG_GLOBAL_PHYSICAL_MINIMUM:
  17. Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_PHYSICAL_MINIMUM %x\n", Data);
  18. ParserContext->GlobalItemState.PhysicalMinimum = Data;
  19. break;
  20. case ITEM_TAG_GLOBAL_PHYSICAL_MAXIMUM:
  21. Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_PHYSICAL_MAXIMUM %x\n", Data);
  22. ParserContext->GlobalItemState.PhysicalMaximum = Data;
  23. break;
  24. case ITEM_TAG_GLOBAL_UNIT_EXPONENT:
  25. Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_REPORT_UNIT_EXPONENT %x\n", Data);
  26. ParserContext->GlobalItemState.UnitExponent = Data;
  27. break;
  28. case ITEM_TAG_GLOBAL_UNIT:
  29. Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_REPORT_UNIT %x\n", Data);
  30. ParserContext->GlobalItemState.Unit = Data;
  31. break;
  32. case ITEM_TAG_GLOBAL_REPORT_SIZE:
  33. Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_REPORT_SIZE %x\n", Data);
  34. ParserContext->GlobalItemState.ReportSize = Data;
  35. break;
  36. case ITEM_TAG_GLOBAL_REPORT_ID:
  37. Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_REPORT_ID %x\n", Data);
  38. ParserContext->GlobalItemState.ReportId = Data;
  39. ParserContext->UseReportIDs = TRUE;
  40. break;
  41. case ITEM_TAG_GLOBAL_REPORT_COUNT:
  42. Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_REPORT_COUNT %x\n", Data);
  43. ParserContext->GlobalItemState.ReportCount = Data;
  44. break;
  45. case ITEM_TAG_GLOBAL_PUSH:
  46. {
  47. Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_PUSH\n");
  48. //
  49. // allocate global item state
  50. //
  51. LinkedGlobalItemState = (PGLOBAL_ITEM_STATE)Parser->Alloc(sizeof(GLOBAL_ITEM_STATE));
  52. ASSERT(LinkedGlobalItemState);
  53. //
  54. // copy global item state
  55. //
  56. Parser->Copy(LinkedGlobalItemState, &ParserContext->GlobalItemState, sizeof(GLOBAL_ITEM_STATE));
  57. //
  58. // store pushed item in link member
  59. //
  60. ParserContext->GlobalItemState.Next = (struct __GLOBAL_ITEM_STATE__*)LinkedGlobalItemState;
  61. break;
  62. }
  63. case ITEM_TAG_GLOBAL_POP:
  64. {
  65. Parser->Debug("[HIDPARSE] ITEM_TAG_GLOBAL_POP\n");
  66. if (ParserContext->GlobalItemState.Next == NULL)
  67. {
  68. //
  69. // pop without push
  70. //
  71. ASSERT(FALSE);
  72. break;
  73. }
  74. //
  75. // get link
  76. //
  77. LinkedGlobalItemState = (PGLOBAL_ITEM_STATE)ParserContext->GlobalItemState.Next;
  78. //
  79. // replace current item with linked one
  80. //
  81. Parser->Copy(&ParserContext->GlobalItemState, LinkedGlobalItemState, sizeof(GLOBAL_ITEM_STATE));
  82. //
  83. // free item
  84. //
  85. Parser->Free(LinkedGlobalItemState);
  86. break;
  87. }
  88. default:
  89. //
  90. // unknown / unsupported tag
  91. //
  92. ASSERT(FALSE);
  93. break;
  94. }
  95. break;
  96. }
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) ......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

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

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