如果你的设备包含同时提供触控和笔功能的数字化仪,则必须分别报告触控和笔集合。 如果你的数字化仪可能安装在平板电脑、平板 PC 或其他没有鼠标的计算机上,你还应该报告鼠标收集。
报告 Null 值
为便于实现防手掌误触,笔设备应在高于正常水平的垂直距离上报告数据。 强烈建议此距离为 50 毫米(或尽可能接近此距离),因为这会产生更好的用户体验。 这将允许主机在知道笔在范围内时以不同的方式处理触摸输入。 由于大多数能够在较高垂直距离处检测到笔的设备将无法准确检测到笔的坐标,因此设备应报告 NULL 坐标。 下面的报告描述符显示了如何为 X 和 Y 支持 NULL 值。在传送 NULL 数据时,设备只需为 X 和 Y 设置超出指定逻辑范围的值。两个值都必须为 NULL 主机才能识别这种报告模式。
0x05, 0x0d, // USAGE_PAGE (Digitizers) 0
0x09, 0x02, // USAGE (Pen) 2
0xa1, 0x01, // COLLECTION (Application) 4
0x85, 0x02, // REPORT_ID (Pen) 6
0x09, 0x20, // USAGE (Stylus) 8
0xa1, 0x00, // COLLECTION (Physical) 10
0x09, 0x42, // USAGE (Tip Switch) 12
0x09, 0x44, // USAGE (Barrel Switch) 14
0x09, 0x3c, // USAGE (Invert) 16
0x09, 0x45, // USAGE (Eraser Switch) 18
0x15, 0x00, // LOGICAL_MINIMUM (0) 20
0x25, 0x01, // LOGICAL_MAXIMUM (1) 22
0x75, 0x01, // REPORT_SIZE (1) 24
0x95, 0x04, // REPORT_COUNT (4) 26
0x81, 0x02, // INPUT (Data,Var,Abs) 28
0x95, 0x01, // REPORT_COUNT (1) 30
0x81, 0x03, // INPUT (Cnst,Var,Abs) 32
0x09, 0x32, // USAGE (In Range) 34
0x81, 0x02, // INPUT (Data,Var,Abs) 36
0x95, 0x02, // REPORT_COUNT (2) 38
0x81, 0x03, // INPUT (Cnst,Var,Abs) 40
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 42
0x09, 0x30, // USAGE (X) 44
0x75, 0x10, // REPORT_SIZE (16) 46
0x95, 0x01, // REPORT_COUNT (1) 48
0xa4, // PUSH 50
0x55, 0x0d, // UNIT_EXPONENT (-3) 51
0x65, 0x13, // UNIT (Inch,EngLinear) 53
0x35, 0x00, // PHYSICAL_MINIMUM (0) 55
0x46, 0x3a, 0x20, // PHYSICAL_MAXIMUM (8250) 57
0x26, 0xf8, 0x52, // LOGICAL_MAXIMUM (21240) 60
0x81, 0x42, // INPUT (Data,Var,Abs) 63
0x09, 0x31, // USAGE (Y) 65
0x46, 0x2c, 0x18, // PHYSICAL_MAXIMUM (6188) 67
0x26, 0x6c, 0x3e, // LOGICAL_MAXIMUM (15980) 70
0x81, 0x42, // INPUT (Data,Var,Abs) 73
0xb4, // POP 75
0x05, 0x0d, // USAGE_PAGE (Digitizers) 76
0x09, 0x30, // USAGE (Tip Pressure) 78
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 80
0x81, 0x02, // INPUT (Data,Var,Abs) 83
0x75, 0x08, // REPORT_SIZE (8) 85
0x09, 0x3d, // USAGE (X Tilt) 87
0x65, 0x14, // UNIT (Degrees,EngRotation)
0x55, 0x0e, // UNIT_EXPONENT (-2)
0x36, 0xd8, 0xdc, // PHYSICAL_MINIMUM (-9000)
0x46, 0x28, 0x23, // PHYSICAL_MAXIMUM (9000)
0x16, 0xd8, 0xdc, // LOGICAL_MINIMUM (-9000)
0x26, 0x28, 0x23, // LOGICAL_MAXIMUM (9000)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x09, 0x3e, // USAGE (Y Tilt)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x55, 0x0e, // UNIT_EXPONENT (-2)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x47, 0xa0, 0x8c, 0x00, 0x00, // PHYSICAL_MAXIMUM (36000)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x27, 0xa0, 0x8c, 0x00, 0x00, // LOGICAL_MAXIMUM (36000)
0x09, 0x41, // USAGE (Twist)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
0xc0, // END_COLLECTION
触控硬件质量保证
当设备通过徽标要求时,Microsoft 将向设备制造商发布一个经过加密签名的二进制 blob。 制造商将在生产之前将此 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))
0xb1, 0x02, // FEATURE (Data,Var,Abs)
以下是明文形式的示例 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
在单指混合模式报表描述符中显示了一个完整的报表描述符示例,其中的特性报告中包含认证 blob。