一.FAQ
1.判断自己的摄像头是否支持uvc标准
输入lsusb //列出usb设备
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0c45:62f1 Microdia //摄像头
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 1a40:0101 TERMINUS TECHNOLOGY INC.
Bus 002 Device 003: ID 17ef:6025 Lenovo
更详细的树形图lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=musb-hdrc/1p, 480M
|__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/4p, 480M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=musb-hdrc/1p, 480M
|__ Port 1: Dev 4, If 0, Class='bInterfaceClass 0x0e not yet handled', Driver=, 480M
|__ Port 1: Dev 4, If 1, Class='bInterfaceClass 0x0e not yet handled', Driver=, 480M
|__ Port 1: Dev 4, If 2, Class=audio, Driver=snd-usb-audio, 480M
|__ Port 1: Dev 4, If 3, Class=audio, Driver=snd-usb-audio, 480M
lsusb -d 0c45:62f1 -v | grep "14 Video" 检测设备属性
bFunctionClasss 14 Video
bInterfaceClass 14 Video
bInterfaceClass 14 Video
bInterfaceClass 14 Video
bInterfaceClass 14 Video
bInterfaceClass 14 Video
bInterfaceClass 14 Video
bInterfaceClass 14 Video
bInterfaceClass 14 Video
显示类似上面信息表示该摄像头是支持uvc标准的
2.使能/关闭调试的trace打印信息
echo 0xffff > /sys/module/uvcvideo/parameters/trace
echo 0 > /sys/module/uvcvideo/parameters/trace
3.播放测试
mplayer tv:// -tv fps=25
mplayer的交叉编译移植请参考
http://blog.csdn.net/orz415678659/article/details/9469271
二.uvc类标准
1.下载标准协议地址
http://www.usb.org/developers/devclass_docs
2. Video Class 基础概念
Usb协议中,除了通用的软硬件电气接口规范等,还包含了各种各样的Class协议,用来为不同的功能定义各自的标准接口和具体的总线上的数据交互格式和内容。这些Class协议的数量非常多,最常见的比如支持U盘功能的Mass Storage Class,以及通用的数据交换协议:CDC class。此外还包括Audio Class, Print Class等等。理论上说,即使没有这些Class,通过专用驱动也能够实现各种各样的应用功能。但是,正如Mass Storage Class的使用,使得各个厂商生产的U盘都能通过操作系统自带的统一的驱动程序来使用,对U盘的普及使用起了极大的推动作用,制定其它这些Class也是为了同样的目的。
Video Class 协议的目的是给USB接口的视频设备提供一个统一的数据交换规范。最初1.0版本是在2003年9月添加到USB Class规范中的,1.1的版本更是在2005年发布。相比之下,Mass Storage Class 早在1998年就发布了。支持Video Class协议的多媒体芯片也是在2005年才陆续发布。所以USB 视频设备在设备端,多数采用通用USB功能的多媒体处理芯片,主机端需要安装专用的驱动程序,基本上各个产品之间不具备兼容性。甚至对于操作系统而言,也只有在XP的SP2以后,才包含了对通用的Video class协议的支持。所以即使是某些多媒体设备(比如Logitech最新的几款摄像头)包含了对Video Class的支持,在Win2000等操作系统上依然需要安装驱动程序。不过使用Video Class无疑会是一个趋势,在相应的多媒体芯片陆续投入市场后,支持Video Class的多媒体设备应该会在一两年内会迅速普及开来。
除了在硬件上通过相应的多媒体芯片支持Video Class的设备以外,对于包含了操作系统的智能手机,当然也可以在手机端通过驱动程序来实现对Video Class的支持,就好像原先支持任何一种专用的USB驱动一样。只不过数据交换的格式不是自己随意制订的,而是按照Video Class的规范来实现的。本文在介绍USB Video Class架构的基础上,主要是探讨Linux操作系统下设备端Video Class驱动的实现。不过在其它平台下的实现思路应该也是类似的。
3. USB Video Class 协议结构
3.1 设备拓扑结构
在拓扑结构上VideoClass 将视频设备抽象为几个主要的硬件功能模块:
输入端点 Input Terminal
输出端点 OutputTerminal
camera端点 Camera Terminal
选择单元 SelectorUnit
处理单元Processing Unit
拓展单元 ExtensionUnit
Each video function has a single VideoControl (VC) interface and can have several VideoStreaming (VS) interfaces
每个视频有且仅有1个VideoControl (VC)接口和可有多个 VideoStreaming (VS) 接口
The VideoControl (VC) interface is used to access the device controls of the function whereas the VideoStreaming (VS) interfaces are used to transport data streams into and out of the function.
VC接口用于设备功能控制,VS接口用于传输数据流进出
Video Interface Class Code(A.1 P171)
视频接口类代码 就是宏定义的USB_CLASS_VIDEO
总共有3种子类subclass
1.VideoControl Interface 视频控制接口子类
2.VideoStreaming Interface 视频数据流接口子类
3.Video Interface Collection 视频接口集合子类
宏定义
/* A.2. Video Interface Subclass Codes */
#define UVC_SC_UNDEFINED 0x00
#define UVC_SC_VIDEOCONTROL 0x01
#define UVC_SC_VIDEOSTREAMING 0x02
#define UVC_SC_VIDEO_INTERFACE_COLLECTION 0x03
Units provide the basic building blocks to fully describe most video functions ,A Unit has one or more Input Pins and a single Output Pin,
Unit提供了基础模块来全面描述大部分的视频功能,一个Unit可以由一个或多个输入引脚和仅一个输出引脚(这里的每一个pin代表一个逻辑上的数据流)
Unit可以通过pin引脚连接在一起,一个输出pin可以连接多个输入pin,但一个输入pin只能连接一个输出pin
An Input Terminal (IT) is an entity that represents a starting point for data streams inside the video function.
一个输入Terminal (IT)终端是一个实体代表数据流的开始端点
An Output Terminal (OT) represents an ending point for data streams.
一个输出Terminal (OT)终端是一个实体代表数据流的结束端点
Terminals have one Input or Output Pin that is always numbered one.
Terminal只有1个输入或一个输出引脚pin
The Camera Terminal (CT) controls mechanical (or equivalent digital) features of the device component that transmits the video stream.
摄像头Terminal (CT)控制传输视频流的设备组件特性(Scanning Mode扫描模式 Auto-Exposure Mode自动曝光模式 Auto-Exposure Priority自动曝光优先级
Exposure Time 曝光时间 Focus聚焦 Auto-Focus自动聚焦 Simple Focus简单聚焦 Iris红外 Zoom放大 Pan摇动 Roll滚动 Tilt倾斜 Digital Windowing数字窗口
Region of Interest 感应区)
The Selector Unit (SU) selects from n input data streams and routes them unaltered to the single output stream.
选择Unit (SU)选择多个输入数据流并路由它们到单一的输出流
The Processing Unit (PU) controls image attributes of the video being streamed through it.
处理Unit (PU)控制流经它的视频流图像属性(【Brightness背光 Hue色度 Saturation饱和度 Sharpness锐度 Gamma伽马值 Digital Multiplier (Zoom)数字放大】
【White Balance Temperature白平衡色温 White Balance Component白平衡组件 Backlight Compensation背光补偿 Contrast对比度】
【Gain增益 Power Line Frequency电源线频率 Analog Video Standard模拟视频标准 Analog Video Lock Status模拟视频锁存状态】)
The Encoding Unit controls attributes of the encoder that encodes the video being streamed through it.
编码Unit (EU)控制流过的视频流编码的编码器的属性(...)The Extension Unit (XU) is the method provided by this specification to add vendor-specific building blocks to the specification
扩展Unit (XU)提供厂商特殊控制模块方法
这样我们就可以用组件Terminal和Unit组成一个usb摄像头模型
从sensor(传感器)和另一个复合视频设备得到的数据流由IT 和 CT输入,经SU选择送PU处理,再由OT绑定到指定的USB端点。最后由USB端点与主机交互将数据发送到host端。在实际设备中,可能没有其中的某些功能模块,也可能其中的几个模块都是由同一硬件来完成的。上图中,左半部的框架组成了Video Class中的控制接口界面,右半部的框架组成了视频流传输接口界面。这两部分构成了Video Class的主要协议框架。