Linux ARM平台开发系列讲解(摄像头V4L2子系统) 2.12.2 摄像头V4L2出图框架介绍

1. 前言

在分析v4l2之前最好具有的知识:

  • 字符设备,因为v4l2是被枚举为字符设备。
  • 内存分配和映射,比如相关数据结构的分配和buffer
  • DMA,因为v4l2的数据传输用到了DMA
  • I2C,因为很多传感器都是用的i2c接口。
  • 文件系统的基本操作,比如open()ioctl()
  • 设备树,因为子设备的异步注册就是靠设备树的的信息来实现的。

2. 概述

V4L2 是专门为 linux 设备设计的一套视频框架,其主体框架在 linux 内核,可以理解为是整个 linux 系统上面的视频源捕获驱动框架。其广泛应用在嵌入式设备以及移动端、个人电脑设备上面,市面上的编码产品类如:SDV手机IPC行车记录仪都会用到这个框架来进行视频采集。

3. 基本框架概念

V4L2驱动属于字符设备驱动,且属于相对复杂的字符设备驱动,对于一个字符设备,我们的编写步骤一般为:

  • 构造一个file_operation结构体,编写系统调用函数open,read,ioctl

  • 驱动入口函数:在入口函数注册主次设备号,cdev,class,device

  • 驱动卸载函数

4. V4L2驱动框架

Linux ARM平台开发系列讲解(摄像头V4L2子系统) 2.12.2 摄像头V4L2出图框架介绍_第1张图片
从图中可以看出V4L2驱动框架也分为核心层硬件相关层

  • V4L2核心层:核心层主要负责注册字符设备,由内核提供open,read,write等接口给用户空间,为视频操作提供统一接口函数。
  • 平台V4L2驱动:根据每一个硬件平台的不同特性实现,包括向V4L2核心层注册Video_device以及V4L2_device,在V4L2_device中管理一个v4l2_subdev链表,用户空间发生系统调用时,首先调用V4L2核心层函数,再通过调用平台V4L2驱动再通过v4l2_subdev_callv4l2_subdev中提供的相关操作。
  • 具体子设备的驱动:主要实现设置分辨率,提供上电时序,视频流开启关闭等一系列操作供给上层使用,并注册v4l2_subdev

5. V4L2驱动主要结构体

v4l2驱动框架主要的对象有video_devicev4l2_devicev4l2_subdevvideobuf

  • video_device:一个字符设备,为用户空间提供设备节点:dev/videoX,提供驱动与应用交互的系统调用函数。
  • v4l2_device:表示一个v4l2设备的实例,由其可以引出一个子设备结构体v4l2_subdev,其中有多少个输入设备就有多少video_device结构体,比如一个高清摄像头,作为一个整体,看作是一个v4l2_device,其包含ISP,MIPI等对应输入子设备v4l2_subdev,它们都属于这一个v4l2_device之下。
  • v4l2_subdev:目前 v4l2驱动 随着需求以及硬件的变化越来越复杂,v4l2驱动需要支持音频,视频,解码,编码等ic,使得大部分 v4l2设备都包含了多个子设备IC,例如 解编码器,传感器,摄像头控制器等等,所以在/dev目录下不仅仅要建立v4l2的节点,还需要建立各个IC的设备节点,如fb,i2c,inputalsa等设备节点,通常这些IC通过i2c总线与主板连接,以上设备统称为 sub-devices 子设备,代表实实在在的camera等传感器设备,通常指挂在i2c总线。驱动需要与子设备进行通信,这些子设备一般情况下就是音频处理,编解码器等,camera常见的子设备有传感器和摄像头控制器,为了方便代码管理,内核 v4l2 提供了一个统一的接口给这些子设备,即 v4l2_subdev 结构体。

返回总目录

你可能感兴趣的:(Linux,ARM平台从入门到精通,linux,arm,arm开发,v4l2,摄像头)