- 0x05, 0x0d, /* USAGE_PAGE (Digitizers) */ \
- 0x09, 0x04, /* USAGE (Touch Screen) */ \
- 0xa1, 0x01, /* COLLECTION (Application) */ \
- 0x85, HID_TS_REPORT_ID, /* REPORT_ID */ \
- 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) */ \
- 0x09, 0x05, /* REPORT_COUNT (5) */ \
- 0x81, 0x03, /* INPUT (Cnst,Ary,Abs) */ \
- 0x25, MAX_TOUCH_POINT, /* LOGICAL_MAXIMUM (MAX_TOUCH_POINT) */ \
- 0x75, 0x08, /* REPORT_SIZE (8) */ \
- 0x09, 0x51, /* USAGE (Contact Identifier) */ \
- 0x95, 0x01, /* REPORT_COUNT (1) */ \
- 0x81, 0x02, /* INPUT (Data,Var,Abs4) */ \
- 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ \
- 0x26, 0x00, 0x10, /* LOGICAL_MAX9MUM (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) */ \
- 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) */ \
- 0x09, 0x05, /* REPORT_COUNT (5) */ \
- 0x81, 0x03, /* INPUT (Cnst,Ary,Abs) */ \
- 0x25, MAX_TOUCH_POINT, /* LOGICAL_MAXIMUM (MAX_TOUCH_POINT) */ \
- 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 Desktop) */ \
- 0x26, 000, 0x10, /* 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, MAX_TOUCH_POINT, /* LOGICAL_MAXIMUM (MAX_TOUCH_POINT) */ \
- 0x81, 0x02, /* INPUT (Data,Var,Abs) */ \
- 0x09, 0x55, /* USAGE (COntact Count Maximum) */ \
- 0xb1, 0x02, /* FEATURE (Data,Var,Abs) */ \
- 0xc0, /* END_COLLECTION */ \
- 0x05, 0x0d, /* USAGE_PAGE (Digitizers) */ \
- 0x09, 0x0e, /* USAGE (Device Configuration) */ \
- 0xa1, 0x01, /* COLLECTION (Application) */ \
- 0x85, FEAUTURE_REPORT_ID, /* REPORT_ID (Configuration) */ \
- 0x09, 0x23, /* USAGE (Device Settings) */ \
- 0xa1, 0x02, /* COLLECTION (Logical) */ \
- 0x09, 0x52, /* USAGE (Device Mode) */ \
- 0x09, 0x53, /* USAGE (Device Identifier) */ \
- 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) */ \
- 0xc0, /* END_COLLECTION */ \
- 0xc0 /* END_COLLECTION */
根据自己定义的描述符,定义的发送的多点触控报告函数如下,采用的是混合模式,两个点打一个包:
- void HIDTouchScreen::touch(uint16_t *x, uint16_t *y, uint8_t *state,
- uint8_t n) {
- if (n == 0) return;
- if (n > MAX_TOUCH_POINT) n = MAX_TOUCH_POINT;
- reportBuffer[0] = HID_TS_REPORT_ID;
- for (uint8_t i = 0; i < n;) {
- reportBuffer[1] = state[i]; // 设置状态
- reportBuffer[2] = i + 1; // 设置触摸点 ID
- reportBuffer[3] = x[i] & 0xFF;
- reportBuffer[4] = (x[i] >> 8) & 0xFF;
- reportBuffer[5] = y[i] & 0xFF;
- reportBuffer[6] = (y[i] >> 8) & 0xFF;
- if (i == 0)
- reportBuffer[13] = n;
- else
- reportBuffer[13] = 0;
- i++;
- if (i < n) {
- reportBuffer[7] = state[i]; // 设置状态
- reportBuffer[8] = i + 1; // 设置触摸点 ID
- reportBuffer[9] = x[i] & 0xFF;
- reportBuffer[10] = (x[i] >> 8) & 0xFF;
- reportBuffer[11] = y[i] & 0xFF;
- reportBuffer[12] = (y[i] >> 8) & 0xFF;
- i++;
- } else {
- for (uint8_t j = 7; j < 13; j++) {
- reportBuffer[j] = 0;
- }
- }
- sendReport();
- }
- }
恳请大家帮分析一下,到底是什么原因导致 win10 无法接受多点触控报告,先谢谢了!