Linux&UVC驱动
+ -

LINUX&UVC驱动向V4L2提供的回调接口v4l2_ioctl_ops

2024-03-28 12 0

在 Linux 内核中,针对视频设备的驱动一般会使用 Video4Linux2(V4L2)接口。在 V4L2 中,ioctl 是一个用于设备控制的系统调用,用来发送各种命令给设备驱动程序。对于 UVC(USB Video Class)摄像头的驱动,通常会使用 uvc_v4l2.c 这个文件。

uvc_v4l2.c 中的 v4l2_ioctl_ops 结构体定义了对 V4L2 设备的 ioctl 操作的实现。下面是该结构体的一般形式及其成员介绍:

const struct v4l2_ioctl_ops uvc_ioctl_ops = {
    .vidioc_querycap           = uvc_ioctl_querycap,
    .vidioc_enum_fmt_vid_cap   = uvc_ioctl_enum_fmt_vid_cap,
    .vidioc_g_fmt_vid_cap      = uvc_ioctl_g_fmt_vid_cap,
    .vidioc_try_fmt_vid_cap    = uvc_ioctl_try_fmt_vid_cap,
    .vidioc_s_fmt_vid_cap      = uvc_ioctl_s_fmt_vid_cap,
    .vidioc_reqbufs            = uvc_ioctl_reqbufs,
    .vidioc_querybuf           = uvc_ioctl_querybuf,
    .vidioc_qbuf               = uvc_ioctl_qbuf,
    .vidioc_dqbuf              = uvc_ioctl_dqbuf,
    .vidioc_streamon           = uvc_ioctl_streamon,
    .vidioc_streamoff          = uvc_ioctl_streamoff,
    .vidioc_enum_input         = uvc_ioctl_enum_input,
    .vidioc_g_input            = uvc_ioctl_g_input,
    .vidioc_s_input            = uvc_ioctl_s_input,
    .vidioc_g_parm             = uvc_ioctl_g_parm,
    .vidioc_s_parm             = uvc_ioctl_s_parm,
    .vidioc_cropcap            = uvc_ioctl_cropcap,
    .vidioc_g_crop             = uvc_ioctl_g_crop,
    .vidioc_s_crop             = uvc_ioctl_s_crop,
    .vidioc_enum_framesizes    = uvc_ioctl_enum_framesizes,
    .vidioc_enum_frameintervals= uvc_ioctl_enum_frameintervals,
    .vidioc_g_fmt_vid_overlay  = uvc_ioctl_g_fmt_vid_overlay,
    .vidioc_try_fmt_vid_overlay= uvc_ioctl_try_fmt_vid_overlay,
    .vidioc_s_fmt_vid_overlay  = uvc_ioctl_s_fmt_vid_overlay,
};

每个成员的简要介绍及使用条件:

  • vidioc_querycap: 用于查询设备的基本能力,如设备名称、驱动名称、支持的输入/输出格式等。无特殊条件。
  • vidioc_enum_fmt_vid_cap: 枚举视频捕获设备支持的视频格式。无特殊条件。
  • vidioc_g_fmt_vid_cap: 获取当前视频捕获设备的视频格式。无特殊条件。
  • vidioc_try_fmt_vid_cap: 尝试设置视频捕获设备的视频格式。无特殊条件。
  • vidioc_s_fmt_vid_cap: 设置视频捕获设备的视频格式。无特殊条件。
  • vidioc_reqbufs: 请求内存缓冲区用于视频数据。无特殊条件。
  • vidioc_querybuf: 查询内存缓冲区的信息。无特殊条件。
  • vidioc_qbuf: 将缓冲区放入队列。无特殊条件。
  • vidioc_dqbuf: 从队列中取出缓冲区。无特殊条件。
  • vidioc_streamon: 打开数据流。无特殊条件。
  • vidioc_streamoff: 关闭数据流。无特殊条件。
  • vidioc_enum_input: 枚举视频输入。无特殊条件。
  • vidioc_g_input: 获取当前视频输入。无特殊条件。
  • vidioc_s_input: 设置视频输入。无特殊条件。
  • vidioc_g_parm: 获取设备参数。无特殊条件。
  • vidioc_s_parm: 设置设备参数。无特殊条件。
  • vidioc_cropcap: 查询裁剪能力。无特殊条件。
  • vidioc_g_crop: 获取当前裁剪设置。无特殊条件。
  • vidioc_s_crop: 设置裁剪。无特殊条件。
  • vidioc_enum_framesizes: 枚举帧大小。无特殊条件。
  • vidioc_enum_frameintervals: 枚举帧间隔。无特殊条件。
  • vidioc_g_fmt_vid_overlay: 获取视频叠加格式。无特殊条件。
  • vidioc_try_fmt_vid_overlay: 尝试设置视频叠加格式。无特殊条件。
  • vidioc_s_fmt_vid_overlay: 设置视频叠加格式。无特殊条件。

