Linux相机设备对象
2025-12-08
本文链接为:http://www.usbzh.com/article/detail-1604.html ,欢迎转载,转载请附上本文链接。
Linux相机驱动中比较重要的设备对象:
struct video_device vdev;
struct v4l2_device v4l2_dev;
struct uvc_video video;
| 特性 | struct video_device |
struct v4l2_device |
struct uvc_video |
|---|---|---|---|
| 所属层次 | V4L2设备接口层 | V4L2框架管理层 | UVC功能实现层 |
| 主要目的 | 提供/dev/videoX接口 | 管理V4L2子设备 | 处理视频数据流 |
| 用户可见 | 直接可见(设备节点) | 内核内部,用户不可见 | 内核内部,用户不可见 |
| 生命周期 | 随设备创建/销毁 | 随驱动加载/卸载 | 随UVC功能绑定/解绑 |
| 包含关系 | 包含v4l2_device指针 | 被video_device引用 | 被uvc_device包含 |
| 典型大小 | ~1-2KB | ~200-500字节 | ~几百字节 |
┌─────────────────────────────────────────────┐
│ 应用层 (用户空间) │
│ /dev/videoX 设备节点 │
└───────────────────┬─────────────────────────┘
│
▼ V4L2系统调用
┌─────────────────────────────────────────────┐
│ struct video_device │ ← 用户接口层
│ (视频设备实例,驱动直接操作) │
└───────────────────┬─────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ struct v4l2_device │ ← 框架管理层
│ (V4L2设备框架,协调多个子设备) │
└───────────────────┬─────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ struct uvc_video │ ← 硬件/功能层
│ (UVC特定功能,视频数据处理) │
└─────────────────────────────────────────────┘
设备注册方法:
// 驱动开发者使用video_device
struct video_device *vdev = video_device_alloc();
vdev->ioctl_ops = &my_ioctl_ops;
video_register_device(vdev, VFL_TYPE_VIDEO, -1);
// 框架开发者使用v4l2_device
struct v4l2_device *v4l2_dev;
v4l2_device_register(&pdev->dev, v4l2_dev);
v4l2_device_call_all(v4l2_dev, core, s_power, 1);
// UVC开发者使用uvc_video
struct uvc_video *video = &uvc->video;
uvc_video_encode(video, buf); // 编码视频帧
usb_ep_queue(video->ep, req); // 提交USB请求
生命周期:
// 创建顺序
1. uvc_device分配(包含v4l2_dev、vdev、video)
2. v4l2_device初始化
3. uvc_video初始化
4. video_device注册
// 销毁顺序(反向)
1. video_device注销
2. uvc_video清理
3. v4l2_device注销
4. uvc_device释放
本文链接为:http://www.usbzh.com/article/detail-1604.html ,欢迎转载,转载请附上本文链接。
Linux&UVC驱动





