uvc-driver.c分析

来源:互联网 发布:spss sas r python 编辑:程序博客网 时间:2024/06/10 21:38

该程序为USB摄像头驱动程序。

    在编写驱动程序之前需要先了解UVC相关的规则, 推荐USB_Video_Payload_MJPEG_1.5文档。UVC规范中说明了一个UVC设备需要实现一个VC(Video Control)接口和若干个VS(Video Streaming)接口,其中VC接口用于控制设备的功能,而VS接口用于传输视频数据流。

程序分析:

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->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( );


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
};

static long uvc_v4l2_ioctl

return video_usercopy(file, cmd, arg, uvc_v4l2_do_ioctl);

uvc_v4l2_do_ioctl

case VIDIOC_QUERYCAP:

case VIDIOC_QUERYCTRL:

......                                                 / /对ioctl控制指令进行处理

原创粉丝点击