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;					//视频设备结构体device
	struct 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的指针,可能为NULL
	struct 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;
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

qt项目使用其他项目的ui之单继承之成员变量

第一步添加.ui文件 第二步&#xff0c;点击编译(原理&#xff1a;qt的uic会将.ui界面编译成c文件) 第三步&#xff1a;在编译后的目录下找到#include “ui_pagewidget.h” 第四步&#xff1a; #ifndef USA_H #define USA_H#include <QWidget>#include "ui_pagew…

设计模式概览

设计模式是一种解决常见编程问题的经验总结&#xff0c;提供了代码的可重用性、可扩展性和可维护性。常见的设计模式有23个&#xff0c;主要分为三大类&#xff1a;创建型模式、结构型模式和行为型模式。下面是这三类设计模式的详细分类和讲解&#xff1a; 一、创建型模式 创建…

记一个src中危-图像大小与请求参数可修改

记一个src中危-图像大小与请求参数可修改 漏洞描述 服务器生成了一个具有客户端指定尺寸的图像&#xff0c;如果未实施任何限制&#xff0c;则可能导致拒绝服务攻击。 漏洞危害 攻击者不需要在此类攻击中投入资源&#xff0c;但服务器可能会分配所需的像素缓冲区&#xff0…

rk3588_DRM_显示

DRM简介&#xff08;Direct Rendering Manager&#xff09; hdmi 查看hdmir接口状态 cat /sys/class/drm/card0-HDMI-A-2/statusconnected 参考文章 rk3588_dp调试_rk3588 dp接口适配-CSDN博客

十六、【智能体】如何高效利用智能体知识库:打造智能助理的核心支撑

“知识库” 节点可以理解为一个集中存储和管理知识的地方。 就像一个装满各种工具和资源的工具箱&#xff0c;它包含了大量的信息、数据、文档、经验总结等各种知识内容。 为我们提供了一个便捷的途径来获取所需的知识&#xff0c;以解决问题、做出决策或者进行学习和研究。 …

Windows无法打开组策略 | Windows家庭版如何添加和打开组策略

什么是组策略&#xff08;Group Policy&#xff09;&#xff1f; 组策略 是微软Windows操作系统中的一个重要功能&#xff0c;它允许系统管理员通过统一的界面集中配置计算机和用户设置。 组策略设置是通过编辑“组策略对象”&#xff08;GPOs&#xff09;来实现的&#xff0c;…

攻坚金融关键业务系统,OceanBase亮相2024金融科技大会

10月15-16日&#xff0c;第六届中新数字金融应用博览会与2024金融科技大会&#xff08;简称“金博会”&#xff09;在苏州工业园区联合举办。此次大会融合了国家级重要金融科技资源——“中国金融科技大会”&#xff0c;围绕“赋能金融高质量发展&#xff0c;金融科技创新前行”…

Python 学习笔记(十二)—— 网络编程

目录 一、网络编程的基本概念 1.1 IP地址 1.1.1 IP的版本 1.1.2 IP的分类 1.1.2.1 公有地址 1.1.2.2 私有地址 1.1.3 IP地址的范围 1.1.4 回环测试 1.2 常见的网络设备 1.3 端口 1.3.1 端口分配 二、网络通信协议 2.1 常用网络协议 2.2 OSI网络协议七层模型 2.3…

几张图就让你掌握InnoDB 存储引擎底层逻辑架构

前言 &#x1f680; 博主介绍&#xff1a;大家好&#xff0c;我是无休居士&#xff01;一枚任职于一线Top3互联网大厂的Java开发工程师&#xff01; &#x1f680; &#x1f4a1; 无论你是刚刚踏入编程世界的新人&#xff0c;还是希望进一步提升自己的资深开发者&#xff0c;…

10.24.2024刷华为OD C题型(四) -- 对象list按照多个属性排序

文章目录 最长连续子序列AI面板识别语法知识记录 最长连续子序列 https://www.nowcoder.com/discuss/592408743019589632 if __name__ "__main__":# 获取用户输入# numbers int(input().split(,))# str_arr input().split(,)arr [int(num) for num in input(…

