V4L2 驱动架构介绍

V4L2 简介

        Video for Linux two(Video4Linux2)简称 V4L2,是 V4L 的改进版。V4L2 是 linux操作系统下用于视频和音频数据采集设备的驱动框架,为驱动和应用程序提供了一套统一的接口规范。

        在 Linux 下,所有外设都被看成一种特殊的文件,成为“设备文件”,可以象访问普通文件一样对其进行读写。采用 V4L2 驱动的摄像头设备文是/dev/videoX以及一些子设备/dev/v4l-subdevX。V4L2 支持两种方式来采集图像:内存映射方式(mmap)和直接读取方式(read)。应用层通过 open/ioctl/close 等函数来操作V4L2 设备文件的方式控制 camera 设备。

V4L2 支持的设备:

  1. Video capture device : 从摄像头等设备上获取视频数据。对很多人来讲,video capture 是 V4L2 的基本应用。设备名称为/dev/video,主设备号 81,子设备号 0~63
  2. Video output device : 将视频数据编码为模拟信号输出。与 video capture 设备名相同。
  3. Video overlay device : 将同步锁相视频数据(如 TV)转换为 VGA 信号,或者将抓取的视频数据直接存放到视频卡的显存中。
  4. Video output overlay device :也被称为 OSD(On-Screen Display)
  5. VBI device : 提供对 VBI(Vertical Blanking Interval)数据的控制,发送 VBI 数据或抓取 VBI 数据。设备名/dev/vbi0~vbi31,主设备号 81,子设备号 224~255
  6. Radio device : FM/AM 发送和接收设备。设备名/dev/radio0~radio63,主设备号81,子设备号 64~127

V4L2 架构总览

总体架构图

CRM 根设备

CRM 即 camera request manager,创建了 V4L2 根设备/dev/video0,供所有子设备注册。

V4L2 子设备

每个子设备实现特定功能,如音视频混合,编解码等。对于 camera,有如下子设备:

SENSOR, IFE, ICP, LRME, JPEG, FD, CPAS, CSIPHY, ACTUATOR, CCI, FLASH,EEPROM, OIS 等。

通过设备文件/dev/v4l-subdevX 供应用层(CSL)调用其功能。

V4L2 驱动层实现

V4L2 驱动架构

几个重要的结构体

  1. video_device:保存 V4L2 的 device node 数据。
  2. v4l2_device:表示一个 v4l2 设备,各个子设备都挂在这个结构体里面。
  3. v4l2_subdev:每个子设备都有一个实例。

Kernel V4l2 的文档:
https://www.kernel.org/doc/html/v4.9/media/kapi/v4l2-core.html

驱动主要实现的功能

  1. 具体硬件的控制代码
  2. 实现 V4L2 架构相关结构体与函数
  3. 将代码(结构体与函数)与 V4L2 框架绑定

要实现的主要结构体

struct video_device

主要的任务就是负责向内核注册字符设备。

此结构体既可以动态分配,也可以嵌入到一个更大的结构体中。

动态分配方法如下:

struct video_device *vdev = video_device_alloc();
if (vdev == NULL)return -ENOMEM;
vdev->release = video_device_release;

也可嵌入到一个大结构体中,此时要实现 release()回调:

struct video_device *vdev = &my_vdev->vdev;
vdev->release = my_vdev_release;

设置结构体主要域:

  1. v4l2_dev: 设置为 v4l2_device 父设备。
  2. name: 设置为唯一的描述性设备名。
  3. fops: 设置为已有的 v4l2_file_operations 结构体。实现文件操作。设置 .unlocked_ioctl 指向 video_ioctl2。请勿使用 .ioctl!它已被废弃。
  4. ioctl_ops: 一般设为 v4l2_ioctl_ops 来简化 ioctl 的维护。
  5. lock: 如果你要在驱动中实现所有的锁操作,则设为 NULL 。否则就要设置一个指向 struct mutex_lock 结构体的指针,这个锁将在 unlocked_ioctl 文件操作被调用前由内核获得,并在调用返回后释放。详见下一节。
  6. prio: 保持对优先级的跟踪。用于实现 VIDIOC_G/S_PRIORITY。如果设置为 NULL,则会使用 v4l2_device 中的 v4l2_prio_state 结构体。如果要对每个设备节点(组)实现独立的优先级,可以将其指向自己实现的 v4l2_prio_state 结构体。

注册视频设备:

err = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
if (err) {video_device_release(vdev); /* or kfree(my_vdev); */return err;
}

这个操作会创建一个字符设备

注销设备:

video_unregister_device(vdev);

这个操作将从 sysfs 中移除设备节点(导致 udev 将其从 /dev 中移除)。

