说在前面:本节内容,我们在基本上对v4l2设备的概念以及上层的调用进行详尽说明,中间有抠图行为,请见谅。只是为了说明问题。
一.V4L2概念
Videofor Linux two(Video4Linux2)简称V4L2,是V4L的改进版。V4L2是linux操作系统下用于采集图片、视频和音频数据的API接口,配合适当的视频采集设备和相应的驱动程序,可以实现图片、视频、音频的采集。
二.Linux下的V4L2架构介绍
V4L2的初衷是想为linux系统建立统一的视频类设备处理模型,让驱动开发者依靠其驱动模型轻松的完成video设备的驱动,让视频应用程序可以轻松的使用其接口完成应用程序开发。V4L2的整体架构如下图所示:
l Video设备
视频设备从输入输出来看,输入设备一般就是摄像头,输出设备常见的就是显示屏、电视机之类。
l Video设备接口
Ø 摄像头接口常用的有:
MIPI CSI:移动行业处理器接口联盟定义的摄像头数字串口接口,是当今主流的手机摄像头接口。
USB:USB摄像头一般就用在台式电脑上了,USB 协议中有专门针对video设备的接口类(interfaceclass = 0x0E)。
Ø 常见视频显示接口:
HDMI:高清晰度多媒体接口,可同时传输音频和视频信号。
VGA:一种模拟信号视频接口,数字电路中使用该类接口需要模拟视频编码器,将视频的数字信号转化为模拟信号进行传输。
TV-out:TV-out是一个泛指,同VGA一样,数字电路中使用该类接口需要用到TV视频编码器,将视频的数字信号转化成TV的模拟信号进行传输。
l Video设备接口驱动
此部分需要驱动开发者根据不同的设备接口进行,完成相应的接口驱动。
l Video设备驱动
该部分是驱动工程师重点关注、实现的对象,驱动开发者需要根据V4L2提供的的基本驱动框架模型,完成对具体视频设备硬件控制的底层实现。Drivers/media/video/vivi.c是linux为开发者提供的一个驱动源码示例。
l V4l2核心
该部分是Linux视频设备的架构核心,它对下为驱动开发者提供统一的视频设备驱动开发模型,对上为应用开发者提供操作视频设备的统一接口;Linux源码路径:drivers/media/video/v4l2-dev.c。
l V4l2应用接口
应用程序通过V4L2提供的read()、write()等API编程接口来控制操作设备,如:设置图形、数据格式、开始/结束视频捕捉。
三.芯片原理图
基于IMX6平台的dvr是I2C设备,因此上电后首先必须满足I2C通讯的时序要求,其次,dvr与车机的通路不同项目用的不一样可以通过配置0x34寄存器来实现;总的来说slave芯片的主要目的是进行数据信号的转换(940是LVDS转化为MIPI,9992是将CVBS转化为MIPI进行传输)和图像特性(亮度、饱和度以及锐度等)的设置以及滚屏等问题的处理。
另外一个就是slave芯片相对于DVR来说也是被动接受数据的;以ti940为例,当系统上电后ti940就会实时检测是否有dvr传过来的视频信号,并更新只读寄存器0x1c的bit[0]位,有数据就是MIPI,没有数据就是UNLOCK状态。
四.应用程序采集数据图像的流程
1. 调用open函数打开设备.
2. 取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等。VIDIOC_QUERYCAP,structv4l2_capability.
3. 选择视频输入,一个视频设备可以有多个视频输入VIDIOC_S_INPUT.
4. 设置视频的制式和帧格式,制式包括PAL,NTSC,帧的格式个包括宽度和高度等。例如:VIDIOC_S_STD,VIDIOC_S_FMT,structv4l2_std_id,struct v4l2_format。
5. 向驱动申请帧缓冲,一般不超过5个。struct v4l2_requestbuffers
6. 将申请到的帧缓冲映射到用户空间,这样就可以直接操作采集到的帧了,而不必去复制。
7. 将申请到的帧缓冲全部入队列,以便存放采集数据.VIDIOC_QBUF.
8. 开始视频的采集。VIDIOC_STREAMON
9. 出队列以取得已采集数据的帧缓冲,取得原始采集数据。VIDIOC_DQBUF
10. 将缓冲重新入队列尾,这样可以循环采集。VIDIOC_QBUF
11. 停止视频的采集。VIDIOC_STREAMOFF
12. 关闭视频设备。
具体程序执行流程如下流程图所示:
从上面截图中我们也基本上能明确video的调用过程以及数据的流向。下一节我们来具体分析video主从设备的注册匹配以及API的调用过程