STM32F103模拟多点触控HID设备触摸事件无响应问题求助
STM32F103多点触控HID设备触摸事件无响应问题
使用STM32F103开发板模拟多点触控HID设备,设备可被主机正确识别为触摸屏,但发送触摸事件后主机无对应动作。添加Contact ID支持多点触控前,单指功能正常。
BusHound快照说明
0x40开头的IN数据用于告知主机支持双指触控:
部分报告描述符
0x05, 0x0d, // USAGE_PAGE (Digitizers) 0x09, 0x04, // USAGE (Touch Screen) 0xa1, 0x01, // COLLECTION (Application) 0x85, 0x04, // 报告ID (4) 0x09, 0x22, // USAGE (Finger) 0xa1, 0x00, // COLLECTION (Physical) 0x09, 0x42, // USAGE (Tip Switch) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 0x09, 0x32, // Usage (In Range) 0x09, 0x47, // Usage (Confidence) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x02, // REPORT_COUNT (2) 0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 0x09, 0x51, // Usage (Contact Identifier) 0x75, 0x05, // Report Size (5) 0x95, 0x01, // Report Count (1) 0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xff, 0x0f, // LOGICAL_MAXIMUM (4095) 0x35, 0x00, // PHYSICAL_MINIMUM (0) 0x46, 0xff, 0x0f, // PHYSICAL_MAXIMUM (4095) 0x75, 0x10, // REPORT_SIZE (16) 0x95, 0x02, // REPORT_COUNT (2) 0x81, 0x02, // INPUT (Data,Var,Abs) 0xc0, // END_COLLECTION 0x05, 0x0D, // Usage Page (Digitizer) 0x09, 0x22, // USAGE (Finger) 0xa1, 0x00, // COLLECTION (Physical) 0x09, 0x42, // USAGE (Tip Switch) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 0x09, 0x32, // Usage (In Range) 0x09, 0x47, // Usage (Confidence) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x02, // REPORT_COUNT (2) 0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 0x09, 0x51, // Usage (Contact Identifier) 0x75, 0x05, // Report Size (5) 0x95, 0x01, // Report Count (1) 0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xff, 0x0f, // LOGICAL_MAXIMUM (4095) 0x35, 0x00, // PHYSICAL_MINIMUM (0) 0x46, 0xff, 0x0f, // PHYSICAL_MAXIMUM (4095) 0x75, 0x10, // REPORT_SIZE (16) 0x95, 0x02, // REPORT_COUNT (2) 0x81, 0x02, // INPUT (Data,Var,Abs) 0xc0, // END_COLLECTION 0x05, 0x0d, // USAGE_PAGE (Digitizers) 0x09, 0x54, // USAGE (Actual count) 0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x08, // REPORT_SIZE (8) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x05, 0x0D, // Usage Page (Digitizer) 0x85, 0x02, // Report ID (2) 0x09, 0x55, // Usage (0x55) 0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x08, // REPORT_SIZE (8) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
事件数据结构

排查方向
BusHound快照最后两行是STM32发送的触摸事件数据,可从以下几点排查:
- 数据位对齐与顺序:确认Tip Switch、In Range、Confidence、Contact ID的位顺序是否与描述符定义一致,字节内高低位顺序是否符合HID规范(通常是高位在前)。
- Actual Count字段值:报告中的Actual Count(0x54)需正确设置当前触摸点数,单指设1、双指设2,检查发送数据中该字段是否赋值正确。
- Contact ID唯一性:每个触摸点的Contact ID必须唯一,触摸期间保持不变,释放后可复用,确保多触点ID不重复。
- 报告ID匹配:发送触摸事件时必须携带正确的报告ID(0x04),检查BusHound中发送数据是否以0x04开头。
- 状态位正确性:触摸时In Range和Tip Switch需设为1,释放时设为0,确认这些位的状态是否符合触摸状态。
- 规范兼容性:对照USB HID Usage Tables v1.12中Touch Screen的示例描述符,检查自身描述符是否遗漏字段或顺序错误。
内容的提问来源于stack exchange,提问作者eaphone
相关产品推荐
相关产品推荐

