第1.5节_摄像头驱动_USB摄像头驱动框架

在上一节视频中我们写了一个虚拟摄像头驱动程序,里面的数据是我们虚构出来的,本节我们要写USB摄像头程序了,它里面就涉及硬件的操作,比如说我们要设置亮度的时候,需要把亮度的参数发给硬件,我们要去得到真正的视频数据的时候,需要去访问硬件,得到数据。但是他们(虚拟摄像头和USB摄像头)的框架应该是一样的。

1.写一个USB摄像头驱动程序
在这里插入图片描述
当我们把usb设备接到电脑或板子上去时,如果这个设备能够被usb_driver所支持(id_table吻合),probe函数就会被调用,在probe函数里面就可以做我们想做的事了(对于摄像头驱动程序来说,是1.分配一个video_device结构体;2.设置这个结构体;3.注册这个结构体)。linux内核里面已经自带有usb摄像头的驱动程序,它支持UVC(USB Video Class,基本上在windows上那种即出即用的usb摄像头就是吻合UVC规范的,即不需要自己再去安装驱动程序)规格的usb摄像头。linux所自带的UVC驱动非常非常复杂,本章的目的就是引领大家从零写起慢慢添加代码,直到能够写出一个具备基本功能的摄像头驱动程序。

现在我们来看看内核所自带的框架:UVC驱动目录(这个目录下面的所有文件都是UVC的驱动程序):drivers\media\video\uvc
打开这个目录下的makefile:
在这里插入图片描述
这个驱动程序含有多个.c文件,它们最终会编译成一个uvcvideo.o

分析一个驱动程序最好的方法就是跟踪应用程序对它的调用过程,在讲调用过程之前我们先了解usb摄像头硬件的内部框架。

2.usb摄像头硬件的内部框架
(1)在www.usb.org下载 uvc specification(uvc的规格书)
UVC 1.5 Class specification.pdf : 有详细描述
USB_Video_Example 1.5.pdf : 有示例
我们先来分析“USB_Video_Example 1.5.pdf”这个文件:
在这里插入图片描述
<1> 通过VideoControl Interface来控制,VC(VideoControl Interface)里含有多个Unit/Terminal等功能模块,可以通过访问这些模块进行控制,比如调亮度、白平衡等等;
<2> 通过VideoStreaming Interface来读视频数据。

(2)分析
分成两部分:
<1>一部分是视频控制接口(VC):用于控制;
在这里插入图片描述
比如说里面有一个PU(process uint),可以来设置这个PU,可以设置它的亮度、饱和度等等。

<2>一部分是视频流接口(VS):用于传输。

(3)VC内部抽象出两个概念:单元units ,终端terminals,都是某一个功能模块
units:里面的
terminal:用于内外连接

3.分析UVC驱动调用过程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
刚才我们的分析只涉及了VideoStreaming Interface,没有涉及VideoControl Interface。

4.分析设置亮度过程
在这里插入图片描述
5.总结
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yanxuan321/article/details/87872277