当前位置: 首页 > news >正文

V4L2 驱动架构介绍

V4L2 简介

        Video for Linux two(Video4Linux2)简称 V4L2,是 V4L 的改进版。V4L2 是 linux操作系统下用于视频和音频数据采集设备的驱动框架,为驱动和应用程序提供了一套统一的接口规范。

        在 Linux 下,所有外设都被看成一种特殊的文件,成为“设备文件”,可以象访问普通文件一样对其进行读写。采用 V4L2 驱动的摄像头设备文是/dev/videoX以及一些子设备/dev/v4l-subdevX。V4L2 支持两种方式来采集图像:内存映射方式(mmap)和直接读取方式(read)。应用层通过 open/ioctl/close 等函数来操作V4L2 设备文件的方式控制 camera 设备。

V4L2 支持的设备:

  1. Video capture device : 从摄像头等设备上获取视频数据。对很多人来讲,video capture 是 V4L2 的基本应用。设备名称为/dev/video,主设备号 81,子设备号 0~63
  2. Video output device : 将视频数据编码为模拟信号输出。与 video capture 设备名相同。
  3. Video overlay device : 将同步锁相视频数据(如 TV)转换为 VGA 信号,或者将抓取的视频数据直接存放到视频卡的显存中。
  4. Video output overlay device :也被称为 OSD(On-Screen Display)
  5. VBI device : 提供对 VBI(Vertical Blanking Interval)数据的控制,发送 VBI 数据或抓取 VBI 数据。设备名/dev/vbi0~vbi31,主设备号 81,子设备号 224~255
  6. Radio device : FM/AM 发送和接收设备。设备名/dev/radio0~radio63,主设备号81,子设备号 64~127

V4L2 架构总览

总体架构图

CRM 根设备

CRM 即 camera request manager,创建了 V4L2 根设备/dev/video0,供所有子设备注册。

V4L2 子设备

每个子设备实现特定功能,如音视频混合,编解码等。对于 camera,有如下子设备:

SENSOR, IFE, ICP, LRME, JPEG, FD, CPAS, CSIPHY, ACTUATOR, CCI, FLASH,EEPROM, OIS 等。

通过设备文件/dev/v4l-subdevX 供应用层(CSL)调用其功能。

V4L2 驱动层实现

V4L2 驱动架构

几个重要的结构体

  1. video_device:保存 V4L2 的 device node 数据。
  2. v4l2_device:表示一个 v4l2 设备,各个子设备都挂在这个结构体里面。
  3. v4l2_subdev:每个子设备都有一个实例。

Kernel V4l2 的文档:
https://www.kernel.org/doc/html/v4.9/media/kapi/v4l2-core.html

驱动主要实现的功能

  1. 具体硬件的控制代码
  2. 实现 V4L2 架构相关结构体与函数
  3. 将代码(结构体与函数)与 V4L2 框架绑定

要实现的主要结构体

struct video_device

主要的任务就是负责向内核注册字符设备。

此结构体既可以动态分配,也可以嵌入到一个更大的结构体中。

动态分配方法如下:

struct video_device *vdev = video_device_alloc();
if (vdev == NULL)return -ENOMEM;
vdev->release = video_device_release;

也可嵌入到一个大结构体中,此时要实现 release()回调:

struct video_device *vdev = &my_vdev->vdev;
vdev->release = my_vdev_release;

设置结构体主要域:

  1. v4l2_dev: 设置为 v4l2_device 父设备。
  2. name: 设置为唯一的描述性设备名。
  3. fops: 设置为已有的 v4l2_file_operations 结构体。实现文件操作。设置 .unlocked_ioctl 指向 video_ioctl2。请勿使用 .ioctl!它已被废弃。
  4. ioctl_ops: 一般设为 v4l2_ioctl_ops 来简化 ioctl 的维护。
  5. lock: 如果你要在驱动中实现所有的锁操作,则设为 NULL 。否则就要设置一个指向 struct mutex_lock 结构体的指针,这个锁将在 unlocked_ioctl 文件操作被调用前由内核获得,并在调用返回后释放。详见下一节。
  6. prio: 保持对优先级的跟踪。用于实现 VIDIOC_G/S_PRIORITY。如果设置为 NULL,则会使用 v4l2_device 中的 v4l2_prio_state 结构体。如果要对每个设备节点(组)实现独立的优先级,可以将其指向自己实现的 v4l2_prio_state 结构体。

