HID报告描述符的四种类型MAIN ITEM/LOCAL ITEM/GLOBAL ITEM/LONG ITEM源码解析
2022-05-17
708
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