当前位置:操作系统 > 安卓/Android >>

Android设备驱动之——V4L2

Video for Linux Two
          
           V4L2的是V4L的第二个版本。原来的V4L被引入到Linux内核2.1.x的开发周期后期。Video4Linux2修正了一些设计缺陷,并开始出现在2.5.X内核。Video4Linux2驱动程序包括Video4Linux1应用的兼容模式,但实际上,支持是不完整的,并建议V4L2的设备使用V4L2的模式。现在,该项目的DVB-Wiki托管在LinuxTV的网站上。

        要想了解 V4l2 有几个重要的文档是必须要读的,Documentation/video4linux目录下的V4L2-framework.txt和videobuf、V4L2的官方API文档V4L2 API Specification 、drivers/media/video目录下的vivi.c(虚拟视频驱动程序 -此代码模拟一个真正的视频设备V4L2 API)。

        V4l2可以支持多种设备,它可以有以下几种接口:

         1. 视频采集接口(video capture inte易做图ce):这种应用的设备可以是高频头或者摄像头.V4L2的最初设计就是应用于这种功能的.

         2. 视频输出接口(video output inte易做图ce):可以驱动计算机的外围视频图像设备--像可以输出电视信号格式的设备.

         3. 直接传输视频接口(video overlay inte易做图ce):它的主要工作是把从视频采集设备采集过来的信号直接输出到输出设备之上,而不用经过系统的CPU.

         4. 视频间隔消隐信号接口(VBI inte易做图ce):它可以使应用可以访问传输消隐期的视频信号.

         5. 收音机接口(radio inte易做图ce):可用来处理从AM或FM高频头设备接收来的音频流.

V4L2 驱动核心

         V4L2 的驱动源码在 drivers/media/video目录下,主要核心代码有:
              v4l2-dev.c                  //linux版本2视频捕捉接口,主要结构体 video_device 的注册
 
              v4l2-common.c        //在Linux操作系统体系采用低级别的操作一套设备structures/vectors的通用视频设备接口。
                                  //此文件将替换videodev.c的文件配备常规的内核分配。

              v4l2-device.c            //V4L2的设备支持。注册v4l2_device
 
              v4l22-ioctl.c             //处理V4L2的ioctl命令的一个通用的框架。
                   
              v4l2-subdev.c          //v4l2子设备
 
              v4l2-mem2mem.c  //内存到内存为Linux和videobuf视频设备的框架。设备的辅助函数,使用其源和目的地videobuf缓冲区。

   头文件linux/videodev2.h、media/v4l2-common.h、media/v4l2-device.h、media/v4l2-ioctl.h、media/v4l2-dev.h、media/v4l2-ioctl.h等。


V4l2相关结构体

 1.V4l2_device

 struct V4l2_device{

      /* DEV-> driver_data指向这个结构。 注:DEV可能是空的,如果没有父设备是如同ISA设备。 */
      struct device *dev;
     /* 用于跟踪注册的subdevs */
    struct list_head subdevs;
    /*锁定此结构体;可以使用的驱动程序以及如果这个结构嵌入到一个更大的结构。 */
    spinlock_t lock;
    /* 独特的设备名称,默认情况下,驱动程序姓名+总线ID */
    char name[V4L2_DEVICE_NAME_SIZE];
   /*报告由一些子设备调用的回调函数。 */
     void (*notify)(struct v4l2_subdev *sd,
     unsigned int notification, void *arg);
};

v4l2_device注册和注销     
   
       v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev);  

     第一个参数‘dev’通常是一个pci_dev的struct device的指针,但它是ISA设备或一个设备创建多个PCI设备时这是罕见的DEV为NULL,因此易做图it不可能联想到一个特定的父母v4l2_dev。 您也可以提供一个notify()回调子设备,可以通过调用通知你的事件。取决于你是否需要设置子设备。一个子设备支持的任何通知必须在头文件中定义 .
  
    注册时将初始化 v4l2_device 结构体. 如果 dev->driver_data字段是空, 它将连接到 v4l2_dev.

       v4l2_device_unregister(struct v4l2_device *v4l2_dev);
        
    注销也将自动注销设备所有子设备。

2.video_device

      在/dev目录下的设备节点使用的 struct video_device(v4l2_dev.h)创建。
 struct video_device
     {
         /*设备操作函数 */
         const struct v4l2_file_operations *fops;

         /* 虚拟文件系统 */
         struct device dev;        /* v4l 设备 */
         struct cdev *cdev;        /* 字符设备 */

        struct device *parent;        /*父设备 */
        struct v4l2_device *v4l2_dev;    /* v4l2_device parent */

        /* 设备信息 */
         char name[32];
         int vfl_type;
         /* 'minor' is set to -1 if the registration failed */
        int minor;
        u16 num;
         /* use bitops to set/clear/test flags */
         unsigned long flags;
         /*属性来区分一个物理设备上的多个索引 */
        int index;

         /* V4L2 文件句柄 */
         spinlock_t        fh_lock; /*锁定所有的 v4l2_fhs */
         struct list_head    fh_list; /* List of struct v4l2_fh */

         int debug;            /* Activates debug level*/

         /* Video standard vars */
         v4l2_std_id tvnorms;        /* Supported tv norms */
         v4l2_std_id current_norm;    /* Current tvnorm */

         /* 释放的回调函数 */
&nb

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,