UVC摄像头技术笔记
+ -

V4L2 UVC事件

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

UVC事件包括两类,分别为数据事件(读写)和异常事件。

数据事件

数据事件对应于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获取事件类型,当然有的事件是需要数据响应返回到UVC Gadget中。

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_FIRST            (V4L2_EVENT_PRIVATE_START + 0)
#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)
#define UVC_EVENT_LAST            (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 仅为枚举标记

当为事件时,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类:

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];
};
本文链接为:http://www.usbzh.com/article/detail-1606.html ,欢迎转载,转载请附上本文链接。

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936     USB技术交流3:1031974172

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函数的读写事件。对于UVC Gadget 应用写数据,当事件来到时。应 struct v4l2_buffer ubuf; ret = ioctl(dev->uvc_fd, ......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

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

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