如何让ESP32-S3 TinyUSB设备在Windows上枚举为XInputHID兼容设备?
解决ESP32-S3 TinyUSB XInputHID设备无法触发Windows xinputhid.sys驱动加载问题
核心问题分析
当前问题主要出在MS OS描述符的兼容ID内容与格式错误,同时可能存在HID描述符合规性、设备请求处理或inf文件匹配的遗漏点。
修正MS OS描述符的兼容ID
根据XInputHID规范,需提供的兼容ID为HID_DEVICE_SYSTEM_GAME,在MS OS 2.0描述符中要拆分为8字节的Compatible ID和8字节的Sub-Compatible ID,剩余字段用0填充。你当前的描述符存在字符串截断和格式缺失问题,正确的描述段应修改为:
// ----- MS OS 2.0 Descriptor Set Header ----- 0x0A, 0x00, // wLength (10字节) 0x00, 0x00, // MS_OS_20_SET_HEADER_DESCRIPTOR 0x00, 0x00, 0x03, 0x06, // Windows版本标识(8.1+) 0x1E, 0x00, // wTotalLength (30字节,10+20) // ----- Compatible ID Descriptor ----- 0x14, 0x00, // wLength (20字节) 0x03, 0x00, // bDescriptorType: COMPATIBLE ID 'H','I','D','_','D','E','V','I', // Compatible ID (8字节: "HID_DEVI") 'S','Y','S','T','E','M','_','G', // Sub-Compatible ID (8字节: "SYSTEM_G") 0x00, 0x00, 0x00, 0x00 // 剩余4字节填充0(兼容ID描述符总长度需为20字节)
注意:原描述符缺少最后4字节的填充,这会导致格式不符合Windows规范,系统会直接忽略该描述符。
其他关键检查点
- HID描述符合规性:确保使用的HID描述符完全匹配《XInputHID Documentation.docx》中的要求,包括报告ID、报告长度、轴/按键的位映射等。错误的报告格式会导致Windows fallback到input.sys驱动。
- TinyUSB的MS OS描述符处理:确认TinyUSB设备正确响应Windows的GET_DESCRIPTOR请求(类型0xEE,索引0x00),且设备描述符中的
bDeviceCapability字段已正确设置微软OS描述符支持标志。 - xinputhid.inf匹配:即使使用兼容ID,也需要确保设备的VID/PID被包含在xinputhid.inf的硬件ID列表中,或者在inf的设备节添加兼容ID匹配项:
[XInputHID_Device.NTamd64] %XInputHID.DeviceDesc%=XInputHID_Inst, HID_DEVICE_SYSTEM_GAME - 驱动签名与测试模式:如果使用未签名的自定义inf,需开启Windows测试模式或禁用驱动签名强制,否则系统会拒绝加载xinputhid.sys。
- VID/PID的选择:使用微软官方VID(0x045E)可能触发系统特殊验证逻辑,建议先使用自定义VID/PID测试,确认兼容ID生效后再尝试官方VID/PID。
内容的提问来源于stack exchange,提问作者TrayMan
相关产品推荐
相关产品推荐

