UVC摄像头技术笔记
+ -

关于UVC摄像头指示灯的调试过程总结

2021-06-07 607 0

最近遇到了一个很是奇怪的UVC摄像头指示灯问题,现象如下:
上层应用是一个会议系统软件,当需要进行会议时,点击会议按钮添加会议。这时应用软件打开摄像头,并开始与服务器进行网络连接。当然由于摄像头的打开,摄像头指示灯点亮。
上层应用软件与服务器连接后,进行会议界面。这时突然摄像头指示灯熄灭,但会议正常,摄像头图像正常,就是摄像头指示灯熄灭。

由于上层应用软件为第三方开发,不知其详细工作原理,无技术支持。
USB摄像头固件也为第三方提供,也无法提供相关的技术资料。
手头只有自己根据摄像头的抓包信息,开发的Windows驱动。

当然,Windows提供了UVC摄像头的驱动,我里由于我们需要做一些特殊处理,故需要自己重新开发驱动。

调试了很多次,发现有时摄像头指示灯也会正常,不过也就是几十次出现一次正常。自己反反复复,做了很多实验,过程如下:

  • 换一台主机,问题依旧。
  • 再换一台主机,偶尔正常。
  • 将本次使用的4K摄像头换成1K的摄像头,正常。
  • 换上位机应用软件,正常。
  • 在出现问题的摄像头上再次试验,多次也会出现偶尔的正常。

这里又有一个很奇怪的问题,就是换应用软件,就正常了。比如我将定制的专业会议软件换成了potplayer播放器,人家就没有问题。但是使用专用的应用软件时,前期正常,连接上会议后进入会议后出现问题。
这时通过抓包分析,发现进入会议系统后,有大量的UVC扩展单元请求。由于我们基于UVC扩展单元做了一些私有通讯,所以从这里来看,应该是这里的问题。
但是!!!这是不应该或者说是不可能的。因为关于UVC的扩展单元的通讯,我并没有在转发至固件,所有关于UVC的扩展请求我都是在Windows内核中自行处理的。
所以,奇了个怪了~~~

但是,通过更换1K别的摄像头,所有东西又都是正常的。所以我这时怀疑是否有一些别的能讯,比如固件中有类似看门狗的东西,是需要定时喂狗的,不然,人家就是给你熄灯~ 哎,想的真是越来越多了。但是,写固件的人没必要这么坑的吧,这么搞~

调试,调试,当你进入一个坑的时候,只要不放弃,总能找到原因的,总能爬出来的。

一个实在没有办法的时候,退抓全包。发现抓到一次HID获取描述符和HIDSET_IDLE请求。所以这时大概率应该是这个SET_IDLE的坑。

手中的摄像头是一个复合设备,即UVC摄像头+自定义的HID设备。

先不管那么多,过滤掉SET_IDLE请求。

    else if (Urb->UrbHeader.Function == URB_FUNCTION_CLASS_INTERFACE)
    {
        if (Urb->UrbControlVendorClassRequest.Request == 0x0A) //idle
        {
            Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
            IoCompleteRequest(Irp, IO_NO_INCREMENT);
            return   STATUS_NOT_IMPLEMENTED;
        }
        else if (Urb->UrbControlVendorClassRequest.Request == 0x03)//protocol
        {

        }
        IoSkipCurrentIrpStackLocation(Irp);
        Status = IoCallDriver(DeviceExtension->TopOfStackDeviceObject, Irp);
        return Status;
    }

再次加载程序,运行,一切OK!!!!


其实在这个过程中,无法确定灯的问题时,偿试着绕过这个问题.就是定时将灯拉起,但定时拉灯又会出现了一些别的问题,偿试了很多种方法,效果都不满意,无奈放弃。关于这一段血泪史,就不再诉说了。

最后再说一下这个SET_IDLE,这个请求在灯灭的时候,还发生了错误。
抓包内容如下:

CTL 21 0a 00 00 00 00 00 00             SET_IDLE
USTS C0000004                           stall pid

包标识PID错误,这时BUShound就搞不定了。只有换USB总线分析仪了。
关于PID的资料可参考:http://www.usbzh.com/article/detail-73.html

想想,最近事还挺多的,自己手头的这个USB总线分析仪,算不,不提也罢。。。
记录此问题,改天再详细分析。

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 篇笔记 写笔记