struct v4l2_device

struct v4l2_device:一个硬件设备可能包含多个子设备,比如 camera 包含 sensor 设备,actuator 设备,flash 设备等。而 v4l2_device 就是所有这些设备的根节点,负责管理所有的子设备。

简单设备可以仅分配这个结构体,但在大多数情况下,都会将这个结构体嵌入到一个更大的结构体中。

注册这个设备实例:

v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev);

注销 v4l2_device 使用如下函数:

v4l2_device_unregister(struct v4l2_device *v4l2_dev);

struct v4l2_subdev

struct v4l2_subdev:子设备,负责实现具体的功能。

子设备驱动可使用如下函数初始化 v4l2_subdev 结构体:

v4l2_subdev_init(sd, &ops);

向 v4l2_device 注册 v4l2_subdev:

int err = v4l2_device_register_subdev(v4l2_dev, sd);

注销子设备则可用如下函数:

v4l2_device_unregister_subdev(sd);

此后,子设备模块就可卸载,且 sd->dev == NULL。

要实现的主要函数

video_device->v4l2_file_operations

实现文件类操作,比如 open,close,read,write,mmap 等。但是 ioctl 是不需要实现的,一般都是用 video_ioctl2 代替。

                .unlocked_ioctl = video_ioctl2,

video_device->v4l2_ioctl_ops

V4L2 导出给应用层使用的所有 ioctl。只要实现需要用的,如:

v4l2_subdev->v4l2_subdev_ops 及其子函数:

        必须实现的:

                v4l2_subdev_core_ops     

        其它可按需选择,如: 

                v4l2_subdev_video_ops  

             

  

V4L2 应用层实现                       

V4L2 是一个字符设备,通过设备文件向应用层提供各种功能。应用层可以像操作普通文件一样 open/close V4L2 设备文件,而 V4L2 的大部分功能都是通过设备文件的 ioctl 导出的。

IOCTL 命令分类

功能查询相关

优先级相关

视频捕获相关

TV 视频相关

输入输出相关

控制相关

杂项

V4l2 设备的基本操作流程

  1. 打开并获取设备属性
  2. 设置帧格式
  3. 设置帧缓冲
  4. 开始进行视频流采集
  5. 停止采集关闭设备

高通平台 V4L2 架构实现

驱动层实现

驱动对应用层提供的设备节点,V4L2 相关设备文件:

其中部分子设备类型如下:

//未完待续...

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

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

相关文章

freertos简介与移植

freertos是一个可裁剪的小型rtos系统,特点: 支持抢占式,合作式和时间片调度saferos衍生自freertos,更完整提供了一个用于低功耗的tickless模式系统的组件在创建时可以选择动态或者静态的ram,例如任务,消息…

MARS: An Instance-aware, Modular and Realistic Simulator for Autonomous Driving

● MARS: An Instance-aware, Modular and Realistic Simulator for Autonomous Driving(基于神经辐射场的自动驾驶仿真器) ● https://github.com/OPEN-AIR-SUN/mars ● https://arxiv.org/pdf/2307.15058.pdf ● https://mp.weixin.qq.com/s/6Ion_DZGJ…

【新版】系统架构设计师 - 层次式架构设计理论与实践

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 层次式架构设计理论与实践考点摘要层次式体系结构概述表现层框架设计MVC模式MVP模式MVVM模式使用XML设计表现层表现层中UIP设计思想 中间层架构设计业务逻辑层工作流设计业务逻辑层设计 数据访问层…

代码随想录算法训练营第五十一天 |309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费、总结

一、309.最佳买卖股票时机含冷冻期 题目链接/文章讲解:代码随想录 视频讲解:动态规划来决定最佳时机,这次有冷冻期!| LeetCode:309.买卖股票的最佳时机含冷冻期_哔哩哔哩_bilibili 思考: 1.确定dp数组&…

MySQL SQL性能分析(SQL优化 一)

在开发和维护数据库应用程序时,优化SQL查询的性能是至关重要的。MySQL提供了一些强大的工具和技术,帮助我们进行SQL性能分析,找出潜在的瓶颈并进行相应的优化。 查看SQL的执行频率 show [ session| global ] status 命令查看服务器状态信息…

Android Live Edit 给 Android开发者带来的福音

Android Live Edit 是一个允许开发者实时更新模拟器和物理设备中的可组合内容的功能。 微信公众号【biglead】的每日提醒 随时随记 每日积累 此功能最大限度地减少了编写和构建应用程序之间的上下文切换,让开发者专注于编写代码更长时间而不会中断。 在AndroidStu…

【VIM】VIm初步使用

玩转Vim-从放弃到入门_哔哩哔哩_bilibili

