必需的 HID 顶级集合 (touchscreen-required-hid-top-level-collections)

本主题介绍在 Windows 10 和更高版本的操作系统中用于触摸屏报告的必需 HID 顶级集合。

Windows 触摸屏设备至少应公开单个用于触摸报告的必需顶级集合。 还可以实现可选(但建议)的固件更新集合。

下图显示了 Windows 触摸屏设备的 HID 集合。

diagram showing the hid collections for a windows touchscreen device. image indicates support for a vendor-specific firmware update collection.

Windows 触摸屏集合

在 Windows 10 中,触摸屏设备可以使用 HID 协议来提供显示为数字化器/触摸屏的顶级集合(页面 0x0D,用法 0x04)。

Windows 触摸屏集合向主机提供多触点报告,以及与这些报告相关的设备信息。 该集合应支持一份包含触点信息的必需输入报告,以及一份包含数字化器所支持的最大触点数的功能报告。 可以实现可选(但强烈建议)的功能报告,以从主机获取延迟模式提示,从而降低处于睡眠模式的 USB 设备的功耗。 最后,可以实现可选(但建议)的功能报告来传达认证状态。

Windows 触摸屏输入报告

“触点级别用法”包括与报告的每个唯一数字化器触点相关的所有必需用法和支持的可选用法。 主机使用以下用法(通过 Windows 触摸屏集合)从输入报告中提取触点数据。

成员 说明 ID 必需/可选
触点 ID 唯一标识给定帧中的触点。 0x0D 0x51 必需
X 触点位置的 X 坐标。 0x01 0x30

对于 T 是必需的

对于 C 是可选的

Y 触点位置的 Y 坐标。 0x01 0x31

对于 T 是必需的

对于 C 是可选的

提示 如果触点位于数字化器的表面,则设置此成员。 0x0D 0x42 必需
置信度 如果触点对于手指而言太大,则设置此成员。 0x0D 0x47 可选
宽度 触点周围的边界框的宽度。 0x0D 0x48 可选
高度 触点周围的边界框的高度。 0x0D 0x49 可选
压强 用户对触点施加的压力大小。 0x0D 0x30 可选
方位角 光标绕 Z 轴逆时针旋转。 0x0D 0x3F 可选

下表显示了应出现在 Windows 触摸屏设备的所有输入报告中的所有必需报告级别用法。

成员 说明 ID 必需/可选
报表 ID Windows 触摸屏报告 ID。 0x0D 0x05 必需
扫描时间 每帧的相对扫描时间。 0x0D 0x56 可选
触点计数 在给定报告中报告的触点总数。 0x0D 0x54 必需

任何未在触点级别或报告级别报告所有必需用法的设备无法作为 Windows 触摸屏设备正常运行。 必需用法由 Windows 主机严格执行。 如果未限制逻辑最大值,可对其进行优化以减小描述符大小。

触点 ID

触点 ID 唯一标识报告中的触点(在其整个生命周期内)。 在设备检测并报告触点时,该触点 ID 必须保持不变。 单独的每个并发触点必须具有唯一标识符。 在不再检测或报告先前关联的触点后,可以重用标识符。 没有预期的数字范围,使用的值仅受描述符中指定的逻辑最大值限制。

X/Y

X 和 Y 报告给定触点的坐标。 设备可为每个触点报告两个点。 第一个点(称为 T)被视为用户打算触摸的点,而第二个点(称为 C)被视为触点的中心。 能够报告 T 和 C 的设备应有一个包含两个 X 值和两个 Y 值的用法数组。 该数组中第一个位置的值解释为 T 的坐标,第二个位置的值解释为 C 的坐标。两种用法的报告计数均为 2,表示存在该用法数组。

报告 C 的设备还必须报告“宽度”和“高度”用法。 主机使用 C 围绕触点构建边界矩形。 如果设备仅报告一个 X 和 Y 对,则主机将为 T 和 C 使用该对。示例触摸描述符包含 X 和 Y 的用法数组。

