文章目录

  • v4l2接口种类
  • v4l2 设备节点
  • 数据结构及指令
  • v4l2框架结构及关系
  • v4l2 结构图(UML)
  • v4l2 拓扑图

参考:

https://zhuanlan.zhihu.com/p/105548113

  1. 《android驱动开发权威指南》
  2. YellowMax2001 https://blog.csdn.net/u013904227/category_9277668.html
  3. linux Kernel source code: 4.4

简介

v4l2接口种类

​ V4L2在设计时,是要支持很多广泛的设备的,它们之中只有一部分在本质上是真正的视频设备:

可以支持多种设备,它可以有以下几种接口:

视频采集接口(video capture interface):这种应用的设备可以是高频头或者摄像头。V4L2的最初设计就是应用于这种功能的。
视频输出接口(video output interface):可以驱动计算机的外围视频图像设备--像可以输出电视信号格式的设备。
直接传输视频接口(video overlay interface):它的主要工作是把从视频采集设备采集过来的信号直接输出到输出设备之上,而不用经过系统的CPU。
视频间隔消隐信号接口(VBI interface):它可以使应用可以访问传输消隐期的视频信号。
收音机接口(radio interface):可用来处理从AM或FM高频头设备接收来的音频流。

v4l2 设备节点

​ V4l2的主设备号是81,次设备号为0~255;这些次设备号有分为多类设备:视频设备,Radio设备,VBI设备等。因此v4l2对应的节点有:/dev/videoX、/dev/vbiX、/dev/radioX。其中X一般为0~31的顺序号。

​ v4l2仍然是基于设备-驱动-总线模型,采用典型的分层结构。用户应用程序通过设备节点,使用文件调用接口和ioctl与内核进行交互。

数据结构及指令

常见数据结构及指令

常见数据结构见下表

v4l2常用IOCTL见下表

​ 大部分现代 V4L2 设备由多个 IC 组成,在 /dev 下导出多个设备节点,并同时创建非 V4L2 设备(如 DVB、ALSA、FB、I2C 和红外输入设备)。由于这种硬件的复杂性,V4L2 驱动也变得非常复杂。尤其是 V4L2 必须支持 IC 实现音视频的多路复用和编解码,这就更增加了其复杂性。通常这些 IC 通过一个或多个 I2C 总线连接到主桥驱动器,但也可使用其他总线。这些设备称为“子设备”。

​ 长期以来,这个框架仅限于通过 video_device 结构体创建 V4L 设备节点,并使用 video_buf 处理视频缓冲。

​ 这意味着所有驱动必须自己设置设备实例并连接到子设备。其中一部分要正确地完成是比较复杂的,使得许多驱动都没有正确地实现。由于框架的缺失,有很多通用代码都不可重复利用。因此,这个框架构建所有驱动都需要的基本结构块,而统一的框架将使通用代码创建成实用函数并在所有驱动中共享变得更加容易。

​ v4l2框架由4个主要的部分(数据结构)组成:v4l2_devices(包括v4l2_subdev); media_device; videobuf2; controls。v4l2_device管理所有的设备;meida_device框架管理运行时的pipeline;videobuf存储缓冲的数据;controls包含主要控制接口。

v4l2框架结构及关系

v4l2子模块划分

这是参考YellowMax2001专栏的划分方法。整体上没有问题,换个角度了解问题也是有好处的。

v4l2 结构图(UML)


​ 上图是v4l2框架的主要数据结构(不完整,部分成员和方法及关系没有表示出来),数据结构已经尽量画得很清楚了,可以下载或者在浏览器中打开大图查看。

v4l2 拓扑图

主要数据结构
v4l2_device(v4l2_device.h)

​ 主设备使用 v4l2_device 进行抽象化表示。一般使用设备树来进行设备解析,使用平台驱动进行相应的驱动 probe。

    注册注销//注册
v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev);
//注销
v4l2_device_unregister(struct v4l2_device *v4l2_dev);//对于热插拔设备断开时需要先调用disconnect函数然后再注销
v4l2_device_disconnect(struct v4l2_device *v4l2_dev);
    引用计数操作//增加引用计数