传输层协议—UDP协议

传输层协议—UDP协议 文章目录 传输层协议—UDP协议传输层再谈端口号端口号范围划分pidofnetstat UDP协议端格式UDP报文UDP特点UDP缓冲区基于UDP的应用层协议 传输层 在学习HTTP/HTTPS等应用层协议时,为了方便理解,可以简单认为HTTP将请求和响应直接发送…

643. 子数组最大平均数I(滑动窗口)

目录 一、题目 二、代码 一、题目 643. 子数组最大平均数 I - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:double findMaxAverage(vector<int>& nums, int k) {double Average INT_MIN;double sum nums[0];int left 0, right 0…

oracle-使用PLSQL工具自行修改用户密码

1、使用PLSQL工具&#xff0c;输入用户名和原密码登录&#xff0c;如下图 2、登录后&#xff0c;在会话下拉菜单中找到”Change password..” 3、在跳出的窗口中配置新密码&#xff0c;修改完成后单击”确认”&#xff0c;后退出PLSQL 4、重新打开PLSQL&#xff0c;使用新密码登…

竞赛 机器学习股票大数据量化分析与预测系统 - python 竞赛

文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 机器学习股票大数据量化分析与预测系统 该项目较为新颖&am…

Vue3 引入使用 vant组件详解

目录 Vue3 引入使用 vant组件详解1.安装2.引入2.1 全局引入2.2 按需引入2.2.1 vite项目:vite.config.js2.2.2 Webpack项目&#xff1a;webpack.config.js2.2.3 配置在vue.config.js中 3.使用 Vue3 引入使用 vant组件详解 Vant是一个强大的移动端组件库&#xff0c;目前Vant 官…

Android stdio的Gradle菜单栏无内容问题的解决方法

右边Gradle菜单栏里没有Tasks选项内容的问题 正常情况↓ 如果这个问题如果无法解决的话&#xff0c;Gradle打包就只能通过控制台输入命令来解决&#xff0c;但这无疑是把简单问题复杂化了&#xff0c;我们来看看怎么解决这个问题吧。 这里有几个方法提供&#xff0c;可以自行选…

网络-Ajax

文章目录 前言一、Ajax优点&#xff1a;缺点&#xff1a; 二、使用步骤XNLHttpRequest对象完整代码 总结 前言 本文主要记录Ajax技术的简介&#xff0c;以及用法。 一、Ajax Ajax是一组用于在Web浏览器和Web服务器之间进行异步通信的Web开发技术。 它代表着Asynchronous Java…

RocketMQ Dashboard说解

RocketMQ Dashboard 是 RocketMQ 的管控利器&#xff0c;为用户提供客户端和应用程序的各种事件、性能的统计信息&#xff0c;支持以可视化工具代替 Topic 配置、Broker 管理等命令行操作。 介绍​ 功能概览​ 面板功能运维修改nameserver 地址; 选用 VIPChannel驾驶舱查看 …

MeterSphere v2.10.X-lts 双节点HA部署方案

一、MeterSphere高可用部署架构及服务器配置 1.1 服务器信息 序号应用名称操作系统要求配置要求描述1负载均衡器CentOS 7.X /RedHat 7.X2C,4G&#xff0c;200GB部署Nginx&#xff0c;实现负载路由。 部署NFS服务器。2MeterSphere应用节点1CentOS 7.X /RedHat 7.X8C,16GB,200G…

【算法】动态规划

文章目录 概述背包问题01背包问题&#xff1a;代码示例部分背包代码示例 完全背包代码示例 多重背包代码示例 总结提升 概述 动态规划&#xff08;Dynamic Programming&#xff09;是一种通过将问题划分为相互重叠的子问题来解决问题的算法思想。其核心思想是通过保存已经计算…

【数据结构】AVL树(C++实现)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【数据…

c#设计模式-结构型模式 之 享元模式

&#x1f680;简介 享元模式&#xff08;Flyweight Pattern&#xff09;是一种用于性能优化的模式&#xff0c;其核心是运用共享技术来有效支持大量细粒度的对象。享元模式可以避免大量非常相似类的开销。在程序设计中&#xff0c;有时需要生成大量细粒度的类实例来表示数据。…

打开泰坦陨落2找不到msvcp120.dll无法执行代码/msvcr120.dll丢失修复方法

msvcp120.dll 是 Windows 操作系统中的一个动态链接库文件&#xff0c;对于许多程序和游戏的运行起着至关重要的作用。然而&#xff0c;有时候我们可能会遇到 msvcp120.dll 丢失的情况&#xff0c;导致电脑出现各种问题。本文将详细介绍 msvcp120.dll 丢失的四种解决方法&#…