近期,要做一个usb摄像头的开发,然后看了韦东山老师的第三期视频,讲UVC协议摄像头开发的教程。做一些记录,以免忘记。
1}当我们拿到一个摄像头,怎么知道它的一些信息呢?
(1)打开虚拟机,让它位于前台,插上摄像头,可以看到这样的界面。
然后连接,再在终端输入
#lsusb
就可以后到这么一句:
Bus 001 Device 003: ID 05a9:4519 OmniVision Technologies, Inc. Webcam Classic
可以看到,它是OmniVision公司的sensor,VIP,PID分别为:05a9:4519。
再用 #dmesg 命令查看一下打印信息
(2)我们从上面的内核打印信息可以看到,找到了uvc的设备,这是调用了内核的哪个文件的哪个函数呢?
进入到内核目录:#cd /usr/src/linux-3.0/drivers/media/uvc
搜索一下这条语句 :#grep "Found UVC" * -nR
找到它在uvc_driver.c中,可以知道,是调用了这里的程序。
(3) ls /dev/video* 可以看到它的设备节点
2}那我们怎么知道它支持的格式及分辨率等信息呢?
(1) #lsusb -h 查看试用方法
#lsusb -v -d ox05a9: //-d之后带的是厂家id,不要忘了冒号
就可以看到一大串打印出来的信息。下面我们就通过打印出的信息分析一下这个摄像头。(2)device descriptor
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 239 Miscellaneous Device
bDeviceSubClass 2 ?
bDeviceProtocol 1 Interface Association
bMaxPacketSize0 64
idVendor 0x05a9 OmniVision Technologies, Inc.
idProduct 0x4519 Webcam Classic
bcdDevice 1.00
iManufacturer 1
iProduct 2
iSerial 0
bNumConfigurations 1
只有一个设备描述符。在
USB_Video_Example 1.5.pdf找到它的说明。
里面的每一项都有对应。
(3)configuration descriptor
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 481
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 128mA
只有一个配置描述符。
(4)Interface Association
Interface Association:
bLength 8
bDescriptorType 11
bFirstInterface 0
bInterfaceCount 2
bFunctionClass 14 Video
bFunctionSubClass 3 Video Interface Collection
bFunctionProtocol 0
iFunction 2
接口联合体描述符,这里也只有一个。
usb
摄像头有
,
一个或多个
videostreaming interface.
那到底有多少个视频流接口呢?第一个是谁?就在这个
IAD I/F
中。
(5)Interface Descriptor:
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 14 Video
bInterfaceSubClass 1 Video Control
bInterfaceProtocol 0
iInterface 2
可以看到,有两个Interface Descriptor,旗下各有N个VideoControl Interface Descriptor和VideoStreaming Interface Descriptor。
(6)VideoControl Interface Descriptor:
VideoControl Interface Descriptor:
bLength 13
bDescriptorType 36
bDescriptorSubtype 1 (HEADER)
bcdUVC 1.00
wTotalLength 79
dwClockFrequency 30.000000MHz
bInCollection 1
baInterfaceNr( 0) 1
VideoControl Interface Descriptor:
bLength 18
bDescriptorType 36
bDescriptorSubtype 2 (INPUT_TERMINAL)
bTerminalID 1
wTerminalType 0x0201 Camera Sensor
bAssocTerminal 0
iTerminal 0
wObjectiveFocalLengthMin 0
wObjectiveFocalLengthMax 0
wOcularFocalLength 0
bControlSize 3
bmControls 0x0000000a
Auto-Exposure Mode
Exposure Time (Absolute)
可以看到,它有多个VideoControl Interface Descriptor,
总共有多少个呢?
很明显,最多有7个不同的vc接口描述符,分别是输入端点、输出端点、摄像头端点、选择单元、处理单元、编码单元、扩展单元。
怎么看它属于哪类描述符呢?
从上面可以看出,有一个元素是 bDescriptorSubtype 2 (INPUT_TERMINAL) ,就是这个子类来描述的。
那这些子类的值又是什么含义,怎么确定呢?
在文档中搜索后面的VC_INPUT_TERMINAL,可以找到 vc 接口描述符所包含的子类。
根据不同的子类,可以找到不同的说明与上面打印的信息对应,例如这个INPUT_TERMINAL,它的各位对应同下:
描述符长度是13个字节;
bDescriptorType 36 就说是接口类型,它的取值如下:
然后是输入端点子类;端点ID是1;端点类型为Camera Sensor;
(7) VideoStreaming Interface Descriptor
vs接口也有很多子类,它们的值为:
1、FORMAT_UNCOMPRESSED
VideoStreaming Interface Descriptor:
bLength 27
bDescriptorType 36
bDescriptorSubtype 4 (FORMAT_UNCOMPRESSED)
bFormatIndex 1
bNumFrameDescriptors 5
guidFormat {59555932-0000-1000-8000-00aa00389b71}
bBitsPerPixel 16
bDefaultFrameIndex 1
bAspectRatioX 0
bAspectRatioY 0
bmInterlaceFlags 0x00
Interlaced stream or variable: No
Fields per frame: 2 fields
Field 1 first: No
Field pattern: Field 1 only
bCopyProtect 0
可以看到子类为FORMAT_UNCOMPRESSED,非压缩格式;
这种格式下支持5种分辨率。 bDefaultFrameIndex 默认使用第1种分辨率。
bBitsPerPixel:每个像素占16位。
wWidth( 0) 640
wHeight( 0) 480
wWidth( 1) 352
wHeight( 1) 288
wWidth( 2) 320
wHeight( 2) 240
wWidth( 3) 176
wHeight( 3) 144
wWidth( 4) 160
wHeight( 4) 120
支持这些分辨率。