HID开发笔记
+ -

HID触摸屏报告描述符应用层解析分析代码

2022-06-06 701 0

这一段时间狠狠地研究了HID报告描述符,虽然尚未达到炉火纯青的地步,不过经过自己深入的研究,还是对HID报告描述符以及Windows系统对HID报告描述符的解析和处理有了更深一层的理解,同时也增进了自己对IRP等Windows驱动编程的技术提高。

其实以前做了触摸屏驱动,包括现在虚拟出来的。不过当我们在进行数据传递时,一般是需要数据格式的转换,这我们只需要按实际的数据结构转换就行了,其实这个还好话。不过有一个比较麻烦的地方就是不同的厂商定义的坐标系的范围是不同的,所以在应用层进行数据结构转换时,时常有一些硬编码或者查表来进行按比例转换。

今天,刚好又要搞这个东西,自己干脆自己在应用层搞一个,通过在驱动层将HID报告描述符的内容获取到应用层,然后在应用层进行解析,获取其X,Y的最大逻辑值。

触摸屏的在定义XY的最大逻辑值LOCAL_USAGE(X)和LOCAL_USAGE(Y)时,使用的USAGE_PAGE为PAGE_GENDRIC_DESKTOP_CONTROLS,这时获取全局项ITEM_TAG_GLOBAL_LOGICAL_MAXIMUM的值。

其实这里的代码相对简单,不过更好帮我们理解HID报告描述符的全局项,主项、局部项等概念。

不支持LONG项

代码如下:


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

#define ITEM_TAG_GLOBAL_USAGE_PAGE            0x0
#define ITEM_TAG_GLOBAL_LOGICAL_MINIMUM        0x1
#define ITEM_TAG_GLOBAL_LOGICAL_MAXIMUM        0x2

#define ITEM_TAG_LOCAL_USAGE                0x0

#define PAGE_GENDRIC_DESKTOP_CONTROLS 0x01
#define USAGE_X 0x30
#define USAGE_Y 0x31

