CMOS Sensor Interface(CSI)
CMOS图像传感器分为两类,非智能和智能。非智能的这类图像传感器只是支持传统的摄像头时序(场同步和行同步),然后输出一个Bayer(拜耳)以及
统计的数据,而智能传感器支持CCIR656视频解码格式,并且还提供了额外的一些图像处理(例如:图像压缩,图像滤波预处理,以及多种数据输出格式)
CSI的包含的能力如下:
.前端-配置逻辑接口以便支持大多数通用的可用的CMOS摄像头接口。
.支持CCIR656视频接口以及传统的摄像头接口。
.8位数据口,支持方便YCC,YUV,Bayer或者是RGB的数据格式输入。
.完全可控的8-bit或16-bit数据到32-bit的FIFO进行打包
.32*32大小的FIFO存储接受到的的图像像素数据,该FIFO可以通过可编程的IO或者是DMA进行读取.
.后端-提供了直接到eMMA的预处理PrP块接口(PrP和PP组成了MX27图形加速器eMMA,PrP和PP能够用来给视频做预处理和后期处理,例如,放大,缩小,颜色转换)
.提供sensor的可屏蔽中断源,该中断源也是中断可控的: 开始Frame,结束Frame,Change of Field,FIFO Full
.提供给外部sensor用的,可配置的主时钟频率
.由统计数据产生的自动曝光(AE)和自动白平衡(AWB)控制。
39.1 CSI结构
39-5图,显示了CMOS摄像头接口的框图,它包含了2个控制寄存器(Control Register 1和3)来建立接口的时序以及中断产生,另外一个控制器
(Control Register 2)用来产生统计数据,还有一个状态寄存器,接口逻辑,数据包逻辑,CCIR时序编码,中断控制,主时钟产生源,统计数据产生,
32*32图像数据接受FIFO(RxFIFO),还有16*32统计数据FIFO(StatFIFO).
39.2 CSI接口信号描述
CSI模块和外部的CMOS图像传感器的接口如下:
.CSI_VSYNC input Vertical Sync(Start of Frame) 摄像头传输进CSI接口,是场同步接口,提供起始帧
.CSI_HSYNC input Horizontal Sync(Blank Signal) 摄像头传输进CSI接口,是行同步接口,提供行同步信号,判断消隐信号
.CSI_D[7:0] input 8-bit摄像头数据总线(传输YUV,YCC,RGB,或者Bayer等数据)
.CSI_MCLK output Sensor Master Clock 该接口是CSI输出接口,提供给外部摄像头的主时钟
.CSI_PIXCLK input pixel Clock 该接口是摄像头输出的像素时钟,一般都等于MCLK主时钟
在CSI的RxFIFO和eMMA的预处理块PrP之间有一条用来快速传输数据的数据线. 该数据线可以enabled或者disabled。
当该bus enabled时,CSI的RxFIFO会从AHB总线上取消,并且连接到PrP上。任何CPU或者DMA通道到RxFIFO寄存器的请求读取都将被忽略(因为连接到PrP上了)
所有的CSI中断都被MASK防止软件访问FIFO以及相关的状态寄存器。
RxFIFO设定Full level等级为4/8/16 Words,如果是24words那么内部逻辑认为是8Words.
用户使用RxFIFO的full level来参考数据格式和线性宽度,来确保传输的帧是一个完整的帧, 图像的大小(in Words)必须是RxFIFO设定的full level
的整数倍。
关系如下:
数据格式 每个像素包含的byte数目 每个Words包含的像素数目 RxFIFO Full level等级 所需要的线宽(line Width)
YUV422 2 2 4/8/16Words 8/16/32的倍数
YCC422 2 2 同上 8/16/32的倍数
RGB565 2 2 同上 8/16/32的倍数
RGB888 4 1 同上 4/8/16的倍数
Bayer 1 4 16/32/64的倍数
39.3 操作原理
该小段描述sensor接口的操作模式
CSI设计是为了支持普通的sensor接口时序以及CCIR656的视频接口时序。传统的CMOS传感器典型使用SOF,HSYNC(消隐),和PIXCLK信号
给Bayer或者YUV输出。智能CMOS传感器,一般在片上都有图像处理,并且通常都支持视频模式的传输,它们使用了内嵌的时序编码来取代了SOF和BLANK信号。
该时序编码依据的标准就是CCIR656.
39.3.1 门选通时钟模式(Gated Mode)
VSYNC,HSYNC,以及PIXCLK信号采用的都是门选时钟模式(脉冲门)
一个帧通常都开始于VSYNC的上升沿_||__,然后HSYNC信号开始变高HIGH,并且hold高电平整行数据(line)。并且当HSYNC信号是高电平的时候,
pixel clock才是合法的像素时钟,Data数据就是每HSYNC高电平期间,每个pixel clock上升沿读取的数据才是有效数据。当HSYNC为低电平的时候
那么该行就结束了。pixel clock就是不合法了,并且CSI也停止从stream中接收数据。然后等待下一行的HSYNC重复开始,最后重复VSYNC进入下一帧。
39.3.2 非门选通时钟模式(non-Gated Mode)
该模式下,只有VSYNC和pixel clock两个信号使用到,HSYNC是被忽略的。
该模式下,总的时间是和gated mode一样的,区别只是在于HSYNC信号。HSYNC是被CSI忽略的,所有的pixel clock时钟所表示的数据都是合法的,
其实区别就是Gate模式的pixel clock是一直开着的,而该模式下是和HSYNC同步进行了与门的操作,只保留了有效数据的pixel clock.所以pixel clock
在非法数据时候是低电平。
39.3.3 CCIR656接口模式
在CCIR656模式中,只有pixel clock和DATA[7:0]信号被使用到。起始帧VSYHC和BLANK消隐信号都被摄像头内直接内嵌的时序编码根据时序直接替换
为有效数据流,不需要后期进行数据流的处理。每一个有效行伴随SAV码激活,并且伴随EAV码结束。有一些方案,数字化的消隐信号是插在SAV和EAV之间的。
CSI会从数据流中进行编码以及滤出相关的时序,来还原VSYHC和HSYNC信号,来给内部使用,例如统计块控制和CSI-to-PrP互连时。
数据从直接转发,以原来连续的方式进行打包。因此,第一帧是跟在第二帧后面的(如果得到了2帧的话)。所以,该帧序是需要重新进行排序的,来还原原来的图像。
COF(Change of Field改变域/帧/场) ,它触发奇偶场的变化。中断服务会读取状态寄存器来确定是否是当前的帧。
依据CCIR656标准,图像必须是625/50帧的PAL,或者是525/60帧的NTSC格式。另外,图像还要交错成奇偶场, 垂直和行消隐数据都被填入特定的行。
数据必须是YCC422格式,每个像素包含了2 bytes,Y+Cr+Y+Cb.这些都是TV模式的设定。
该CSI仅仅支持PAL和NTSC制式。
从39-3图中可以看到,SOF是一个中断,时序编码timing codec中断产生,表示来了新的帧,SOV1和SOV2是表示奇偶域。
39-4,39-5两图表示具体的码和有效数据位。
39.3.4 CCIR656更进模式
CMOS摄像头系统提供的VGA或CIF分辨率,CIF标准中,奇偶场交错不用很严格的指出,因为CIF图像本身就很小,使用奇场或偶场就可以了。
一般是使用奇场,即Field 1.大多数的sensor都支持该CCIR模式,因此在CIF下,只要一个SOF中断进入新的一帧,而不需要SOV来判断奇偶场了。
39.3.5 CCIR656编码错误校验
依据CCIR编码表,SAV和EVAV之间的保护数据是被编码过的,使用这种方法,编码器可以纠正1-bit错误,可以检查2-bit的错误。
该特征只是在CSI的CCIR编码中,仅仅是奇偶交错模式中支持。
39.4 中断产生
39.4.1起始帧中断Start Of Frame Interrupt(SOF_INT)--- 一般都是VSYHC的上升沿开始,就触发了
在传统模式中,VSYHC信号来自传感器,因此SOF_INT中断是由VSYHC信号的上升沿或者是下降沿触发的。
在CCIR模式中,SOF中断信息是从嵌入的代码检索出来的,并且产生SOF_INT的。
在CCIR更进模式中,有下面两个SOF中断:
.内部VSYHC模式,SOF是从嵌入的代码检索出来
.外部VSYHC模式,来自外部摄像头输入的VSYHC信号,根据VSYHC的上升沿或下降沿来产生SOF.
39.4.2 结束帧中断End of Frame Interrupt(EOF_INT)
当一帧结束或者是一个在RxFIFO中的完整的帧数据被全部读出时,EOF中断就产生了,EOF并不在CSI的PrP模式中使用。
39.4.3 改变帧中断Change Of Field Interrupt(COF_INT)
该中断是用在CCIR奇偶域交错的模式下使用,该中断当Field 1 和Field 2交错的时候产生。F1_INT和F2_INT会产生
39.4.4 CCIR错误中断(ECC_INT)
CCIR中断仅仅用在CCIR奇偶场交错的模式下使用,因为如果没有奇偶场交错的话,不需要校验该帧的奇偶帧,如果有的话,那么如果是错误下,
还将该奇偶场拼接进行合成的话,那么画面肯定出问题了。
39.4.5 Data Packing Style数据打包格式
由于图像在采集的过程中,不同的端口大小,不同的阶段,数据的字节顺序是非常重要的。
为了能够灵活的对图像数据进行打包,CSI模块提供了数据交换空间,通过PACK_DIR和SWAP16_EN bits(包含在CSIRC1--CSI Control Register1中)
数据在提交给RxFIFO之前,利用设置PACK_DIR的bit位来进行打包。
39.4.6 RxFIFO路径
Bayer数据是一个从图像传感器获得典型的行数据。该数据宽度一定要通过软件转化为RGB空间或者是YUV空间的数据格式。
PACK_DIR bit设置为0,表示系统是小端,不是大端系统。使用P0,P1,P2,P3存放了打包了的数据内容,P0是第一个Data,依次,P3是最后一个data.
Page 1438
39.4.6.1 RGB565数据
(我们用的ov9660-0xd7[1:0]是选择YUV还是RGB模式,YUV=00,RGB=01)
RGB565数据是从图像传感器获得的处理过的数据,该数据可以直接显示到Video Buffer上面。
这个数据格式是16-bits的宽度,该数据可以直接通过CSI给Memory,然后Memory给LCDC.
39.4.6.2 RGB888数据格式 ----24位bit屏可用
总结:
MX27提供了一个非常专业的摄像头CSI接口,可以配置相关的口进行接口匹配。
我们的摄像头是ov9660,输出设定为YUV模式,因此,CSI获取的数据也是YUV格式的数据,因此还需要通过软件,将YUV的格式转化为
RGB565、RGB656、RGB888格式放到LCDC对应的Memory进行显示输出。
转化公式如下:
From RGB to YUV
Y = 0.299R + 0.587G + 0.114B
U = 0.492 (B-Y)
V = 0.877 (R-Y)
It can also be represented as:
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
From YUV to RGB
R = Y + 1.140V
G = Y - 0.395U - 0.581V
B = Y + 2.032U
我的额外话题:
当前摄像头的参数我们基本上主要看:
1.摄像头像素是多少万的? 我这边罗列了一部分
2560*1960 =4915200,也就是通常说的500W
1600*1200 =1920000,也就是200W
1280*960 =1228800,也就是130W像素
640*480=307200,也就是30W
该像素可以放映到你的抓图上面的大小,该像素就是说明你的CMOS或者是CCD感光元件的像素点多少,可以想象在相同的面积上,数量越多,感光元件肯定要越小,感光元件小,那么图像的质量其实会变差,这个当然可以理解,但是从大的方面来说,只要镜头好,光源充足,那么效果也会变好,这样画面就比像素低的更加的细腻,所以高像素的好处就在这里。有种专业上的说法,是你的摄像头达到几线几线的?
2.帧率?也就是看你的最大分辨率的时候能够达到的最大帧率是多少?
像OV系列来说,一般最大的分辨率下的帧率是30帧左右,也可以调频率进行提高。我们人的眼睛一般情况下,只要图像能够达到每秒30帧,那么利用眼睛的视觉残留,基本上可以感觉到图像是连续的,人眼的视觉残留时间超过30ms。
我调试摄像头的时候,可以发现有个非常严重的现象就是,加开夜光模式的时候,帧率掉的非常严重,这个估计就是DSP后期处理的时候,处理不了每秒30帧,只能往下降了,黑白的话效果好一些。
3. 镜头也是非常关键的,这个就要看不同的厂家,不同的显示效果
题外篇
我们买到的数码相机,现在都是1300W以上的,但是并不是说我们的摄像模式下可以达到这个分辨率,不信的话你可以去试试看,因为摄像要求比较高,需要达到每秒30帧以上,这个对DSP处理的负荷很重(RGB--颜色空间转换----H264编码/JPG编码),有人说我们为什么不利用数码相机的连续抓拍功能,这样既能保证分辨率又可以摄像,其实原理是一样的,抓拍也不可能高像素下达到每秒30帧。
还有,我们有一些非常高的像素是如何达到的呢?
其实现在的做法都是靠拼装,也就是说两块CCD感光模块分别进行摄像,然后在末端进行同步,这样就能提高像素,而且DSP的负荷不用太过进行提升,但是这样的拼装方法有一个缺陷就是,如果模块太多,那么在末端进行同步就很难把握了,所以现在一般都是2个CCD或者3个CCD,再多就不行了