该程序为USB摄像头驱动程序。
在编写驱动程序之前需要先了解UVC相关的规则, 推荐USB_Video_Payload_MJPEG_1.5文档。UVC规范主要为VC接口与VS接口,其中VC接口用于控制设备的功能,而VS接口用于传输视频数据流。VC中有多个unit实现不同的控制功能,例如PU(process unit)能够控制亮度,白平衡等。VS中有多个formats(数据格式如YUV/MJPEG等),一个formats中有多个frame(分辨率如640*320等大小),实现设置图像数据的格式以及大小。
程序分析:
一.uvc_driver.c
从uvc_init函数开始看:
usb_register(&uvc_driver.driver); //注册usb设备
.driver = {
.name= "uvcvideo",
.probe= uvc_probe,
.disconnect= uvc_disconnect,
.suspend= uvc_suspend,
.resume= uvc_resume,
.reset_resume= uvc_reset_resume,
.id_table= uvc_ids,
.supports_autosuspend = 1,
},
对于uvc_probe函数:
uvc_register_chains(dev)
uvc_register_terms(dev, chain);
uvc_register_video(dev, stream);
vdev = video_device_alloc();
vdev->fops = &uvc_fops; / /在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
};
video_register_device(vdev, VFL_TYPE_GRABBER, -1); / /进入到v4l2_dev.c进行注册, cdev_alloc( );cdev_add( );
二.分析调用过程以及主要的11个ioctl(ioctl_qurycap,四个format,四个buffer,streaming_on以及streaming_off)
1. open:
uvc_v4l2_open
2. VIDIOC_QUERYCAP // video->streaming->type 应该是在设备被枚举时