一、V4L2框架概述
V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写。V4L2在设计之初时,是要支持很多广泛的设备的,如声卡, display, FB, I2C, camera等.它们之中只有一部分在本质上是真正的视频设备,也是造成V4l2源码冗余的原因之一。kernel更新速度快,在display上有drm框架和framebuffer框架, 声卡上有ALSA框架. 目前V4L2主要用于camera驱动,本文也是通过camera驱动讲解V4l2内部原理。
1.1 v4l2设备实现流程


1.2 v4l2设备应用层流程
注册的设备节点有/dev/video和/dev/v4l2-subdev。
应用层操作video设备主要流程如下:
1. 通过打开video设备设置video参数。
2. 设置采集方式(设置帧格式和帧缓冲)。
3. 开始进行视频流采集,将数据取出,处理,放回, 可循环处理。
4. 完成相应的任务后关闭。

1.3 相关内容
(1)常用结构体(定义在include/linux/videodev2.h)
struct v4l2_requestbuffers // 申请帧缓冲,对应命令VIDIOC_REQBUFS
struct v4l2_capability // 视频设备的功能,对应命令VIDIOC_QUERYCAP
struct v4l2_input // 视频输入信息,对应命令VIDIOC_ENUMSTD
struct v4l2_standard // 视频的制式,如PAL,NTSC,对应命令VIDIOC_ENUMSTD
struct v4l2_buffer // 驱动中的一帧图像的缓存,对应命令VIDIC_QUERYBUF
struct v4l2_format // 帧的格式,对应命令VIDIOC_G_FMT、VIDIOC_S_FMT等
struct v4l2_crop // 视频信号矩形边框
(2)数据采集:
V4L2支持内存映射方式(mmap)和直接读取方式(read)来采集数据,前者用于连续视频数据的采集,后者常用于静态图像数据的采集:
帧传输:使用read和write方法,每一帧都要通过I/O操作在用户和内核空间之间拷贝数据
流传输:用户与内核空间之间交换缓冲区指针,这些缓冲区将被映射到应用的地址空间
(3)数据结构
(4)驱动层实现
1.4 内核V4L2模块
应用层流程之所以简单, 是因为内核相关模块做了很多工作夯实了基础。 与V4L2相关的模块如下:

(1) video_device
保存 V4L2 的 device node 数据。用于实例化一个/dev/video设备的结构体。里面包含该video的类型, 回调函数,以及操作缓冲的队列。接触内核v4l2驱动, 理解video_device结构体内部很重要。
(2) v4l2_subdev
用于实例化一个/dev/subdev 设备的结构体。 一般只需通过ioctl设置采样属性即可。 内部实现部分v4l2_subdev_ops回调函数, 也可以用与其他驱动模块通讯。
(3) videobuf2
用于video缓存的分配,释放,出队,入队等。提供多种缓存类型管理。
(4)v4l2_device:表示一个 v4l2 设备,各个子设备都挂在这个结构体里面。
(5)常见的硬件拓扑结构:
&nb


4686

被折叠的 条评论
为什么被折叠?



