V4L2驱动框架

文章目录

  • 一、V4L2简介
  • 二、v4l2驱动关键组件
    • (一)video_device结构体
      • v4l2操作方法结构体
      • v4l2的ioctl操作方法结构体
    • (二)v4l2_device结构体

一、V4L2简介

V4L2,即Video for Linux two,是Linux内核中用于视频设备驱动的框架。
它提供了一套统一的接口规范给用户空间的应用程序,使其能够访问和控制视频设备。

v4l2设备本质是字符设备驱动,当调用cdev的fops时,就会回调到v4l2的操作方法结构体,即v4l2_file_operations。
当调用ioctl函数时,会回调到v4l2的操作方法结构体,然后再回调到ioctl操作方法结构体,即v4l2_ioctl_ops。

首先,需要分配并初始化video_device结构体,
然后,设置其成员变量,如设备名、文件操作函数集、ioctl操作函数集等,注意必须填充v4l2_dev->name成员
最后,调用video_register_device函数将video_device结构体注册到系统中,创建一个对应的设备文件(如/dev/videoX)。

二、v4l2驱动关键组件

在这里插入图片描述

video_device:表示一个字符设备,包含cdev和v4l2_device等成员v4l2_device:表示一个v4l2设备实例,内部通过链表管理从属所有子设备。

(一)video_device结构体

V4L2驱动框架中表示视频设备的核心结构体。
它包含了设备的各种属性和操作函数,如字符设备名、操作函数集以及ioctl操作函数集。

//该结构体用于创建和管理v4l2设备节点
struct video_device
{const struct v4l2_file_operations *fops;	//v4l2_file_operations操作方法结构体struct device dev;					//视频设备结构体devicestruct cdev *cdev;					//字符设备struct v4l2_device *v4l2_dev;		//v4l2_device父类struct device *dev_parent;			//device结构体的父类/* 设备信息 */char name[32];						//视频设备名enum vfl_devnode_type vfl_type;		//v4l设备类型int minor;							//次设备号u16 num;							//视频设备节点号	unsigned long flags;				//视频设备标志位/* 回调函数 */void (*release)(struct video_device *vdev);	//视频设备注销的回调函数const struct v4l2_ioctl_ops *ioctl_ops;		//v4l2的ioctl回调函数struct mutex *lock;							//序列化操作锁
};

v4l2操作方法结构体

struct v4l2_file_operations {struct module *owner;ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);__poll_t (*poll) (struct file *, struct poll_table_struct *);long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);unsigned long (*get_unmapped_area) (struct file *, unsigned long,unsigned long, unsigned long, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);int (*open) (struct file *);int (*release) (struct file *);
};

v4l2的ioctl操作方法结构体