仅报告 T 的设备不能有 X 和 Y 属性的用法数组。 换言之,每个用法的报告计数为 1,如以下示例描述符摘录内容所示。 这些摘录内容还演示了仅支持 T 的设备与支持 T 和 C 的设备之间的差别。

    0x05, 0x01,                         //       USAGE_PAGE (Generic Desk..
    0x26, 0xff, 0x0f,                   //       LOGICAL_MAXIMUM (4095)         
    0x75, 0x10,                         //       REPORT_SIZE (16)             
    0x55, 0x0e,                         //       UNIT_EXPONENT (-2)           
    0x65, 0x13,                         //       UNIT(Inch,EngLinear)                  
    0x09, 0x30,                         //       USAGE (X)                    
    0x35, 0x00,                         //       PHYSICAL_MINIMUM (0)         
    0x46, 0xb5, 0x04,                   //       PHYSICAL_MAXIMUM (1205)
    0x95, 0x01,                         //       REPORT_COUNT (1)         
    0x81, 0x02,                         //       INPUT (Data,Var,Abs)         
    0x46, 0x8a, 0x03,                   //       PHYSICAL_MAXIMUM (906)
    0x09, 0x31,                         //       USAGE (Y)                    
    0x81, 0x02,                         //       INPUT (Data,Var,Abs)

支持 T 和 C 的设备使用用法数组来报告 X 和 Y 值。 X 和 Y 的报告计数均为 2。

    0x05, 0x01,                         //       USAGE_PAGE (Generic Desk..
    0x26, 0xff, 0x0f,                   //       LOGICAL_MAXIMUM (4095)         
    0x75, 0x10,                         //       REPORT_SIZE (16)             
    0x55, 0x0e,                         //       UNIT_EXPONENT (-2)           
    0x65, 0x13,                         //       UNIT(Inch,EngLinear)                  
    0x09, 0x30,                         //       USAGE (X)                    
    0x35, 0x00,                         //       PHYSICAL_MINIMUM (0)         
    0x46, 0xb5, 0x04,                   //       PHYSICAL_MAXIMUM (1205)
    0x95, 0x02,                         //       REPORT_COUNT (2)         
    0x81, 0x02,                         //       INPUT (Data,Var,Abs)         
    0x46, 0x8a, 0x03,                   //       PHYSICAL_MAXIMUM (906)
    0x09, 0x31,                         //       USAGE (Y)                    
    0x81, 0x02,                         

注意:这些示例利用了 HID 规则,即,全局项在更改之前对于每个主项保持相同。 这样,X 和 Y 用法可以只共享报告计数的一个条目。

必须为 X 和 Y 用法指定以下全局项:

  • 逻辑最小值

  • 逻辑最大值

  • 物理最小值

  • 物理最大值

  • 计价单位

  • 单位指数

必须准确报告设备和单位的物理范围。 如果信息不准确,设备将无法正常工作。 设备还必须报告在报告描述符中指定的逻辑范围内的数据。 超出此范围的任何报告值被视为无效数据,并且该值将更改为最接近的边界值(逻辑最小值或逻辑最大值)。

提示

尖端开关用于指示触点何时在数字化器的表面上或离开了表面。 这由报告大小为 1 位的主项指示。 在传递触点报告时,如果触点在数字化器表面上,则应设置该位;如果触点离开了表面,则应清除该位。

在清除尖端开关的情况下报告触点时,报告的 X/Y 位置应与设置了尖端开关的情况下报告的最后一个位置相同。

diagram showing the contact sequence for 2 contacts with separated lift.

如上图所示,两个触点放置在 Windows 触摸屏上。 在一段时间后,第一个触点提起,而第二个触点仍在表面上。 将按下表中所述报告此状态。

报表 1 2 3 4 5 6 7 8 9 10 11
触点计数 2 2 2 2 2 2 1 1 1 1 1
触点 1:尖端开关 1 1 1 1 1 0 NR NR NR NR NR
触点 1:X、Y X₁, Y₁ X₂, Y₂ X₃, Y₃ X₄, Y₄ X₅, Y₅ X₆, Y₆ NR NR NR NR NR
触点 2:尖端开关 1 1 1 1 1 1 1 1 1 1 0
触点 2:X, Y X₁, Y₁ X₂, Y₂ X₃, Y₃ X₄, Y₄ X₅, Y₅ X₆, Y₆ X₇, Y₇ X₈, Y₈ X₉, Y₉ X₁₀, Y₁₀ X₁₁, Y₁₁

上表显示了分别提起(双指混合)的两个触点的报告顺序。

Confidence

“置信度”是设备提供的有关触控接触是有意触控还是意外触控的建议。 如果你确信触控是有意的,请将交互持续时间内的置信度用法设置为 1 (true),包括提起(清除尖端开关时)。 当延迟保留在要求的范围内时,设备应尽可能彻底拒绝意外触控。 如果你不确定触控是否是有意的,并且设备未将触控当作意外触控拒绝,请将置信度用法更改为 0 (false),以允许操作系统按需取消触控接触。 如果设备始终拒绝意外触控,则无需包含置信度用法。