这些 ioctl 请求通常由用户空间的应用程序发起,例如视频采集应用或者视频播放器。应用程序可以通过 V4L2 接口与视频设备通信,发送相应的 ioctl 命令来控制视频设备的行为,如获取设备信息、设置采集参数、启动/停止数据流等。

0 篇笔记 写笔记

Linux V4L2 UVC摄像头框架浅析
V4L2 :video for linux version 2 ,是 Linux 里一套标准的视频驱动,它支持 UVC 标准的摄像头。本文来分析一下它的核心框架。整个v4l2的框架分为三层:在应用层,我们可以在 /dev 目录发现 video0 类似的设备节点,上层的摄像头程序打开设备节点进行......
V4L2访问摄像头扩展单元命令
我们可以通过IOCTL访问扩展单元,调用方法如下:ioctl(fd, UVCIOC_CTRL_QUERY, struct uvc_xu_control_query *);访问不同的扩展命令只需要修改uvc_xu_control_query 结构体里面内容即可。uvc_xu_control_qu......
Linux系统V4L2访问UVC摄像头扩展单元命令
我们可以通过IOCTL访问扩展单元,调用方法如下:ioctl(fd, UVCIOC_CTRL_QUERY, struct uvc_xu_control_query *);访问不同的扩展命令只需要修改uvc_xu_control_query 结构体里面内容即可。uvc_xu_control_qu......
Linux打开V4L2摄像头并存储Camera数据流
Linux系统下打开UVC摄像头,并将从CAMERA读取到的数据存储在文件中。源代码版权归老吕、所有。感谢老吕、的无私贡献。v4l2_capture_demo.c#include #include #include
V4L2整体框架如下图:图片来源于http://blog.csdn.net/leesagacious/article/details/49948163其整体驱动框架分为三个层次:第一个层为字符设备驱动程序,主要是上层应用创建视频设备节点。这一层是整个V4L2层框架的外包接口,应用层通过API......
LINUX关于相机涉及到的东西有:V4L2 框架UVC驱动V4L2是视频的通用框架,其下可支持各类总线设备,如pci,i2c,usb等各种总线类型。其目录位于:E:linux-5.6.11linux-5.6.11driversdriversmedia在USB总线框架下,其使用的是......
以下内容仅代表个人观点,有很大概率不准确。作业初学者,仅为学习笔记而已,勿全当真。但本人会随着认识而修正本文错误的观点。Windows系统有驱动层级结构,Linux应该也有。作为初学者,需要多读多学,并对新学的知识进行总结。本人根据自己的理解对Linux系统UVC驱动栈进行绘制图。最底层的......
从 Linux&UVC驱动栈 https://www.usbzh.com/article/detail-1322.html 一文可知,UVC驱动其实是一个中间层驱动程序,其启着承上启下的功能。在UVC驱动的下层是USBCore驱动,其实现的是USB设备初始化及通讯相关的功能实现。在UVC......
在 Linux 内核中,针对视频设备的驱动一般会使用 Video4Linux2(V4L2)接口。在 V4L2 中,ioctl 是一个用于设备控制的系统调用,用来发送各种命令给设备驱动程序。对于 UVC(USB Video Class)摄像头的驱动,通常会使用 uvc_v4l2.c 这个文件。uvc......
VIDIOC_QUERYCAP请求使用api函数ioctl,最终进行LINUX&UVC驱动中,根据设备节点的不同,执行的回调函数不同。VIDIOC_QUERYCAP请求用于返回设备支持的功能属性信息,其对应的结构体v4l2_capability。struct v4l2_capabilit......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!