博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
camera驱动(一)
阅读量:3898 次
发布时间:2019-05-23

本文共 2665 字,大约阅读时间需要 8 分钟。

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_ENUMINPUTstruct 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标签。

转载地址:http://ehuen.baihongyu.com/

你可能感兴趣的文章
WIFI之服务器系统设计组成
查看>>
Linux之Arinc驱动设计草图
查看>>
Linux之grub.conf的内容介绍
查看>>
网址之Curl API整理说明
查看>>
Python之ftp的用法整理
查看>>
MStar之公司简介
查看>>
STB之业务架构图
查看>>
WebKit之Port篇幅介绍
查看>>
WebKit之Binding案例(testCallback.idl)
查看>>
WebKit之binding分析案例(testInterface.idl)
查看>>
WebKit之binding案例分析(testMediaQueryListListener.idl)
查看>>
Webkit之generate-bindings.pl源码分析
查看>>
WebKit之CodeGenerate-JS的perl脚本的分析和学习
查看>>
Linux之死锁的代码体验
查看>>
WebKit之webIDL详解
查看>>
WebKit之创建Event的2种方法
查看>>
CPP之中介者设计模式
查看>>
Event的三个阶段
查看>>
WebKit之MediaPlayer的简单分析
查看>>
WebKit之MediaPlayer之底层调度的源码分析
查看>>