USB设备的调试笔记-奇怪枚举失败问题
自己搞了一个USB 触摸屏的驱动,通过对系统的USB触摸屏设备进行更改,这样可以在自己的驱动中过滤来自触摸屏的数据。
在不加自定义驱动的情况下,设备管理器树关系如下:
- USB输入设备
- USB触摸屏设备
而加上自己的设备驱动后,设备管理器树关系如下:
- USB触摸屏设备
- 自己的驱动程序
- USB输入设备
- USB触摸屏设备
- USB输入设备
从上述的设备管理器上可以看到,相对于原来的设备树,加了一层自己定义的设备驱动层。
触摸屏的数据过滤本人做了比较简单的方式,主要是过滤IRP_MJ_INTERNAL_DEVICE_CONTROL的回调函数。通过自行分析HID报表描述符,这样进行硬编码进行数据长度和数据内容的过滤。
在上述的设备管理器中,其实设备管理器树形结构中还有一层自定义HID设备,此HID设备用于对USB设备固件的升级。
以上的方案比较完美的解决了自己项目中的需求,但是,但是,出了问题。
通过频率的升级,这样USB设备会频敏的枚举,从理论的角度来讲,是没有任何问题的。
但是,在执行过程中,出现了USB设备枚举失败的问题。在设备管理器中看到的是设备树上有一个感叹号,显示设备启动取消。
重启设备又正常。
关于启动取消,启动在我的概念理解上一般是IRP_MN_START_DEVICE回调函数取消,这个应该是和设备在禁用或卸载驱动时的类似。所以我在代码中对进行过滤,并通过DbgView中查看结果。
使用 Windows下USB驱动同步URB转IRP请求函数代码 一文中的代码,详见网址:http://www.usbzh.com/fun/detail-31.html
这里一调不知道,竟然发现在设备的枚举启动过程中,从来没有看到由于底层PDO执行IRP_MN_START_DEVICE导致STATUS_PENDING而引起的同步等待。
执行了快几百次了,好不容易问题复现。竟然发现没有插入鼠标,没办法进行电脑操作。
此种情况下好像设备管理器还是USB总线死锁一般,根据不再识别新的设备
没办法,只能重新再挂机,这次我也加上了BusHoud,同时追踪USB设备的收发包信息。
你要说也奇怪,昨天在调步调用IRP的请求的时候,IoCallDriver没有发现一份PENDING状态,今天换了一台机器,基本全是PENDING状态。
其它这从侧面说明一个问题,自己调试成功的的并不一定代表正确无语的,只是一条在特定条件下的分支。