struct v4l2_ioctl_ops {//查询是否是摄像头设备int (*vidioc_querycap)(struct file *file, void *fh, struct v4l2_capability *cap);  //列举摄像头支持的数据格式int (*vidioc_enum_fmt_vid_cap)(struct file *file, void *fh, struct v4l2_fmtdesc *f);//获取当前设置的数据格式int (*vidioc_g_fmt_vid_cap)(struct file *file, void *fh, struct v4l2_format *f);	//尝试设置数据格式到摄像头			     int (*vidioc_try_fmt_vid_cap)(struct file *file, void *fh, struct v4l2_format *f);//设置数据格式给摄像头int (*vidioc_s_fmt_vid_cap)(struct file *file, void *fh, struct v4l2_format *f);//申请内存int (*vidioc_reqbufs)(struct file *file, void *fh, struct v4l2_requestbuffers *b);//查询内存int (*vidioc_querybuf)(struct file *file, void *fh, struct v4l2_buffer *b);//将申请的内存放入到队列尾int (*vidioc_qbuf)(struct file *file, void *fh, struct v4l2_buffer *b);//将内存从队列头取出int (*vidioc_dqbuf)(struct file *file, void *fh, struct v4l2_buffer *b);	//开启摄像头int (*vidioc_streamon)(struct file *file, void *fh, enum v4l2_buf_type i);//关闭摄像头int (*vidioc_streamoff)(struct file *file, void *fh, enum v4l2_buf_type i);

(二)v4l2_device结构体

表示一个V4L2设备,通常作为管理所有子设备的根节点。
它包含了指向子设备的指针数组,以及用于管理子设备的各种函数。
通过v4l2_device_register函数,可以将v4l2_device结构体注册到系统中。

v4l2_dev继承于device,描述摄像头设备,所有的子设备由链表连接

//v4l2设备驱动的主结构体
struct v4l2_device {struct device *dev;				//指向struct device的指针struct media_device *mdev;		//指向struct media_device的指针,可能为NULLstruct list_head subdevs;		//已注册的子设备,以链表形式管理spinlock_t lock;				//自旋锁char name[V4L2_DEVICE_NAME_SIZE];				//v4l2的设备名void (*release)(struct v4l2_device *v4l2_dev);	//当引用计数降为0时调用的释放函数
};
--------------------
//以链表形式保存每一个v4l2设备的子设备
struct list_head {struct list_head *next, *prev;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux Redis查询key与移除日常操作

维护老项目Express node 编写的后端程序、有这么一个方法、没有设置redis过期时间(建议设置过期时间,毕竟登录生产服务器并不是每个人都有权限登录的!!!)。如果变动只能通过登录生产服务器、手动修改… 于…

本地docker部署中间件和应用

Docker Desktop搭建 安装完成之后使用docker下载镜像,报以下错误: 解决办法: Docker Engine配置能访问的镜像地址: {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled…

使用 Elasticsearch 作为向量数据库询问有关你的 GitHub 存储库的问题

作者:来自 Elastic Fram Souza 本博客介绍了使用 RAG 和 Elasticsearch 实现语义代码查询的 GitHub Assistant,提供对 GitHub 存储库的洞察,并可扩展到 PR 反馈、问题处理和生产准备情况审查。 该项目允许你直接与 GitHub 存储库交互并利用语…

【YOLOv11】制作使用YOLOv11的docker环境

目录 一 安装docker 1 安装依赖 2 添加docker官网 GPG 密钥、设置stable 仓库 3 安装 4 使用 二 环境制作 ① 拉基础镜像 ② 起容器 ③ 安装Anaconda3 ④ 安装YOLO11 ⑤ /root/.bashrc ⑥ 退出容器 ⑦ 保存镜像 ⑧ 镜像的使用 一 安装docker ubuntu:20.04 1 安装…

Java项目-基于springboot框架的人职匹配推荐系统项目实战(附源码+文档)

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…

【LeetCode】每日一题 2024_10_24 找到连续赢 K 场比赛的第一位玩家(模拟/脑筋急转弯)

前言 每天和你一起刷 LeetCode 每日一题~ 1024 程序员节快乐~ LeetCode 启动! 题目:找到连续赢 K 场比赛的第一位玩家 代码与解题思路 题目让我们从第一个元素开始让数组中的元素排队一个个打擂台,直到找到最先赢下 k 次的元素编号 因为…

代码随想录算法训练营第六天|454四数相加II、 383赎金信、15三数之和、18四数之和

day06 1. 454四数相加II 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。定义int变量count,用来统计 …

系统性能优化的终极武器,一键让你的电脑焕发第二春

作为Windows系统维护的得力助手,PC Fresh为用户带来全方位的电脑优化解决方案。这款智能系统工具采用先进的检测引擎,不仅能够实时监控计算机的运行状态,更可以精准定位影响性能的潜在问题。通过智能诊断技术,软件会针对每台电脑的…

多去尝试 AI 产品经理面试,你会意外发现……

前言 这两天跟很多做程序员的朋友聊天,怎么看全网火爆的大模型。让我挺意外的是,大家的反馈普遍都很焦虑 。 在AI大模型微调领域的产品经理面试中,总会遇到一系列与技术细节、项目经验、市场趋势以及职业规划相关的问题。以下是一些建议的面…

GEE引擎传奇UI界面修改教程

还记得小林之前给大家分享了gom引擎UI界面编辑教程,今天给大家分享一下gee引擎UI界面修改教程 首先打开登录器生成器-客户端界面设置 在客户端界面设置这里可以自定义UI素材,也可以直接在原素材上编辑主界面 传奇根目录指向的是你的传奇客户端根目录&am…

【LaTeX】调整itemize中item的间距

LaTeX中调整itemize中item的间距 1. 使用 \setlength 调整间距2. 使用 enumitem 宏包来更灵活地调整 在 LaTeX 中,调整 itemize 列表中各项 (item) 的间距可以通过以下方法实现: 1. 使用 \setlength 调整间距 通过 \setlength 调整列表项之间的间距。两…

【随手笔记】远程升级之如何平衡下载包大小与速率?

1. 远程升级基本信息 使用NB_BC26模组,通过AT指令使用TCP的协议与公司后台交互升级的固件为BIN文件,使用原始固件包升级,未使用差分方式原始固件包有110K,大小左右,固件的存储为外置的FLASH W25Q16,w25q16最小存储单位为页&#…

BurpSuit 安装Jpython 和Json-Hunter脚本

0x00下载Jpython jpython2.7.2下载的人最多,所以我就安装2.7.2了 Central Repository: org/python/jython-standalone/2.7.2 点击下载即可。 0x01BP设置jpython环境 重点:Jpython和Jsonp-Hunter一定要放在英文目录下。 0x02安装Jsonp-Hunter https:…

基于Python和OpenCV的疲劳检测系统设计与实现

项目运行 需要先安装Python的相关依赖:pymysql,Django3.2.8,pillow 使用pip install 安装 第一步:创建数据库 第二步:执行SQL语句,.sql文件,运行该文件中的SQL语句 第三步:修改源…

《Windows PE》6.4.2 远程注入DLL

实验四十七:远程注入DLL 写一个窗口程序,将一个dll通过远程注入的方法,注入到第三章的示例程序PEHeader.exe中,支持32位和64位PE。 ●dll.c /*------------------------------------------------------------------------FileNam…

《PP-OCRv1》论文精读:PaddleOCR是目前SOTA级别的OCR开源技术(截止2024年10月)

PP-OCR: A Practical Ultra Lightweight OCR System论文地址PP-OCRv2: Bag of Tricks for Ultra Lightweight OCR System论文地址PP-OCRv3: More Attempts for the Improvement of Ultra Lightweight OCR System论文地址PaddleOCR Github OCR工具库 43.5K个star PP-OCRv1由百度…

矩阵基础知识

矩阵定义 矩阵的定义 1.矩阵是由一组数按照矩形排列而成的数表。矩阵通常用大写字母表示,例如 AA、BB 等。矩阵中的每个数称为矩阵的元素或元。 一个 mn的矩阵 AA 可以表示为: 其中 aij表示矩阵 A中第i行第j列的元素。 矩阵的维度 1.矩阵的维度由它…

经典功率谱估计的原理及MATLAB仿真(自相关函数BT法、周期图法、bartlett法、welch法)

经典功率谱估计的原理及MATLAB仿真(自相关函数BT法、周期图法、bartlett法、welch法) 文章目录 前言一、BT法二、周期图法三、Bartlett法四、welch法五、MATLAB仿真六、MATLAB详细代码总结 前言 经典功率谱估计方法包括BT法(对自相关函数求傅…

python实现onvif协议下控制摄像头变焦,以及融合人形识别与跟踪控制

#1024程序员节 | 征文# 这两天才因为项目需要,对网络摄像头的视频采集以及实现人形识别与跟踪技术。对于onvif协议自然起先也没有任何的了解。但是购买的摄像头是SONY网络头是用在其他地方的。因为前期支持探究项目解决方案,就直接拿来做demo测试使用。 …

react18中在列表项中如何使用useRef来获取每项的dom对象

在react中获取dom节点都知道用ref,但是在一个列表循环中,这样做是行不通的,需要做进一步的数据处理。 实现效果 需求:点击每张图片,当前图片出现在可视区域。 代码实现 .box{border: 1px solid #000;list-style: …