void v4l2_device_get(struct v4l2_device *v4l2_dev);//减少引用计数
int v4l2_device_put(struct v4l2_device *v4l2_dev);
    subdev注册注销//注册
int  v4l2_device_register_subdev(struct v4l2_device *v4l2_dev,struct v4l2_subdev *sd);//一次注册所有subdev
int  v4l2_device_register_subdev_nodes(struct v4l2_device *v4l2_dev);//注销
void v4l2_device_unregister_subdev(struct v4l2_subdev *sd);
    遍历subdev#define v4l2_device_for_each_subdev(sd, v4l2_dev)       list_for_each_entry(sd, &(v4l2_dev)->subdevs, list)
    回调//调用所有指定的回调,忽略错误
#define v4l2_device_call_all(v4l2_dev, grpid, o, f, args...)        \do {                                \struct v4l2_subdev *__sd;               \\__v4l2_device_call_subdevs_p(v4l2_dev, __sd,        \!(grpid) || __sd->grp_id == (grpid), o, f , \##args);                    \} while (0)//调用所有指定的回调,不忽略错误
#define v4l2_device_call_until_err(v4l2_dev, grpid, o, f, args...)  \
({                                  \struct v4l2_subdev *__sd;                   \__v4l2_device_call_subdevs_until_err_p(v4l2_dev, __sd,      \!(grpid) || __sd->grp_id == (grpid), o, f , \##args);                    \
})

v4l2_subdev(v4l2_subdev.h)

该结构体是抽象化的子设备,用于管理子设备。

    初始化void v4l2_subdev_init(struct v4l2_subdev *sd,const struct v4l2_subdev_ops *ops);设置/获取subdev私有数据static inline void v4l2_set_subdevdata(struct v4l2_subdev *sd, void *p)
{sd->dev_priv = p;
}static inline void *v4l2_get_subdevdata(const struct v4l2_subdev *sd)
{return sd->dev_priv;
}设置/获取host私有数据static inline void v4l2_set_subdev_hostdata(struct v4l2_subdev *sd, void *p)
{sd->host_priv = p;
}static inline void *v4l2_get_subdev_hostdata(const struct v4l2_subdev *sd)
{return sd->host_priv;
}向v4l2_device发送notifystatic inline void v4l2_subdev_notify(struct v4l2_subdev *sd,unsigned int notification, void *arg)
{if (sd && sd->v4l2_dev && sd->v4l2_dev->notify)sd->v4l2_dev->notify(sd, notification, arg);
}

media_device

涉及头文件:media-device.h/media-entity.h/meida-devnode.h具体helper函数可以参考对应头文件。

运行时设备控制,提供实时的 pipeline 管理。下图是一个pipeline的抽象示例图。


video_device(v4l2-dev.h)

​ 该结构体整合了数据流管理的终端模块功能,负责提供从内核空间到用户空间的数据交流。该结构体主要在v4l2 userspace介绍。
v4l2_ctrl_handler(v4l2-ctrls.h)

control 控制接口,这些接口通常用来实现一些特效控制、菜单控制等。下图是v4l2控制模块的一个示例图。

v4l2接口,结构图相关推荐

  1. v4l2接口解析和摄像头数据采集

    文章目录 V4L2接口解析 操作步骤 相关结构体解析 使用V4L2接口采集图片 yuyv格式摄像头 mjpg格式摄像头 使用v4l2接口采集视频 V4L2接口解析 操作步骤 应用程序通过V4L2接口采 ...

  2. 安卓系统采用v4l2接口打开YUYV和MJPEG摄像头,支持热插拔。

    安卓系统采用v4l2接口打开YUYV和MJPEG摄像头,支持热插拔. 1、需求:安卓5.1系统,视频监控门禁主板(rk3288)上要用到两个摄像头,且两个摄像头要同时打开. 2、背景:开始使用安卓系统 ...

  3. 正点原子imx6ull开发板视频监控项目实战系列5: 摄像头(V4L2)和声卡(ALSA)接口简介

    1.摄像头: 1).对于不同的摄像头,有不同的接口方式,eg:USB,CMOS等,但是他们都遵循同样的标准-V4L2. 所以,不同的APP可以使用同样的API访问不同硬件接口的摄像头. 2).摄像头参 ...

  4. linux之V4L2摄像头应用流程

    对于v4l2,上次是在调试收音机驱动的时候用过,其他也就只是用i2c配置一些寄存器就可以了.那时只是粗粗的了解了,把收音机当作v4l2的设备后会在/dev目录下生成一个radio的节点.然后就可以操作 ...

  5. sata接口 图解 定义_SATA协议简介

    SATA协议简介 1.概述 本文档主要介绍SATA的发展历程以及SATA相关协议,为后续SATA驱动框架分析做基础知识准备. 2.SATA简介 2.1 SATA发展历程 2.1.1 PATA硬盘 PA ...

  6. linux 内核配置v4l2,深入理解linux内核v4l2框架之videobuf2【转】

    Videobuf2框架 1. 什么是videobuf2框架? 它是一个针对多媒体设备的v4l2兼容驱动框架,是用户空间应用程序和设备驱动的中间层.它为驱动提供更为底层的模块化的内存管理功能. 它能够使 ...

  7. V4L2摄像头应用编程

    Video for Linuxtwo(Video4Linux2)简称V4L2,是V4L的改进版.V4L2是linux操作系统下用于采集图片.视频和音频数据的API接口,配合适当的视频采集设备和相应的驱 ...

  8. Android 利用V4L2 调用camera

    为何要使用V4L2进行开发 出于安全原因,使用Android 原生的Camera接口,必须要使用可见的surface显示摄像头的preview图像,即必须要让用户看到你的应用正在使用摄像头.另外And ...

  9. V4L2驱动详解 API翻译

    博主按:介绍V4L2基础的东西,不知道是哪位同志翻译的,莫名的感动啊.这个必须转! 另,对未翻译的部分博主加以补充.文中以蓝色字体表示,如果有错误请高手指正.还有些图片好像不能显示,我从原文复制过来了 ...

  10. OK6410 V4L2 分析

    主要分析来自下面一篇文章. http://www.chinaaet.com/article/3000015768  /* 由mach-smdk6410.c文件可知,内核启动时将所有platform_d ...

