未知USB设备-端口重置失败、设备描述符请求失败
如下图,2个USB硬件设备插入PC机后,出现了如下的错误,导致USB硬件无法正常工作。打开USB设备管理器之后,设备节点上显示的错误信息如下:
如果查看设备状态,一般应都会归为设备启动失败,错误码一般为10。
至于出现以上的错误时,怎么处理了,这就得搞明白为什么会出现以上错误。
USB设备其实对于普通用户来说,分为刚插入电脑的枚举过程和正常的运行两种工作状态。
对于USB设备来说,一般很少出现USB设备正在用的过程中,不能用了。就算出现这种问题,大多数是我们不小心触碰了一下USB设备,导致USB接口接触不良,但也会立马重新枚举,再次正常工作的。
另一种就是USB设备插入电脑中,会进行正常的枚举。这个枚举的过程其实就是USB设备和主机电脑交谈的过程。这个交谈的过程其实就是USB设备要告诉主机自己是个什么样的设备,而USB主机则根据USB设备上报的信息进行资源分配,并加载相应的驱动,让其充当某种标准的设备。如U盘磁盘存储器、打印机或者USB网卡之类。
关于USB的设备类型可详见:USB设备类型定义 https://www.usbzh.com/article/detail-221.html
端口重置失败
按本人自己的理解,其实在USB的枚举过程中,一般不会出现端口重置的。但是凡事有例外。这个例外就是为什么要端口重置。
端口重置一般指的是USB集线器下游端口连接USB设备的那个端口,所以重置USB端口就是USB主机控制器或者USB集线器发现其下游端口出现问题了,所以才会重置。
USB端口重置命令SetPortFeature请示实现,在Windows系统中对于的URB功能号为USB_REQUEST_SET_FEATURE,其IRP为IOCTL为IOCTL_INTERNAL_USB_RESET_PORT。
- 关于SetPortFeature请求更多的详见:https://www.usbzh.com/article/detail-1161.html
- 关于IOCTL_INTERNAL_USB_RESET_PORT更多的详见:https://www.usbzh.com/article/detail-1059.html
所以重置端口失败,个人认为有可能发现设备端在硬件或都数据链路层接该USB集线器下游端口搞的不正常了,触发了硬件上报主机自动恢复功能,但最终结果没有恢复正常,导致问题表现。
设备描述符请求失败
关于这个问题,其实之前分析的比较多:
- 请求USB设备描述符失败 (代码 43)CM_PROB_FAILED_POST_START https://www.usbzh.com/article/detail-1143.html
- Windows10设备管理器USB设备描述符请求失败(未知的usb设备) https://www.usbzh.com/article/detail-395.html
这类问题的根据其实只要搞清楚了USB的枚举过程即可:
USB设备通过触发中断给主机后,USB主机会对设备进行复位(详见USB2.0设备从全速模式到高速模式的识别过程及速率协商 https://www.usbzh.com/article/detail-672.html ),复位之后USB主机就会获取USB设备的信息,获取这个信息的过程就是获取USB设备描述符的事务过程。
这个事务过程分为:
- 主机->设备 SETUP令牌,DATA0令牌下发标准请求
- 主机->设备 发送ACK,表求设备收到标准请求,然后设备应按令牌进行回复数据
- 设备->主机 IN令牌,然后用DATA1令牌返回数据。这里是设备描述符
- 主机->设备 主机返回ACK表示收到数据。
这个具体的过程可详见本站示例USB2.0设备枚举-获取设备描述符事务https://www.usbzh.com/article/detail-447.html
一般最后,其实也会有一个长度为0的DATA/IN事务,但是我们一般不会再关注它了,如果有兴趣了解的可见:https://www.usbzh.com/article/detail-624.html
当然,以上都介绍的是正常过程,但有的时候因为设备端的无响应,会出现这个流程走不下去,然后主机会重试几次后发现设备根据无法正常的回答数据或者无回答,主机也就干脆上报给系统的设备管理器提示设备描述符请求失败。我们的一个示例抓包可见:USB设备接入主机后不停重复枚举最后失败 https://www.usbzh.com/article/detail-757.html