宽度和高度

“宽度”和“高度”用法表示触点周围的边界框的宽度和高度。 报告的值永远不应为零 (0),除非报告了“UP”事件,在这种情况下,则报告的值应为零 (0)。

压力

“压力”是手指对数字化器表面施加的力的度量。 压力的允许范围没有限制。

方位角

“方位角”指定光标绕 Z 轴逆时针旋转一个完整圆范围。 必须指定物理范围和逻辑范围。 物理范围必须为 0 到 360 度或等效的弧度,但是如果触控椭圆基于硬件功能呈对称形状,则设备可能会报告整个范围或一半范围。 逻辑范围必须足够大,提供至少精确到两个小数位的数据。

扫描时间

扫描时间报告相对数字化器时间,以 100µs 为单位。 它表示设备在处于非活动状态一段时间并开始报告数据后所报告的第一帧的增量。 收到的第一个扫描时间被视为后续报告时间的基础时间。 报告的扫描时间之间的增量应反映数字化器的扫描频率。 必须注意,与其他用法不同,主机不允许扫描时间用法(如果已实现)的单位具有任何灵活性。 它必须以 100µs 为单位。 该值预期会滚动更新,因为只会将 2 个字节分配给计数器。

对于一帧内的所有触点,扫描时间值应该相同。

触点计数

触点计数用于指示在给定帧中报告的触点数,不考虑与触点关联的尖端开关。

Windows 触摸屏功能报告

主机使用以下用法(通过 Windows 触摸屏集合)从输入报告中提取触点数据。

触点最大计数功能报告

此报告指定多点触控设备支持的触点总数。 Windows 触摸屏设备应通过在触点最大计数功能报告中指定触点最大计数(页面 0x0D,用法 0x55)来报告此值。 在报告数据时,设备报告的触点数不得超过触点最大计数。 在达到触点最大计数后报告的任何新触点信息将被主机忽略。

设备认证状态功能报告

当设备满足兼容性要求时,Microsoft 将向设备制造商发出一个经过加密签名的二进制 Blob(称为 THQA Blob)。 制造商在生产之前将此 Blob 放入设备的固件中。 当触控设备尝试连接时,Windows 操作系统将验证签名。 Windows 只会对设备描述符中公开 THQA 功能报告的设备执行此操作。

注意:在 Windows 10 中,向主机报告有效的已认证 Blob 是可选操作,但若要与 Windows 8 和 Windows 8.1 后向兼容,必须执行此操作。 具有 THQA Blob 的设备将在控制面板中包含短语“完全支持 Windows 触控”。 不具备已认证 THQA Blob 的设备将在控制面板中显示短语“支持 Windows 触控”。

该 Blob 本身包含 256 字节的二进制数据,应按以下 HID 描述符所示予以报告。 设备制造商应确保在 Microsoft 发出已签名的二进制 Blob 之前,将以下示例 Blob 提供给 Windows。

    0x06, 0x00, 0xff,                   //     USAGE_PAGE (Vendor Defined)  
    0x09, 0xC5,                         //     USAGE (Vendor Usage 0xC5)    
    0x15, 0x00,                         //     LOGICAL_MINIMUM (0)          
    0x26, 0xff, 0x00,                   //     LOGICAL_MAXIMUM (0xff) 
    0x75, 0x08,                         //     REPORT_SIZE (8)             
    0x96, 0x00, 0x01,                   //     REPORT_COUNT (0x100 (256

下面是明文形式的示例 Blob。

