V4L2学习笔记

article/2025/9/29 16:07:36

首先附上,Linux内核网站:
入口

v4l2非常棒的一篇文章
入口

内核代码查看:
入口

一个博客文档:
入口
https://lwn.net/Articles/204545/

别人整理

关于linux内核头函数:
/usr/src/xxx

系列文
在这里插入图片描述
在其内部有media文件夹,里面含有v4l2有关的内核函数。
在这里插入图片描述
我们的设别驱动都是要依赖这些内核函数,但是平时这些内核函数是不存在的,只有你把设备挂载后才会出现:

在这里插入图片描述
如果你要实现一个v4l2驱动,只要简单进行对下属函数重写就可以了:

struct v4l2_ioctl_ops {/* ioctl callbacks *//* VIDIOC_QUERYCAP handler */int (*vidioc_querycap)(struct file *file, void *fh,struct v4l2_capability *cap);/* VIDIOC_ENUM_FMT handlers */int (*vidioc_enum_fmt_vid_cap)(struct file *file, void *fh,struct v4l2_fmtdesc *f);int (*vidioc_enum_fmt_vid_overlay)(struct file *file, void *fh,struct v4l2_fmtdesc *f);int (*vidioc_enum_fmt_vid_out)(struct file *file, void *fh,struct v4l2_fmtdesc *f);int (*vidioc_enum_fmt_vid_cap_mplane)(struct file *file, void *fh,struct v4l2_fmtdesc *f);};static const struct v4l2_file_operations mvx_v4l2_fops = {.owner          = THIS_MODULE,.open           = mvx_v4l2_open,.release        = mvx_v4l2_release,.poll           = mvx_v4l2_poll,.unlocked_ioctl = video_ioctl2,.mmap           = mvx_v4l2_mmap
};static const struct v4l2_ioctl_ops mvx_v4l2_ioctl_ops = {.vidioc_querycap                = mvx_v4l2_vidioc_querycap,.vidioc_enum_fmt_vid_cap        = mvx_v4l2_vidioc_enum_fmt_vid_cap,.vidioc_enum_fmt_vid_out        = mvx_v4l2_vidioc_enum_fmt_vid_out,.vidioc_enum_fmt_vid_cap_mplane = mvx_v4l2_vidioc_enum_fmt_vid_cap,.vidioc_enum_fmt_vid_out_mplane = mvx_v4l2_vidioc_enum_fmt_vid_out,.vidioc_enum_framesizes         = mvx_v4l2_vidioc_enum_framesizes,.vidioc_g_fmt_vid_cap           = mvx_v4l2_vidioc_g_fmt_vid_cap,.vidioc_g_fmt_vid_cap_mplane    = mvx_v4l2_vidioc_g_fmt_vid_cap,.vidioc_g_fmt_vid_out           = mvx_v4l2_vidioc_g_fmt_vid_out,.vidioc_g_fmt_vid_out_mplane    = mvx_v4l2_vidioc_g_fmt_vid_out,.vidioc_s_fmt_vid_cap           = mvx_v4l2_vidioc_s_fmt_vid_cap,.vidioc_s_fmt_vid_cap_mplane    = mvx_v4l2_vidioc_s_fmt_vid_cap,.vidioc_s_fmt_vid_out           = mvx_v4l2_vidioc_s_fmt_vid_out,.vidioc_s_fmt_vid_out_mplane    = mvx_v4l2_vidioc_s_fmt_vid_out,.vidioc_try_fmt_vid_cap         = mvx_v4l2_vidioc_try_fmt_vid_cap,.vidioc_try_fmt_vid_cap_mplane  = mvx_v4l2_vidioc_try_fmt_vid_cap,.vidioc_try_fmt_vid_out         = mvx_v4l2_vidioc_try_fmt_vid_out,.vidioc_try_fmt_vid_out_mplane  = mvx_v4l2_vidioc_try_fmt_vid_out,.vidioc_g_crop                  = mvx_v4l2_vidioc_g_crop,.vidioc_streamon                = mvx_v4l2_vidioc_streamon,.vidioc_streamoff               = mvx_v4l2_vidioc_streamoff,.vidioc_encoder_cmd             = mvx_v4l2_vidioc_encoder_cmd,.vidioc_try_encoder_cmd         = mvx_v4l2_vidioc_try_encoder_cmd,.vidioc_decoder_cmd             = mvx_v4l2_vidioc_decoder_cmd,.vidioc_try_decoder_cmd         = mvx_v4l2_vidioc_try_decoder_cmd,.vidioc_reqbufs                 = mvx_v4l2_vidioc_reqbufs,.vidioc_create_bufs             = mvx_v4l2_vidioc_create_bufs,.vidioc_querybuf                = mvx_v4l2_vidioc_querybuf,.vidioc_qbuf                    = mvx_v4l2_vidioc_qbuf,.vidioc_dqbuf                   = mvx_v4l2_vidioc_dqbuf,.vidioc_subscribe_event         = mvx_v4l2_vidioc_subscribe_event,.vidioc_unsubscribe_event       = v4l2_event_unsubscribe,.vidioc_default                 = mvx_v4l2_vidioc_default
};

