linux_驱动_V4l2层_camera_应用层调用流程_MIPI协议包格式简介

  一、 摄像头基础介绍                

1、摄像头结构和工作原理.

linux_驱动_V4l2层_camera_应用层调用流程_MIPI协议包格式简介

   拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电脑中进行处理,最终转换成手机屏幕上能够看到的图像。

数字信号处理芯片DSP(DIGITAL SIGNAL PROCESSING)功能:主要是通过一系列复杂的数学算法运算,对数字图像信号参数进行优化处理,并把处理后的信号通过USB等接口传到PC等设备。DSP结构框架:

  1). ISP(image signal processor)(镜像信号处理器)

  2). JPEG encoder(JPEG图像解码器)

  3). USB device controller(USB设备控制器)

    常见的摄像头传感器类型主要有两种,

一种是CCD传感器(Chagre Couled Device),即电荷耦合器。

一种是CMOS传感器(Complementary Metal-Oxide Semiconductor)即互补性金属氧化物半导体。

CCD的优势在于成像质量好,但是制造工艺复杂,成本高昂,且耗电高。在相同分辨率下,CMOS价格比CCD便宜,但图像质量相比CCD来说要低一些。CMOS影像传感器相对CCD具有耗电低的优势,加上随着工艺技术的进步,CMOS的画质水平也不断地在提高,所以目前市面上的手机摄像头都采用CMOS传感器。

linux_驱动_V4l2层_camera_应用层调用流程_MIPI协议包格式简介

手机摄像头的简单结构

滤光片有两大功用:

  1).滤除红外线。滤除对可见光有干扰的红外光,使成像效果更清晰。

       2).修整进来的光线。感光芯片由感光体(CELL)构成,最好的光线是直射进来,但为了怕干扰到邻近感光体,就需要对光线加以修整,因此那片滤光片不是玻璃,而是石英片,利用石英的物理偏光特性,把进来的光线,保留直射部份,反射掉斜射部份,避免去影响旁边的感光点.

 

2、相关参数和名词

1)、常见图像格式

    1.1 RGB格式:

    传统的红绿蓝格式,比如RGB565,RGB888,其16-bit数据格式为5-bit R + 6-bit G + 5-bit B。G多一位,原因是人眼对绿色比较敏感。

    1.2 YUV格式:

    luma (Y) + chroma (UV) 格式。YUV是指亮度参量和色度参量分开表示的像素格式,而这样分开的好处就是不但可以避免相互干扰,还可以降低色度的采样率而不会对图像质量影响太大。YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为很多种具体的格式。

色度(UV)定义了颜色的两个方面─色调与饱和度,分别用CB和CR表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。

主要的采样格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。

    1.3 RAW data格式:

    RAW图像就是CMOS或者CCD图像感应器将捕捉到的光源信号转化为数字信号的原始数据。RAW文件是一种记录了数码相机传感器的原始信息,同时记录了由相机拍摄所产生的一些元数据(Metadata,如ISO的设置、快门速度、光圈值、白平衡等)的文件。RAW是未经处理、也未经压缩的格式,可以把RAW概念化为“原始图像编码数据”或更形象的称为“数字底片”。sensor的每一像素对应一个彩色滤光片,滤光片按Bayer pattern分布。将每一个像素的数据直接输出,即RAW RGB data

Raw data(Raw RGB)经过彩色插值就变成RGB.

linux_驱动_V4l2层_camera_应用层调用流程_MIPI协议包格式简介

RAW格式图像示例

2). 相关技术指标

2.1 图像解析度/分辨率(Resolution)

  SXGA(1280 x1024)又称130万像素

  XGA(1024 x768)又称80万像素

  SVGA(800 x600)又称50万像素

  VGA(640x480)又称30万像素(35万是指648X488)

  CIF(352x288) 又称10万像素

  SIF/QVGA(320x240)

  QCIF(176x144)

  QSIF/QQVGA(160x120)

2.2 彩色深度(色彩位数)

    256色灰阶,有256种灰色(包括黑白)。

    15或16位彩色(高彩色):65,536种颜色。

    24位彩色(真彩色):每种原色都有256个层次,它们的组合便有256*256*256种颜色。

    32位彩色:除了24位彩色的颜色外,额外的8位是储存重叠图层的图形资料(alpha频道)。

