V4L2 Linux驱动简介(3)基本I/O原理

V4L2驱动框架详解 1.1 v4l2设备应用层流程1.2 内核V4L2模块 2。 阅读详情
       如果有人在video for linux API规范上花了我时间的话,他肯定已经注意到了一个问题,那就是V4L2大量使用了ioctl接口。视频硬件有大量的可操作旋钮,可能比其它任何处设都 要多。视频流要与许多参数相联系,而且有很大一部分处理要通过硬件进行。不使用硬件有良好支持模式可能导致表现不好,甚至根本没有表现。所以我们不得不揭 露硬件的许多特性,而对最终应用表现得怪异一点。
    传统上来讲,视频驱动中包含的ioctl()函数一般会长得像一部小说,而函数所得到的结论也往 往比小说更令人满意来,他们往往在中间拖了很多(这句话完全不明白什么意思)。所以V4L2的API在2.6.18版本的内核开始做出了改变。冗长的 ioctl函数被替换成了一个大的回调函数的集合,每个回调函数实现自己的ioctl函数。实际上,在2.6.19-rc3中,有79个这样的回调函数。 而幸运的是,多数驱动并不需实现所有的回调函数,甚至都不是大部分回调函数。
    在ioctl()函数中发生的事情都放到了 drivers/media/video/videodev.c里面。这部分代码处理数据在内核和用户空间之间的传输并把ioctl调用发送给驱动。要使 用它的话,只要把video_device中的video_ioctl2()做为ioctl()来调用就行了。实际上,多数驱动也要把它当成 unlocked_ioctl()来用。Video4Linux2层的锁可以对其进行处理,而且驱动也应该在合适的地方加锁。(这一段没看明白,乱写的)

 

你的驱动第一个可能要实现的回调函数是:

int (*vidioc_querycap)(struct file *file, void *fh, struct v4l2_capability *cap);

这 个函数处理VIDIOC_QUERYCAP ioctl(), 只是简单问问“你是谁?你能干什么?”实现它是V4L2驱动的责任。在这个函数中,和所有其他V4L2回调函数一样, 参数priv是file->private_data域的内容;通常的实现是在open()的时候把它指向驱动中表示设备的内部结构。

 

驱动应该负责填充cap结构并且返回“0或者负的错误码”值。如果成功返回,则V4L2层会负责把回复拷贝到用户空间。

 

v4l2_capability结构(定义在<linux/videodev2.h>中)是这样的:

struct v4l2_capability {
 __u8 driver[16]; /* i.e. "bttv" */
 __u8 card[32]; /* i.e. "Hauppauge WinTV" */
 __u8 bus_info[32]; /* "PCI:" + pci_name(pci_dev) */
 __u32   version;        /* should use KERNEL_VERSION() */
 __u32 capabilities; /* Device capabilities */
 __u32 reserved[4];
};

 

其中driver域应该被填充设备驱动的名字,card域应该被填充这个设备的硬件描述信息。并不是所有的驱动都消耗精力去处理bus_info域,这些驱动通常使用下面这个方法:

   springf(cap->bus_info, "PCI:%s", pci_name(&my_dev));

version域用来保存驱动的版本号。capabilities域是一个位掩码用来描述驱动能做的不同的事情:

/* Values for 'capabilities' field */
#define V4L2_CAP_VIDEO_CAPTURE  0x00000001  /* Is a video capture device */
#define V4L2_CAP_VIDEO_OUTPUT  0x00000002  /* Is a video output device */
#define V4L2_CAP_VIDEO_OVERLAY  0x00000004  /* Can do video overlay */
#define V4L2_CAP_VBI_CAPTURE  0x00000010  /* Is a raw VBI capture device */
#define V4L2_CAP_VBI_OUTPUT  0x00000020  /* Is a raw VBI output device */
#define V4L2_CAP_SLICED_VBI_CAPTURE 0x00000040  /* Is a sliced VBI capture device */
#define V4L2_CAP_SLICED_VBI_OUTPUT 0x00000080  /* Is a sliced VBI output device */
#define V4L2_CAP_RDS_CAPTURE  0x00000100  /* RDS data capture */
#define V4L2_CAP_VIDEO_OUTPUT_OVERLAY 0x00000200  /* Can do video output overlay */
#define V4L2_CAP_HW_FREQ_SEEK  0x00000400  /* Can do hardware frequency seek  */