注册视频设备:

err = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
if (err) {video_device_release(vdev); /* or kfree(my_vdev); */return err;
}

这个操作会创建一个字符设备

注销设备:

video_unregister_device(vdev);

这个操作将从 sysfs 中移除设备节点(导致 udev 将其从 /dev 中移除)。

struct v4l2_device

struct v4l2_device:一个硬件设备可能包含多个子设备,比如 camera 包含 sensor 设备,actuator 设备,flash 设备等。而 v4l2_device 就是所有这些设备的根节点,负责管理所有的子设备。

简单设备可以仅分配这个结构体,但在大多数情况下,都会将这个结构体嵌入到一个更大的结构体中。

注册这个设备实例:

v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev);

注销 v4l2_device 使用如下函数:

v4l2_device_unregister(struct v4l2_device *v4l2_dev);

struct v4l2_subdev

struct v4l2_subdev:子设备,负责实现具体的功能。

子设备驱动可使用如下函数初始化 v4l2_subdev 结构体:

v4l2_subdev_init(sd, &ops);

向 v4l2_device 注册 v4l2_subdev:

int err = v4l2_device_register_subdev(v4l2_dev, sd);

注销子设备则可用如下函数:

v4l2_device_unregister_subdev(sd);

此后,子设备模块就可卸载,且 sd->dev == NULL。

要实现的主要函数

video_device->v4l2_file_operations

实现文件类操作,比如 open,close,read,write,mmap 等。但是 ioctl 是不需要实现的,一般都是用 video_ioctl2 代替。

                .unlocked_ioctl = video_ioctl2,

video_device->v4l2_ioctl_ops

V4L2 导出给应用层使用的所有 ioctl。只要实现需要用的,如:

v4l2_subdev->v4l2_subdev_ops 及其子函数:

        必须实现的:

                v4l2_subdev_core_ops     

        其它可按需选择,如: 

                v4l2_subdev_video_ops  

             

  

V4L2 应用层实现                       

V4L2 是一个字符设备,通过设备文件向应用层提供各种功能。应用层可以像操作普通文件一样 open/close V4L2 设备文件,而 V4L2 的大部分功能都是通过设备文件的 ioctl 导出的。

IOCTL 命令分类

功能查询相关

优先级相关

视频捕获相关

TV 视频相关

输入输出相关

控制相关

杂项

V4l2 设备的基本操作流程

  1. 打开并获取设备属性
  2. 设置帧格式
  3. 设置帧缓冲
  4. 开始进行视频流采集
  5. 停止采集关闭设备

高通平台 V4L2 架构实现

驱动层实现

驱动对应用层提供的设备节点,V4L2 相关设备文件:

其中部分子设备类型如下:

//未完待续...

相关文章:

V4L2 驱动架构介绍

V4L2 简介 Video for Linux two(Video4Linux2)简称 V4L2,是 V4L 的改进版。V4L2 是 linux操作系统下用于视频和音频数据采集设备的驱动框架,为驱动和应用程序提供了一套统一的接口规范。 在 Linux 下,所有外设都被看成一种特殊的文件&#xf…...

掌握这些技巧,让Excel批量数据清洗变得简单高效!

什么是数据清洗 数据清洗是指在数据处理过程中对原始数据进行筛选、转换和修正,以确保数据的准确性、一致性和完整性的过程。它是数据预处理的一部分,旨在处理和纠正可能存在的错误、缺失值、异常值和不一致性等数据质量问题。 为什么要数据清洗 Exce…...

成都瀚网科技:抖音上线地方方言自动翻译功能