BusHound的使用方法详解
在开始菜单日运行Bus Hound软件,将USB设备插入电脑U口。如图所示,进入”Devices”目录,在”Devices”内选择要监听的设备。例如:我的设备置是一个U盘,则装置为USB大容量储存设备,点选”USB大容量储存设备”图示,可以在下面的”Properties”图框内看到设备的设备树及设备......
HID键盘设备数据抓包分析实践
本文使用 Bus Hound 工具对 USB HID 设备数据包进行分析,并结合官方手册及网上文章进行整理。在进行数据分析前,我们先回顾一下USB相关的基础知识。USB描述符USB 主机是通过各种描述符来识别设备的,有设备描述符,接口描述符,端点描述符,字符描述符,报告描述符(HID)等。和普通的......
关于UVC摄像头指示灯的调试过程总结
最近遇到了一个很是奇怪的UVC摄像头指示灯问题,现象如下:上层应用是一个会议系统软件,当需要进行会议时,点击会议按钮添加会议。这时应用软件打开摄像头,并开始与服务器进行网络连接。当然由于摄像头的打开,摄像头指示灯点亮。上层应用软件与服务器连接后,进行会议界面。这时突然摄像头指示灯熄灭,但会议正常,摄......
BusHound简介及安装
BusHound简介BusHound软件是由美国perisoft公司研制的一种专用于PC机各种总线数据包监视和控制的开发工具软件,其名“hound”的中文意思为“猎犬”,即指其能敏锐地感知到总线的丝毫变化。Bus Hound是一个超级软件总线协议分析器,用于捕捉来自设备的协议包和输入输出操作,其优......
BusHound设备窗口
使用BusHound进行数据抓包,抓包的目标为设备。BusHound提供了一个类似设备管理器的窗口,以树形的方式显示。设备树主要包括SCSI设备树和Usb设备树。设备IDBusHound为每个显示在设备窗口中的设备树分配一个ID,这个ID在设备窗口树列表中,设备名前中括号中的数字为设备ID.点击设备......
UVC 描述符实例
通过BUSBOUND抓取USB摄像头插入电脑时的数据信息,这里只是选报设备描述符和接口描述符信息Device Phase Data Description Cmd.Phase.Ofs(rep)------ ----- ----------......
UVC PTZ和扩展单元XU的过滤与分发调试笔记
在写这篇文章之前,我得首先感谢微软,感谢你的不严格,让我可以有空子可钻,不至于太过狼狈…记得看过一句话,开局一张图,内容全告编。我多么希望自己在UVC摄像头的调试过程中也可以瞎编乱造,这样不至于身心疲惫。至少保持着愉快的心情,吹吹牛,也是一件很开心的事。今日有一个需求,对UVC摄像头的请求进行......
U盘枚举失败-该设备无法启动(GET_MAX_LUN请求)
群里有人用STM32搞了一个U盘,但是U盘在插入电脑后在设备管理器是枚举失败。我让他看一下设备状态:又是熟悉的错误码10,表示设备启动失败。设备的启动失败,一般在设备获取描述符获取之后,初始会失败,我之前在弄USB虚拟鼠标的时候也遇到此类情况。不过由于这个设备是U盘,本人还没有研究USB存储协议,只......
BUSHOUND抓包stall pid的USTS c0000004错误
对USB设备进行数据分析,使用最多的也就是BUSHOUND了,不过经常遇到一个问题就是 USTS c0000004 stall pid 错误。USTS c0000004 stall pid在本站中搜......
HID设备SET_IDLE时遇到c0000004
下午,USB中文网技术交流群里的一个同学,说他的HID设备时好时不好的,有时会花很长的时间才能枚举成功。没有抓包,没的截图…我是一顿乱扯,从硬件电路到各种抓包方法….晚上11点,这位同学发来了BUSHOUND抓的包,打开一看:Device Length Phase Data ......
手动分析使用BUSHOUND抓取同步传输的URB
BUSHOUND大家太熟了,使用它来进行数据抓包那不太太方便。但在BUSHOUND的抓取配置项中,有一个叫了URB的东西,我相信大家都没有选中过,因为一般来说,对WINDOWS USB驱动开发人员来说都不一定有用,更何况大家也只是用来抓取一下几个数据的输入输出,更没有必要进行USB的分析了。本人今天......
USB状态错误码USBD_STATUS对照表
USBDI.H定义了一组USB_STATUS_XXX的值. 这些值是从URB的状态字段是对IRP_MJ_INTERNAL_DEVICE_CONTROL调用的USB传输状态返回标识。USBD将URB状态码映射到有效的NTSTATUS码中(但具体详情还得看USBD_STAUTS_XXX的值),在完成IR......
使用BUSHOUND手动分析USB控制传输的URB
USB的控制传输是最基本的传输类型,控制传输适用于设备的枚举和设备的状态控制。我里我们使用BUSHOUND来抓取USB控制传输的URB。同样的,我们使用的操作系统是Windows10 x64,和同步传输的URB抓包一样,我们先抓取数据,然后再分析数据结构。这里我插入电脑的U盘的枚举以获取设备描述符为......
使用BUSHOUND手动分析USB批量传输的URB
使用BUSHOUND抓取U盘的批量传输的URB数据,我们对其其进行数据分析:13 IN 55 53 42 53 40 0b ac 57 00 00 00 00 00 URB80 00 09 00 00 00 00 00 d8 f2 75 a0 77 7f 00 00 ......
USB设备抓包工具BusHound的Windows驱动抓包
BusHound可以抓包的设备类型有硬盘、1394火线和USB设备数据,并且抓到的数据并非是各总线上的,而是经过各总线传递到Windows内核的内核数据。BusHound采用的是Windows过滤驱动的方式进行抓包的,并且可以区分各总线上相关的数据协议,如USB的输入输出事务,同步传输,CTRL请求......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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