【V4L2】 v4l2框架分析之v4l2_fh

news2024/11/15 14:07:42

一、v4l2_fh简介

🔺相关源码文件:

  • /drivers/media/v4l2-fh.c

  • /drivers/media/v4l2-fh.h

在V4L2中,struct v4l2_fh结构用于保存V4L2框架中使用的文件句柄(File Handle)的数据,即每个打开的视频设备都会对应一个struct v4l2_fh结构体,该结构体包含了与该设备相关的各种信息,例如该设备的控制器、缓冲区、状态等等。通过struct v4l2_fh,V4L2子系统能够跟踪设备文件的打开和关闭,并管理与句柄相关的状态和控制操作。

在新的驱动程序设计中必须使用struct v4l2_fh,因为它可以用来实现优先级处理。该结构定义如下:

struct v4l2_fh {
	struct list_head	list;   //file 处理列表
	struct video_device	*vdev;  //指向video_device结构体的指针
	struct v4l2_ctrl_handler *ctrl_handler; //指向结构体v4l2_ctrl_handler的指针
	enum v4l2_priority	prio; //文件处理程序的优先级,由enum v4l2_priority定义

	/* Events */
	wait_queue_head_t	wait; //事件等待队列
	struct list_head	subscribed; //已订阅事件链表
	struct list_head	available; //等待退出队列的事件链表
	unsigned int		navailable;  //可用列表中可用事件的数量
	u32			sequence;  //事件序列号

#if IS_ENABLED(CONFIG_V4L2_MEM2MEM_DEV)
	struct v4l2_m2m_ctx	*m2m_ctx;  //指向结构体v4l2_m2m_ctx的指针
#endif
};

在V4L2框架中,通过检测v4l2_fh结构中的video_device->flags是否是V4L2_FL_USES_V4L2_FH位来判断驱动程序是否使用v4l2_fh作为它的file->private_data指针。该flags会在调用v4l2_fh_init()函数时设置,如下代码:

struct v4l2_fh被分配为驱动程序自己的文件句柄结构的一部分,并且驱动程序在open()函数中会将file->private_data设置为文件句柄。

在多数情况下,struct v4l2_fh将被嵌入到更大的结构中。这时候应该调用:

v4l2_fh_init() 和 v4l2_fh_add()
v4l2_fh_del() 和 v4l2_fh_exit() 

注:驱动程序可以使用container_of宏来提取自己的文件句柄结构。

例如下列代码:

struct my_fh {
    int blah;
    struct v4l2_fh fh;
};
...

int my_open(struct file *file)
{
    struct my_fh *my_fh;
    struct video_device *vfd;
    int ret;

    ...

    my_fh = kzalloc(sizeof(*my_fh), GFP_KERNEL);

    ...

    v4l2_fh_init(&my_fh->fh, vfd);

    ...

    file->private_data = &my_fh->fh;
    v4l2_fh_add(&my_fh->fh);
    return 0;
}

int my_release(struct file *file)
{
    struct v4l2_fh *fh = file->private_data;

    //从子级元素(v4l2_fh)中提取父级包含元素(my_fh)
    struct my_fh *my_fh = container_of(fh, struct my_fh, fh);
    ...
    v4l2_fh_del(&my_fh->fh);
    v4l2_fh_exit(&my_fh->fh);
    kfree(my_fh);
    return 0;
}

二、struct v4l2_fh的常用API接口

(1)初始化文件句柄:

v4l2_fh_init (fh, vdev)

该函数必须在驱动程序的v4l2_file_operations->open()处理程序中执行。

(2)将v4l2_fh添加到video_device的文件处理列表:

v4l2_fh_add (fh)

注:该函数必须在文件句柄完全初始化后调用。

(3)解除与video_device的文件句柄的关联:

v4l2_fh_del (fh)

(4)取消初始化的文件句柄:

v4l2_fh_exit (fh)

在取消初始化后,可以释放v4l2_fh内存。

如果struct v4l2_fh没有嵌入到更大的结构中,可以使用下列助手函数:

v4l2_fh_open (struct file *filp)

