UVC摄像头开发(一)

近期,要做一个usb摄像头的开发,然后看了韦东山老师的第三期视频,讲UVC协议摄像头开发的教程。做一些记录,以免忘记。

1}当我们拿到一个摄像头,怎么知道它的一些信息呢?

(1)打开虚拟机,让它位于前台,插上摄像头,可以看到这样的界面。

然后连接,再在终端输入

#lsusb

就可以后到这么一句:

Bus 001 Device 003: ID 05a9:4519 OmniVision Technologies, Inc. Webcam Classic

可以看到,它是OmniVision公司的sensorVIP,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

[html]  view plain  copy
  1. Device Descriptor:  
  2.   bLength                18  
  3.   bDescriptorType         1  
  4.   bcdUSB               2.00  
  5.   bDeviceClass          239 Miscellaneous Device  
  6.   bDeviceSubClass         2 ?  
  7.   bDeviceProtocol         1 Interface Association  
  8.   bMaxPacketSize0        64  
  9.   idVendor           0x05a9 OmniVision Technologies, Inc.  
  10.   idProduct          0x4519 Webcam Classic  
  11.   bcdDevice            1.00  
  12.   iManufacturer           1   
  13.   iProduct                2   
  14.   iSerial                 0   
  15.   bNumConfigurations      1  
只有一个设备描述符。在 USB_Video_Example 1.5.pdf 找到它的说明。

里面的每一项都有对应。

(3)configuration descriptor

[html]  view plain  copy
  1. Configuration Descriptor:  
  2.    bLength                 9  
  3.    bDescriptorType         2  
  4.    wTotalLength          481  
  5.    bNumInterfaces          2  
  6.    bConfigurationValue     1  
  7.    iConfiguration          0   
  8.    bmAttributes         0x80  
  9.      (Bus Powered)  
  10.    MaxPower              128mA  
只有一个配置描述符。

(4)Interface Association

[html]  view plain  copy
  1. Interface Association:  
  2.       bLength                 8  
  3.       bDescriptorType        11  
  4.       bFirstInterface         0  
  5.       bInterfaceCount         2  
  6.       bFunctionClass         14 Video  
  7.       bFunctionSubClass       3 Video Interface Collection  
  8.       bFunctionProtocol       0   
  9.       iFunction               2   
接口联合体描述符,这里也只有一个。 usb 摄像头有 , 一个或多个 videostreaming interface. 那到底有多少个视频流接口呢?第一个是谁?就在这个 IAD I/F 中。


(5)Interface Descriptor:

[html]  view plain  copy
  1. Interface Descriptor:  
  2.       bLength                 9  
  3.       bDescriptorType         4  
  4.       bInterfaceNumber        0  
  5.       bAlternateSetting       0  
  6.       bNumEndpoints           1  
  7.       bInterfaceClass        14 Video  
  8.       bInterfaceSubClass      1 Video Control  
  9.       bInterfaceProtocol      0   
  10.       iInterface              2   
可以看到,有两个Interface Descriptor,旗下各有N个VideoControl Interface Descriptor和VideoStreaming Interface Descriptor。

(6)VideoControl Interface Descriptor:

[html]  view plain  copy
  1. VideoControl Interface Descriptor:  
  2.    bLength                13  
  3.    bDescriptorType        36  
  4.    bDescriptorSubtype      1 (HEADER)  
  5.    bcdUVC               1.00  
  6.    wTotalLength           79  
  7.    dwClockFrequency       30.000000MHz  
  8.    bInCollection           1  
  9.    baInterfaceNr( 0)       1  
  10.  VideoControl Interface Descriptor:  
  11.    bLength                18  
  12.    bDescriptorType        36  
  13.    bDescriptorSubtype      2 (INPUT_TERMINAL)  
  14.    bTerminalID             1  
  15.    wTerminalType      0x0201 Camera Sensor  
  16.    bAssocTerminal          0  
  17.    iTerminal               0   
  18.    wObjectiveFocalLengthMin      0  
  19.    wObjectiveFocalLengthMax      0  
  20.    wOcularFocalLength            0  
  21.    bControlSize                  3  
  22.    bmControls           0x0000000a  
  23.      Auto-Exposure Mode  
  24.      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

[html]  view plain  copy
  1. VideoStreaming Interface Descriptor:  
  2. bLength                            27  
  3. bDescriptorType                    36  
  4. bDescriptorSubtype                  4 (FORMAT_UNCOMPRESSED)  
  5. bFormatIndex                        1  
  6. bNumFrameDescriptors                5  
  7. guidFormat                            {59555932-0000-1000-8000-00aa00389b71}  
  8. bBitsPerPixel                      16  
  9. bDefaultFrameIndex                  1  
  10. bAspectRatioX                       0  
  11. bAspectRatioY                       0  
  12. bmInterlaceFlags                 0x00  
  13.   Interlaced stream or variable: No  
  14.   Fields per frame: 2 fields  
  15.   Field 1 first: No  
  16.   Field pattern: Field 1 only  
  17.   bCopyProtect                      0  

可以看到子类为FORMAT_UNCOMPRESSED,非压缩格式;
这种格式下支持5种分辨率。 bDefaultFrameIndex 默认使用第1种分辨率。

bBitsPerPixel:每个像素占16位。

[html]  view plain  copy
  1.  wWidth( 0)                        640  
  2. wHeight( 0)                       480  
  3. wWidth( 1)                        352  
  4. wHeight( 1)                       288  
  5. wWidth( 2)                        320  
  6. wHeight( 2)                       240  
  7. wWidth( 3)                        176  
  8. wHeight( 3)                       144  
  9. wWidth( 4)                        160  
  10. wHeight( 4)                       120  
支持这些分辨率。

你可能感兴趣的:(移动开发)