V4L2框架

article/2025/9/29 17:16:25

前言

在分析v4l2之前最好具有的知识:
1.字符设备,因为v4l2是被枚举为字符设备。
2.内存分配和映射,比如相关数据结构的分配和buffer。
3.DMA,因为v4l2的数据传输用到了DMA。
4.I2C,因为很多传感器都是用的i2c接口。
5.文件系统的基本操作,比如open(),ioctl()
6.设备树,因为子设备的异步注册就是靠设备树的的信息来实现的。

框架

在这里插入图片描述
怎么看这个图?
这个图包含了2个部分:输入和输出,可以先只看输入设备。视频设备会以字符设备cdev的形式呈现,v4l2_device是整个v4l2的核心以及管理者,video_device不是一个instance,而是一个融合数据结构,它包含有cdev和v4l2_device数据结构并将他们关联起来,video_register_device()函数来实现的。

说明

v4l2总体可以分为2层:用户层和驱动层。它们各自有对应的操作函数,最终也是通过系统调用联系起来的。
应用层包含哪些操作呢?
v4l2_capture.c这是一个简单的应用层例子,包含了v4l2的一些基本操作。比如一般的操作步骤:

	struct v4l2_capability cap;if (-1 == xioctl (fd, VIDIOC_QUERYCAP, &cap)) {if (EINVAL == errno) {fprintf (stderr, "%s is no V4L2 device\n",	dev_name);exit (EXIT_FAILURE);} else {errno_exit ("VIDIOC_QUERYCAP");}}
	struct v4l2_input input;memset(&input, 0, sizeof(struct v4l2_input));input.index = 0;int rtn = ioctl(fd, VIDIOC_S_INPUT, &input);if (rtn < 0) {printf("VIDIOC_S_INPUT:rtn(%d)\n", rtn);}

需要说明的是,这些只是v4l2功能的中的一小部分,还有其它的很多操作。
而这些操作在驱动中都有对应的实现函数。

驱动层包含哪些操作呢?
举例ov5640.c的实现,这个是一个具体的实例,也是一个现实的具体应用。但作为一个linux工程师只实现部分代码还是不够的,我们需要更加深入的了解V4L2底层。那么就会涉及到/drivers/media目录各种代码。其中/drivers/media/i2c/ov5640.c就是我们前面提到的代码。/drivers/media/v4l2-core中的代码就是整个v4l2的核心实现代码。

tree
├── Kconfig
├── Makefile
├── tuner-core.c		//里面主要的函数都是通过struct v4l2_subdev *sd来分别进行控制的。
├── v4l2-async.c		//异步注册操作
├── v4l2-clk.c
├── v4l2-common.c
├── v4l2-compat-ioctl32.c
├── v4l2-ctrls.c		//控制相关的亮度等
├── v4l2-dev.c			//主要作用申请字符主设备号、注册class和提供video device注册注销等相关函数;
├── v4l2-device.c		//设备相关对应于驱动
├── v4l2-dv-timings.c
├── v4l2-event.c		//导出到用户空间的事件
├── v4l2-fh.c			//文件访问控制
├── v4l2-flash-led-class.c
├── v4l2-fwnode.c		//fw:fireware固件处理相关函数。
├── v4l2-ioctl.c		//子设备控制->层级调用
├── v4l2-mc.c
├── v4l2-mem2mem.c
├── v4l2-subdev.c		//子设备实例
├── v4l2-trace.c
├── videobuf2-core.c
├── videobuf2-dma-contig.c	//物理地址连续(虚拟地址不关心)
├── videobuf2-dma-sg.c		//虚拟地址以及物理地址上都非连续内存
├── videobuf2-dvb.c
├── videobuf2-memops.c
├── videobuf2-v4l2.c
├── videobuf2-vmalloc.c		//虚拟地址连续,物理地址分散

可以看到这部分还是有很多的内容。还需要补充的是v4l2需要实现和平台现关的代码,比如NXP的/drivers/media/platform/mxc 、
三星的/drivers/media/platform/exynos4-is等。比如hdmi、capture、output、overlay、mipi等功能的实现。总之,v4l2的底层驱动还是比较复杂的。子设备的异步注册、V4L2 Controls等都有自己的实现方式。

核心代码

