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

HID报告描述符ITEM的数据结构及代码分析过程

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

HID报告描述符是数据流的形式,其中最小单位是项英文ITEM,根据定义分为4种。分别为GLOBA,LOCAK和MAIN。

项分为长项和短项,这里我们只介绍短项。

短项头的一字节定义为:

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

BIT0,BIT1代表的后续数据的个数:

0 = 0 bytes1 = 1 byte2 = 2 bytes3 = 4 bytes

BIT2,BIT3代表项的类型,其中:

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

而BIT4-7代表着功能号。

HID项的分析

这里使用C语言来分析,其中ReportDescriptor是报告描述符指针,ReportLength中长度。


   CurrentOffset = ReportDescriptor; //报告描述符指针
   ReportEnd = ReportDescriptor + ReportLength;//报告描述符的指针结尾

  do
    {
        //
        // get current item
        //
        CurrentItem = (PITEM_PREFIX)CurrentOffset;

        //
        // get item size
        //
        CurrentItemSize = ItemSize[CurrentItem->Size];
        Data = 0;

        if (CurrentItem->Type == ITEM_TYPE_LONG)
        {
            //
            // increment item size with size of data item
            //
            CurrentLongItem = (PLONG_ITEM)CurrentItem;
            CurrentItemSize += CurrentLongItem->DataSize;
        }
        else
        {
            //
            // get short item
            //
            CurrentShortItem = (PSHORT_ITEM)CurrentItem;

            //
            // get associated data
            //
            //ASSERT(CurrentItemSize == 1 || CurrentItemSize == 2 || CurrentItemSize == 4);
            if (CurrentItemSize == 1)
                Data = CurrentShortItem->Data.UData8[0];
            else if (CurrentItemSize == 2)
                Data = CurrentShortItem->Data.UData16[0];
            else if (CurrentItemSize == 4)
                Data = CurrentShortItem->Data.UData32;
            else
            {
                //
                // invalid item size
                //
                //Parser->Debug("CurrentItem invalid item size %lu\n", CurrentItemSize);
            }

        }

     CurrentOffset += CurrentItemSize + sizeof(ITEM_PREFIX);
    }while (CurrentOffset < ReportEnd);

其中短项和长项的结构定义如下:

typedef struct
{
    ITEM_PREFIX Prefix;

    union
    {
        UCHAR UData8[4];
        CHAR  SData8[4];
        USHORT UData16[2];
        SHORT SData16[2];
        ULONG UData32;
        LONG SData32;
    }Data;

}SHORT_ITEM, *PSHORT_ITEM;

typedef struct
{
    ITEM_PREFIX Prefix;
    UCHAR DataSize;
    UCHAR LongItemTag;
    UCHAR Data[0];

}LONG_ITEM,*PLONG_ITEM;

     以上就是USB接口百科为您提供HID报告描述符ITEM的数据结构及代码分析过程的解读,本文章链接: http://www.usb-hub.cn/hidgf/42350.html 欢迎分享转载,更多婚礼相关资讯请前往HID规范