您现在的位置是:主页 > HID规范 >

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

发布时间:2022-11-10 10:34:31所属栏目:HID规范 已帮助编辑作者:【USB接口百科】

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);

     以上就是USB接口百科为您提供HID报告描述符的四种类型MAIN ITEM/LOCAL ITEM/GLOBAL ITEM/LONG ITEM源码解析的解读,本文章链接: http://www.usb-hub.cn/hidgf/42355.html 欢迎分享转载,更多婚礼相关资讯请前往HID规范