分配一个struct v4l2_fh,对其进行初始化并将其添加到与struct file相关联的struct video_device中。

v4l2_fh_release (struct file *filp)

该函数从struct file相关联的struct video_device中删除v4l2_fh,取消初始化的v4l2_fh并释放。

上述两个函数可以插入到v4l2_file_operationopenrelease的ops中。

当第一个文件句柄打开和最后一个文件句柄关闭时,在驱动程序中可添加两个助手函数来检查v4l2_fh结构是否是关联该设备节点唯一打开的文件句柄:

v4l2_fh_is_singular (fh)

检查该文件句柄是否是唯一打开的文件句柄,如果是则返回1,否则返回0。

v4l2_fh_is_singular_file (struct file *filp)

该函数与v4l2_fh_is_singular()一样,但是该函数使用filp->private_data调用v4l2_fh_is_singular

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

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

相关文章

微信小程序开发入门学习01-TDesign模板解读

目录 1 使用模板创建小程序2 app.json3 页面布局总结 原来我们使用微信开发者工具,比较困难的是前端框架的选择上,官方也没有提供一套框架供我们使用,最近开发者工具已经提供了一套前端框架,后续我们开发的效率会因为使用模板提高…

Linux-线程的同步与互斥

线程的同步与互斥 进程/线程间的互斥相关背景概念互斥量互斥量接口互斥量的初始化互斥量的销毁加锁和解锁 改善抢票系统互斥量原理 可重入与线程安全重入和线程安全的概念常见线程不安全情况常见线程安全的情况常见不可重入情况常见可重入情况可重入与线程安全的关系可重入与线…

Spring Security系列之认证(Authentication)架构

文章目录 架构主要组件SecurityContextHolderAuthenticationAuthenticationManagerProviderManagerAuthenticationProviderAuthenticationEntryPointAbstractAuthenticationProcessingFilter 架构主要组件 SecurityContextHolder - SecurityContextHolder 是 Spring Security …

【tensorflow】连续输入的神经网络模型训练代码

【tensorflow】连续输入的神经网络模型训练代码 全部代码 - 复制即用 训练输出 代码介绍 全部代码 - 复制即用 from sklearn.model_selection import train_test_split import tensorflow as tf import numpy as np from keras import Input, Model, Sequential from keras.l…

try-catch-finally中的四大坑

目录 1.坑1:finally中使用return 2.坑2:finally中的代码好像“不执行” 3.坑3:finally中的代码“非最后”执行 4.坑4:finally中的代码真的“不执行” 在 Java 语言中 try-catch-finally 看似简单,但想要真正的“掌…

对现在的生活不满意?《围城》给你个人,婚姻,爱情的启示

杨绛先生在100岁感言的时候说,我们曾如此期盼外界的认可,到最后才知道:世界是自己的,与他人毫无关系!百岁老人的感言,清晰透彻地道出了人生的真相。我们每个人都是生活于关系之中的,在错综复杂的…

华为OD机试真题 JavaScript 实现【找车位】【2023 B卷 100分】,附详细解题思路

一、题目描述 停车场有一横排车位,0代表没有停车,1代表有车。至少停了一辆车在车位上,也至少有一个空位没有停车。 为了防剐蹭,需为停车人找到一个车位,使得距停车人的车最近的车辆的距离是最大的,返回此…

【tensorflow】连续输入的线性回归模型训练代码

【tensorflow】连续输入的感知机模型训练 全部代码 - 复制即用 训练输出 代码介绍 全部代码 - 复制即用 from sklearn.model_selection import train_test_split import tensorflow as tf import numpy as np from keras import Input, Model, Sequential from keras.layers …

2023ciscn初赛 Unzip

参考&#xff1a; 奇安信攻防社区-2021深育杯线上初赛官方WriteUp-Web篇 1.打开环境 2.上传一个文件&#xff0c;得到以下源码&#xff0c;分析一下8 <?php error_reporting(0); highlight_file(__FILE__);$finfo finfo_open(FILEINFO_MIME_TYPE); //使用 PHP 内置函数…

【软考系统规划与管理师笔记】第7篇 IT服务运营管理