1、在Linux/videodev2.h中定义了枚举类型和关键结构体,这些都是对app用户而言的:

{V4L2_FIELD_ANY           = 0, /* driver can choose from none,top, bottom, interlaced depending on whatever it thinksis approximate ... */V4L2_FIELD_NONE          = 1, /* this device has no fields ... */V4L2_FIELD_TOP           = 2, /* top field only */V4L2_FIELD_BOTTOM        = 3, /* bottom field only */V4L2_FIELD_INTERLACED    = 4, /* both fields interlaced */V4L2_FIELD_SEQ_TB        = 5, /* both fields sequential into one buffer, top-bottom order */V4L2_FIELD_SEQ_BT        = 6, /* same as above + bottom-top order */V4L2_FIELD_ALTERNATE     = 7, /* both fields alternating into separate buffers */V4L2_FIELD_INTERLACED_TB = 8, /* both fields interlaced, top field first and the top field is transmitted first */V4L2_FIELD_INTERLACED_BT = 9, /* both fields interlaced, top field  first and the bottom field is transmitted first */
};enum v4l2_buf_type {V4L2_BUF_TYPE_VIDEO_CAPTURE        = 1,V4L2_BUF_TYPE_VIDEO_OUTPUT         = 2,V4L2_BUF_TYPE_VIDEO_OVERLAY        = 3,V4L2_BUF_TYPE_VBI_CAPTURE          = 4,V4L2_BUF_TYPE_VBI_OUTPUT           = 5,V4L2_BUF_TYPE_SLICED_VBI_CAPTURE   = 6,V4L2_BUF_TYPE_SLICED_VBI_OUTPUT    = 7,V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY = 8,V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE = 9,V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE  = 10,V4L2_BUF_TYPE_SDR_CAPTURE          = 11,V4L2_BUF_TYPE_SDR_OUTPUT           = 12,V4L2_BUF_TYPE_META_CAPTURE         = 13,V4L2_BUF_TYPE_META_OUTPUT	   = 14,/* Deprecated, do not use */V4L2_BUF_TYPE_PRIVATE              = 0x80,
};enum v4l2_memory {V4L2_MEMORY_MMAP             = 1,V4L2_MEMORY_USERPTR          = 2,V4L2_MEMORY_OVERLAY          = 3,V4L2_MEMORY_DMABUF           = 4,
};struct v4l2_capability {__u8	driver[16];__u8	card[32];__u8	bus_info[32];__u32   version;__u32	capabilities;__u32	device_caps;__u32	reserved[3];
};
struct v4l2_pix_format {__u32			width;__u32			height;__u32			pixelformat;__u32			field;		/* enum v4l2_field */__u32			bytesperline;	/* for padding, zero if unused */__u32			sizeimage;__u32			colorspace;	/* enum v4l2_colorspace */__u32			priv;		/* private data, depends on pixelformat */__u32			flags;		/* format flags (V4L2_PIX_FMT_FLAG_*) */union {/* enum v4l2_ycbcr_encoding */__u32			ycbcr_enc;/* enum v4l2_hsv_encoding */__u32			hsv_enc;};__u32			quantization;	/* enum v4l2_quantization */__u32			xfer_func;	/* enum v4l2_xfer_func */
};
/* RGB formats */
#define V4L2_PIX_FMT_RGB332  v4l2_fourcc('R', 'G', 'B', '1') /*  8  RGB-3-3-2     */
#define V4L2_PIX_FMT_RGB444  v4l2_fourcc('R', '4', '4', '4') /* 16  xxxxrrrr ggggbbbb */
#define V4L2_PIX_FMT_ARGB444 v4l2_fourcc('A', 'R', '1', '2') /* 16  aaaarrrr ggggbbbb */
#define V4L2_PIX_FMT_XRGB444 v4l2_fourcc('X', 'R', '1', '2') /* 16  xxxxrrrr ggggbbbb */
#define V4L2_PIX_FMT_RGBA444 v4l2_fourcc('R', 'A', '1', '2') /* 16  rrrrgggg bbbbaaaa */
#define V4L2_PIX_FMT_RGBX444 v4l2_fourcc('R', 'X', '1', '2') /* 16  rrrrgggg bbbbxxxx */
#define V4L2_PIX_FMT_ABGR444 v4l2_fourcc('A', 'B', '1', '2') /* 16  aaaabbbb ggggrrrr */
#define V4L2_PIX_FMT_XBGR444 v4l2_fourcc('X', 'B', '1', '2') /* 16  xxxxbbbb ggggrrrr */struct v4l2_fmtdesc {__u32		    index;             /* Format number      */__u32		    type;              /* enum v4l2_buf_type */__u32               flags;__u8		    description[32];   /* Description string */__u32		    pixelformat;       /* Format fourcc      */__u32		    reserved[4];
};
struct v4l2_plane {__u32			bytesused;__u32			length;union {__u32		mem_offset;unsigned long	userptr;__s32		fd;} m;__u32			data_offset;__u32			reserved[11];
};
struct v4l2_buffer {__u32			index;__u32			type;__u32			bytesused;__u32			flags;__u32			field;struct timeval		timestamp;struct v4l2_timecode	timecode;__u32			sequence;/* memory location */__u32			memory;union {__u32           offset;unsigned long   userptr;struct v4l2_plane *planes;__s32		fd;} m;__u32			length;__u32			reserved2;union {__s32		request_fd;__u32		reserved;};
};
struct v4l2_output {__u32	     index;		/*  Which output */__u8	     name[32];		/*  Label */__u32	     type;		/*  Type of output */__u32	     audioset;		/*  Associated audios (bitfield) */__u32	     modulator;         /*  Associated modulator */v4l2_std_id  std;__u32	     capabilities;__u32	     reserved[3];
};#define VIDIOC_QUERYCAP		 _IOR('V',  0, struct v4l2_capability)
#define VIDIOC_ENUM_FMT         _IOWR('V',  2, struct v4l2_fmtdesc)
#define VIDIOC_G_FMT		_IOWR('V',  4, struct v4l2_format)
#define VIDIOC_S_FMT		_IOWR('V',  5, struct v4l2_format)
#define VIDIOC_REQBUFS		_IOWR('V',  8, struct v4l2_requestbuffers)
#define VIDIOC_QUERYBUF		_IOWR('V',  9, struct v4l2_buffer)
#define VIDIOC_G_FBUF		 _IOR('V', 10, struct v4l2_framebuffer)