0xfc, 0x28, 0xfe, 0x84, 0x40, 0xcb, 0x9a, 0x87, 0x0d, 0xbe, 0x57, 0x3c, 0xb6, 0x70, 0x09, 0x88,
0x07, 0x97, 0x2d, 0x2b, 0xe3, 0x38, 0x34, 0xb6, 0x6c, 0xed, 0xb0, 0xf7, 0xe5, 0x9c, 0xf6, 0xc2,
0x2e, 0x84, 0x1b, 0xe8, 0xb4, 0x51, 0x78, 0x43, 0x1f, 0x28, 0x4b, 0x7c, 0x2d, 0x53, 0xaf, 0xfc,
0x47, 0x70, 0x1b, 0x59, 0x6f, 0x74, 0x43, 0xc4, 0xf3, 0x47, 0x18, 0x53, 0x1a, 0xa2, 0xa1, 0x71,
0xc7, 0x95, 0x0e, 0x31, 0x55, 0x21, 0xd3, 0xb5, 0x1e, 0xe9, 0x0c, 0xba, 0xec, 0xb8, 0x89, 0x19,
0x3e, 0xb3, 0xaf, 0x75, 0x81, 0x9d, 0x53, 0xb9, 0x41, 0x57, 0xf4, 0x6d, 0x39, 0x25, 0x29, 0x7c,
0x87, 0xd9, 0xb4, 0x98, 0x45, 0x7d, 0xa7, 0x26, 0x9c, 0x65, 0x3b, 0x85, 0x68, 0x89, 0xd7, 0x3b,
0xbd, 0xff, 0x14, 0x67, 0xf2, 0x2b, 0xf0, 0x2a, 0x41, 0x54, 0xf0, 0xfd, 0x2c, 0x66, 0x7c, 0xf8,
0xc0, 0x8f, 0x33, 0x13, 0x03, 0xf1, 0xd3, 0xc1, 0x0b, 0x89, 0xd9, 0x1b, 0x62, 0xcd, 0x51, 0xb7,
0x80, 0xb8, 0xaf, 0x3a, 0x10, 0xc1, 0x8a, 0x5b, 0xe8, 0x8a, 0x56, 0xf0, 0x8c, 0xaa, 0xfa, 0x35,
0xe9, 0x42, 0xc4, 0xd8, 0x55, 0xc3, 0x38, 0xcc, 0x2b, 0x53, 0x5c, 0x69, 0x52, 0xd5, 0xc8, 0x73,
0x02, 0x38, 0x7c, 0x73, 0xb6, 0x41, 0xe7, 0xff, 0x05, 0xd8, 0x2b, 0x79, 0x9a, 0xe2, 0x34, 0x60,
0x8f, 0xa3, 0x32, 0x1f, 0x09, 0x78, 0x62, 0xbc, 0x80, 0xe3, 0x0f, 0xbd, 0x65, 0x20, 0x08, 0x13,
0xc1, 0xe2, 0xee, 0x53, 0x2d, 0x86, 0x7e, 0xa7, 0x5a, 0xc5, 0xd3, 0x7d, 0x98, 0xbe, 0x31, 0x48,
0x1f, 0xfb, 0xda, 0xaf, 0xa2, 0xa8, 0x6a, 0x89, 0xd6, 0xbf, 0xf2, 0xd3, 0x32, 0x2a, 0x9a, 0xe4,
0xcf, 0x17, 0xb7, 0xb8, 0xf4, 0xe1, 0x33, 0x08, 0x24, 0x8b, 0xc4, 0x43, 0xa5, 0xe5, 0x24, 0xc2

延迟模式功能报告

注意:Windows 10 版本 1511 和更低版本的操作系统目前不会向恰好支持延迟模式功能的笔或触摸屏设备发出此 HID 功能报告。 但是,向设备添加对延迟模式功能报告的支持可以确保将来 Windows 支持在笔和触摸屏设备上使用该功能时,该设备可以立即使用该功能。

延迟模式功能报告由主机发送到 Windows 触摸屏设备,指示何时需要高延迟以节省电量,或反之,何时需要正常延迟以确保正常操作。 对于 USB 连接的 Windows 触摸屏设备,此功能使设备能够区分由于不活动而处于暂停状态(运行时空闲)和由于系统进入 S3 或连接待机模式而处于暂停状态。

应通过延迟模式功能报告中的延迟模式用法值(页面 0x0D,用法 0x60)来指示延迟模式。

延迟模式值 延迟模式
0 正常延迟
1 高延迟

固件更新集合(可选)

Windows 触摸屏设备可以使用 HID 协议来提供特定于供应商的顶级集合,用于执行设备固件和供应商配置更新。

特定于供应商的固件更新集合可以提供用于将固件有效负载从主机传输到设备的输出报告。

这是非常有利的,因为它允许在不需要主机上的驱动程序的情况下执行固件更新。 在固件升级后,wVersionID 设备属性必须递增。

在断电(或其他某种错误)导致固件更新失败后,应该可以通过关机再重新通电,来恢复 Windows 触摸屏设备。 强烈建议确保即使在固件更新失败后也可以使用基本功能。