2.3 光学变焦和数码变焦:

    光学变焦: 通过镜头的调整,拉近拉远所要拍摄的对象,保持像素不变和画质基本不变,却可以拍到自己             理想的物像。     数码变焦:其实没有什么变焦,只是从原图片中截取出来放大,你从液晶屏幕上看到变大了,实际上画质并没有本质提高,而像素比你相机能拍摄的最大像素降低了。 画质上说基本是鸡肋把,但是可以提供一些方便。

2.4 图像压缩方式:

    JPEG/M-JPEG

    H.261/H.263

    MPEG

    H.264 

2.5 图像噪音:

  指的是图像中的杂点干挠。表现为图像中有固定的彩色杂点。

2.6 自动白平衡处理技术(auto White Balance):

      简单来说就是:摄像机对白色物体的还原。相关概念:色温。

2.7 视角

  与人的眼睛成像是相成原理,简单说就是成像范围。

2.8 自动对焦:

       自动对焦可以分成两大类:一类是基于镜头与被拍摄目标之间距离测量的测距自动对焦,另一类是基于对焦屏上成像清晰的聚焦检测自动对焦(清晰度算法)。

注:变焦就是把远处的物体拉近。对焦是让图像清晰。

2.9 自动曝光和Gamma

      就是光圈和快门的组合。光圈,快门速度,ISO。Gamma即人眼对亮度的响应曲线。

二:V4L2调用流程

 转自:http://blog.csdn.net/g_salamander/article/details/8189893

     对于v4l2,上次是在调试收音机驱动的时候用过,其他也就只是用i2c配置一些寄存器就可以了。那时只是粗粗的了解了,把收音机当作v4l2的设备后会在/dev目录下生成一个radio的节点。然后就可以操作了。后来就没怎么接触了。这周,需要调试下usb的摄像头。因为有问题,所以就要跟进,于是也就要开始学习下linux的v4l2了。看到一篇很不错的文章,下面参考这篇文章,加上自己的一些见解,做一些总结把。

       Video for Linuxtwo(Video4Linux2)简称V4L2,是V4L的改进版。V4L2是linux操作系统下用于采集图片、视频和音频数据的API接口,配合适当的视频采集设备和相应的驱动程序,可以实现图片、视频、音频等的采集。在远程会议、可视电话、视频监控系统和嵌入式多媒体终端中都有广泛的应用。

在Linux下,所有外设都被看成一种特殊的文件,成为“设备文件”,可以象访问普通文件一样对其进行读写。一般来说,采用V4L2驱动的摄像头设备文件是/dev/video0。V4L2支持两种方式来采集图像:内存映射方式(mmap)和直接读取方式(read)。V4L2在include/linux/videodev.h文件中定义了一些重要的数据结构,在采集图像的过程中,就是通过对这些数据的操作来获得最终的图像数据。Linux系统V4L2的能力可在Linux内核编译阶段配置,默认情况下都有此开发接口。

       而摄像头所用的主要是capature了,视频的捕捉,具体linux的调用可以参考下图。

linux_驱动_V4l2层_camera_应用层调用流程_MIPI协议包格式简介

 

 

应用程序通过V4L2进行视频采集的原理

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

应用程序通过V4L2接口采集视频数据分为五个步骤:

首先,打开视频设备文件,进行视频采集的参数初始化,通过V4L2接口设置视频图像的采集窗口、采集的点阵大小和格式;

其次,申请若干视频采集的帧缓冲区,并将这些帧缓冲区从内核空间映射到用户空间,便于应用程序读取/处理视频数据;

第三,将申请到的帧缓冲区在视频采集输入队列排队,并启动视频采集;

第四,驱动开始视频数据的采集,应用程序从视频采集输出队列取出帧缓冲区,处理完后,将帧缓冲区重新放入视频采集输入队列,循环往复采集连续的视频数据;

第五,停止视频采集。

具体的程序实现流程可以参考下面的流程图:

linux_驱动_V4l2层_camera_应用层调用流程_MIPI协议包格式简介

 

 

其实其他的都比较简单,就是通过ioctl这个接口去设置一些参数。最主要的就是buf管理。他有一个或者多个输入队列和输出队列。