#define V4L2_CAP_TUNER   0x00010000  /* has a tuner */
#define V4L2_CAP_AUDIO   0x00020000  /* has audio support */
#define V4L2_CAP_RADIO   0x00040000  /* is a radio device */

#define V4L2_CAP_READWRITE              0x01000000  /* read/write systemcalls */
#define V4L2_CAP_ASYNCIO                0x02000000  /* async I/O */
#define V4L2_CAP_STREAMING              0x04000000  /* streaming I/O ioctls */

 

最后一个域(reserved)是保留的。V4L2规则要求要求reserved被置为0, 但是, 因为video_ioctl2()设置了整个的结构体为0,所以这个就不用我们操心了。

 

可以在“vivi”这个驱动中找到一个典型的应用:

static int vidioc_querycap(struct file *file, void  *priv,
     struct v4l2_capability *cap)
{
 struct vivi_fh  *fh  = priv;
 struct vivi_dev *dev = fh->dev;

 strcpy(cap->driver, "vivi");
 strcpy(cap->card, "vivi");
 strlcpy(cap->bus_info, dev->v4l2_dev.name, sizeof(cap->bus_info));
 cap->version = VIVI_VERSION;
 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
    V4L2_CAP_STREAMING     |
    V4L2_CAP_READWRITE;
 return 0;
}

考虑到这个回调函数的出现,我们希望应用程序使用它,避免要求设备完成它们不可能完成的功能。然而,在你编程的有限经验中,应用程序不会花太多的精力来关注VIDIOC_QUERYCAP调用。

 

另一个可选而又不常被是实现的回调函数是:

     int (*vidioc_log_status)       (struct file *file, void *fh);

这个函数用来实现VIDIOC_LOG_STATUS调用,作为视频应用程序编写者的调试助手。当调用时,它应该打印藐视驱动及其硬件的当前状态信息。这个信息应该足够充分以便帮助迷糊的应用程序开发者弄明白为什么视频显示一片空白。

 

 下一部分开始剩下的77个回调函数。特别的,我们要开始看看与硬件协商一组操作模式的过程。


原文链接

