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

[复制链接]
 楼主| 5kmGo 发表于 2019-10-3 10:35 | 显示全部楼层 |阅读模式
本帖最后由 5kmGo 于 2019-10-3 10:37 编辑

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



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




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



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


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

报告描述符如下:

  1.   0x05, 0x0d,                   /*  USAGE_PAGE (Digitizers) */               \
  2.       0x09, 0x04,               /*  USAGE (Touch Screen) */                  \
  3.       0xa1, 0x01,               /*  COLLECTION (Application) */              \
  4.       0x85, HID_TS_REPORT_ID,   /*    REPORT_ID */                           \
  5.       0x09, 0x22,               /*    USAGE (Finger) */                      \
  6.       0xa1, 0x02,               /*    COLLECTION (Logical) */                \
  7.       0x09, 0x42,               /*      USAGE (Tip Switch) */                \
  8.       0x15, 0x00,               /*      LOGICAL_MINIMUM (0) */               \
  9.       0x25, 0x01,               /*      LOGICAL_MAXIMUM (1) */               \
  10.       0x75, 0x01,               /*      REPORT_SIZE (1) */                   \
  11.       0x95, 0x01,               /*      REPORT_COUNT (1) */                  \
  12.       0x81, 0x02,               /*      INPUT (Data,Var,Abs) */              \
  13.       0x09, 0x32,               /*      USAGE (In Range) */                  \
  14.       0x81, 0x02,               /*      INPUT (Data,Var,Abs) */              \
  15.       0x09, 0x47,               /*      USAGE (Touch Valid) */               \
  16.       0x81, 0x02,               /*      INPUT (Data,Var,Abs) */              \
  17.       0x09, 0x05,               /*      REPORT_COUNT (5) */                  \
  18.       0x81, 0x03,               /*      INPUT (Cnst,Ary,Abs) */              \
  19.       0x25, MAX_TOUCH_POINT,    /*      LOGICAL_MAXIMUM (MAX_TOUCH_POINT) */ \
  20.       0x75, 0x08,               /*      REPORT_SIZE (8) */                   \
  21.       0x09, 0x51,               /*      USAGE (Contact Identifier) */        \
  22.       0x95, 0x01,               /*      REPORT_COUNT (1) */                  \
  23.       0x81, 0x02,               /*      INPUT (Data,Var,Abs4) */             \
  24.       0x05, 0x01,               /*      USAGE_PAGE (Generic Desktop) */      \
  25.       0x26, 0x00, 0x10,         /*      LOGICAL_MAX9MUM (32767 ) */          \
  26.       0x75, 0x10,               /*      REPORT_SIZE (16) */                  \
  27.       0x55, 0x00,               /*      UNIT_EXPONENT (0) */                 \
  28.       0x65, 0x00,               /*      UNIT (None) */                       \
  29.       0x09, 0x30,               /*      USAGE (X) */                         \
  30.       0x35, 0x00,               /*      PHYSICAL_MINIMUM (0) */              \
  31.       0x46, 0x00, 0x00,         /*      PHYSICAL_MAXIMUM (0) */              \
  32.       0x81, 0x02,               /*      INPUT (Data,Var,Abs) */              \
  33.       0x09, 0x31,               /*      USAGE (Y) */                         \
  34.       0x46, 0x00, 0x00,         /*      PHYSICAL_MAXIMUM (0) */              \
  35.       0x81, 0x02,               /*      INPUT (Data,Var,Abs) */              \
  36.       0xc0,                     /*    END_COLLECTION */                      \
  37.       0xa1, 0x02,               /*    COLLECTION (Logical) */                \
  38.       0x05, 0x0d,               /*      USAGE_PAGE (Digitizers) */           \
  39.       0x09, 0x42,               /*      USAGE (Tip Switch) */                \
  40.       0x15, 0x00,               /*      LOGICAL_MINIMUM (0) */               \
  41.       0x25, 0x01,               /*      LOGICAL_MAXIMUM (1) */               \
  42.       0x75, 0x01,               /*      REPORT_SIZE (1) */                   \
  43.       0x95, 0x01,               /*      REPORT_COUNT (1) */                  \
  44.       0x81, 0x02,               /*      INPUT (Data,Var,Abs) */              \
  45.       0x09, 0x32,               /*      USAGE (In Range) */                  \
  46.       0x81, 0x02,               /*      INPUT (Data,Var,Abs) */              \
  47.       0x09, 0x47,               /*      USAGE (Touch Valid) */               \
  48.       0x81, 0x02,               /*      INPUT (Data,Var,Abs) */              \
  49.       0x09, 0x05,               /*      REPORT_COUNT (5) */                  \
  50.       0x81, 0x03,               /*      INPUT (Cnst,Ary,Abs) */              \
  51.       0x25, MAX_TOUCH_POINT,    /*      LOGICAL_MAXIMUM (MAX_TOUCH_POINT) */ \
  52.       0x75, 0x08,               /*      REPORT_SIZE (8) */                   \
  53.       0x09, 0x51,               /*      USAGE (Contact Identifier) */        \
  54.       0x95, 0x01,               /*      REPORT_COUNT (1) */                  \
  55.       0x81, 0x02,               /*      INPUT (Data,Var,Abs) */              \
  56.       0x05, 0x01,               /*      USAGE_PAGE (Generic Desktop) */      \
  57.       0x26, 000, 0x10,          /*      LOGICAL_MAXIMUM (32767 ) */          \
  58.       0x75, 0x10,               /*      REPORT_SIZE (16) */                  \
  59.       0x55, 0x00,               /*      UNIT_EXPONENT (0) */                 \
  60.       0x65, 0x00,               /*      UNIT (None) */                       \
  61.       0x09, 0x30,               /*      USAGE (X) */                         \
  62.       0x35, 0x00,               /*      PHYSICAL_MINIMUM (0) */              \
  63.       0x46, 0x00, 0x00,         /*      PHYSICAL_MAXIMUM (0) */              \
  64.       0x81, 0x02,               /*      INPUT (Data,Var,Abs) */              \
  65.       0x09, 0x31,               /*      USAGE (Y) */                         \
  66.       0x46, 0x00, 0x00,         /*      PHYSICAL_MAXIMUM (0) */              \
  67.       0x81, 0x02,               /*      INPUT (Data,Var,Abs) */              \
  68.       0xc0,                     /*    END_COLLECTION */                      \
  69.       0x05, 0x0d,               /*    USAGE_PAGE (Digitizers) */             \
  70.       0x09, 0x54,               /*    USAGE (Contact Count) */               \
  71.       0x95, 0x01,               /*    REPORT_COUNT (1) */                    \
  72.       0x75, 0x08,               /*    REPORT_SIZE (8) */                     \
  73.       0x15, 0x00,               /*    LOGICAL_MINIMUM (0) */                 \
  74.       0x25, MAX_TOUCH_POINT,    /*    LOGICAL_MAXIMUM (MAX_TOUCH_POINT) */   \
  75.       0x81, 0x02,               /*    INPUT (Data,Var,Abs) */                \
  76.       0x09, 0x55,               /*    USAGE (COntact Count Maximum) */       \
  77.       0xb1, 0x02,               /*    FEATURE (Data,Var,Abs) */              \
  78.       0xc0,                     /*  END_COLLECTION */                        \
  79.       0x05, 0x0d,               /*  USAGE_PAGE (Digitizers) */               \
  80.       0x09, 0x0e,               /*  USAGE (Device Configuration) */          \
  81.       0xa1, 0x01,               /*  COLLECTION (Application) */              \
  82.       0x85, FEAUTURE_REPORT_ID, /*    REPORT_ID (Configuration) */           \
  83.       0x09, 0x23,               /*    USAGE (Device Settings) */             \
  84.       0xa1, 0x02,               /*    COLLECTION (Logical) */                \
  85.       0x09, 0x52,               /*      USAGE (Device Mode) */               \
  86.       0x09, 0x53,               /*      USAGE (Device Identifier) */         \
  87.       0x15, 0x00,               /*      LOGICAL_MINIMUM (0) */               \
  88.       0x25, 0x0a,               /*      LOGICAL_MAXIMUM (10) */              \
  89.       0x75, 0x08,               /*      REPORT_SIZE (8) */                   \
  90.       0x95, 0x02,               /*      REPORT_COUNT (2) */                  \
  91.       0xb1, 0x02,               /*      FEATURE (Data,Var,Abs) */            \
  92.       0xc0,                     /*    END_COLLECTION */                      \
  93.       0xc0                      /*  END_COLLECTION */


