【Linux驱动】Linux--V4L2视频驱动框架

这篇具有很好参考价值的文章主要介绍了【Linux驱动】Linux--V4L2视频驱动框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux–V4L2驱动框架

一、V4L2 框架

v4l2驱动框架主要的对象有video_device、v4l2_device、v4l2_subdev、videobuf

  • video_device

    一个字符设备,为用户空间提供设备节点(/dev/videox),提供系统调用的相关操作(open、ioctl…)

  • v4l2_device

    嵌入到video_device中,表示一个v4l2设备的实例

  • v4l2_subdev

    依附在v4l2_device之下,并表示一个v4l2设备的子设备,一个v4l2_devide下可以有多个sub_device

  • videobuf

    v4l2驱动的缓存管理

v4l2_device和v4l2_subdev的关系:

subdev的设计目的是为了多路复用,就是用一个v4l2_device可以挂接多个v4l2_subdev。所谓的多路复用就是使用一个摄像头控制器来控制多个摄像头。比如手机上有前置和后置摄像头。

在V4L2驱动中,使用v4l2_device来表示摄像头控制器(ISP)。使用v4l2_subdev来表示具体的某一个摄像头(Sensor)。

对于手机而言 ,一般都有两个摄像头,一个前置摄像头,一个后置摄像头,其接发下图所示

v4l2驱动框架,Linux驱动,linux,音视频,驱动开发,视频,嵌入式硬件

在V4L2驱动中,使用v4l2_device来表示摄像头控制器

使用v4l2_subdev来表示具体的某一个摄像头的I2C控制模块,进而通过其控制摄像头

v4l2_device里有一个v4l2_subdev链表,可以选择v4l2_device去控制哪一个v4l2_subdev

v4l2框架图如下:

v4l2驱动框架,Linux驱动,linux,音视频,驱动开发,视频,嵌入式硬件

二、V4L2驱动主要数据结构

V4l2驱动的代码在drivers\media\v4l2-core文件夹下

  1. videobufxx_xxx.c系列文件是用于实现视频的内存分配,videobuf2_xxx系列文件是对应v4l2,而videobuf_xxx系列文件是对应于v4l(video for linux version1)。
  2. v4l2-dev.c对应于video_device的实现。
  3. v4l2-device.c对应 v4l2_device的实现。
  4. v4l2-ioctl.c对应 ioctl的实现。
  5. v4l2-subdev.c对应 42vl_subdev的实现等等。
  • struct video_device
  • video_device是个字符设备,保存管理V4l2_device设备数据。 包含底层驱动结构体v4l2_device以及为上层提供的接口cdev。
  • 应用层通过/dev/videoX的文件操作会调用video_device的v4l2_file_operations结构体中指向的函数。
  • V4L2的ioctl很复杂,应用层调用ioctl会调用到v4l2_ioctl_ops结构体中指向的函数。

v4l2驱动框架,Linux驱动,linux,音视频,驱动开发,视频,嵌入式硬件

v4l2驱动框架,Linux驱动,linux,音视频,驱动开发,视频,嵌入式硬件

v4l2驱动框架,Linux驱动,linux,音视频,驱动开发,视频,嵌入式硬件

  • struct v4l2_device
    • 代表一个v4l2设备,保存设备实例的数据
    • v4l2_device中有一个链表 ,挂载着v4l2_subdev,用于管理v4l2_subdev

v4l2驱动框架,Linux驱动,linux,音视频,驱动开发,视频,嵌入式硬件

  • struct v4l2_subdev
  • sub-devices子设备,代表实实在在的camera等传感器设备。驱动需要与子设备进行通信,这些子系统一般情况下就是音频处理,编解码器等,camera常见的子设备有传感器和摄像头控制器,为了方便代码管理,内核v4l2提供了一个统一的接口给这些子设备,即v4l2_sbudev结构体。
  • v4l2_subdev内有一个链表节点,可以链接至 v4l2_device。
  • v4l2_subdev有v4l2_device指针,表示属于哪个v4l2_device。
  • v4l2_subdev_ops为v4l2_subdev的具体功能实现。

v4l2驱动框架,Linux驱动,linux,音视频,驱动开发,视频,嵌入式硬件

v4l2驱动框架,Linux驱动,linux,音视频,驱动开发,视频,嵌入式硬件

