USB兼容驱动Composite层级引起的摄像头灯问题
跌跌撞撞,搞了快一个星期。一个定制厂商用的UVC摄像头指示搞了几天,今天算是可以蒙混过关了。
关于调试过程中的一部分细节,可见本人的另一篇文章:
关于UVC摄像头指示灯的调试过程总结 http://www.usbzh.com/article/detail-430.html
在这里,可能只能算是总结二吧,没准还有总结三。
关于这个指示灯,调试过程我觉地都要出现幻觉了。原因无它,就是因为:
- 在一部分的机器上是看心情,时好时不好。
- 换个机器可能一直好。
- 再换个机器又不好。
- 装上Bushound抓包工具有时竟然把一个不好的机器给调教好了。
但是无论怎么样,都有一个现实说我无法自圆其说,那就是用了Windows自带的驱动,人家就是好的。出现以上的问题,只出现在我自己的驱动问题上。
丢,想让固件厂商帮忙定位调试一下,人家根本就不理我。想问下上层应用的机制,只能呵呵,XX无门。对于这个两头黑的调试,只能看自己本事,自己分析了。
不过隐隐根据上面的现象分析,感觉可能与时序有关系。昨晚睡了一觉,能否减少驱动通讯时长,来看下是否可以。
现说下我该UVC摄像头的设备树。该设备是一个复合设备,包含一个标准的UVC摄像头功能和一个自定义的HID功能。所以当把该摄像头接入机器后,Windows加载的是USB通用驱动usbccgp.sys,所以设备树如下所示:
- USB Comosite Device
- UVC Camera
- USB Input Device
- HID-compliant vendor-defined device
而经过本人的驱动后,设备树变成了
- MY UVC Device
- USB Comosite Device
- UVC Camera
- USB Comosite Device
- USB Input Device
- HID-compliant vendor-defined device
- USB Input Device
- USB Comosite Device
由于本人在驱动中将报告的PDO的BusQueryCompatibleIDs设为了 USB\\COMPOSITE
所以才变成了上述的设备树。
经过本人的思考,需要干掉多出的这两层USB Comosite Device层级,让设备树变成如下的结构:
- MY UVC Device
- UVC Camera
- USB Input Device
- HID-compliant vendor-defined device
好了,已经知道目标了,就开始动手写代码。第一次将UVC的BusQueryCompatibleIDs上报成 USB\Class_0e&SubClass_03&Prot_00
竟然无法识别。微软你竟然骗人,我以为摄像头的兼容硬件就是这个来的,算了,用最大匹配的兼容硬件ID算了,直接变成 USB\Class_0e
.
驱动编译,在目标机上加载驱动,运行,结果就是指示灯正常了,换几台目标机,依旧正常。