最新文章

  1. WFP在包含fwpmu.h头的时候出错
  2. python人工智能基础课免费_【领卡免费学】Python基础课(完整大课)
  3. 【转载】尝试使用GraphicsMagick的缩略图功能
  4. leetCode数据查询笔记(困难)
  5. SDUT2389Ballot evaluation
  6. React开发(141):react中ref为class添加ref
  7. 使用Eclipse构建Maven项目 (step-by-step) (转收藏)
  8. Unity安装 ILRuntime插件
  9. MATLAB线型英文名字
  10. ACPYPE中FAILED: [Errno 2] No such file or directory: 'FFF_AC.prmtop'的解决方法
  11. 基础 八大疑问词+翻译
  12. Lake Shore Cernox低温温度传感器之温度探头
  13. 【包装类、自动装箱/自动拆箱】
  14. Python编写一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
  15. 笨方法学python 34-38
  16. 2022年9月电子学会Python等级考试试卷(三级)答案解析
  17. 如何保持规律的生活习惯?
  18. docker下vi和vim安装
  19. 微信小程序开发--日历/日视图
  20. 【图像-关键点json标签】的数据集生成器

热门文章

  1. 使用高分四号数据计算表观反射率
  2. mysql主从复制及读写分离
  3. c++中new和delete
  4. Java并发编程实战读书笔记(1)
  5. oracle数据库补丁号解释,Oracle数据库版本对应的PSU和补丁号码
  6. Android头部悬浮ListView第二种实现方式
  7. Kotlin实战【五】Kotlin中的异常
  8. Android Multimedia框架总结(四)MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程
  9. 非法关机linux分辨率丢失,非法关机造成文件系统损坏,怎么办?请教:附图片...
  10. 如何建立网页快捷方式linux,怎么创建linux命令”快捷方式”或”自定义命令”...