linux V4L2子系统——v4l2架构(1)之整体架构

news2024/9/25 1:20:58

概述


V4L(Video for Linux)是Linux内核中关于视频设备的API接口,涉及视频设备的音频和视频信息采集及处理、视频设备的控制。V4L出现于Linux内核2.1版本,经过修改bug和添加功能,Linux内核2.5版本推出了V4L2(Video for Linux Two)子系统,功能更多且更稳定。V4L2的主设备号是81,次设备号范围0~255,这些次设备号又分为多类设备,如视频设备(次设备号范围0-63)、Radio(收音机)设备(次设备号范围64-127)、Teletext设备(次设备号范围192-223)、VBI设备(次设备号范围224-255)。

V4L2设备对应的设备节点有/dev/videoX、/dev/vbiX、/dev/radioX。这里只讨论视频设备,视频设备对应的设备节点是/dev/videoX。视频设备以高频头或Camera为输入源,Linux内核驱动该类设备,接收相应的视频信息并处理。

Linux系统中视频输入设备主要包括以下四个部分:

字符设备驱动程序核心:V4L2本身就是一个字符设备,具有字符设备所有的特性,暴露接口给用户空间。
V4L2 驱动核心:主要是构建一个内核中标准视频设备驱动的框架,为视频操作提供统一的接口函数。
平台V4L2设备驱动:在V4L2框架下,根据平台自身的特性实现与平台相关的V4L2驱动部分,包括注册video_device和v4l2_dev。
具体的sensor驱动:主要上电、提供工作时钟、视频图像裁剪、流IO开启等,实现各种设备控制方法供上层调用并注册v4l2_subdev。


videoX字符设备框架


熟悉v4l2用户空间编程的都知道, v4l2编程主要是调用一系列的ioctl函数去对v4l2设备进行打开, 关闭, 查询, 设置等操作. v4l2设备是一个字符设备, 而且其驱动的主要工作就是实现各种各样的ioctl.v4l2的整体框架如下图所示:

在这里插入图片描述

 

下图中芯片模块对应Soc的各个子模块,video_device结构体主要用来控制Soc的video模块,v4l2_device会包含多个v4l2_subdev, 每个v4l2_subdev用来控制各自的子模块,某些驱动不需要v4l2_subdev,依靠video模块就能实现功能。

Linux系统上的Video设备多种多样,如通过Camera Host控制器接口连接的摄像头,通过USB总线连接的摄像头等。为了兼容更多的硬件,Linux内核抽象了V4L2(Video for Linux Two)子系统。V4L2子系统是Linux内核中关于Video(视频)设备的API接口,是V4L(Video for Linux)子系统的升级版本。V4L2子系统向上为虚拟文件系统提供了统一的接口,应用程序可通过虚拟文件系统访问Video设备。V4L2子系统向下给Video设备提供接口,同时管理所有Video设备。Video设备又分为主设备和从设备,对于Camera来说,Camera Host控制器为主设备,负责图像数据的接收和传输,从设备为Camera Sensor,一般为I2C接口,可通过从设备控制Camera采集图像的行为,如图像的大小、图像的FPS等。主设备可通过v4l2_subdev_call的宏调用从设备提供的方法,反过来从设备可以调用主设备的notify方法通知主设备某些事件发生了。

在这里插入图片描述

 

V4L2框架


结构体v4l2_device、video_device、v4l2_subdev和v4l2_fh是搭建框架的主要元素。

在这里插入图片描述

 

从上图可看出,V4L2框架是一个标准的树形结构,v4l2_device充当了父设备,通过链表把所有注册到其下的子设备管理起来,这些设备可以GRABBER、VBI或RADIO。

v4l2_device
这个是整个输入设备的总结构体,可以认为它是整个 V4L2 框架的入口,充当驱动的管理者以及入口监护人。由该结构体引申出来 v4l2_subdev。用于视频输入设备整体的管理,有多少输入设备就有多少个v4l2_device抽象(比如一个USB摄像头整体就可以看作是一个 V4L2 device)。再往下分是输入子设备,对应的是例如 ISP、CSI、MIPI 等设备,它们是从属于一个 V4L2 device 之下的。

v4l2_subdev
v4l2_subdev是子设备,v4l2_subdev结构体包含了对设备操作的ops和ctrls,这部分代码和硬件相关,需要根据硬件实现,像摄像头设备需要实现控制上下电、读取ID、饱和度、对比度和视频数据流打开关闭的接口函数。

video_device
video_device用于创建子设备节点,把操作设备的接口暴露给用户空间。

v4l2_fh
v4l2_fh是每个子设备的文件句柄,在打开设备节点文件设置,方便 上层索引到v4l2_ctrl_handler, v4l2_ctrl_handler管理设备的ctrls,这些ctrls(摄像头设备)包括调节饱和度、对比度和白平衡等。