三、V4L2提供的外部接口

  • struct video_device (在v4l2-dev.h文件中)
static inline int __must_check video_register_device(struct video_device *vdev,
						     enum vfl_devnode_type type,
						     int nr)
    
void video_unregister_device(struct video_device *vdev);
  • **struct v4l2_device ** (在v4l2-device.h中)
int __must_check v4l2_device_register(struct device *dev,
				      struct v4l2_device *v4l2_dev);


void v4l2_device_unregister(struct v4l2_device *v4l2_dev);
  • struct v4l2_subdev (在v4l2-device.h中)
int __must_check v4l2_device_register_subdev(struct v4l2_device *v4l2_dev,
					     struct v4l2_subdev *sd);

void v4l2_device_unregister_subdev(struct v4l2_subdev *sd);

四、V4L2驱动框架模板

步骤:

  • 分配设置video_device结构体,包括.fops以及.ioctl_ops
  • 初始化v4l2_device结构体(代表一个v4l2设备)
  • 注册video_device结构体(video_device是内核对v4l2_device的官方封装,用于管理v4l2_device数据),向上层用户提供访问接口
#include <...>

static struct video_device* video_dev;
static struct v4l2_device v4l2_dev;

/* 实现各种系统调用 */
static const struct v4l2_file_operations video_dev_fops = {
	.owner		    = THIS_MODULE,
	.release        = vdev_close,
	.read           = vdev_read,
	.poll		    = vdev_poll,
	.ioctl          = video_ioctl2,
	.mmap           = vdev_mmap,
};

/* 实现各种系统调用 */
static const struct v4l2_ioctl_ops video_dev_ioctl_ops = {
	.vidioc_querycap      = vidioc_querycap,
	.vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
	.vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
	.vidioc_try_fmt_vid_cap   = vidioc_try_fmt_vid_cap,
	.vidioc_s_fmt_vid_cap     = vidioc_s_fmt_vid_cap,
	.vidioc_reqbufs       = vidioc_reqbufs,
	.vidioc_querybuf      = vidioc_querybuf,
	.vidioc_qbuf          = vidioc_qbuf,
	.vidioc_dqbuf         = vidioc_dqbuf,
	.vidioc_enum_input    = vidioc_enum_input,
	.vidioc_g_input       = vidioc_g_input,
	.vidioc_s_input       = vidioc_s_input,
	.vidioc_streamon      = vidioc_streamon,
	.vidioc_streamoff     = vidioc_streamoff,
};

static int __init video_init(void)
{
    /* 分配并设置一个video_device */
    video_dev = video_device_alloc();
    video_dev->fops = &video_dev_fops;
    video_dev->ioctl_ops = &video_dev_ioctl_ops;
    video_dev->release = video_device_release;
    video_dev->tvnorms = V4L2_STD_525_60;
    video_dev->current_norm = V4L2_STD_NTSC_M;

    /* 注册一个v4l2_device */
    v4l2_device_register(video_dev->dev, &v4l2_dev);    
    video_dev->v4l2_dev = &v4l2_dev;

    /* 注册一个video_device字符设备 */
    video_register_device(video_dev, VFL_TYPE_GRABBER, -1);

    return 0;
}

static void __exit video_exit(void)
{
    video_unregister_device(video_dev);
    v4l2_device_unregister(&v4l2_dev);
    video_device_release(video_dev);
}


module_init(video_init);
module_exit(video_exit);

五、虚拟摄像头驱动

驱动位于drivers\media\platform\vivid文件夹下

【转载】Linux摄像头驱动1——vivid_linux 摄像头驱动_seiyaaa的博客-CSDN博客

参考资料

摄像头驱动——V4L2框架分析 - 朱果果 - 博客园 (cnblogs.com)

Linux V4l2驱动 – 框架概述 - 忆云竹 (eyunzhu.com)

深入学习Linux摄像头(二)v4l2驱动框架_v4l2_subdev_ops_JT同学的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-623590.html