http://chatgpt.dhexx.cn/article/GYLyKayZ.shtml

相关文章

V4L2框架学习

V4L2框架 0 查看videodev2 0.1 头文件/usr/include/linux/videodev2.h 0.2 使用ioctl函数 使用ioctl函数 // 添加头文件 #include <unistd.h> #include <sys/ioctl.h> #include <linux/videodev2.h>int ioctl (int __fd, unsigned long int __request, ...…

V4L2介绍

V4L2介绍 V4L2介绍主要功能框架v4L2编程 V4L2介绍 V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。在Linux中&#xff0c;视频设备是设备文件&#xff0c;可以像访问普通文件一样对其进行读写&#xff0c;摄像头在/dev/video*下&#xff0c;如果只有一个视频…

linux V4L2子系统——v4l2架构(7)之V4L2应用编程

linux V4L2子系统——v4l2架构&#xff08;7&#xff09;之V4L2应用编程 备注&#xff1a;   1. Kernel版本&#xff1a;5.4   2. 使用工具&#xff1a;Source Insight 4.0   3. 参考博客&#xff1a; &#xff08;1&#xff09;Linux V4L2子系统-应用层访问video设备&a…

[2022.8.15]v4l2-ctl基本使用方法

v4l2-ctl使用帮助可以参考&#xff1a;https://www.mankier.com/1/v4l2-ctl 1 v4l2-ctl --list-devices 列出所有设备 USB 2.0 Camera: USB Camera (usb-0000:00:14.0-9):/dev/video0/dev/video1 一个USB camera对应两个设备&#xff1a;一个是图像/视频采集&#xff0c;一…

V4L2应用层分析

V4L2应用层分析 一、总述二、例子 一、总述 V4L2&#xff0c;即Video for Linux 2&#xff0c;是第二代为Linux打造的音频、视频驱动。相比第一代V4L&#xff0c;V4L2支持更多的设备&#xff0c;同时更加稳定。现今的视频设备&#xff0c;如USB摄像头&#xff0c;基本都支持V4…

v4l2数据结构分析

v4l2数据结构分析 文章目录 v4l2数据结构分析Video4Linux2设备v4l2_device媒体设备media_deviceVideo4Linux2子设备v4l2_subdevVideo4Linux2子设备的操作集v4l2_subdev_opsVideo4Linux2子设备的内部操作集v4l2_subdev_internal_opsVideo4Linux2控制处理器v4l2_ctrl_handlerVide…

摄像头V4L2编程应用开发

1.V4L2简介 Video for Linux two(Video4Linux2)简称V4L2&#xff0c;是V4L的改进版。V4L2是linux系统操作系统下一套用于采集图片、视频、和音视频数据的通用API接口&#xff0c;配合适当的视频采集设备和相应的驱动程序&#xff0c;可以实现图片、视频、音频等的采集。 在linu…

