• USB摄像头驱动框架分析


    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驱动所在路径:driversmediavideouvc(3.4.2内核),该路径下的所有文件都是UVC的驱动程序。首先看一下Makefile

    uvcvideo-objs  := uvc_driver.o uvc_queue.o uvc_v4l2.o uvc_video.o uvc_ctrl.o 
              uvc_status.o uvc_isight.o uvc_debugfs.o
    ifeq ($(CONFIG_MEDIA_CONTROLLER),y)
    uvcvideo-objs  += uvc_entity.o
    endif
    obj-$(CONFIG_USB_VIDEO_CLASS) += uvcvideo.o

    这个驱动程序含有多个.c,最终会编译成一个uvcvideo.ko

    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摄像头的硬件框图:

  • 相关阅读:
    String、StringBuffer与StringBuilder之间区别
    关于 hashCode() 你需要了解的 3 件事
    Java基础之 运算符
    Java基础之基础语法
    Java基础之Java 修饰符
    自动化-python介绍与基础
    vue访问本地后台
    vue请求报错Uncaught (in promise)
    使用vue-resource,get、post、jsonp都报未定义的错误。
    【蓝桥杯】历届试题 打印十字图
  • 原文地址:https://www.cnblogs.com/-glb/p/10344329.html
Copyright © 2020-2023  润新知