V4L2 core介绍


概述


v4l2驱动代码在drivers\media\v4l2-core文件夹下,可根据字面意思来理解基本的功能。videobuf是实现视频的内存分配,对于 v4l 和 v4l2 分别对应不同的文件,如 videobuf-core 和 videobuf2-core, v4l2-dev、v4l2-device、v4l2-subdev分别对应video_device、v4l2_device、v4l2_subdev的实现,v4l2-ioctl实现ioctl等等。

drivers/media/v4l2-core
├── tuner-core.c
├── v4l2-async.c
├── v4l2-clk.c
├── v4l2-common.c
├── v4l2-compat-ioctl32.c
├── v4l2-ctrls.c
├── v4l2-dev.c
├── v4l2-device.c
├── v4l2-dv-timings.c
├── v4l2-event.c
├── v4l2-fh.c
├── v4l2-flash-led-class.c
├── v4l2-fwnode.c
├── v4l2-i2c.c
├── v4l2-ioctl.c
├── v4l2-mc.c
├── v4l2-mem2mem.c
├── v4l2-spi.c
├── v4l2-subdev.c
├── v4l2-trace.c
├── videobuf-core.c
├── videobuf-dma-contig.c
├── videobuf-dma-sg.c
└── videobuf-vmalloc.c



video驱动代码在driver/media目录下,下面分多个子目录,其中platform目录存放的是不同Soc的驱动代码,对应video_device; 其他大多子目录如:i2c、mmc、usb、tuners、radio等对应subdev的实现。

drivers/media/platform$ tree -L 1
.
├── am437x
├── aspeed-video.c
......
├── omap
├── omap3isp
├── pxa_camera.c
├── qcom
......
├── rockchip
......
├── seco-cec
├── sh_veu.c
├── sh_vou.c
├── sti
├── stm32
├── sunxi
......
└── xilinx



v4l2驱动框架最重要的是理解ioctl, 另外v4l2驱动框架最主要的是各个ioctl实现的功能,这些实现方式需要在实际操作中多加理解,不是难点。

v4l2核心源码v4l2-core分类

模块描述
核心模块由v4l2-dev.c实现,主要作用包括申请字符主设备号、注册class和提供video device注册注册等相关函数。
V4L2框架由v4l2-device.c、v4l2-subdev.c、v4l2-fh.c、v4l2-ctrls.c、v4l2-async.c、v4l2-fwnode.c、v4l2-i2c.c、v4l2-spi.c等文件实现,构建v4l2框架。
videobuf管理由videobuf2-core.c、videobuf2-dma-contig.c、videobuf-dma-sg.c、videobuf2-memops.c、videobuf2-vmalloc.c、v4l2-mem2mem.c等文件实现,完成videobuffer的分配、管理和注销。
ioctl框架由v4l2-ioctl.c、v4l2-compat-ioctl32.c 文件实现,构建v4l2_ioctl框架。

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

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

相关文章

【python】AttributeError: ‘DataFrame‘ object has no attribute ‘append‘

在使用pandas时出现这个问题,因为我复现的代码是很久之前发布的了,我用的pandas又是最新版本2.0.3,大概猜到是pandas版本出了问题,参考 (6条消息) 解决AttributeError: ‘DataFrame‘ object has no attribute ‘append‘_wang_j…

辅助驾驶功能开发-执行器篇(03)-Mobileye Control Requirements

1. 目的 本文描述了产品开发不同阶段(研发、验证和产品化)车辆集成的控制要求。 2. 控制接口要求 2.1 接口类型 控制模块与车辆之间的接口应基于CAN协议或Flexray协议。 2.2 通讯频率 控制模块与车辆之间的通讯频率应高于36Hz。通信频率优先选择为 50…

Spring高手之路11——BeanDefinition解密:构建和管理Spring Beans的基石

文章目录 1. 探索BeanDefinition1.1 官方文档对BeanDefinition的解读1.2 BeanDefinition关键方法剖析1.3 BeanDefinition部分方法的实际运用1.4 BeanDefinition深层信息结构梳理 2. BeanDefinition构造体系解析2.1 BeanDefinition的类型及其应用2.2 生成BeanDefinition的原理剖…

最全语言模型领域知识评估Benchmark——獬豸:包含了516门学科、13学科门类、240w条数据

论文链接:https://arxiv.org/abs/2306.05783 代码链接:https://github.com/MikeGu721/XiezhiBenchmark 复旦大学肖仰华团队——獬豸(Xiezhi)是一套针对语言模型(LM)的领域评估Benchmark。它由249587道多选…

linux下frp实现内网穿透