启动视频采集后,驱动程序开始采集一帧数据,把采集的数据放入视频采集输入队列的第一个帧缓冲区,一帧数据采集完成,也就是第一个帧缓冲区存满一帧数据后,驱动程序将该帧缓冲区移至视频采集输出队列,等待应用程序从输出队列取出。驱动程序接下来采集下一帧数据,放入第二个帧缓冲区,同样帧缓冲区存满下一帧数据后,被放入视频采集输出队列。

应用程序从视频采集输出队列中取出含有视频数据的帧缓冲区,处理帧缓冲区中的视频数据,如存储或压缩。

最后,应用程序将处理完数据的帧缓冲区重新放入视频采集输入队列,这样可以循环采集,如图所示。

 

 linux_驱动_V4l2层_camera_应用层调用流程_MIPI协议包格式简介

每一个帧缓冲区都有一个对应的状态标志变量,其中每一个比特代表一个状态

  V4L2_BUF_FLAG_UNMAPPED 0B0000

  V4L2_BUF_FLAG_MAPPED 0B0001

  V4L2_BUF_FLAG_ENQUEUED 0B0010

  V4L2_BUF_FLAG_DONE 0B0100

  缓冲区的状态转化如图所示。

 

 linux_驱动_V4l2层_camera_应用层调用流程_MIPI协议包格式简介

三,MIPI-CSI协议介绍:

1. MIPI CSI2简介
  MIPI联盟是一个开放的会员制组织。2003年7月,由美国德州仪器(TI)、意法半导体(ST)、英国ARM和芬兰诺基亚(Nokia)4家公司共同成立。MIPI联盟旨在推进移动应用处理器接口的标准化 。MIPI联盟下面有不同的WorkGroup,分别定义了一系列的手机内部接口标准,比如摄像头接口CSI、显示接口DSI、射频接口DigRF、麦克风/喇叭接口SLIMbus等。 
  CSI(Camera Serial Interface)是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版,主要由应用层、协议层、物理层组成,最大支持4通道数据传输、单线传输速度高达1Gb/s。

2. MIPI CSI2的分层结构
  MIPI CSI2的分层方法有好几种,根据MIPI联盟的规范,CSI2可分为5层,分别为:应用层、组包/解包层、底层协议层(Low Level Protocol)、通道管理层和物理层。 

 
图2-1 MIPI CSI2的分层结构 

  为了更清晰的描述协议结构中所述的名词,列表对其做了详细的阐述具体如表 2-1 所示。 

表 2-1协议结构名词解释
名称    解释
应用层    即是处理原始图像数据的各种算法模块
组包/解包层    负责将数据按照一定的次序,切割成 8 比特数据。
底层协议层    为新生成的数据加上包头包尾,形成符合协议要求的数据流。
通道管理层    将生成的数据流按照一定次序和要求,进行读写管理,输出数据流。
物理层    生成 MIPI 最后的信号波形。
像素数据    经过图像模块处理过的数据流,或者原始图像的数据路。
传输数据    经过MIPI模块切割或者加上包头包尾的数据。
控制信号    模块间的控制数据流
发送端    包括了 MIPI 数字部分,转接板等实现MIPI 信源传输的部分。
接收端    包括了转接板和商用接收端模块,负责解析收到的 MIPI 信源。

  详细的来说,链路的工作顺序如下: 
  首先原始的图像数据会在应用层做相应的图像处理,包括白平衡、噪声去除、色彩还原等。 
  处理过后的数据进入组包层做数据分割和重组,再传给协议层。协议层根据数据类型产生包头,根据数据内容产生构成包尾的  校验序列,之后将包头、数据本身、包尾组合起来发送给通道管理模块。 
  通道管理模块按照通道的选通情况,合理分配数据到每个通道,之后数据经过数模转换进入物理层传输,接收端在收到物理层的数据后,再按照之前的逆序解包出原始的图像数据。
3 MIPI CSI2的物理连接
  除地线外,MIPI CSI2一般会有1对I2C通信引脚,1对MIPI差分时钟引脚和1~4对MIPI差分数据信号引脚,如图3-1所示。 

 
图3-1 MIPI CSI2的物理连接 

图中涉及到的名词如表3-1所示: 

