1. 前言

V4L2是Video for linux2的简称,是 linux 中关于视频设备的内核驱动框架。

camera 驱动就采用了 V4L2框架,貌似收音机驱动也可以采用V4L2框架,因为我在V4L2部分看到了收音机相关的代码,但是没有深入研究,此处就不做讨论,本篇讨论摄像头驱动。

2. 概念

制式和帧格式是两个东西,制式是指PAL,NTSC这些东西;帧格式是指图像的宽度、高度等这些东西。

摄像头主要采用PAL和NTSC制式,采用PAL制式的摄像头为模拟摄像头,采用NTSC制式的摄像头为数字摄像头。

CSI和DPI是MIPI标准的一种,因为MIPI在移动领域应用范围太广了,各种外围设备都可以用它来传输信息,所以,MIPI联盟给不同的外设接口定义了版本名,CSI是for Camera的,DPI是for Display的。

2. 注释

在正式看代码之前,将一些结构体、变量、接口进行注释,有助于看代码时的流畅。

2.1 常用结构体

常用的结构体在内核目录include/linux/videodev2.h中定义

struct v4l2_requestbuffers    //申请帧缓冲,对应命令VIDIOC_REQBUFS
struct v4l2_capability        //视频设备的功能,对应命令VIDIOC_QUERYCAP
struct v4l2_input             //视频输入信息,对应命令VIDIOC_ENUMINPUT
struct v4l2_standard          //视频的制式,比如PAL,NTSC,对应命令VIDIOC_ENUMSTD
struct v4l2_format            //帧的格式,对应命令VIDIOC_G_FMT、VIDIOC_S_FMT等
struct v4l2_buffer            //驱动中的一帧图像缓存,对应命令VIDIOC_QUERYBUF
struct v4l2_crop              //视频信号矩形边框
v4l2_std_id                   //视频制式

2.2 IOCTL命令码

常用的IOCTL接口命令也在include/linux/videodev2.h中定义

VIDIOC_REQBUFS       //分配内存
VIDIOC_QUERYBUF      //把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址
VIDIOC_QUERYCAP      //查询驱动功能
VIDIOC_ENUM_FMT      //获取当前驱动支持的视频格式
VIDIOC_S_FMT         //设置当前驱动的频捕获格式
VIDIOC_G_FMT         //读取当前驱动的频捕获格式
VIDIOC_TRY_FMT       //验证当前驱动的显示格式
VIDIOC_CROPCAP       //查询驱动的修剪能力
VIDIOC_S_CROP        //设置视频信号的矩形边框
VIDIOC_G_CROP       //读取视频信号的矩形边框
VIDIOC_QBUF         //把数据从缓存中读取出来
VIDIOC_DQBUF        //把数据放回缓存队列
VIDIOC_STREAMON     //开始视频显示函数
VIDIOC_STREAMOFF    //结束视频显示函数
VIDIOC_QUERYSTD     //检查当前视频设备支持的标准,例如PAL或NTSC。

3. 接口

V4L2规范中不仅定义了通用API元素(Common API Elements),图像的格式(Image Formats),输入/输出方法(Input/Output),还定义了Linux内核驱动处理视频信息的一系列接口(Interfaces),这些接口主要有:

Video Capture Interface   视频采集接口,这种接口应用于摄像头
Video Output Interface    视频输出接口,将静止图像或图像序列编码为模拟视频信号,通过此接口,应用程序可以控制编码过程并将图像从用户空间移动到驱动程序
Video Overlay Interface   视频覆盖/预览接口,可以将采集到的视频数据直接传输到显示设备,不需要cpu参与,这种方式的显示图像的效率比其他方式高得多
Video Output Overlay Interface 视频输出覆盖接口
Codec Interface           编解码接口

4. 设备

Video capture device : 从摄像头等设备上获取视频数据。对很多人来讲,video capture是V4L2的基本应用。设备名称为/dev/video,主设备号81,子设备号0~63

Video output device : 将视频数据编码为模拟信号输出。与video capture设备名相同。

Video overlay device : 将同步锁相视频数据(如TV)转换为VGA信号,或者将抓取的视频数据直接存放到视频卡的显存中。

Video output overlay device :也被称为OSD(On-Screen Display)

VBI device : 提供对VBI(Vertical Blanking Interval)数据的控制,发送VBI数据或抓取VBI数据。设备名/dev/vbi0~vbi31,主设备号81,子设备号224~255

Radio device : FM/AM发送和接收设备。设备名/dev/radio0~radio63,主设备号81,子设备号64~127

5. 数据采集

V4L2支持内存映射方式(mmap)和直接读取方式(read)来采集数据,前者一般用于连续视频数据的采集,后者常用于静态图片数据的采集,本文重点讨论内存映射方式的视频采集。

帧传输:使用read和write方法,每一帧都要通过I/O操作在用户和内核空间之间拷贝数据。