Linux V4L2驱动框架分析之(四):sensor驱动 为了实现代码的重用,sensor驱动只需实现各种设备控制方法供上层调用并注册v4l2_subdev,而无需关心video_device和v4l2_dev。 struct v4l2_subdev结构体定义如下: struct v4l2_subdev { ...... struct list_head list; //用于挂入v4l2_dev的subdevs链表 struct module *owner; bool owner_v4l2_dev; u32 flags; struct v4l2_ 阅读详情

相关推荐

和小白一起学习V4L2采集视频

最近想做一个视频推流拉流的小项目,需要使用V4L2驱动框架,先来学习学习 Video for Linuxtwo(Video4Linux2)简称V4L2,是V4L的改进版。V4L2是linux操作系统下用于采集图片、视频和音频数据的API接口,配合适当的视频采集设备和相应的驱动程序,可以实现图片、视频、音频等的采集。在远程会议、可视电话、视频监控系统和嵌入式多媒体终端中都有广泛的应用。 在Linux下,所有外设都被看成一种特殊的文件,成为“设备文件”,可以象访问普通文件一样对其进行读写。一般来说,采用V4L2

weixin_43937576的博客 8682

linux v4l2系统详解,v4l2驱动2-linux3.0.8中V4L2_CAP_*详解

这部分涉及不少专业支持,有些可能写的不好,请大家原谅!/* Values for ‘capabilities‘ field */#define V4L2_CAP_VIDEO_CAPTURE0x00000001 /* Is a video capture device */#define V4L2_CAP_VIDEO_OUTPUT0x00000002 /* Is a video output d...

weixin_30270475的博客 695

V4L2框架视频sensor模块驱动开发汇总

二、一、V4L2框架概述V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写。V4L2在设计之初时,是要支持很多广泛的设备的,如声卡, display, FB, I2C, camera等.它们之中只有一部分在本质上是真正的视频设备,也是造成V4l2源码冗余的原因之一。

hhhhhhh_hhhhhh_的博客 1488

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

V4L2子系统向上提供了很多访问Video设备的接口,应用程序可以通过系统调用访问Video设备。但由于Video设备千差万别,很少有设备驱动程序能支持所有的接口功能,因此在使用之前,需要了解设备驱动程序支持的功能。...

枫潇潇 2170

Linux V4L2 摄像头采集 + YUYV 转 RGB 显示

本文详细介绍了 Linux 下通过 V4L2 框架实现摄像头数据采集的完整流程,包括设备打开、格式设置、内存映射、采集帧数据,以及如何将 YUYV 图像格式转换为 ARGB 并实时显示在 LCD 屏幕上。

weixin_56167571的博客 2240

Linux ARM平台开发系列讲解(摄像头V4L2子系统) 2.12.7 摄像头V4L2驱动开发流程总结

1.概述前几章对摄像头V4L2驱动开发各个环节做了展开分析,这一章节就做一个汇总,用来回顾前几章得知识点,概括一下摄像头开发得流程,本次使用RK3399。2.SensorSub-device开发移植Sensor驱动位于目录下,注意到本章节所描述的是具有属性的sensor驱动,故目录下的驱动并不适用。在结构下,Sensor一般作为sub-device并通过pad与cif、isp或者mipiphy链接在一起。本章主要介绍Sensor驱动的代码[1],dts配置,及如何验证sensor5个部分。...

DSMGUOGUO的博客 3730

Video4Linux下USB摄像头驱动和视频采集的实现

1 引言 多媒体通信技术的发展为信息的获取和传输提供了丰富的手段,视频采集是其中不可缺少的重要组成部分。视频采集的手段多种多样,随着人们对降低系统成本和提高可靠性的迫切需求,基于嵌入式的视频采集系统成为新的研发热点。本方案以S3C2410微控制器作为硬件平台,通过移植具有实现硬件功能...

测试0901-1 870

v4l2_1.zip_v4l2_升级linux应用

V4L2照片采集程序,V4L2应用程序框架。 V4L2是V4L的升级版本,linux下视频设备程序提供了一套接口规范。

Linux内核怎么找不到v4l驱动,quartus找不到硬件USB-blaster及驱动无法安装,解决方法 | 技术部落...

一、Windows无法正常驱动USB-BlasterWin7、Win8、Win10操作系统安装USB-Blaster驱动程序过程中无外乎两个问题:1、Windows无法安装USB-Blaster。2、文件的哈希值不在指定的目录文件中.下面以上提供两个问题的完整解决办法,Win7、Win8、Win10系统的解决过程是类似的,只是界面不一样而已。问题一:Windows无法安装USB-Blasterno...

weixin_39604139的博客 809

ZYNQ双核通信实战:手把手教你用OpenAMP搭建Linux+FreeRTOS开发环境(2018.3版)

本文详细介绍了如何在ZYNQ平台上使用OpenAMP框架实现双核通信,构建Linux与FreeRTOS协同开发环境。从开发环境配置、系统组件编译到OpenAMP框架应用,手把手指导开发者完成ZYNQ双核通信系统的搭建与调试,为异构计算开发提供实用解决方案。

weixin_33737134的博客 476

告别编译失败:详解Keil MDK中ARM编译器V5与V6的区别及项目迁移选择

本文深入解析Keil MDK中ARM编译器V5与V6的核心差异,提供STM32项目迁移的完整指南。从代码生成策略、优化重点到语法支持,详细对比两版本特性,并给出项目兼容性评估框架和双版本共存配置方案,帮助开发者高效解决编译器版本冲突问题。

weixin_28684757的博客 516

V4L2简介

http://work-blog.readthedocs.org/en/latest/v4l2%20intro.html 第一章 V4L2简介 1.1、什么是v4l2 V4L2(Video4Linux的缩写)是Linux下关于视频采集相关设备的驱动框架,为驱动和应用程序提供了一套统一的接口规范。 V4L2支持的设备十分广泛,但是其中只有很少一部分在本质上是真正的视频设备:

hushup的专栏 7641

HAL库STM32CubeMX+DHT11温湿度传感器模块化驱动与OLED显示实战

本文详细介绍了基于HAL库和STM32CubeMX开发DHT11温湿度传感器模块化驱动的实战过程。通过精确的时序控制和模块化封装,实现了传感器数据采集,并结合OLED显示模块实时展示温湿度信息,为嵌入式开发者提供了完整的解决方案。

h6j7k8l9p0的博客 1134

linux的v4l2驱动,V4L2 Linux驱动简介(1)

笔者最近有机会写了一个摄像头的驱动,是“One laptop per child”项目的中摄像头专用的。这个驱动使用了为此目的而设计的内核API:the Video4Linux2 API。在写这个驱动的过程中,笔者发现了一个惊人的问题:这个API的文档工作做得并不是很好,而用户层的文档则写的,实际上,相当不错。为了补救现在的状况,LWN将在未来的内个月里写一系列文章,告诉大家如何写V4L2接口的驱...

weixin_39783857的博客 309

【Unity3D渲染】Unity3d实现Photoshop的各种图层混合模式

Adobe Photoshop图层混合原理、Unity ShaderLab图层混合实现

a310989583的专栏 2435

从编译到启动:RV1106嵌入式Linux系统构建的效率优化与深度实践

本文深入探讨RV1106嵌入式Linux系统构建的全流程优化策略,重点提升编译速度和驱动加载效率。通过并行编译配置、内核裁剪、驱动加载优化和硬件辅助加速等实践方法,显著缩短系统构建和启动时间,为嵌入式开发提供实用指导。

ttt77的博客 1032

v4l2驱动2-linux3.0.8中V4L2_CAP_*详解

这部分涉及不少专业支持,有些可能我的不好,请大家原谅! /* Values for 'capabilities' field */ #define V4L2_CAP_VIDEO_CAPTURE 0x00000001 /* Is a video capture device */ #define V4L2_CAP_VIDEO_OUTPUT 0x00000002 /* Is a video

xxxxxlllllxl的专栏 3147

刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型

在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。  通过博文了解💝💝💝    1💝💝💝----adb禁用或者删除系统app导致无法开机的几种解决方法 2💝💝💝----如何保数据来无损恢复机型 3💝💝💝----其他保数据解决系统类故障无法开机的步骤解析

小马哥的专栏 1352

linux V4L2子系统——v4l2的结构体(3)之v4l2_subdev

子设备,负责实现具体的功能。可将其抽象为具体的某一摄像头传感器,如OV7740、OV7251、OV5640等。

枫潇潇 5901

YOLOv8改进 | 主干篇 | 利用MobileNetV2替换Backbone(轻量化网络结构)

本文给大家带来的改进机制是,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者⭐⭐⭐⭐。

Snu77的博客 5686

【智能座舱】- 智能座舱研究报告合集

智能座舱研究报告合集

零点壹客的博客 1305

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 流程...

welljrj的博客 8959

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

使用Linux内核自带的V4L2设备驱动 采集图像

V4L2代表Video for Linux Two,它是Linux内核的一部分,提供了一种统一的方式来访问各种视频输入/输出设备,如摄像头、电视卡等。

l22221的博客 1661

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

i.MX6ULL 平台 V4L2 摄像头驱动框架解析

V4L2 的全称是,它是 Linux 内核中用于管理视频设备的一套统一驱动框架。简单来说,V4L2 为摄像头提供了统一的访问接口。应用程序不需要直接关心底层硬件的具体实现,只需要通过设备节点,就可以完成图像采集、格式设置、缓冲区管理等操作。常见的摄像头主要分为两类:一类是USB 摄像头,通常遵循 UVC 协议,由 Linux 的uvcvideo通用驱动支持;另一类是MIPI 摄像头。

2501_92596338的博客 926

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: V4L2 Linux驱动简介(2)驱动结构
下一篇: 哲理小故事---理想和现实
kernel_learner
博客等级 码龄15年 60粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值