表3-1 CSI2涉及到的各个引脚解释
名称    解释
DATA 1+ / DATA 1-    MIPI 协议组包生成的差分模拟数据信号第二组
DATA 2+ / DATA 2-    MIPI 协议组包生成的差分模拟数据信号第一组
CLOCK+ / CLOCK- MIPI    协议组包生成的差分模拟时钟信号
SDA I2C    数据信号线
SCL I2C    时钟信号线

  在典型的应用中发送端在完成对图像的各种处理后,按照协议对数据进行打包,然后通过差分信号线向接收端传输信号,差分信号线一般有一对时钟差分线和多对数据差分线,数据差分信号线的数量与需要传输的数据量的要求有关,数据量越大多对数据线能更容易满足链路的需求。一般情况下两百万到五百万像素的手机使用两对差分数据线,即两个数据通道。而当摄像头像素进一步提高到八百万甚至一千三百万时一般会使用四个数据通道,即四对差分数据线。 
  与外部进行控制信号交互时,采用的是 I2C 接口,在 MIPI 的发送端使用的是 I2C 从端的 IP,MIPI CSI-2 接口的控制寄存器连接 I2C 的从端,这样外部接收装置可以通过 I2C 去配置 MIPI 发送端的内部寄存器,以此改变 MIPI CSI-2 接口内部状态机的持续时间和最后输出数据时的通道数,又或者在调试过程中读出这些寄存器,去做相应的检查,以判断发送端的工作状态,再通过接收端的现象来分析发送端是否工作在正常的状态。
4. MIPI CSI2的工作模式
  D-PHY有两种传输模式: 
  (1) HS 高速传输模式,用于传输突发数据,同步传输,信号为差分信号,电平范围为100mv-300mv,传输速度范围是80-1000Mbps。在该模式下传输时,当差分线正端收到 1.2V 信号,负端收到 0V信号时,这时接收端识别为 1。反之为0。 
  (2) LP 低功耗模式,用于传输控制指令,异步传输,信号线为单端,电平范围是0-1.2v,没有用时钟线,时钟是通过两个数据线异或而来的,速度只有10Mbps。在该模式下传输时,当正端接收到300m V,负端接收到100m V 时接收端识别为1.反之则识别为0. 

linux_驱动_V4l2层_camera_应用层调用流程_MIPI协议包格式简介

 
图4-1 MIPI CSI2工作模式电压范围 
5. MIPI CSI2的数据包格式
  MIPI CSI2是一个面向字节的,基于包的协议;它支持任意大小的数据通过短包和长包格式传输。各个包之间由EOT-LPS-SOT序列隔开,如图5-1所示。 
 linux_驱动_V4l2层_camera_应用层调用流程_MIPI协议包格式简介
图5-1 MIPI CSI2的数据包 

  LLP包有两种:长包和短包。每个包的传输以SoT(start of transmission)开始,EoT(end of transmission)结束,中间间隙是LPS(Low Power State低功耗状态)。
5.1 MIPI CSI2的长包格式
  MIPI CSI2的长包主要有包头、数据包和包尾三部分构成。而包头又可细分为:数据标识(data identifier)、数据包大小(word count)和错误校验码(ECC)构成。如图5-2所示。 

 linux_驱动_V4l2层_camera_应用层调用流程_MIPI协议包格式简介
图5-2 MIPI CSI2的长包数据格式 

  其中,数据标识大小为1字节,包含虚拟数据通道号[7:6]和数据类型[5:0]。 
  数据包大小为2字节,其内容为传送数据的长度,以“字”为单位。 
  错误校验码大小为1字节,负责对数据包的传输错误进行检查及纠错。 
  数据包可以传送数据的大小为0~65535字节。 
  包尾大小为2字节,是数据负荷的检查和。
5.2 MIPI CSI2的短包格式
  与长包相比,短包没有数据包和包尾。数据标识DI中的数据类型在0x00到0x0F之间。WC字段是短包的数据域,这个数据可由用户定义。ECC是校验码,能对1bit错误进行纠错,2bit错误进行检查,如图5-3所示。 

 linux_驱动_V4l2层_camera_应用层调用流程_MIPI协议包格式简介
图5-3 MIPI CSI2的短包数据格式