uvc驱动程序主要位于3.42内核\drivers\media\video\uvc文件夹中。由于本身十分复杂,在此只做简单分析。
这幅图来源于UVC的规格书。可以看到一个完整的UVC设备主要分为两个部分:
通过VideoControl Interface来控制,
通过VideoStreaming Interface来读视频数据,
VC里含有多个Unit/Terminal等功能模块,可以通过访问这些模块进行控制,比如调亮度。
分析UVC驱动调用过程
在uvc_v4l2.c中,有:
const struct v4l2_file_operations uvc_fops = {
.owner = THIS_MODULE,
.open = uvc_v4l2_open,
.release = uvc_v4l2_release,
.unlocked_ioctl = uvc_v4l2_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl32 = uvc_v4l2_compat_ioctl32,
#endif
.read = uvc_v4l2_read,
.mmap = uvc_v4l2_mmap,
.poll = uvc_v4l2_poll,
#ifndef CONFIG_MMU
.get_unmapped_area = uvc_v4l2_get_unmapped_area,
#endif
};
通过以上这些函数接口实现应用程序的系统调用。
下面一个一个分析:
- open:
uvc_v4l2_open
ioctr:下面的调用通过uvc_v4l2_ioctl函数实现的:
- VIDIOC_QUERYCAP // video->streaming->type 应该是在设备被枚举时分析描述符时设置的
if (video->streaming->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE