参考:https://www.cnblogs.com/tuotuteng/p/4648387.html

  http://blog.sina.com.cn/s/blog_c91863e60102w65w.html

一,常用ioctl请求

VIDIOC_QUERYCAP     /* 获取设备支持的操作 */
VIDIOC_G_FMT        /* 获取设置支持的视频格式 */
VIDIOC_S_FMT        /* 设置捕获视频的格式 */
VIDIOC_REQBUFS      /* 向驱动提出申请内存的请求 */
VIDIOC_QUERYBUF     /* 向驱动查询申请到的内存 */
VIDIOC_QBUF         /* 将空闲的内存加入可捕获视频的队列 */
VIDIOC_DQBUF        /* 将已经捕获好视频的内存拉出已捕获视频的队列 */
VIDIOC_STREAMON     /* 打开视频流 */
VIDIOC_STREAMOFF    /* 关闭视频流 */
VIDIOC_QUERYCTRL    /* 查询驱动是否支持该命令 */
VIDIOC_G_CTRL       /* 获取当前命令值 */
VIDIOC_S_CTRL       /* 设置新的命令值 */
VIDIOC_G_TUNER      /* 获取调谐器信息 */
VIDIOC_S_TUNER      /* 设置调谐器信息 */
VIDIOC_G_FREQUENCY  /* 获取调谐器频率 */
VIDIOC_S_FREQUENCY  /* 设置调谐器频率 */

二,v4l2架构图

2.1  video设备

视频设备按输入输出来看,输入设备常见的就是摄像头了,输出设备常见的就是显示器、电视机。

2.2 video设备接口

  • 摄像头接口一般有:

    ITU-R BT601/656:国际电信联盟针对数字电视演播室的视频接口及数据流格式所做的标准,比较老一点的手机摄像头一般都采用这种接口。

    MIPI CSI:移动行业处理器接口联盟定义的摄像头数字串行接口,是当今主流的手机摄像头接口。

    USB:USB摄像头一般常见在台式机上,USB协议中有专门针对video设备的接口类(interfaceclass=0x0E)。

  •   视频显示接口一般有:

    HDMI:高清晰度多媒体接口,可同时传输音频及视频信号,广泛用于数字机顶盒、个人电脑、平板电脑、高清数字电视当中。

    VGA:它是一种模拟信号视频接口,广泛用于PC电脑与显示器中,几乎所有显卡都支持该接口。数字电路中使用该类接口需要用到数模视频编码器,将视频的数字信号转化为模拟信号进行传输。

    TV-out:TV-out只是一个泛指,指电视中常见的视频模拟接口,如AV接口,S端子,YPbPr接口等。同VGA一样,数字电路中使用该类接口需要用到TV视频编码器,将视频的数字信号转化为TV模拟信号进行传输。

2.3 video设备接口驱动

  该部分需要驱动开发者针对不同的视频设备接口,完成其接口驱动。

2.4 video设备驱动

  该部分是驱动开发者在进行视频设备驱动开发时,需要重点实现的对象。驱动开发者需要根据V4L2提供的驱动模型,完成对具体视频设备硬件控制的底层实现。Linux为开发者提供了V4L2驱动开发的示例源码:“/drivers/media/video/vivi.c”。

2.5 V4L2核心

  该部分是Linux视频设备的架构核心,它对下为驱动开发者提供统一的视频设备驱动开发模型,对上为应用开发者提供操作视频设备的统一接口。其在linux中的核心源码路径为:“/drivers/media/video/v4l2-dev.c”。

2.6  V4L2应用接口

  应用程序通过V4L2提供read()、write()、ioctl()编程接口,来控制操作视频设备,如:设置图像分辨率、视频数据格式、开始/结束视频捕获等等。

二、 V4L2设备驱动编写

  Linux的video设备驱动实现,驱动开发者需要按照V4L2的驱动模型进行设计,该驱动模型主要围绕核心数据结构struct video_device来展开设计,通过该数据结构来完成视频设备的分配、设置、注册等工作。驱动程序需要重点实现两个操作集:v4l2_file_operations和v4l2_ioctl_ops ,V4L2架构最终会调用这两个操作集中的函数接口,来完成对视频设备硬件的控制。其实现流程如下图所示:

三、
V4L2_subdev与v4l2_device的出现

  V4L2
驱动随着硬件的变化也越来越复杂,现在大部分设备里面包含了多个子设备IC,比较常见的子设备如编解码器、传感器、摄像头控制器等。通常这些IC通过
i2c
总线连接到主板,这些设备都统称为sub-devices。

  在很长的一段时间里
V4L2
被限制只能在 video_device 结构体里面创建,并且用video_buf
控制视频缓存,这意味着所有的驱动创建自己的实例都将连接到自己的sub-devices,这些工作通常很复杂并经常引起错误,许多常见的代码因为缺乏一个框架而无法重构。因此
V4L2
 框架作了相应的优化:它有一个 v4l2_device 结构作为设备实例,一个v4l2_subdev结构作为子设备实例,video_device
