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
UVC摄像头技术笔记





