打印

求助:USB HID 多点触摸可被 Win10 识别但不能识别触摸报告

[复制链接]
2218|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
5kmGo|  楼主 | 2019-10-3 10:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 5kmGo 于 2019-10-3 10:37 编辑

大家好,恳请大神帮助!如题,题主使用 stm32f103c8t6 要实现 usb hid 的多点触控,连接到 win10 ,win10 可以识别到实现的十点触控设备:



设备管理器中也能看到已经识别到的设备:




但是在系统设置中识别的图标看上去是鼠标:



实现多点触控,题主清楚要有两个交互过程
  • win10 会向设备请求特征报告,包含支持的最多触摸点数
  • win10 会根据设备提交的描述符以及获取的特征报告告诉设备以单点工作还是多点触摸工作


不知道是不是上面的两个必要交互没做好才导致 win10 无法识别设备发送的触摸报告数据?

报告描述符如下:

  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 无法接受多点触控报告,先谢谢了!

使用特权

评论回复

相关帖子

沙发
cwt962279960| | 2020-5-12 17:46 | 只看该作者
大佬 解决好了吗?重金求源码962279960@qq.com

使用特权

评论回复
板凳
huaziforever| | 2020-8-4 21:52 | 只看该作者
一般都是描述符不对或者报告不对,,,QQ125242773

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