V4L2框架

前言 在分析v4l2之前最好具有的知识&#xff1a; 1.字符设备,因为v4l2是被枚举为字符设备。 2.内存分配和映射,比如相关数据结构的分配和buffer。 3.DMA&#xff0c;因为v4l2的数据传输用到了DMA。 4.I2C&#xff0c;因为很多传感器都是用的i2c接口。 5.文件系统的基本操作&am…

V4L2系列 之 V4L2驱动框架

目录 前言一、V4L2驱动框架概览1、应用层 -》中间层-》驱动层2、主要代码文件(Linux 4.19版本内核) 二、怎么写V4L2驱动1、如何写一个设备的驱动&#xff1f;2、Video设备主要结构体3、怎么写V4L2驱动 三、V4L2的调试工具1、v4l2-ctl2、dev_debug3、v4l2-compliance 前言 本篇文…

V4L2框架概述

原文链接 本文开启 linux 内核 V4L2 框架部分的学习之旅&#xff0c;本文仅先对 V4L2 的框架做一个综述性的概括介绍&#xff0c;然后接下来的文章中会对 V4L2 框架的各个子模块进行一个全面的介绍&#xff0c;包括每一部分的实现原理&#xff0c;如何使用&#xff0c;用在什么…

V4l2框架分析

Table of Contents 1.V4L2框架概述 1.1 v4l2设备应用层流程 1.2 内核V4L2模块 1.2.1 video_device 1.2.2 v4l2_subdev 1.2.3 videobuf2 2. video_device结构体 2.1 图像处理模块 2.2 video_device处理流程 2.2.1 video_device 结构体成员介绍: 3. video_buf2 3.1 …

V4L2

V4L2(video 4 linux 2) V4L2有一段历史了。大约在1998的秋天&#xff0c;它的光芒第一次出现在Bill Dirks 的眼中。经过长足的发展&#xff0c;它于2002年11 月&#xff0c;发布2.5.46 时&#xff0c;融入了内核主干之中。然而直到今天&#xff0c;仍有一部分内核驱不支持新的A…

V4L2简介

http://work-blog.readthedocs.org/en/latest/v4l2%20intro.html 第一章 V4L2简介 1.1、什么是v4l2 V4L2&#xff08;Video4Linux的缩写&#xff09;是Linux下关于视频采集相关设备的驱动框架&#xff0c;为驱动和应用程序提供了一套统一的接口规范。 V4L2支持的设备十分广泛&…

我们一起学linux之V4L2摄像头应用流程

一、概述 Video for Linuxtwo(Video4Linux2)简称V4L2&#xff0c;是V4L的改进版。V4L2是linux操作系统下用于采集图片、视频和音频数据的API接口&#xff0c;配合适当的视频采集设备和相应的驱动程序&#xff0c;可以实现图片、视频、音频等的采集。在远程会议、可视电话、视频…

深入学习Linux摄像头(一)v4l2应用编程

深入学习Linux摄像头&#xff08;一&#xff09;v4l2应用编程 一、什么是v4l2 二、v4l2 API介绍 2.1 Querying Capabilities 2.2 Application Priority 2.3 Device Inputs and Outputs 2.4 Video Standards 2.5 Camera Control Reference 2.6 Image Format 2.7 Cropping, compo…

V4L2驱动框架详解

1. V4L2框架概述 1.1 v4l2设备应用层流程 1.2 内核V4L2模块 2 2. video_device 2.1图像处理模块 2.2 video注册流程 3. videobuf2 3.1 与video device的关系: 3.2 buffer类型 3.3 vb2_ops回调函数 3.4 mmap 流程 4. Subdev 4.1 概念 4.2 subdev注册流程 5. media fra…

html背景自动适应,css背景图片如何自适应?

css可以使用background-size属性设置背景图片自适应&#xff0c;为背景图片设置background-size:cover;样式即可使背景图片自适应。 css可以使用background-size属性设置背景图片自适应。background-size属性规定背景图像的尺寸。 background-size属性&#xff1a; 语法&#x…

css实现图片自适应容器的几种方式

css实现图片自适应容器 经常有这样一个场景,需要让图片自适应容器的大小。 1、img标签的方式 我们马上就能想到,把width、height 设置为100%啊。来看一哈效果。 <div class=div1><img src="./peiqi.png" alt=""> </div>.div1 {widt…

css 背景图片自适应属性整理

本篇博客主要记录一些使用 css 对背景图片自适应的操作整合 背景图片取消重复 background-image: url(image.jpg); background-repeat:no-repeat;修改前 修改后 背景图片固定&#xff08;不会随着内容滚动而改变位置&#xff09; background-image: url(image.jpg); back…