BOOL  GetLogicalMax(PUCHAR pData, ULONG nLen, PULONG pXMax, PULONG pYMax)
{
#pragma pack(1)
    typedef struct
    {
        UCHAR Size : 2;
        UCHAR Type : 2;
        UCHAR Tag : 4;
    }ITEM_PREFIX, * PITEM_PREFIX;
    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;
#pragma pack()
    static UCHAR ItemSize[4] = { 0, 1, 2, 4 };

    PUCHAR CurrentOffset = pData;
    ULONG Data = 0;

    ULONG UsagePage;
    ULONG Usage;

    ULONG xMax = 0, yMax = 0;
    do
    {
        PITEM_PREFIX CurrentItem = (PITEM_PREFIX)CurrentOffset;

        UCHAR CurrentItemSize = ItemSize[CurrentItem->Size];
        if (CurrentItem->Type == ITEM_TYPE_LONG)
        {
            return FALSE;
        }

        PSHORT_ITEM CurrentShortItem = (PSHORT_ITEM)CurrentItem;
        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;

        if (CurrentItem->Type == ITEM_TYPE_GLOBAL)
        {
            if (CurrentItem->Tag == ITEM_TAG_GLOBAL_USAGE_PAGE)
            {
                UsagePage = Data;
            }
            else if (CurrentItem->Tag == ITEM_TAG_GLOBAL_LOGICAL_MAXIMUM)
            {
                if (UsagePage == PAGE_GENDRIC_DESKTOP_CONTROLS && Usage == USAGE_X)
                {
                    xMax = Data;
                }
                else if (UsagePage == PAGE_GENDRIC_DESKTOP_CONTROLS && Usage == USAGE_Y)
                {
                    yMax = Data;
                }
                //    printf("LogicalMax=%d\n", Data);
            }
            else if (CurrentItem->Tag == ITEM_TAG_GLOBAL_LOGICAL_MINIMUM)
            {
                //printf("LogicalMin=%d\n", Data);
            }
        }
        else if (CurrentItem->Type == ITEM_TYPE_LOCAL)
        {
            if (CurrentItem->Tag == ITEM_TAG_LOCAL_USAGE)
            {
                Usage = Data;
            }
        }

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

    if (xMax == 0 || yMax == 0)
    {
        return FALSE;
    }

    if (pXMax != NULL)
    {
        *pXMax = xMax;
    }

    if (pYMax != NULL)
    {
        *pYMax = yMax;
    }
    return TRUE;
}
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 篇笔记 写笔记

HID 触摸屏的报表描述符
讲道理,这个触摸屏的报告描述符是我从网上搜索的一段代码,这个触摸屏的报告内容本人也进行了测试。测试是通过本站编写的虚拟触摸屏驱动实现的。0x05, 0x0d, // USAGE_PAGE (Digitizers) 0 0x......
Win10 x64虚拟设备之触摸屏
前一段时间在本人整理了自己编写的USB虚拟驱动框架,在其基础上实现了虚拟键盘,鼠标的功能。本节是继虚拟键盘鼠标的另一个虚拟USB设备-触摸屏触摸屏设备是HID设备的一个小类,但是随着触摸设备使用的越来越广泛,这类设备也变地越来越重要。触摸屏设备的原理和我们手机上的触摸屏原理一样,是在电脑屏幕上有一层......
HID规范、HID Usage Tables版本及文档分类
HID是Human Interface Devices的缩写,传统意义我们使用HID设备一般特指USB HID键盘和USB HID鼠标,但实际上USB HID规范不仅包括USB HID键盘和USB HID鼠标,也包括很多其它的标准USB HID设备如游戏手柄、HID触摸屏等,也包括一些自定义的USB......
HID报告描述符Usage
Usage是HID报告描述符的一部分,用于应用开发人员提供有关控制测量内容的信息。Usage标签指示了设备供应商对其设备的控制或者设备控制组的特定用途建议。例如虽然报告描述符中定义了数据格式(例如,三个 8 位字段),但使用Usages定义了应对数据执行的操作含义,例如 x、y 和 z 输入。 此功......
HID设备虚拟触摸屏上报的多点数据系统不响应
前一般时间在Windows10下使用USB驱动虚拟了一个触摸屏设备,上层软件按照HID报告述符的格式下发触摸屏数据给驱动,再由驱动将数据上交给系统,实现虚拟触摸屏的功能。今天,突发奇想,上次的报告描述符仅支持的是一个点触摸效果,今天保不实现了一下多点触摸效果,所以我通过在一个支持多点触摸屏的设备......
Windows支持多点的触摸屏的HID报告描述符
上次在Windows10 x64下实现了 虚拟触摸屏效果。原文见:Win10 x64虚拟设备之触摸屏http://www.usbzh.com/article/detail-513.html但是现在的大部分触摸屏都支持多点触摸,例如十指触摸(因为我们有十个手指头),本想着在原来的基础上只是增加上报的个......
安装自己研HID虚拟触摸屏驱动后系统重启需要5-10分钟的问题
从2021年7-8月份吧,有一个需求就是搞一个HID触摸屏驱动,当时心想,这玩意不要太简单,可事实之于这件事,是没有那么简单的。先不话一位同事的算法的曲折,另一位同事固件的曲折,没想到到我身上,把一个BUG也带到了今日。虚拟实现的功能比较简单,就是通过同事的自定义BULK端点读取原始的触摸屏数据,然......
Teams 标准HID Usage Tables
设备的电话功能必须基于USB HID使用表的USB HID电话设备页面。下表显示了客户端支持的USB HID使用命令的子集。Device Page (0x08) UsagesMicrosoft Team和Skype for Business支持的电话设备页面(0x0B)Usages.Usa......
HID支持4触点的触摸屏报告描述符
HID支持4触点的触摸屏报告描述符 0x05, 0x0D, // USAGE_PAGE (Digitizers) 0x09, 0x04, // USAGE (Touch Screen) 0xA1, 0x01, ......
HID触摸屏单点模式报告描述符
单点混合模式多点触控设备示例报表描述符包含单个逻辑集合。0x05, 0x0d, // USAGE_PAGE (Digitizers) 0x09, 0x04, // USAGE......
HID触摸屏多点模式报告描述符
双指并行/混合模式多点触控设备示例报表描述符包含两个逻辑集合(每个手指一个)0x05, 0x0d, // USAGE_PAGE (Digitizers) 0x09, 0x04, ......
HID多点触摸屏报告描述符
HID报告描述符分析工具USB中文网 http://www.usbzh.com-----报告描述符--------------05 0D //0 GLOBAL_USAGE_PAGE(Digitizer) 09 04 ......
HID触摸屏配置描述符
原始数据:09 02 22 00 01 01 00 a0 32 09 04 02 00 01 03 0101 00 09 21 11 01 00 01 22 0f 03 07 05 84 03 4000 04使用USB标准请求及描述符在线分析工具http://www.usbzh.......
HID报告描述符LOCAL ITEM解析
HID报告描述符的LOCAL ITEM相当于报告描述符的局部变量,只能当前属性有效,超过作用域不再有意义。LOCAL ITEM包括的内容有:#define ITEM_TAG_LOCAL_USAGE 0x0#define ITEM_TAG_LOCAL_USAGE_MI......
HID报告描述符INPUT ITEM,OUTPUT ITEM,FEATERU ITEM Bit 1{Array (0) | Variable (1)}和HID_REPORT_ITEM的关系
HID的MAIN ITEM的INPUT ITEM,OUTPUT ITEM,FEATERU ITEM Bit定义如下:0:代表是数组1:代表变量我们在 HID主条目input item、output item和feature item详解http://www.usbzh.com/article......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

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

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