UVC摄像头技术笔记
+ -

USB兼容驱动Composite层级引起的摄像头灯问题

2021-06-11 511 0

跌跌撞撞,搞了快一个星期。一个定制厂商用的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

由于本人在驱动中将报告的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.

UVC摄像头兼容ID

驱动编译,在目标机上加载驱动,运行,结果就是指示灯正常了,换几台目标机,依旧正常。

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

USB兼容驱动Composite层级引起的摄像头灯问题
跌跌撞撞,搞了快一个星期。一个定制厂商用的UVC摄像头指示搞了几天,今天算是可以蒙混过关了。关于调试过程中的一部分细节,可见本人的另一篇文章:关于UVC摄像头指示灯的调试过程总结 http://www.usbzh.com/article/detail-430.html在这里,可能只能算是总结二吧,没......
USB通用父驱动usbccgp.sys的过滤UVC摄像头、UAC麦克风和HID设备硬件ID
激动的心情,无溢言表。。虽然只是一个很简单的东西。。但相于折腾了这么久,还是很开心的了。最近有个需求,功能是这样的:有一个USB复合设备,连接到windows系统中它在windows下的设备树如下:USB Composite Device(usbccgp.sys)UVC CameraUAC ......
USBCCGP 功能简介
许多 USB 设备提供了多个 USB 接口。在 USB 术语中,此类设备被称为USB复合设备。Microsoft Windows 2000 和 Windows 98 操作系统的 USB 总线驱动程序 (Usbhub.sys) 中包含有一个通用父设备,它将复合设备的各接口显示为一台单独的设备。在 M......
USBCCGP 复合USB设备的枚举
当新的 USB 设备连接到主机计算机时,USB 总线驱动程序创建设备的物理设备对象 (PDO),并生成报告新 PDO 的即插即用事件。 操作系统然后,查询的硬件 Id 与 PDO 相关联的总线驱动程序。对于所有 USB 设备、 USB 总线驱动程序报告设备 ID具有以下格式:USBVID_xx......
USBCCGP 复合设备接口设备ID
复合 USB 设备上的接口可分组到集合中或分别代表一个 USB 函数。如果接口未分组在集合中,则通用父驱动程序会为每个接口创建一个 PDO,并为每个 PDO 生成一组硬件 Id。USB设备ID接口 PDO 的设备 ID具有以下格式:USBVID_v(4)&PID_p(4)&MI......
USBCCGP 驱动结构
USBCCGP驱动文件结构USBCCGP驱动位于REACTOS的ReactOS-0.4.0driversusbusbccgp目录下,包含文件descriptor.cfdo.cfunction.cguid.cmisc.cpdo.cusbccgp.cusbccgp.husbccg......
USBCCGP 分发函数
通过上一节知道,USBCCGAP将所有的IRP都会发到USBCCGP_Dispatch函数中。其代码如下:usbccgp.cNTSTATUSNTAPIUSBCCGP_Dispatch( PDEVICE_OBJECT DeviceObject, PIRP Irp){ ......
USBCCGP 功能设备驱动FDO创建
回到入口函数DriverEntry,驱动扩展结构体的AddDevice函数指针被置为USBCCGP_AddDevice。这个函数指针是WDM驱动功能设备创建和扩展数据初始的回调函数。usbccgp.cNTSTATUSNTAPIDriverEntry( PDRIVER_OBJECT D......
USBCCGP FDO的启动
USBCCGP FDO的启动会执行主功能号为IRP_MJ_PNP,次功功能号IRP_MN_START_DEVICE的IRP。其函数调用关系如下:USBCCGP_Dispatch FDO_Dispatch FDO_HandlePnp ......
USBCCGP 获取USB设备描述符
USB设备的描述符是通过函数USBCCGP_GetDescriptors来获取的。descriptor.c /* Get descriptors */ Status = USBCCGP_GetDescriptors(DeviceObject); if (!NT_SUCCESS......
USBCCGP 获取USB设备特性
设备特性在windows下所有设备的通用,其主要包括一些电源特性和热插拨特性。结构定义如下:typedef _Struct_size_bytes_(Size) struct _DEVICE_CAPABILITIES { _Field_range_(==, sizeof(struct _DE......
USBCCGP 配置设备
获取设备的配置描述符通过前面已经知道,其包括的内容比较多,如接口描述符、端点描述符等,其中有很多我们进行数据通讯的信息,所以下来我们就要对设备进行配置。在USBCCGP USB复合设备驱动中,由于其将各个独立的接口会枚举成一个单独的设备,所以一般情况下有几个接口描述符就会被枚举成几个设备(UVC设备......
USBCCGP 总线过滤驱动接口
总线驱动或过滤驱动的接口其实就是一个USBC_DEVICE_CONFIGURATION_INTERFACE_V1的结构体,其用于创建PDO.#define USBC_DEVICE_CONFIGURATION_INTERFACE_VERSION_1 0x0001typedef s......
USBCCGP 设备接口集
USBCCGP是通用复合设备,所以其中一项重要的功能是需要分析USB接口集,并进行解析,然后对应于每一个集口,创建其子设备PDO。所以说USBCCGP既是一个通用的总线驱动程序,也是一个功能设备。在USBCCGP中,每个独立的子设备叫做一个功能,枚举这些子设备是通过函数USBCCGP_Enumer......
USBCCGP 关联接口功能设备枚举
从上节可知,所有的功能设备都存储在FDO_DEVICE_EXTENSION中的FunctionDescriptor中的,而FunctionDescriptorCount成员记录着子功能数量。typedef struct _USBC_FUNCTION_DESCRIPTOR{ // The 0......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!