V4L2框架视频sensor模块驱动开发汇总

一、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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值