USB UVC 1-- 基础

首先,UVC是我现在现在正在做的一个项目,我对这个还是很有兴趣。只是我做的东西目前还比较少,现在也只是简单总结一下。很多内容还是不很清楚,我会再更新的。

USB UVC,顾名思义,首先还是USB,整个UVC还是基于USB框架的,要真正掌握这个,还是要掌握USB的协议。然后是UVC,全称是USB Video Class,用于支持视频设备(例如网络摄像头、摄像机、扫描仪等)与计算机之间的通信和交互。实际上就是免驱了。

实际上我们可以先想想,如果让你做一个免驱的USB摄像头,你有几步要做?首先摄像头要支持USB协议,其次要支持UVC协议,要提供符合UVC协议的设备描述符,然后是遵循UVC定义好的控制命令,多媒体格式,还有传输方式。

当然,对于摄像头厂商来说没那么复杂。用支持UVC协议的芯片就可以了。大概有以下这些:

  1. Sonix SN9C1xx 系列:Sonix 是一家知名的摄像头芯片制造商,其 SN9C1xx 系列芯片被广泛用于支持 UVC 的摄像头产品中。

  2. OmniVision OV系列:OmniVision 是另一家知名的摄像头芯片制造商,其 OV系列芯片也经常用于支持UVC的摄像头产品中。

  3. Realtek RTS系列:Realtek 是一家知名的芯片制造商,在其 RTS 系列中也有支持 UVC 的摄像头芯片。

  4. STMicroelectronics STV系列:STMicroelectronics 是一家知名的半导体制造商,其 STV 系列芯片也被用于支持 UVC 的摄像头产品中。

  5. MediaTek MT系列:MediaTek 是一家知名的芯片制造商,在其 MT 系列中也有支持 UVC 的摄像头芯片。

在windows下,只要使用了这些芯片的摄像头,都没有任何问题。毕竟UVC就是微软搞起来的,但是在LInux下,就有不同的。在这里就有不少的花活。。。所以还是要学学。

下面这个是UVC的一个框图。(现在还是有很多疑惑的地方)

UVC还是主从结构。我理解PC是主机,终端摄像头是客户机。

一个UVC包含了以下部分:

IT UVC输入端点(Input Terminal)
OT UVC OT(输出端点)
CT UVC CT(Camera端点)
SU 选择单元 (SU)
PU 处理单元(PU),在PU中可以实现以下控制:
        用户控制 User Controls

                Brightness(背光)
                Contrast(对比度)
                Hue(色度)
                Saturatio(饱和度)
                Sharpness(锐度)
                Gamma(伽马)
                Digital Multiplier (Zoom)(数字放大)
        自动控制 Auto Controls

                White Balance Temperature(白平衡色温)
                White Balance Component(白平衡组件)
                Blcklight Compensation(背光补偿)
                其它 Other

        Gain(增益)
        Power Line Frequency(电源线平率)
        Analog Video Standard(模拟视频标准)
        Analog Video Lock Status(模拟视频死锁状态)

EU 编码单元(EU)
XU 扩展单元(XU)

具体分析USB协议,可以用Bus Hound抓包工具。

Windows下看USB设备,可以用usbView.exe这个工具。

VID idVendor 
PID idProduct

说的这些都太抽象了,后面还是从代码起吧。用的是libuvc。

USB UVC 1-- libuvc(TODO)-CSDN博客

对了,再复习一下USB协议。

所有的 USB 设备端设备,都使用一系列层级的描述符 (Descriptors) 来向主机描述自身信息。这些描述符包括:

  • Device Descriptors: 设备描述
  • Configuration Descriptors: 配置描述
  • Interface Descriptors: 接口描述
  • Endpoint Descriptors: 端点描述
  • String Descriptors: 字符串描述

层级如下:

每个 USB 设备只能有一个设备描述(Device Descriptor),该描述符中包括了设备的 USB 版本、厂商、产品 ID 以及包含的配置描述符个数等信息。

不同的配置描述(Configuration Descriptor)中分别指定了 USB 设备所支持的配置,如功率等信息;一个 USB 设备可以包含多个配置,但同一时间只能有一个配置是激活状态。实际上大部分的 USB 设备都只包含一个配置描述符。

一个配置下有多个接口,可以看成是一组相似功能的端点的集合。对 USB 摄像头而言,接口可以分为视频流、音频流和键盘(摄像头上的控制按键)等。

端点描述符用来描述除了零端点(ep0)之外的其他端点,零端点总是被假定为控制端点,并且在开始请求任意描述符之前就已经被配置好了。端点(Endpoint),可以认为是一个单向数据信道的抽象,因此端点描述符中包括传输的速率和带宽等信息。

参考资料:

Getting video stream from USB web-camera on Arduino Due - Part 7: Completing enumeration process - CodeProject

USB 协议核心概念与实践-腾讯云开发者社区-腾讯云

================================================================

小tips,关于UAC的。

Android开启UAC

cd /config/usb_gadget/g1/functions/uac2.0
echo adaptive > c_sync 
setprop sys.usb.config diag,uac2,adb

将c_sync从async改成adaptive。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值