v4L2的核心源码位于drivers/media/v4l2-core,根据功能可以划分为四类:

  • 字符设备模块:由v4l2-dev.c实现,主要作用申请字符主设备号、注册class和提供video device注册注销等相关函数;
  • V4L2基础框架:由v4l2-device.c、v4l2-subdev.c、v4l2-fh.c、v4l2-ctrls.c等文件构建V4L2基础框架;
  • videobuf管理:由videobuf2-core.c、videobuf2-dma-contig.c、videobuf2-dma-sg.c、videobuf2-memops.c、videobuf2-vmalloc.c、v4l2-mem2mem.c等文件实现,完成videobuffer的分配、管理和注销;
  • ioctl框架:由v4l2-ioctl.c文件实现,构建V4L2的ioctl控制框架。

官方文档参考:

https://www.kernel.org/doc/html/v4.15/media/uapi/v4l/v4l2.html
https://www.kernel.org/doc/html/v4.15/media/kapi/v4l2-core.html
ioctl相关操作:
https://www.kernel.org/doc/html/v4.14/media/uapi/v4l/user-func.html
capture:
https://www.kernel.org/doc/html/v4.14/media/uapi/v4l/capture.c.html
v4l2grab:
https://www.kernel.org/doc/html/v4.14/media/uapi/v4l/v4l2grab.c.html

相关内容阅读

链接: V4L2框架
链接: V4L2之设备注册
链接: V4L2之mmap()函数
链接: V4L2之events
链接: V4L2之buffer分配和映射


http://chatgpt.dhexx.cn/article/5sScS3ZY.shtml

相关文章

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…

CSS实现图片自适应布局

CSS实现图片自适应布局 最轻松的写法 <div class"container">// 这里图片尺寸为440X440像素&#xff0c;<img src"./images/medium.jpg" alt"test"> </div><style>.container {width: 600px;height: 600px;border: 1p…

CSS图片自适应框架

CSS图片自适应框架 使用img来设置 <!DOCTYPE html> <html><style>body{margin: 0;padding: 10px;}#a_1{display: block;width: 100px;height: 50px;overflow: hidden;padding: 10px;border: dashed;margin: 10px;}#a_1img{width: 100%;height: 100%;}</s…

css之实现图片自适应

文章目录 一、position实现图片自适应二、padding补偿法三、图片以正方形显示 原图如下&#xff1a; 在开发中&#xff0c;想在固定的高度和宽度中显示不一样的图片时&#xff0c;就会出现压缩&#xff0c;导致图片最后显示不好看&#xff0c;以下提供几种方法进行调整&#xf…

css实现图片自适应缩放的两种方法

想要实现图片根据给定宽高来自适应缩放的时候&#xff0c;会想到什么属性&#xff1f;是object-fit: cover;吗&#xff1f; 来试一试&#xff01;为了展示效果&#xff0c;我特地选了对称的图片。下面两个img元素都有一个div包裹&#xff0c;div设置固定宽高&#xff0c;第一个…

3种CSS实现背景图片全屏铺满自适应的方式

来源 | https://www.fly63.com/ 一张清晰漂亮的背景图片能给网页加分不少&#xff0c;设计师也经常会给页面的背景使用大图&#xff0c;我们既不想图片因为不同分辨率图片变形&#xff0c;也不希望当在大屏的情况下&#xff0c;背景有一块露白&#xff0c;简而言之&#xff0c;…

css怎么设置背景图片自适应大小

在css中&#xff0c;可以利用“background-size”属性设置背景图片自适应大小&#xff0c;该属性用于设置背景图片的大小&#xff0c;只需要给背景图片元素添加“background-size:cover;”样式&#xff0c;即可使背景图片的大小自适应。 本教程操作环境&#xff1a;windows10系…

CSS——图片自适应宽高

宽度拉伸&#xff1a;把width设置成100%&#xff0c;height设置auto 高度拉伸&#xff1a;把height设置成100%&#xff0c;width设置auto ​ <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv&…

使用CSS进行图片自适应的两个方法

1.object-fit 属性 设置好图片的宽高&#xff0c;然后设置object-fit属性为contain就是常见的图片自适应效果。 img {width: 400px;height: 400px;object-fit: contain;} object-fit: fill|contain|cover|scale-down|none|initial|inherit; 2.background 我们把图片作为背景…

css实现一个图片自适应,图片不会变形。

第一种&#xff0c;图片填充满容器 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" conten…