【安装教程】使用WSL工具,在Windows11系统上安装Linux模拟环境(逐步教程)

目录 一、为什么要学习Linux系统 二、Linux模拟环境&#xff08;WSL&#xff09; WSL的官方文档 1、下载WSL 2、安装Ubuntu 结语 提示&#xff1a;WSL下的Linux模拟环境是纯命令行操作的。如果想要使用桌面系统&#xff0c;则应该考虑其他的虚拟机&#xff0c;如VMware。我…

从校园到职场:Java实习生面试常见问题

Java实习生面试通常会涵盖多个方面的知识&#xff0c;包括基础知识、项目经验、解决问题的能力以及面试技巧。以下是一些常见的Java实习生面试题及其回答技巧&#xff1a; Java基础知识 问题&#xff1a;Java有那些基本数据类型&#xff0c;String是不是基本数据类型&#xff…

java实现redis的消息发送和消费,类似kafka功能

确保在 pom.xml 中添加了 Spring Data Redis 和 Jedis 的依赖。如下所示&#xff1a;<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency&g…

C数组与字符串

1.数组 数组是一组有序的、类型相同的数据的集合&#xff0c;这些数据被称为数组的元素。 每个数组都有一个名字&#xff0c;我们称之为数组名。 数组名代表数组的起始地址。 数组元素由索引或下标标识&#xff0c;索引或下标从0开始 数组的特性必须在使用前定义&#xff1…

Mycat 详细介绍及入门实战,解决数据库性能问题

一、基本原理 1、数据分片 &#xff08;1&#xff09;、水平分片 Mycat 将一个大表的数据按照一定的规则拆分成多个小表&#xff0c;分布在不同的数据库节点上。例如&#xff0c;可以根据某个字段的值进行哈希取模&#xff0c;将数据均匀的分布到不同的节点上。 这样做的好处…

OpenIPC开源FPV之Ardupilot配置

OpenIPC开源FPV之Ardupilot配置 1. 源由2. 问题3. 分析3.1 MAVLINK_MSG_ID_RAW_IMU3.2 MAVLINK_MSG_ID_SYS_STATUS3.3 MAVLINK_MSG_ID_BATTERY_STATUS3.4 MAVLINK_MSG_ID_RC_CHANNELS_RAW3.5 MAVLINK_MSG_ID_GPS_RAW_INT3.6 MAVLINK_MSG_ID_VFR_HUD3.7 MAVLINK_MSG_ID_GLOBAL_P…

ActiveMQ消息模式Queue和Topic机制讲解

Docker安装ActiveMQ镜像以及通过Java生产消费activemq示例_docker activemq-CSDN博客 背景 周末由于服务器异常宕机&#xff0c;导致业务系统重启后出现ActiveMQ中的数据没有被正常消费&#xff0c;运维认为是消息积压&#xff0c;便联系博主排查。 最终发现并不存在消息积压…

GIS常见前端开发框架

#1024程序员节&#xff5c;征文# 伴随GIS的发展&#xff0c;陆续出现了众多开源地图框架&#xff0c;这些地图框架与众多行业应用融合&#xff0c;极大地拓展了GIS的生命力&#xff0c;这里介绍几个常见的GIS前端开发框架&#xff0c;排名不分先后。 1.Leaflet https://leafl…

Spring--1

spring是一个轻量级的&#xff0c;采用IOC与AOP编程思想的java后端开发框架&#xff0c;简化了企业级的应用开发。 Spring体系 数据访问层&#xff0c;Web层&#xff0c;配置中心&#xff0c;测试区 IOC 控制反转&#xff0c;将创建对象的控制权交由Spring框架&#xff0c;需…

Tongweb7049m4+THS6010-6012版本 传真实ip到后端(by yjm+lwq)

遇到客户需要通过ths传真实ip到后端也就是部署到tongweb的需求&#xff0c;在ths的httpserver.conf里的location块配置了以下内容&#xff1a; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwar…