Linux V4l2子系统专栏之一 子系统概述

从本章开始 , 我们开始分析V4L2子系统(Video for Linux two) , 主要用于音视频设备的框架 。 V4l2
主要用于驱动视频输出设备(video outpt interface)、Video overlay interface、Video output overlay device、
【Linux V4l2子系统专栏之一 子系统概述】VBI interface、Radio interface等 。 本专栏主要分为如下几章:
一、LINUX V4L2子系统概述
二、LINUX V4L2相关数据结构说明
三、LINUX video device分析
四、linux v4l2 device分析
五、linux v4l2 ctrls分析
六、linux v4l2 sub-device分析
七、linux v4l2 filehandler分析等几部分
八、linux v4l2 videobuffer介绍
一、v4l2子系统框架
如下即为v4l2子系统框架 , 针对v4l2子系统而言 , 其主要通过字符设备节点与应用层交互:

  1. 通过字符设备文件 , 应用程序可通过字符设备文件完成与具体v4l2 device的通信;
而在v4l2子系统内部 , 则主要包括如下几方面的内容:
  1. video_device结构体用于创建v4l2 device对应的字符设备节点 , 该数据结构包含了指向v4l2-dev的指针、字符设备指针(struct cdev类型)、字符设备文件相关的操作接口指针、v4l2 control handler、v4l2_fh;
  2. v4l2_dev则是对一个v4l2_dev的抽象 , 该v4l2_dev管理该device下所有的子设备(即v4l2_subdev) , 若该v4l2_dev没有子设备 , 则v4l2_dev的作用应该不大 , 基本上针对没有子设备的v4l2,借助video_device操作 , 即可完成针对该v4l2_dev的访问操作(通过字符设备的读、写、ioctl接口即可);
  3. V4l2_subdev则代表一个v4l2 dev的子设备 , 针对一个v4l2 dev , 可以完成各种任务操作 , 但通常他们负责音视频复用和编解码 。 如网络摄像头的子设备通常是传感器和摄像头控制器 。针对v4l2_subdev则提供了该子设备的操作接口等信息 , 可实现与子设备的通信操作;
  4. V4l2_fh则对应一个已打开的v4l2_dev字符设备file , 可以理解为该打开字符设备file的handler , 一般为该字符设备文件的私有v4l2_dev变量;通过v4l2_fh , 可以使用v4l2子系统提供的v4l2 control handler以及v4l2 event相关机制;
  5. V4l2 event机制主要实现将v4l2 dev的触发事件发送给应用程序 , 主要借助poll 、wait机制实现 。
  6. v4l2_ctrl_handler是v4l2设备控制方法集的结构体 , 可通过字符设备文件提供的ioctl接口访问对应的方法
  7. videobuff用于v4l2的buff操作 , 针对v4l2 device , 主要有三种IO访问方法(read/write)、内存映射缓冲区(内核驱动申请缓存并mmap至应用层)、USERPTR(
应用层负责分配内存空间 , 通过指针的形式传递给V4L2子系统驱动 , V4L2 device driver会把捕获的内容保存至指针所指的空间)
Linux V4l2子系统专栏之一 子系统概述文章插图
以上即是本章的主要内容 , 简要说明了v4l2 子系统的几个大的模块 。 从现在开始即要进入v4l2子系统的分析 , 如有存在错误的地方 , 还希望大家能斧正 , 我也是在学习中 , 难免存在错误 。