这章也基本上是纯概念&#xff0c;整体上来说系统规划与管理师考试&#xff0c;以概念记忆为主。课本上的知识点往往告诉我们该怎么做&#xff0c;但是如何确保执行到位&#xff0c;如何主动激发员工、客户执行到位&#xff0c;往往还是空白&#xff1f;&#xff0c;作为考试记…

Android ANR分析

ANR(Application Not Responding&#xff0c;即应用程序无响应)。在Android中&#xff0c;当应用程序在规定时间内没有处理完毕相应的事件,系统就会报出ANR。 ANR类型 InputDispatchingTimedOut&#xff1a;应用程序主线程在5s内没有完成用户的input事件ServiceTimeout&#…

小型企业社交完整指南(2023年)

目录 如何制定成功的社交媒体营销策略 1. 设定预算和目标 2. 确定你的目标受众 3.研究竞争对手 4.选择社交媒体网站 5.定义你的社交媒体品牌 6.制定内容策略 社交媒体营销指标 如何制定成功的社交媒体营销策略 有效的内容营销始于计划。以下是通过六个步骤制定企业…

数据备份- rclone ,Duplicity, restic,rsync

目录 Duplicity 安装 语法&#xff1a; 案例&#xff1a; Rclone 简介 安装 设置 命令语法 备份 同步 常用功能选项 常用参数 日志 文件过滤 常用命令 查看远程文件夹的体积占用大小 Restic Restic 支持的存储类型 安装 备份至本地 创建备份仓库 备份至云…

《安富莱嵌入式周报》第315期:开源USB高速分析仪,8GHz示波器开发, 600行C编写RISC-V内核,英特尔推出用于开发人员等宽字体,便携物联网监测器

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV1gV4y117UD/ 《安富莱嵌入式周报》第315期&#xff1a;开源USB…

618期间该如何入手数码好物,列举几款618值得入手的数码好物

跟不少数码爱好者一样&#xff0c;在618、双十一这种大型电商促销节日中&#xff0c;都会选择入手几款心仪且实用的数码好物毕竟产品的热度可以说是相当的在线&#xff0c;而明天就是618的最后一天了&#xff0c;为了赶紧抓住最后的脚步&#xff0c;下面我将给大家分享一些618值…

CefSharp89-winform浏览器(支持H264,MP3,MP4等音视频)x86体验

cef89.*-cefsharp89.*版本应用体验-浏览器 欢迎体验cefsharp-winform-浏览器版本更新方法**测试视频播放**正常![播放视频测试正常](https://img-blog.csdnimg.cn/263f7199ef3c4f1fba59302355e5372d.png)兼容性测试(html5test.com)下载地址其他版本参阅:欢迎体验cefsharp-wi…

华为OD机试之整数对最小和

整数对最小和 题目描述 给定两个整数数组array1、array2&#xff0c;数组元素按升序排列。 假设从array1、array2中分别取出一个元素可构成一对元素&#xff0c;现在需要取出k对元素&#xff0c; 并对取出的所有元素求和&#xff0c;计算和的最小值。 注意&#xff1a; 两…

网安等保 | 主机安全之CentOS8服务器配置优化与安全加固基线文档脚本分享

欢迎关注「全栈工程师修炼指南」公众号 点击 &#x1f447; 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; 专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享 “ 花开堪折直须折&#xf…

C语言解决“三天打鱼两天晒网”的问题?

中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打 鱼两天晒网”&#xff0c;问这个人在以后的某一天是“打鱼”还是“晒网”&#xff1f; 根据题意可以将解题过程分为三步&#xff1a; &#xff08;1&#xff09;计算从1990年1月1日开始至指定日…

Vite 是怎么兼容老旧浏览器的?你以为仅仅依靠 Babel?

目录 一、前言 二、那个午后 三、跟webpack构建产物到底哪里不一样&#xff1f; 1. 准备工作 2. 构建工具版本说明 3. 构建工具配置项说明 4. 构建产物 5. Vite 的原生模块化能力 6. “魔鬼藏在细节中” 四、总结 一、前言 对前端开发者来说&#xff0c;Vite 应该不算…