frp简介 frp是什么? frp采用Golang语言编写,支持跨平台,仅需下载对应平台的二进制文件即可执行,没有额外依赖。 frp是一个专注于内网穿透的高性能的反向代理应用,支持TCP,UDP,HTTP,HTTPS等多种协议。可以将…

Android开发之Fragment

Fragment可以看作一种灵活的子Activity,其依附于Activity运行。一个Activity下可以依附多个Fragment,从而实现一个页面多个窗口,而同一个Fragment也能被多个Activity复用,因此Fragment是Android开发中相当重要的板块。 文章目录 …

Docker-compose容器编排

Docker-Compose介绍 Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关…

Visual Studio 2022 程序员必须知道高效调试手段与技巧(中)

🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 📋 前言💬 调试的时候查看程序当前信息💭 查看临时变量的值💭 查…

实验报告-Sublime配置默认语法,以配置Verilog语法为例

实验报告-Sublime配置默认语法,以配置Verilog语法为例 1,下载Verilog语法环境2,Sublime配置语法工作环境,以Verilog语法环境为例。3,打开一个新的Sublime,验证编辑器配置Verilog为默认语法成功!4,Sublime汉化1,下载Verilog语法环境 参考文献: 1,Sublime Text 4加载…

29.Git版本控制工具

1.Git简介 Git是一开源的分布式版本控制系统,提供了存储代码、管理版本历史、分支和合并等功能。 版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。它的主要目的是跟踪和记录软件开发过程…

【2500. 删除每行中的最大值】

来源:力扣(LeetCode) 描述: 给你一个 m x n 大小的矩阵 grid ,由若干正整数组成。 执行下述操作,直到 grid 变为空矩阵: 从每一行删除值最大的元素。如果存在多个这样的值,删除其…

手把手教你写代码——基于控制台的通讯录管理系统(单表)

栏目介绍 本栏目专为入门java学习者设计的一些简单的入门项目 功能介绍 本项目为简单的基于控制台的通讯录管理系统,所需要的环境仅仅为jdk以及mysql(版本不限)!只有一个简单的eclipse软件以及我们的mysql可视化工具(视…

企业网关:打开商业大门的关键

企业网关:打开商业大门的关键 在当今数字化时代,企业网关的重要性变得越来越明显。作为连接企业内外的关键枢纽,企业网关不仅提供了安全可靠的网络连接,还为企业提供了更高效的业务运营和更好的客户体验。本文将深入探讨企业网关…

Vue-路由

一、目标 能够说出前端路由工作的过程能够知道如何在vue3中配置路由能够知道如何使用嵌套路由能够知道如何实现动态路由匹配能够知道如何使用编程式导航能够知道如何使用导航守卫 二、目录 前端路由的概念与原理vue-router的基本使用vue-router的高级用法后台管理案例 前端…

linux下的questasim安装和与vivado的关联

一、questasim安装 参考链接 IC验证工具:Ubuntu下Questasim10.7安装(64bit)全攻略 参考2 易特创芯 linux环境下questasim 10.7的安装总结_limanjihe的博客-CSDN博客 前面操作参照的第一个链接,后面激活文件参考的第二个 另外…

JavaScript 常用数组方法之数组扁平化「赶紧收藏」

一、什么是数组扁平化 数组扁平化,就是将一个复杂的嵌套多层的数组,一层一层的转化为层级较少或者只有一层的数组。 比如: // 多维数组 var arr [1,2,[3,4,5,[6,7,8],9],10,[11,12]]; // 数组扁平化 [1,2,3,4,5,6,7,8,9,10,11,12]二、实现…

关于在Python的for循环中改变列表的值问题探究

案例一: def test():a [1, 2]for i in a:print(i, id(a))if i 5:breaka [a[0]2, a[1]2] 输出: 1 4313456192 2 4313269056 解释: 在for循环语句中的变量a使用的内存地址为4313456192,这个地址以及存储的值不会因为a的重新赋…

ceph-mon运行原理分析

一、流程:ceph-deploy部署ceph-mon组建集群 1.ceph-deploy部署ceph-mon的工作流程及首次启动 1)通过命令创建ceph-mon,命令为:ceph-deploy create mon keyring def mon(args):if args.subcommand create:mon_create(args)elif…

【Jenkins系列】-Pipeline语法全集

Jenkins为您提供了两种开发Pipeline的方式:脚本式和声明式。 脚本式流水线(也称为“传统”流水线)基于Groovy作为其特定于域的语言。而声明式流水线提供了简化且更友好的语法,并带有用于定义它们的特定语句,而无需学习…

金融行业软件测试面试题及其答案

下面是一些常见的金融行业软件测试面试题及其答案: 1. 什么是金融行业软件测试? 金融行业软件测试是针对金融领域的软件系统进行验证和确认的过程,旨在确保软件在安全、稳定、可靠和符合法规要求的条件下运行。 2. 解释一下金融软件中的风险…