根据自己定义的描述符,定义的发送的多点触控报告函数如下,采用的是混合模式,两个点打一个包:
  1. void HIDTouchScreen::touch(uint16_t *x, uint16_t *y, uint8_t *state,
  2.                            uint8_t n) {
  3.   if (n == 0) return;
  4.   if (n > MAX_TOUCH_POINT) n = MAX_TOUCH_POINT;
  5.   reportBuffer[0] = HID_TS_REPORT_ID;
  6.   for (uint8_t i = 0; i < n;) {
  7.     reportBuffer[1] = state[i];  // 设置状态
  8.     reportBuffer[2] = i + 1;     // 设置触摸点 ID
  9.     reportBuffer[3] = x[i] & 0xFF;
  10.     reportBuffer[4] = (x[i] >> 8) & 0xFF;
  11.     reportBuffer[5] = y[i] & 0xFF;
  12.     reportBuffer[6] = (y[i] >> 8) & 0xFF;
  13.     if (i == 0)
  14.       reportBuffer[13] = n;
  15.     else
  16.       reportBuffer[13] = 0;
  17.     i++;
  18.     if (i < n) {
  19.       reportBuffer[7] = state[i];  // 设置状态
  20.       reportBuffer[8] = i + 1;     // 设置触摸点 ID
  21.       reportBuffer[9] = x[i] & 0xFF;
  22.       reportBuffer[10] = (x[i] >> 8) & 0xFF;
  23.       reportBuffer[11] = y[i] & 0xFF;
  24.       reportBuffer[12] = (y[i] >> 8) & 0xFF;
  25.       i++;
  26.     } else {
  27.       for (uint8_t j = 7; j < 13; j++) {
  28.         reportBuffer[j] = 0;
  29.       }
  30.     }
  31.     sendReport();
  32.   }
  33. }


恳请大家帮分析一下,到底是什么原因导致 win10 无法接受多点触控报告,先谢谢了!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
cwt962279960 发表于 2020-5-12 17:46 | 显示全部楼层
大佬 解决好了吗?重金求源码962279960@qq.com
huaziforever 发表于 2020-8-4 21:52 | 显示全部楼层
一般都是描述符不对或者报告不对,,,QQ125242773
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部