USB摄像头驱动框架分析

时间:2022-01-22 11:50:18

usb摄像头驱动程序,里面涉及硬件的操作。比如说,想设置亮度的时候,需要把亮度的参数发给硬件。去得到真正视频数据的时候,需要访问硬件得到数据。usb摄像头驱动程序框架与虚拟摄像头驱动程序的框架是一样的。

1、构造一个usb_driver

2、设置

   probe:

    2.1 分配video_device  : video_device_alloc

    2.2 设置

      .fops

      .ioctl_ops(里面需要设置11项)

      如果需要内核提供的缓冲区操作函数,还需要构造一个videobuf_queue_ops

    2.3 注册 :video_register_device

  id_table: 表示支持哪些usb设备

当将usb设备接到板子上后,如果该设备能够被driver所支持,也就是说吻合这个id_table,此时probe函数就会被调用。在probe函数里面就可以做自己想做的事情了。

linux内核已经自带有usb摄像头的驱动程序,它支持UVC规格的摄像头

UVC:usb  video  class

基本上对于Windows下面,那种即插即用的usb摄像头,就吻合UVC规范的,不需要自己再去安装驱动程序。

UVC驱动所在路径:drivers\media\video\uvc\(3.4.2内核)

uvc_driver.c分析:

1、usb_register(&uvc_driver.driver)

2、

  struct uvc_driver uvc_driver = {
    .driver = {
    .name = "uvcvideo",
    .probe = uvc_probe,//当它发现所能支持的设备时,就会调用该函数
    .disconnect = uvc_disconnect,
    .suspend = uvc_suspend,
    .resume = uvc_resume,
    .reset_resume = uvc_reset_resume,
    //假设我们接上了一个usb摄像头,这个摄像头在uvc_ids里面,那么内核就会调用uvc_probe函数
    .id_table = uvc_ids,
    .supports_autosuspend = 1,
    },
  };

  uvc_probe

    uvc_register_chains(dev)

      uvc_register_terms(dev, chain);

        uvc_register_video(dev, stream);

          video = video_device_alloc();

          video->fops = &uvc_v4l2_fops;

          video_register_device(video, VFL_TYPE_GRABBER, -1); //到这个地方又回到了以前我们分析的video_register_device这个函数了。

-----------------------------------------------------------------------------------------------

接下来简要看一下,usb摄像头的硬件框图: