V4L2架构可以参考  linux-3.4.2\Documentation\video4linux\v4l2-framework.txt

V4L2全名为Video For Linux 2,它是针对Linux系统的视频设备处理架构。视频设备主要包括输入设备(摄像头)及输出设备(显示设备)。

一、 Linux的V4L2架构介绍

V4L2的初衷是想为linux系统建立统一的视频类设备处理模型,让驱动开发者依靠其驱动模型轻松的完成video设备的驱动,让视频应用程序可以轻松的使用其接口完成应用程序开发。V4L2的整体架构如下图所示:

Ø  video设备

视频设备按输入输出来看,输入设备常见的就是摄像头了,输出设备常见的就是显示器、电视机。

Ø  video设备接口

l  摄像头接口一般有:

ITU-R BT601/656:国际电信联盟针对数字电视演播室的视频接口及数据流格式所做的标准,比较老一点的手机摄像头一般都采用这种接口。

MIPI CSI:移动行业处理器接口联盟定义的摄像头数字串行接口,是当今主流的手机摄像头接口。

USB:USB摄像头一般常见在台式机上,USB协议中有专门针对video设备的接口类(interfaceclass=0x0E)。

l  视频显示接口一般有:

HDMI:高清晰度多媒体接口,可同时传输音频及视频信号,广泛用于数字机顶盒、个人电脑、平板电脑、高清数字电视当中。

VGA:它是一种模拟信号视频接口,广泛用于PC电脑与显示器中,几乎所有显卡都支持该接口。数字电路中使用该类接口需要用到数模视频编码器,将视频的数字信号转化为模拟信号进行传输。

TV-out:TV-out只是一个泛指,指电视中常见的视频模拟接口,如AV接口,S端子,YPbPr接口等。同VGA一样,数字电路中使用该类接口需要用到TV视频编码器,将视频的数字信号转化为TV模拟信号进行传输。

Ø  video设备接口驱动

该部分需要驱动开发者针对不同的视频设备接口,完成其接口驱动。

Ø  video设备驱动

该部分是驱动开发者在进行视频设备驱动开发时,需要重点实现的对象。驱动开发者需要根据V4L2提供的驱动模型,完成对具体视频设备硬件控制的底层实现。Linux为开发者提供了V4L2驱动开发的示例源码:“/drivers/media/video/vivi.c”或者“/drivers/media/video/uvc/uvc_driver.c”。

Ø  V4L2核心

该部分是Linux视频设备的架构核心,它对下为驱动开发者提供统一的视频设备驱动开发模型,对上为应用开发者提供操作视频设备的统一接口。其在linux中的核心源码路径为:“/drivers/media/video/v4l2-dev.c”。

Ø  V4L2应用接口

应用程序通过V4L2提供read()、write()、ioctl()编程接口,来控制操作视频设备,如:设置图像分辨率、视频数据格式、开始/结束视频捕获等等。

二、 V4L2设备驱动编写

Linux的video设备驱动实现,驱动开发者需要按照V4L2的驱动模型进行设计,该驱动模型主要围绕核心数据结构struct video_device来展开设计,通过该数据结构来完成视频设备的分配、设置、注册等工作。驱动程序需要重点实现两个操作集:v4l2_file_operations和v4l2_ioctl_ops,V4L2架构最终会调用这两个操作集中的函数接口,来完成对视频设备硬件的控制。其实现流程如下图所示:

三、 V4L2_subdev与v4l2_device的出现

V4L2 驱动随着硬件的变化也越来越复杂,现在大部分设备里面包含了多个子设备IC,比较常见的子设备如编解码器、传感器、摄像头控制器等。通常这些IC通过 i2c 总线连接到主板,这些设备都统称为sub-devices。

在很长的一段时间里 V4L2 被限制只能在 video_device 结构体里面创建,并且用video_buf控制视频缓存,这意味着所有的驱动创建自己的实例都将连接到自己的sub-devices,这些工作通常很复杂并经常引起错误,许多常见的代码因为缺乏一个框架而无法重构。因此 V4L2  框架作了相应的优化:它有一个 v4l2_device 结构作为设备实例,一个v4l2_subdev结构作为子设备实例,video_device 结构包含了v4l2_device 节点,每个视频设备都采用 v4l2_device 结构来表示。为了提供统一的接口给这些子设备,内核将涉及到子设备控制的那部分独立了出来,用 struct v4l2_subdev 来表示以方便用户实现 v4l2 驱动程序。现如今的V4L2设备关系用一个比较粗糙的图来表示他们之间的关系,大致为:

设备实例(v4l2_device)

|______子设备实例(v4l2_subdev)

|______视频设备节点(video_device)

|______文件访问控制(v4l2_fh)

|______视频缓冲的处理(videobuf/videobuf2)

8、摄像头驱动_Linux的V4L2架构分析的更多相关文章

  1. 摄像头驱动——V4L2框架分析

    一.概述 Video for Linux 2,简称V4l2,是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口. 摄像头驱动是属于字符设备驱动程序.(分析linu ...

  2. 初始v4l2(六)-------根据虚拟驱动vivi的使用彻底分析摄像头驱动

    前面的几篇文章已经分析了v4l2的框架,对框架的分析是比较粗浅的,能基本清楚函数之间的调用过程.但是很多内容并没有分析,比如说里面有很多ioctl,并没有分析哪些ioctl是必须的,也没有分析如何从应 ...

  3. 二十四、V4L2框架主要结构体分析和虚拟摄像头驱动编写

    一.V4L2框架主要结构体分析 V4L2(video for linux version 2),是内核中视频设备的驱动框架,为上层访问视频设备提供统一接口. V4L2整体框架如下图: 图中主要包括两层 ...

  4. V4L2(二)虚拟摄像头驱动vivi深入分析【转】

    转自:http://www.cnblogs.com/tureno/articles/6694463.html 转载于: http://blog.csdn.net/lizuobin2/article/d ...

  5. s5k4ba摄像头驱动分析

    注释: 本驱动是基于S5PV310的,但是全天下的摄像头驱动都是采用V4L2,因此驱动框架流程基本差不多.其中fimc_init_camera()函数会回调.init函数,该函数主要就是通过IIC总线 ...

  6. 找回了当年一篇V4L2 linux 摄像头驱动的博客

    从csdn找回 , 无缘无故被封了..当时损失不少啊!!!!!!!!! linux 摄像头驱动 :核心数据结构:    /**     * struct fimc_dev - abstraction ...

  7. Hi3559AV100外接UVC/MJPEG相机实时采图设计(一):Linux USB摄像头驱动分析

    下面将给出Hi3559AV100外接UVC/MJPEG相机实时采图设计的整体流程,主要实现是通过V4L2接口将UVC/MJPEG相机采集的数据送入至MPP平台,经过VDEC.VPSS.VO最后通过HD ...

  8. Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析

    关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸机开发 —— IIC总线 ,下面回顾下 IIC 基础概念 一.IIC 基础概念 IIC(Inter-Integrated Ci ...

  9. 通过虚拟驱动vivi分析摄像头驱动

    Linux摄像头驱动学习之:(二)通过虚拟驱动vivi分析摄像头驱动 一.通过指令 "strace -o xawtv.log xawtv" 得到以下调用信息: // 1~7都是在v ...

随机推荐

  1. centos6.5 数据库的安装

    mongo https://www.cnblogs.com/layezi/p/7290082.html

  2. api h5 sdk 接入的说明

    api 接入 :纯后台接入没有页面 h5接入: 有页面的接入  需要和客户交互 客户输入内容 sdk 接入:需要对方的sdk文件 植入文件

  3. cron 简单任务调度 go

    package main import ( "github.com/robfig/cron" "log" ) func main() { i := 0 c := ...

  4. 调用中行接口针对返回报文(xml形式)做相关处理

    最近在对接中行银行接口,在获取返回报文的时候遇到一些问题,现在在这里做个总结 TIP: 在返回报文之前,要对前置机的URL请求,在这期间遇到一个坑,还是通过查看日志才发现问题 在填写转账信息的时候要求 ...

  5. Android eclipse 提示java代码 快捷键

    1.提示java代码能够用ALT+/ 键就能够了(前提是你要把你须要的类或方法的首字母打出来).我添加的部分:仅仅要输入sysout,然后alt+/键就能够输出System.out.prinln(), ...

  6. 【UWP通用应用开发】控件、应用栏

    控件的属性.事件与样式资源 怎样加入控件 加入控件的方式有多种,大家更喜欢以下哪一种呢? 1)使用诸如Blend for Visual Studio或Microsoft Visual Studio X ...

  7. 取消cp命令别名

    1. 取消cp命令别名unalias cpcp -rf恢复别名alias cp='cp -i'2.关闭当前用户下的cp别名配置sed -i "s/alias cp='cp -i'/#alia ...

  8. actionBarTab-actionBarTab自定义 布局没法改变其中字体相对中间的位置

    我们经常遇到对actionBarTab 进行操作的情况.现在记录修改它的样式的方法,已经如何自定义tab的显示布局 1.在你的theme主题中添加<item name="android ...

  9. Multiple CPUs,Multiple Cores、Hyper-Threading

    CPU Basics: Multiple CPUs, Cores, and Hyper-Threading Explained 现在多数的家用电脑,仍然使用的是 Single CPU,Multiple ...

  10. Python中对于GIL全局解释器锁的一点理解

    GIL全局解释器锁 python最初开发时,开发人只考虑到了单核CPU的,为解决多线程运算之间的数据完整性和状态同步选择了加锁的方式.即GIL锁. 而目前的CPU都有多个核心,在运行python的某个 ...