问题遇到的现象和发生背景
最近在做一个hid触摸屏的项目,前期测试所有电脑枚举正常,功能也正常;但是最近有一台客户的电脑枚举成功,但是没有触摸功能。经过调试发现那台没功能的电脑没有成功上传手指数,GET_REPORT没有回应导致usb断开(如图)。但是功能可以的电脑能正常返回手指数。
操作环境、软件版本等信息
电脑系统是正版的win11家庭版,公司的同版本系统没这个问题。客户电脑用别的触摸设备功能也正常。
最近在做一个hid触摸屏的项目,前期测试所有电脑枚举正常,功能也正常;但是最近有一台客户的电脑枚举成功,但是没有触摸功能。经过调试发现那台没功能的电脑没有成功上传手指数,GET_REPORT没有回应导致usb断开(如图)。但是功能可以的电脑能正常返回手指数。
电脑系统是正版的win11家庭版,公司的同版本系统没这个问题。客户电脑用别的触摸设备功能也正常。
以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
USB HID GET REPORT
请求的处理。代码中还包含了对报告类型和报告ID的检查,以及如何通过端点0返回特性报告的逻辑。GET DESCRIPTOR
、SET CONFIG
等操作。日志显示了请求的时间戳、请求类型、数据传输方向(IN
或OUT
)、传输的数据以及响应状态。USB_HID_SET_IDLE
请求时的代码处理逻辑,包括对数据长度的检查和相应的响应。问题是关于一个HID触摸屏项目,在大多数电脑上枚举和功能都正常,但在一台特定客户的电脑上,触摸屏没有触摸功能,原因是GET_REPORT
请求没有得到响应,导致USB连接断开。
问题可能出现的原因包括:
GET_REPORT
请求的处理逻辑是否正确,特别是报告类型和报告ID的检查。根据第一张图片中的代码,以下是修改后的代码片段,以确保GET_REPORT
请求能够正确处理:
if ((pSetup->RequestType & 0x80) == 0x80) {
// 从主机到设备
switch (pSetup->Request) {
case USB_HID_GET_REPORT:
// 报告类型为3(Feature)且报告ID为VendorID2
if (((pSetup->wValue >> 8) == 3) && ((pSetup->wValue & 0xFF) == VendorID2) &&
(pSetup->wIndex == 0) && (pSetup->wLength == 2)) {
// 通过端点0返回我们的特性报告
pSendData = MaxContactCountReport;
DataLength = pSetup->wLength;
// 将数据通过EPO返回
USBD_IxWrite(0, (uint8_t *)pSendData, DataLength);
break;
}
// 其他报告类型的处理...
default:
// 如果请求的报告类型不被支持,发送STALL响应
USBD_StallEP(0);
break;
}
} else {
// 从设备到主机的处理...
}
GET_REPORT
请求时,HID触摸屏能够正确响应,不再断开USB连接。请注意,上述代码和解决方案需要根据实际的固件架构和客户电脑的具体情况进行调整。如果问题依然存在,可能需要进一步的调试和分析。