请问一下各位大佬,国产手柄中的USB二次枚举是如何实现的
usb吧
全部回复
仅看楼主
level 4
白匠啊º 楼主
我想要实现一下USB 设备XINPUT和键盘等HID类同时枚举(也就是在XINPUT上增加HID接口),使用USB分析仪抓包,发现手柄的进行了三次枚举,三次都是不同的设备PID VID,第一次枚举是个HID类,report分析好像是个收发数据的,我猜测是厂商的BootLoader之类的,第二次枚举是标准的XINPUT,使用的是XBOX厂商的PID VID,之后由进行了第三次枚举,使用的是自定义厂商PID VID 这次的配置描述符总共有三个接口第一个是厂商是自定义接口,应该是用来走XINPUT的,后面两个一个就是正常的键盘HID接口,一个是数据收发HID接口和第一次枚举时的功能没啥太大差别似乎估计也是固件升级的接口。
这其中的关键在于第二次XINPUT的枚举和第三次枚举是如何实现主机不注销XINPUT接口的,我个人是能够成功枚举XINPUT设备的,但是在这个厂商抓包中,在XINPUT枚举是主机请求了两次序列字符串描述符之后,设备响应完成之后,主机下发OUT DATA1 从机一直应答ACK一直循环,直到后面复位重新进行枚举,在我自己的XINPUT抓包时是不同的。还有就是复位是的状态手柄端一直是JJJJ SE0 J SE0 J 复位的,而我自己的复位就是SE0 J SE0 J 。这两点就是有很大的不同。目前我也没啥想法去实现这些,我也是个USB新手,所以想问一下各位大佬具体这些是如何实现的。
我第一次的想法是在XINPUT的配置符上添加一个HID接口,来实现HID设备和xinput设备同时枚举,但是一旦使用了XBOX的厂商PID VID主机将不会进行任何获取HID report描述符的请求,看网上说需要setup中添加啥厂商请求的描述符其实根本不需要,抓包中主机根本没有进行任何请求厂商描述符。第三次描述符我发评论区
2026年02月12日 04点02分 1
level 4
白匠啊º 楼主
unsigned Device_Descriptor[0x12] = { 0x12, 0x1, 0x0, 0x2, 0x0, 0x0, 0x0, 0x40, 0x37, 0x35, 0x40, 0x10, 0x0, 0x1, 0x1, 0x2, 0x0, 0x1};unsigned char Config_Descriptor[0x69] = { 0x9, 0x2, 0x69, 0x0, 0x3, 0x1, 0x0, 0x80, 0x32, 0x9, 0x4, 0x0, 0x0, 0x2, 0xff, 0x5d, 0x1, 0x0, 0x10, 0x21, 0x10, 0x1, 0x1, 0x24, 0x81, 0x14, 0x3, 0x0, 0x3, 0x13, 0x2, 0x0, 0x3, 0x0, 0x7, 0x5, 0x81, 0x3, 0x20, 0x0, 0x1, 0x7, 0x5, 0x2, 0x3, 0x20, 0x0, 0x8, 0x9, 0x4, 0x1, 0x0, 0x1, 0x3, 0x1, 0x1, 0x0, 0x9, 0x21, 0x11, 0x1, 0x0, 0x1, 0x22, 0x56, 0x0, 0x7, 0x5, 0x82, 0x3, 0x10, 0x0, 0x8, 0x9, 0x4, 0x2, 0x0, 0x2, 0x3, 0x0, 0x0, 0x0, 0x9, 0x21, 0x11, 0x1, 0x0, 0x1, 0x22, 0x1d, 0x0, 0x7, 0x5, 0x83, 0x3, 0x40, 0x0, 0x8, 0x7, 0x5, 0x3, 0x3, 0x40, 0x0, 0x8};unsigned char Qualifer_Descriptor[0xa] = {0xa, 0x6, 0x0, 0x2, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0};unsigned char report_Descriptor[0x56] = {0x5, 0x1, 0x9, 0x6, 0xa1, 0x1, 0x85, 0x1, 0x5, 0x7, 0x19, 0xe0, 0x29, 0xe7, 0x15, 0x0, 0x25, 0x1, 0x75, 0x1, 0x95, 0x8, 0x81, 0x2, 0x95, 0x3, 0x75, 0x1, 0x5, 0x8, 0x19, 0x1, 0x29, 0x3, 0x91, 0x2, 0x95, 0x5, 0x75, 0x1, 0x91, 0x1, 0x95, 0x7, 0x75, 0x8, 0x15, 0x0, 0x26, 0xff, 0x0, 0x5, 0x7, 0x19, 0x0, 0x2a, 0xff, 0x0, 0x81, 0x0, 0xc0, 0x5, 0xc, 0x9, 0x1, 0xa1, 0x1, 0x85, 0x3, 0x75, 0x10, 0x95, 0x1, 0x15, 0x0, 0x26, 0x8c, 0x2, 0x19, 0x0, 0x2a, 0x8c, 0x2, 0x81, 0x0, 0xc0};unsigned char report_Descriptor1[0x1d] = {0x6, 0x7a, 0xff, 0x9, 0x1, 0xa1, 0x1, 0x9, 0x2, 0xa1, 0x0, 0x9, 0x3, 0x15, 0x0, 0x25, 0xff, 0x75, 0x8, 0x95, 0x40, 0x81, 0x2, 0x9, 0x5, 0x91, 0x2, 0xc0, 0xc0};
2026年02月12日 04点02分 2
level 4
白匠啊º 楼主
好像这个吧全速用户,好少开发者啊
2026年02月12日 04点02分 3
level 4
白匠啊º 楼主
欧克兄弟们,问题已经解决了,虽然这个吧似乎全是用户开发者很少,但是我还是把方案给出来好了,这个XINPUT的复合类设备枚举的关键就在于最后使用自定义PID VID是主机会下发一个厂商类请求,你需要对这个厂商类请求进行回应[呵呵][呵呵],为什么这么简单的问题我会忽略呢,原因就在于抓包软件的上位机没把这个厂商类请求给识别出来,而将他变成了一段数据。具体设备要发啥数据可以去我分享的包里面查看
2026年03月25日 12点03分 4
level 4
白匠啊º 楼主
USB包和XINPUT XINPUT Composite例程地址
网页链接
2026年04月15日 08点04分 5
1