到了这里,关于【Linux驱动】Linux--V4L2视频驱动框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 汽车IVI中控开发入门及进阶(十二):V4L2视频

    前言     IVI,In-Vehicle Infotainment,智能座舱信息娱乐系统,或称车载信息娱乐系统, 汽车中控也被称为车机、车载多媒体、车载娱乐等, 它是智能座舱的重要组成部分。IVI 采用车载专用中央处理器,基于车身总线系统和联网服务提供车载综合信息处理功能,包括音频播放、

    2024年02月04日
    浏览(35)
  • RK3568平台开发系列讲解(驱动基础篇)V4L2 用户空间 API 说明

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢设备驱动的主要目的是控制和利用底层硬件,同时向用户展示功能。 这些用户可以是在用户空间或其他内核驱动中运行的应用。 本篇我们将学习如何利用内核公开的 V4L2 设备功能。 我们将从描述和

    2023年04月25日
    浏览(33)
  • c 摄像头利用v4l2直接生成avi视频(不利用ffmpeg)

    自定义avi结构头文件。现在不能实时显示摄像头画面,准备参照fim(终端中显示图片),直接对显示framebuffer操作,显示视频。不用qt等。 生成的视频根据机子的性能不同,诂计要手动调一下生成视频的帧率。 播放: $ aplay  musicdemo.wmv 录音: $ arecord -c 2 -r 44100 -f S16_LE musicd

    2024年02月08日
    浏览(30)
  • V4L2常用调试命令

    这篇文章简单记录一下RK平台基于V4L2框架camera调试过程中常用的一些命令: (1)查看拓扑结构:查看media0的pipeline (2)抓数据流命令: 对video0节点,设置格式为NV12,分辨率为1920x1080,不裁剪,4个buf轮转,--verbose的作用是刷出帧率。 (3)抓图命令: 类似上面的,将图像保

    2024年02月03日
    浏览(37)
  • Linux摄像头(v4l2应用)——获取摄像头一帧图像

    一.V4L2简介 V4L2(Video for Linux 2):Linux内核中视频设备中的驱动框架,对于应用层它提供了一系列的API接口,同时对于硬件层,它适配大部分的视频设备,因此通过调用V4L2的接口函数可以适配大部分的视频设备。 二、操作流程 1.打开设备 当把摄像头插入到电脑后,执行ls /

    2024年02月20日
    浏览(39)
  • V4L2 摄像头应用编程

    ALPHA/Mini I.MX6U 开发板配套支持多种不同的摄像头,包括正点原子的ov5640(500W 像素)、 ov2640(200W 像素)以及ov7725(不带FIFO、30W 像素)这三款摄像头,在开发板出厂系统上,可以使用这些摄像头;当然,除此之外我们还可以使用USB 摄像头,直接将USB 摄像头插入到开发板上的

    2024年02月11日
    浏览(29)
  • Linux + 香橙派 + V4L2 + http 实现远程监控摄像头在网页端显示

    项目需求,需要做一个基于边缘端的人脸识别远程监控摄像头并在网页前端展示 ,这里采用国产香橙派作为边缘计算终端,安装ubuntu系统,系统中采用v4l2接口对摄像头进行获取,当客户端通过网页进行请求时,服务器通过http服务的形式将一帧帧图像发送给客户端,只要一秒

    2024年02月15日
    浏览(29)
  • 内存不足V4L2 申请DMC缓存报错问题

    当内存不足时,V4L2可能存在申请DMA缓存报错,如下日志:

    2024年02月12日
    浏览(27)
  • V4L2+QT+USB摄像头实时显示视频(Arm,Linux,window均适用)

    笔者自从学习了Framebuffer编程和V4L2编程之后,就想实现在LCD屏上显示实时视频 笔者学习过正点I.MX6U Linux C编程中的相关内容,然而原子的例程是针对OV5640摄像头写的,像素格式是RGB 然而USB摄像头大多支持MJPEG或者YUYV格式,如果要在屏幕上显示需要进行格式转换,而 转换像素

    2023年04月08日
    浏览(33)
  • opencv-python调用摄像头失败 global /io/opencv/modules/videoio/src/cap_v4l.cpp (1000) tryIoctl VIDEOIO(V4L2

    Ubuntu 18.04 aarch64 Python 3.7.15 opencv-python 4.6.0 插入USB摄像头后, /dev/video0 会正常出现,使用 fswebcam 也能正常拍摄照片。但运行 opencv-python 的视频拍摄例程时出错,例程如下。 如果例程正确运行,屏幕窗口中将显示灰度处理后的摄像头实时视频。 报错信息如下 单步调试后,发现

    2023年04月24日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包