0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x01, // INPUT (Cnst,Ary,Abs)
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y)
0x15, 0x81, // LOGICAL_MINIMUM (-127) 0x25, 0x7f, // LOGICAL_MAXIMUM (127) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x02, // REPORT_COUNT (2) 0x81, 0x06, 0xc0, 0xc0, 0x05, 0x01, 0x09, 0x02, 0xa1, 0x01, 0x09, 0x01, 0xa1, 0x00, 0x85, 0x02, 0x05, 0x09, 0x19, 0x01, 0x29, 0x03, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x03, 0x81, 0x02, 0x75, 0x01, 0x95, 0x05, 0x81, 0x03, 0x05, 0x01, 0x09, 0x30, 0x15, 0x00, 0x26, 0xff, 0x07, 0x75, 0x10, 0x95, 0x01, 0x81, 0x02, 0x09, 0x31, 0x15, 0x00, 0x26, 0xff, 0x05, 0x75, 0x10, 0x95, 0x01, 0x81, 0x02, 0xc0, 0xc0 // INPUT (Data,Var,Rel) // END_COLLECTION // END_COLLECTION
// USAGE_PAGE (Generic Desktop) // USAGE (Mouse)
// COLLECTION (Application) // USAGE (Pointer)
// COLLECTION (Physical) // REPORT_ID (2)
// USAGE_PAGE (Button)
// USAGE_MINIMUM (Button 1) // USAGE_MAXIMUM (Button 3) // LOGICAL_MINIMUM (0) // LOGICAL_MAXIMUM (1) // REPORT_SIZE (1) // REPORT_COUNT (3) // INPUT (Data,Var,Abs) // REPORT_SIZE (1) // REPORT_COUNT (5) // INPUT (Cnst,Var,Abs)
// USAGE_PAGE (Generic Desktop) // USAGE (X)
// LOGICAL_MINIMUM (0)
// LOGICAL_MAXIMUM (2047) // REPORT_SIZE (16) // REPORT_COUNT (1) // INPUT (Data,Var,Abs) // USAGE (Y)
// LOGICAL_MINIMUM (0)
// LOGICAL_MAXIMUM (1535) // REPORT_SIZE (16) // REPORT_COUNT (1) // INPUT (Data,Var,Abs) // END_COLLECTION
// END_COLLECTION
6
(2)使用绝对坐标的鼠标报告描述符
DB 05H, 01H //USAGE_PAGE (Generic Desktop) DB 09H, 02H //USAGE (Mouse)
DB a1H, 01H //COLLECTION (Application) DB 09H, 01H // USAGE (Pointer)
DB a1H, 00H // COLLECTION (Physical) DB 05H, 09H // USAGE_PAGE (Button)
DB 19H, 01H // USAGE_MINIMUM (Button 1) DB 29H, DB 15H, DB 25H, DB 75H, DB 95H, DB 81H, DB 75H, DB 95H, DB 81H, DB 05H, DB 09H, DB 15H, DB 26H, DB 35H, DB 46H, DB 75H, DB 95H, DB 81H, DB 09H, DB 15H, DB 26H, DB 35H, DB 46H, DB 75H, DB 95H, DB 81H, DB c0H DB c0h
03H // USAGE_MAXIMUM (Button 3) 00H // LOGICAL_MINIMUM (0) 01H // LOGICAL_MAXIMUM (1) 01H // REPORT_SIZE (1) 03H // REPORT_COUNT (3) 02H // INPUT (Data,Var,Abs) 01H // REPORT_SIZE (1) 05H // REPORT_COUNT (5) 03H // INPUT (Cnst,Var,Abs)
01H // USAGE_PAGE (Generic Desktop) 30H // USAGE (X)
00H // LOGICAL_MINIMUM (0) 55H, 05H // LOGICAL_MAXIMUM (1365) 00H // PHYSICAL_MINIMUM (0) 55H, 05H // PHYSICAL_MAXIMUM (1365) 08H // REPORT_SIZE (16) 02H // REPORT_COUNT (1) 02H // INPUT (Data,Var,Abs) 31H // USAGE (Y)
00H // LOGICAL_MINIMUM (0) ffH, 02H // LOGICAL_MAXIMUM (767) 00H // PHYSICAL_MINIMUM (0) ffH, 02H // PHYSICAL_MAXIMUM (767) 08H // REPORT_SIZE (16) 02H // REPORT_COUNT (1) 02H // INPUT (Data,Var,Abs) // END_COLLECTION // END_COLLECTION 7
8、为支持多点触控增加的HID规范
参考文本《Digitizer Drivers for Windows Touch and Pen-Based Computers》。 为支持多点触控(例如Windows7),HID又在数字化仪用途页(0x04,Digitizer)下面增加了下面的几个新的【用途】。可以接受多点输入值的【顶层应用集合用途ID】分别为:0x01(数字化仪)、0x02(手写笔)、0x04(触摸屏)和0x05(触摸板)。 名称 Contact identifier Configuration Device mode Device settings Device identifier Contact count Contact count maximum 说明 触摸ID 配置 设备模式 设备设置 设备ID 触点数 最大触点数 类型 用途ID DV (动态值) 0x51 CA(应用集合) 0x0E DV (动态值) 0x52 CL(逻辑集合) 0x23 DV (动态值) 0x53 DV (动态值) 0x54 DV (动态值) 0x55 其中:
? 【触摸ID】用于区分不同的触摸点;
? 【触点数】用于指出实际有效的触摸点数;
? 【最大触点数】用于指出设备支持的最大触点数(只读,用Feature声明);
? 【设备ID】用在报告描述符中存在多个【顶层数字化仪集合】时区分不同的设备。
(1)【配置】应用集合、【设备设置】逻辑集合和【设备模式】用于描述【配置报告】顶层集合,该Feature报告用于win7操作系统改变(重新配置)设备模式。设备模式包括:0x00鼠标、0x01单点触控、0x02多点触控。(通常缺省的设备模式应该为鼠标,以便支持win7之前的操作系统)。 (2)多点触摸报告通常具有一个【顶层数字化仪集合】,其中包含若干个【内层指针(finger)逻辑集合】,每一个逻辑集合报告一个触点信息。【触点数】和【最大触点数】处于顶层数字化仪集合中。
(3)触点信息逻辑集合中必须包含的用途有:【X】(用途页0x01,用途0x30)、【Y】(用途页0x01,用途0x31)、【触摸ID】(用途页 0x0D,用途0x51)、【碰触开关】(用途页0x0D,用途0x42)和【进入范围标志】(用途页0x0D,用途0x32)。
可选的用途有:【确认】(用途页0x0D,用途0x47)、【宽和高】(用途页 0x0D,用途0x48和0x49)。 (4)【最大触点数】是必须报告的,而实际有效【触点数】是可选的,如果不报告该值,则需要将第一个无效触点的相关数据域均填入空值Null(超出有效范围的值,通常为0)。 (5)为了支持平板计算机,除了多点触摸报告外,报告描述符中通常需要另外说明一个鼠标顶层集合。
(A)【配置报告】的例子
0x09, 0x0E, // USAGE (Device Configuration)
0xa1, 0x01, // COLLECTION (Application) 【顶层配置集合】 0x85, REPORTID_FEATURE, // REPORT_ID (Configuration) 0x09, 0x23, // USAGE (Device Settings)
0xa1, 0x02, // COLLECTION (logical) 【设备设置逻辑集合】 0x09, 0x52, // USAGE (Device Mode)
0x09, 0x53, // USAGE (Device Identifier)【设备ID】非必须
8
0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x0a, // LOGICAL_MAXIMUM (10) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x02, // REPORT_COUNT (2)
0xb1, 0x02, // FEATURE (Data,Var,Abs)【设备模式】+【设备ID】 0xc0, // END_COLLECTION 0xc0, // END_COLLECTION
(B)一个2点触控报告的例子
0x05, 0x0d, // USAGE_PAGE (Digitizers) 0x09, 0x04, // USAGE (Touch Screen)
0xa1, 0x01, // COLLECTION (Application) 0x85, REPORTID_MTOUCH, // REPORT_ID (Touch) 0x09, 0x22, // USAGE (Finger)
0xa1, 0x02, // COLLECTION (Logical) 0x09, 0x42, // USAGE (Tip Switch) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x32, // USAGE (In Range)
0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x47, // USAGE (Touch Valid)
0x81, 0x02, // INPUT (Data,Var,Abs) 0x95, 0x05, // REPORT_COUNT (5)
0x81, 0x03, // INPUT (Cnst,Ary,Abs) 0x75, 0x08, // REPORT_SIZE (8)
0x09, 0x51, // USAGE (Contact Identifier) 0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x02, // INPUT (Data,Var,Abs) 0x05, 0x01, // USAGE_PAGE (Generic Desk.. 0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767) 0x75, 0x10, // REPORT_SIZE (16) 0x55, 0x00, // UNIT_EXPONENT (0) 0x65, 0x00, // UNIT (None)
0x09, 0x30, // USAGE (X) 0x35, 0x00, // PHYSICAL_MINIMUM (0) 0x46, 0x00, 0x00, // PHYSICAL_MAXIMUM (0) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x31, // USAGE (Y) 0x46, 0x00, 0x00, // PHYSICAL_MAXIMUM (0) 0x81, 0x02, // INPUT (Data,Var,Abs) 0xc0, // END_COLLECTION
0xa1, 0x02, // COLLECTION (Logical)
【顶层数字化仪集合】【第1触点逻辑集合】 【碰触开关】 【进入范围】标志 【确认】标志 【5个填充位】 【触摸ID】 【X】 【Y】 【第2触点逻辑集合】 9
0x05, 0x0d, // USAGE_PAGE (Digitizers) 0x09, 0x42, // USAGE (Tip Switch) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x32, // USAGE (In Range) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x47, // USAGE (Touch Valid) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x95, 0x05, // REPORT_COUNT (5) 0x81, 0x03, // INPUT (Cnst,Ary,Abs) 0x75, 0x08, // REPORT_SIZE (8)
0x09, 0x51, // USAGE ( Cotact Identifier) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x05, 0x01, // USAGE_PAGE (Generic Desk.. 0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767) 0x75, 0x10, // REPORT_SIZE (16) 0x55, 0x00, // UNIT_EXPONENT (0) 0x65, 0x00, // UNIT (None) 0x09, 0x30, // USAGE (X)
0x35, 0x00, // PHYSICAL_MINIMUM (0) 0x46, 0x00, 0x00, // PHYSICAL_MAXIMUM (0) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x31, // USAGE (Y)
0x46, 0x00, 0x00, // PHYSICAL_MAXIMUM (0) 0x81, 0x02, // INPUT (Data,Var,Abs) 0xc0, // END_COLLECTION
0x05, 0x0d, // USAGE_PAGE (Digitizers) 0x09, 0x54, // USAGE (Contact Count) 0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x08, // REPORT_SIZE (8) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x08, // LOGICAL_MAXIMUM (8)
0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x55, // USAGE(Contact Count Maximum) 0xb1, 0x02, // FEATURE (Data,Var,Abs) 0xc0, // END_COLLECTION
【实际触点数】 【最大触点数】10