结构包含了v4l2_device
节点,每个视频设备都采用
v4l2_device
结构来表示。为了提供统一的接口给这些子设备,内核将涉及到子设备控制的那部分独立了出来,用 struct
v4l2_subdev 来表示以方便用户实现
v4l2
驱动程序。现如今的V4L2设备关系用一个比较粗糙的图来表示他们之间的关系,大致为:

设备实例(v4l2_device)

|______子设备实例(v4l2_subdev)

|______视频设备节点(video_device)

|______文件访问控制(v4l2_fh)

|______视频缓冲的处理(videobuf/videobuf2)

v4l2框架的更多相关文章

  1. V4L2框架分析学习二

    转载于:http://www.techbulo.com/1198.html v4l2_device v4l2_device在v4l2框架中充当所有v4l2_subdev的父设备,管理着注册在其下的子设 ...

  2. V4L2框架分析学习一

    转载于http://www.techbulo.com/1193.html 1.概述 Video4Linux2是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口.凡 ...

  3. v4l2框架分析

    参考:https://www.cnblogs.com/fengong/p/4424823.html    http://www.cnblogs.com/fengong/p/4424895.html 一 ...

  4. 嵌入式Linux驱动笔记(十八)------浅析V4L2框架之ioctl【转】

    转自:https://blog.csdn.net/Guet_Kite/article/details/78574781 权声明:本文为 风筝 博主原创文章,未经博主允许不得转载!!!!!!谢谢合作 h ...

  5. V4L2框架之视频监控

    [参考]韦东山 教学视频 一. V4L2框架: video for linux version 2 虚拟视频驱动vivi.c分析:1.分配video_device2.设置3.注册:video_regi ...

  6. V4L2框架分析学习

    1.概述 Video4Linux2是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口.凡是内核中的子系统都有抽象底层硬件的差异,为上层提供统一的接口和提取出公共代 ...

  7. 摄像头驱动——V4L2框架分析

    一.概述 Video for Linux 2,简称V4l2,是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口. 摄像头驱动是属于字符设备驱动程序.(分析linu ...

  8. 二十四、V4L2框架主要结构体分析和虚拟摄像头驱动编写

    一.V4L2框架主要结构体分析 V4L2(video for linux version 2),是内核中视频设备的驱动框架,为上层访问视频设备提供统一接口. V4L2整体框架如下图: 图中主要包括两层 ...

  9. 【原创】Linux v4l2框架分析

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

随机推荐

  1. golang中的mutex锁

    mutex锁中一种互斥锁,如果有多个goroutine需要对同一变量进行修改则需要对该变量施加mutex锁以实现安全读写.

  2. java第五周作业

    Java Applet Applet 是一种 Java 程序.它一般运行在支持 Java 的 Web 浏览器内.因为它有完整的 Java API支持,所以Applet 是一个全功能的 Java 应用程 ...

  3. JS快排

  4. python_01

    测试工程师的短板,近二年的时间,python这门语言获得非同一般的美誉.在算法,测试,运维里火的不要不要的.本人学了将近一年的时间,总是林林散散的学,也没有规划的去分析和总结.希望能够帮我梳理一下这一 ...

  5. [转载]前端 阿里p6面试题集锦含答案

    1.说一下你了解CSS盒模型. 盒模型分为:IE的怪异盒模型和标注浏览器的盒模型,然后可以通过box-sizing属性控制两种盒模型的变换. 2.说一下box-sizing的应用场景. 这个也不难,简 ...

  6. Nginx+Tomcat配置负载均衡-动静分离(二)

    配置动静分离的时候遇到了一些问题,一个是配置nginx配置文件有问题导致访问不到服务器,另一个问题是配置静态资源的路径和实际的资源目录不匹配导致404,502等错误 结合上一篇的基础,在此将动静分离的 ...

  7. 实现鼠标悬停,div勾画div边框的动画

    鼠标悬浮,边框div边框的动画样式,效果图如下: 首先定义div及其样式: <style> .show { width:300px; height:200px; border:1px so ...

  8. Good Time------打卡让生活更美好

    Section 1团队介绍 Part 1 队员信息 姓名 学号 职务 王怡镔 2016012045 组长 于鑫宇 2016012029 组员 张济吨 2016012072 组员 黄鹤 20160120 ...

  9. ubuntu18.04LTS配置apache虚拟目录(基于端口)

    假设在用户目录下要新建两个虚拟目录web1,web2,分别对应端口8081,8082 $ cd ~ #切换到用户目录 $ mkdir www #新建www文件夹,以后新建的虚拟目录都放在该文件夹下 $ ...

  10. 什么是BFC

    对css有了解的朋友肯定都知道盒式模型这个概念,对一个元素设置css,首先需要知道这个元素是block还是inline类型.而BFC就是用来格式化块级盒子,同样管理inline类型的盒子还有IFC,以 ...