V4L2学习笔记
+ -

V4L2 UVC事件

2025-12-12 本文链接为:http://www.usbzh.com/article/detail-1606.html ,欢迎转载,转载请附上本文链接。

UVC事件包括两类,分别为数据事件(读写)和异常事件。这两类事件可通过select函数查看。
事件的注册可见:

    struct v4l2_event_subscription sub;
    memset(&sub, 0, sizeof sub);
    sub.type = UVC_EVENT_SETUP;
    ioctl(dev->uvc_fd, VIDIOC_SUBSCRIBE_EVENT, &sub);

    sub.type = UVC_EVENT_DATA;
    ioctl(dev->uvc_fd, VIDIOC_SUBSCRIBE_EVENT, &sub);

    sub.type = UVC_EVENT_STREAMON;
    ioctl(dev->uvc_fd, VIDIOC_SUBSCRIBE_EVENT, &sub);

    sub.type = UVC_EVENT_STREAMOFF;
    ioctl(dev->uvc_fd, VIDIOC_SUBSCRIBE_EVENT, &sub);

104930794685

数据事件

数据事件对应于select函数的读写事件。
对于UVC Gadget 应用写数据,当事件来到时。应

        struct v4l2_buffer ubuf;
        ret = ioctl(dev->uvc_fd, VIDIOC_DQBUF, &ubuf); //获取空闲队列
        uvc_video_fill_buffer(dev, &ubuf);//自定义函数,填充数据缓冲区
        ret = ioctl(dev->uvc_fd, VIDIOC_QBUF, &ubuf); //重新入队列等待数据发送

异常事件

异常事件包括UVC本身的控制请求和设备的事件。
首先应先通过VIDIOC_DQEVENT ioctl获取事件v4l2_event。

//事件本身
struct v4l2_event {
    __u32                type;
    union {
        struct v4l2_event_vsync        vsync;
        struct v4l2_event_ctrl        ctrl;
        struct v4l2_event_frame_sync    frame_sync;
        struct v4l2_event_src_change    src_change;
        struct v4l2_event_motion_det    motion_det;
        __u8                data[64];
    } u;
    __u32                pending;
    __u32                sequence;
    struct timespec            timestamp;
    __u32                id;
    __u32                reserved[8];
};

//事件响应
struct uvc_request_data {
    __s32 length;
    __u8 data[60];
};

其中type为事件类型

#define UVC_EVENT_CONNECT         (V4L2_EVENT_PRIVATE_START + 0)
#define UVC_EVENT_DISCONNECT      (V4L2_EVENT_PRIVATE_START + 1)
#define UVC_EVENT_STREAMON         (V4L2_EVENT_PRIVATE_START + 2)
#define UVC_EVENT_STREAMOFF        (V4L2_EVENT_PRIVATE_START + 3)
#define UVC_EVENT_SETUP            (V4L2_EVENT_PRIVATE_START + 4)
#define UVC_EVENT_DATA            (V4L2_EVENT_PRIVATE_START + 5)
重要性 事件类型 原因
最高 UVC_EVENT_SETUP 所有控制和配置的基础,需要UVCIOC_SEND_RESPONSE请求返回uvc_request_data
UVC_EVENT_DATA 配合SETUP完成控制传输(实际为SET_CUR)
UVC_EVENT_STREAMON/OFF 控制数据流启停
UVC_EVENT_CONNECT/DISCONNECT 设备物理状态变化
UVC_EVENT_FIRST/LAST 仅为枚举标记

当为UVC_EVENT_SETUP或UVC_EVENT_DATA事件时,v4l2_event.u.data类型为uvc_event

struct uvc_event {
    union {
        enum usb_device_speed speed;
        struct usb_ctrlrequest req;
        struct uvc_request_data data;
    };
};

    struct uvc_event *uvc_event = (void *)&v4l2_event.u.data;

uvc_event分为2类:

  • UVC_EVENT_SETUP 控制请求
  • UVC_EVENT_DATA 控制请求OUT事务的数据包

    UVC_EVENT_SETUP 的IN事务数据包通过UVCIOC_SEND_RESPONSE ioctl下发给驱动。

truct uvc_event {
    union {
        enum usb_device_speed speed;
        struct usb_ctrlrequest req; //UVC_EVENT_SETUP
        struct uvc_request_data data; //UVC_EVENT_DATA
    };
};
struct usb_ctrlrequest {
    __u8 bRequestType;
    __u8 bRequest;
    __le16 wValue;
    __le16 wIndex;
    __le16 wLength;
} __attribute__ ((packed));

struct uvc_request_data {
    __s32 length;
    __u8 data[60];
};

UVC_EVENT_SETUP

UVC_EVENT_SETUP事件就是标准的SETUP事务,USB控制请求,所以从理论上包括标准请求、类请求和Vendor自定义请求,这里需要关注的是类请求。
UVC的类请求分为两类:VC和VS的区别可以通过wIndex & 0xff来获取对应的接口描述符ID来判断。

  • 第一类为UVC视频控制接口GET_CUR,SET_CUR,GET_DEF等标准类请求,主要是相机终端、处理单元、扩展单元的请求。
  • 第二类为UVC类视频流控制请求,主要涉及的是数据流接口的PROB COMMIT请求,也是一大堆的GET_CUR和SET_CUR等。

对于UVC控制接口,当unitId=0时,cs=UVC_VC_REQUEST_ERROR_CODE_CONTROL表求请求错误代码信息,通常由主机(如PC)向UVC设备(如摄像头)发送,以查询或清除设备报告的错误状态。

static void uvc_events_process_control(
    struct uvc_device *dev, uint8_t req, uint8_t cs, uint8_t entity_id, uint8_t len, struct uvc_request_data *resp)
{
    switch (entity_id) {
    case 0:
        switch (cs) {
        case UVC_VC_REQUEST_ERROR_CODE_CONTROL:
            /* Send the request error code last prepared. */
            resp->data[0] = dev->request_error_code.data[0];
            resp->length = dev->request_error_code.length;
            break;

        default:
            /*
             * If we were not supposed to handle this
             * 'cs', prepare an error code response.
             */
            dev->request_error_code.data[0] = 0x06;
            dev->request_error_code.length = 1;
            break;
        }
        break;
本文链接为:http://www.usbzh.com/article/detail-1606.html ,欢迎转载,转载请附上本文链接。

0 篇笔记 写笔记

Linux V4L2框架
Linux系统支持多钟多样的Video设备,如通过USB总线连接的相机,通过PCI设备连接的摄像头,通过MIPI总线连接其它Video设备。故Linux系统专门开发了V4L2子设备用来管理此类设备。V4L2子系统向上为虚拟文件系统VFS提供一的接口,这样应用程序就可以通过虚拟文件系统访问视频设备。......
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......
UVC事件包括两类,分别为数据事件(读写)和异常事件。这两类事件可通过select函数查看。事件的注册可见: struct v4l2_event_subscription sub; memset(&sub, 0, sizeof sub); sub.type = UVC......
V4L2从视频设备中传输数据方式有以下四种: enum v4l2_memory { V4L2_MEMORY_MMAP = 1, V4L2_MEMORY_USERPTR = 2, V4L2_MEMORY_OVERLAY ......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

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

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