流传输:用户与内核空间之间交换缓冲区指针,这些缓冲区将被映射到应用的地址空间

流数据调用:支持流输入输出的驱动应该通知应用这一事实,方法是在“VIDIOC_QUERYCAP”下设置V4L2_CAP_STREAMING标签。

Linux camera驱动(1) - 概述相关推荐

  1. Linux网络设备驱动结构概述

    2019独角兽企业重金招聘Python工程师标准>>> 网络设备驱动相比字符型设备的驱动要复杂一些,除了总体上驱动的框架有一些相似外,有很多地方都是不同,但网络设备驱动有一个很大的特 ...

  2. FS_S5PC100平台上Linux Camera驱动开发详解(二)

    http://blog.csdn.net/wh_19910525/article/details/18091915 这个问题弄清楚了以后下面就来看获得Camera信息以后如何做后续的处理: 在fimc ...

  3. Linux V4l2驱动 -- 框架概述

    V4l2框架简述 1 硬件 常用的电脑摄像头是USB接口,主流的智能手机摄像头是MIPI接口,另外还有像树莓派等硬件使用的CSI接口的设备.常用的智能手机Camera采用的MIPI接口,电路框架以及电 ...

  4. Linux设备驱动开发概述

    作者:宋宝华 email:author@linuxdriver.cn 在过去这些年,Linux已经成功应用于服务器和桌面系统,而近年来,随着嵌入式系统应用的持续升温,Linux也开始广泛应用于嵌入式领 ...

  5. linux摄像头内核驱动开发,FS_S5PC100平台上Linux Camera驱动开发详解(一)

    说明: 理解摄像头驱动需要四个前提: 1)摄像头基本的工作原理和S5PC100集成的Camera控制器的工作原理 2)platform_device和platform_driver工作原理 3)Lin ...

  6. Linux设备驱动模型概述(Linux device driver model overview)

    平台(platform)设备和平台驱动是连接到平台总线(bus)的linux驱动模型接口,总线将设备和驱动绑定,这个伪总线(platform bus)以最小的基础结构被用来连接设备到总线上.在系统每注 ...

  7. Linux网络驱动架构

    转载来自:https://blog.csdn.net/zhoudengqing/article/details/47406821 转 Linux网络驱动架构 2015年08月10日 22:54:39 ...

  8. Linux驱动(1)--关于驱动的概述

    关于驱动的概述 Linux驱动包含三种:字符设备驱动.块设备驱动.网络设备驱动.块设备驱动主要包括存储类设备的驱动,比如RAM,SD卡等:网络设备驱动主要包括网络相关设备的驱动,比如以太网等:剩下的都 ...

  9. Linux驱动开发概述

    第 1 章 Linux驱动开发概述 设备驱动程序是计算机硬件与应用程序的接口,是软件系统与硬件系统沟通的桥梁.如果没有设备驱动程序,那么硬件设备就只是一堆废铁,没有什么功能.本章将对Linux驱动开发 ...

最新文章

  1. Linux常用命令学习(shell 脚本)
  2. git在项目中的实际运用
  3. poj 1470(简单LCA 倍增法)
  4. 猫眼电影评论_电影的人群意见和评论家的意见一样好吗?
  5. 让人欲罢不能的量子学
  6. [C#]文件中转站程序及源码
  7. SQL service 数据库 某工厂的物料管理系统数据库设计与实现
  8. excel两个表格数据对比_用vlookup把两个或者多个excel表格,整合到一个表格中
  9. syntactic 与semantic 的区别
  10. FreeRTOS临界区操作
  11. Oracle的LAST_DAY函数
  12. Win10移除右键无用的菜单选项--注册表的自定义管理
  13. LeetCode——复数乘法 C++
  14. 记忆化搜索例题 记忆化搜索
  15. 网络舆情事件预警与分析工作实施措施与流程详解
  16. 作文未来的计算机医生300字,未来医生的好帮手作文300字
  17. java ant配置环境变量
  18. 系统稳定性指标计算器
  19. 备份文件系统中的文件到磁带库中(四)
  20. 为什么我要选择Java

热门文章

  1. 手机端input输入文字500ms之后查询
  2. 命令行贪吃蛇以及qt写的桌面贪吃蛇
  3. 电路设计篇【5】MOS管驱动电路设计,如何让MOS管快速开启和关闭?
  4. 【RuoYi-Vue-Plus】问题笔记 07 - V3.5.0 Redisson 报错 Unable to send PING command over channel
  5. Java开发框架!java枚举定义lists参数
  6. Serverless Knative Serving弹性扩缩容实践整理
  7. 电商用户行为数据分析(MySQL+Tableau)
  8. 三层架构与MVC详细讲解
  9. 【渝粤教育】电大中专建筑材料 (2)作业 题库
  10. Android生成简单的图片验证码