为了让很多方言的地域历史、文化、习俗能够以短视频的形式生产、传播和保存,解决方言难以被更多用户阅读和理解的问题,平台正式上线推出当地方言自动翻译功能。创作者可以利用该功能,将多个方言视频“一键”转换为普通话字幕供大众观看。 具体…...

【k8s】【docker】web项目的部署

yaml配置文件 后端:springboot项目 前端:vue项目,之前镜像封装的nginx.conf反向代理配置直接使用了docker-compose.yml中services的名称,无法代理成功,可修改为127.0.0.1 # 后端 apiVersion: apps/v1 kind: Deployment…...

【视频去噪】基于全变异正则化最小二乘反卷积是最标准的图像处理、视频去噪研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

国庆day3---网络编程知识点脑图整合

...

链表经典面试题(六)

判断链表是否有环 1.题目2.思路分析(文字)3.详细的注释和代码实现 1.题目 2.思路分析(文字) 3.详细的注释和代码实现 public class Solution {public boolean hasCycle(ListNode head) {//定义两个快慢指针ListNode fast head;ListNode slow head;//让快指针走两步,慢指针走…...

SM2签名算法中随机数K的随机性对算法安全的影响

一、构造如下SM2签名算法过程1 Sig1 r1 F2BFC778C66127C74E3613FAA1AB6E207059740B317597A78BBFCDF58AED0A51 Sig1 s1 4FC719D00334CCC23098036DEEAA71DB464A076EFA79283389D3414D70659E88 私钥d B3124DC843BB8BA61F035A7D0938251F5DD4CBFC…...

郁金香2021年游戏辅助技术中级班(六)

郁金香2021年游戏辅助技术中级班(六) 055-ce,xdbg调试分析接任务交任务完成任务056-C,C写代码测试接任务交任务完成任务我们再来分析一下完成任务 057-C,C写代码测试交任务完成任务 055-ce,xdbg调试分析接任务交任务完成任务 创建一个新角色&#xff0c…...

毛玻璃员工卡片悬停效果

效果展示 页面结构组成 通过效果展示图,我们可以看出页面布局比较常规,最核心的就是卡片,当鼠标没有悬停在卡片上时,文字和头像处于半透明状态,当鼠标悬停在卡片上是,底部会展示社交图标。 CSS 知识点 b…...

闪存工作原理

前言 1、闪存类型 闪存有两种分类,NAND型闪存主要用于存储 2、MOS的特性 MOS管的三个引脚分别是Gate(G)、Source(S)和Drain(D)。Gate(G)引脚是晶闸管的控制引脚&…...

从0到一配置单节点zookeeper

我的软件: 链接:https://pan.baidu.com/s/1nImkjOgzPkgaFOuUPwd1Sg?pwd2wqo 提取码:2wqo 视频教程p1-zookeeper安装和配置以及启动服务和检测是否运行成功_哔哩哔哩_bilibili 一、安装zookeeper http://zookeeper.apache.org/releases.h…...

【JVM】第三篇 JVM对象创建与内存分配机制深度剖析

目录 一. JVM对象创建过程详解1. 类加载检查2. 分配内存2.1 如何划分内存?2.2 并发问题3. 初始化4. 设置对象头5. 执行<init>方法二. 对象头和指针压缩详解三. JVM对象内存分配详解四.逃逸分析 & 栈上分配 & 标量替换详解1. 逃逸分析 & 栈上分配2. 标量替换…...

【信创】麒麟v10(arm)-mysql8-mongo-redis-oceanbase

Win10/Win11 借助qume模拟器安装arm64麒麟v10 前言 近两年的国产化进程一直在推进&#xff0c;基于arm架构的国产系统也在积极发展&#xff0c;这里记录一下基于麒麟v10arm版安装常见数据库的方案。 麒麟软件介绍: 银河麒麟高级服务器操作系统V10 - 国产操作系统、银河麒麟、中…...

maven settings.xml文件(包含了配置阿里云镜像)

mac 的 settings.xml 我配置的位置是&#xff1a; /Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3/conf/settings.xml 然后 local repository 我配置的位置是&#xff1a; /Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3/conf/repos…...

分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测

分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测 目录 分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结…...

Redis是否要分库的实践

Redis的分库其实没有带来任何效率上的提升&#xff0c;只是提供了一个命名空间&#xff0c;而这个命名空间可以完全通过key的设计来避开这个问题。 一个优雅的Redis的key的设计如下...

String 进阶

字符串拼接 // 常量与常量的拼接结果放在常量池 // 常量池中不会存在相同的常量 String str1 "a" "b"; System.out.println(str1 "ab");// 拼接时有一个为变量&#xff0c;则结果会放在堆中。 // 变量拼接的原理是 StringBuilder append 最后…...

ESP32设备通信-两个ESP32间UART通信

两个ESP32间UART通信 文章目录 两个ESP32间UART通信1、UART介绍2、软件准备3、硬件准备4、代码实现在本文中,我们将使用 Arduino IDE 的 UART 硬件库在两个 ESP32 板之间执行 UART 或串行通信。 要使用 USB 端口调试和编程 ESP32,需要使用称为通用异步接收器/发送器 (UART) 通…...

LCR 052.递增顺序搜索树

​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;LCR 052. 递增顺序搜索树 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 中序遍历时修改指针即可。 解题代码&#xff1a; /*** Definition for a binary tree node.* public class TreeNo…...

Mysql集群技术问答

前提&#xff1a;Mysql集群服务部署到一个群组的所有服务器上&#xff0c;一般20台为一个群组&#xff0c;群组内所有节点数据实时同步&#xff0c;动态自动维护节点。 问&#xff1a;集群空间跟传统空间的最大不同是什么&#xff1f; 答&#xff1a;集群空间有数据同步和宕机检…...

2023版 STM32实战4 滴答定时器精准延时

SysTick简介与特性 -1- SysTick属于系统时钟。 -2- SysTick定时器被捆绑在NVIC中。 -3- SysTick可以产生中断,且中断不可屏蔽。 SysTick的时钟源查看 通过时钟树可以看出滴答的时钟最大为72MHZ/89MHZ 通过中文参考手册也可以得到这个结论 代码编写&#xff08;已经验证&a…...

ESP32设备驱动-数据持久化到Flash

数据持久化到Flash 文章目录 数据持久化到Flash1、Preferences库介绍2、软件准备3、硬件准备4、代码实现4.1 初始化NVS Flash4.2 读写Key/Value对4.3 保存/读取网络凭据4.4 复位后记住最后的 GPIO 状态在本文中,我们将介绍如何使用 Preferences库将数据存储到 ESP32 的Flash中…...

Swift data范围截取问题

文章目录 一、截取字符串的几种方法1. 截取前几位2. 截取后几位3. subData4. 下标截取 二、subData(in:) 报错 EXC_BREAKPOINT 一、截取字符串的几种方法 1. 截取前几位 mobileID.prefix(32)2. 截取后几位 mobileID.suffix(3)3. subData data.subdata(in: 0..<4)4. 下标…...

PICO首届XR开发者挑战赛正式启动,助推行业迈入“VR+MR”新阶段

9月25日&#xff0c;“PICO 2023首届XR开发者挑战赛”&#xff08;下文简称“挑战赛”&#xff09;媒体启动会在北京圆满落幕&#xff0c;官方赛事报名通道已于今日开启。据悉&#xff0c;本次挑战赛是PICO首次针对全球开发者举办的大型挑战赛事&#xff0c;旨在与开发者保持连…...

【计算机网络】应用层协议原理

文章目录 网络应用程序体系结构客户-服务器体系结构P2P体系结构 进程通信客户和服务器进程进程与计算机网络之间的接口进程寻址 可供应用程序使用的运输服务可靠数据传输吞吐量定时安全性 因特网提供的运输服务TCP服务面向连接的服务可靠数据传输服务TCP安全 UDP服务因特网运输…...

buuctf-[WUSTCTF2020]CV Maker

打开环境 随便登录注册一下 进入到了profile.php 其他没有什么页面&#xff0c;只能更换头像上传文件&#xff0c;所以猜测是文件上传漏洞 上传一句话木马看看 <?php eval($_POST[a]);?>回显 搜索一下 添加文件头GIF89a。上传php文件 查看页面源代码&#xff0c;看…...

数据库表操作详解

在数据库管理中,表操作是最基础也最常用的一项功能。不论是临时存储一些数据,还是通过派生表进行复杂的查询,表操作的灵活性和多样性都使其在数据库中发挥着重要的作用。 本文将详细解析数据库中常见的表操作,包括临时表、派生表以及与视图、子查询的比较。我们将使用游戏…...

axios配置代理ip

axios配置代理ip 对于在nodejs中使用axios作为请求库时&#xff0c;有需要配置代理ip的需求&#xff08;比如爬虫等等&#xff09; 最离谱的是&#xff0c;在网上搜了一圈&#xff0c;全是关于axios配置proxy跨域的解决办法&#xff0c;没有配置代理ip的方法。 const axios …...

Apache Commons Pool2 池化技术

对象池是一种设计模式&#xff0c;用于管理和重用对象&#xff0c;以提高性能和资源利用率。对象池的概念在许多应用程序中都有广泛应用&#xff0c;特别是在需要频繁创建和销毁对象的情况下&#xff0c;例如数据库连接、线程、HTTP连接等 对象池通过预先创建一组对象并将它们存…...

网络绿化网站建设哪家权威/百度推广助手app

思路&#xff1a;1、获取元素。2、用for循环历遍数组&#xff0c;把checkbox的checked设置为true即实现全选&#xff0c;把checkbox的checked设置为false即实现不选。3、通过if判断&#xff0c;如果checked为true选中状态的&#xff0c;就把checked设为false不选状态&#xff0…...

中国建设银行龙卡信用卡网站/专业seo网络营销公司

在 C 言语中&#xff0c;变量的地址常常多是编译零碎主动分派的&#xff0c;对我们用户来说&#xff0c;我们是不晓得某个变量的详细地址的。所以我们界说一个指针变量 p&#xff0c;把通俗变量 a 的地址直接送给指针变量 p 就是 p &a;如许的写法。关于指针变量 p 的界说和…...

装饰设计有限公司/内蒙古网站seo

国有企业利润突破9000亿的喜与忧【国有企业利润突破9000亿&#xff0c;喜的是政府应该有更多的财力搞社会保障&#xff0c;充实社会保障基金了。但愿这些钱不再更多地花费于政府自身的行政费用&#xff0c;而是真正花费于"民生"建设。忧的是这些利润有许多是依靠庞大…...

怎么做网站动态地图/如何做好网络推广销售

机械制图培训中剖视图的画法详解机械制图是机械工程语言&#xff0c;用图样表示机械产品的结构形状、尺寸大小、工作原理和技术要求&#xff0c;是机械设计与机械制造的基础学科&#xff0c;每一个从事机械行业的人员都应该懂机械制图。机械CAD指机械计算机辅助设计&#xff0c…...

wordpress标题转英文/百度搜索大数据怎么查

分享一个大牛的人工智能教程。零基础&#xff01;通俗易懂&#xff01;风趣幽默&#xff01;希望你也加入到人工智能的队伍中来&#xff01;请点击http://www.captainbed.net Redis服务器是一个事件驱动程序&#xff0c;服务器处理的事件分为时间事件和文件事件两类。 文件事…...

一级a做爰片 A视频网站/互联网营销顾问是做什么的

对于专科生来说&#xff0c;选择一个好的专业&#xff0c;关乎以后自己能否找到一个好的工作&#xff0c;下面小编为大家提供大专都有哪些专业&#xff0c;仅供大家参考。大专有什么专业大专的具备的专业和本科的专业没有太大的区别&#xff0c;一般本科具备的专业&#xff0c;…...