1 前言
DM368 是TI 达芬奇系列芯片中的一颗,被广泛的使用在IPNC(IP net camera 网络摄像机)的应用领域里。对于IPNC 应用,首先就需要将视频信号送入DM368 里面,这就需要使用到DM368 的视频前端(VPFE - Video Processing Front End)。DM368 的视频前端主要包含了IPIPEIF(Image Pipe Interface 图像管道接口),ISIF(Image Signal Interface 图像信号接口),IPIPE (Image Pipe 图像管道),Resizer(缩放器)四个部分。
IPIPEIF 功能是数据通路连接,以及把数据整合成后端模块接口可以接入的格式/大小。ISIF 是视频信号的输入口,可以支持Bayer 格式的RAW 数据(原始数据)或者是YUV 的数据的输入。IPIPE 主要是做ISP 的处理。Resizer 起到了对图像缩放和图像存储格式转换的作用。本文是基于IPIPEIF 将外部并口输入数据送入ISIF 处理的基础上展开讨论。
图 1. 视频处理前端
如何将输入信号和DM368 视频前端参数一一对应?如何获取外部的RAW 数据以及RAW 转换成的对应的YUV 数据?如何只采集或者处理图像中的一部分区域?如何配置VD 中断触发的时机?在VD 中断里面我们应该处理什么?希望在阅读完本文后,你可以找到相应的答案。
2 DM368 的前端信号输入
如果用户外接传感器(sensor)输出RAW 数据或者YUV 数据到DM368,为了采集到正确的数据,我们需要了解DM368 的视频前端是如何解读信号,以获得正确的数据。如果用户使用的是FPGA 输出信号到DM368,那就更需要了解DM368 视频前端支持的信号格式,正确输出DM368可以接收的信号。
2.1 输入信号的物理连接
DM368 视频前端支持并口的信号输入,包括PCLK(像素时钟),8 到16 位数据线,HD(行同步)信号,VD(场同步)信号。可以支持最多16 位的Bayer 格式的RAW 数据输入。也可以支持内嵌同步或者外部信号同步的8 位或者16 位的YUV422 信号输入。如果是内嵌同步,则不需要接入HD 信号和VD 信号。对于输入内嵌同步的信号,DM368 硬件可以自动解析出数据上嵌入的同步信息给芯片内部使用。DM368 的PCLK 最高可支持120MHz,可以支持720p60、 1080p30 等分辨率的输入,也可以支持较大分辨率,例如五百万、八百万等分辨率,但帧率是非实时(小于30 帧)的。
DM368 的视频前端ISIF 可以支持master(主) 模式或者slave (从)模式。所谓master 模式就是PCLK、VD 和HD 由DM368 向外发出。而slave 模式是外部设备提供PCLK、VD 和HD 信号给DM368。在实际的应用里面绝大部分的情况都使用采slave 模式。
2.2DM368视频前端对输入信号的解析
2.2.1 ISIF 对信号的解析
无论是master 模式还是slave 模式,DM368的视频前端接口ISIF 对于信号的处理是一样的。
图 2. 帧图像格式
图2 的时序通常认为水平同步和垂直同步信号都为高电平有效,需要配置ISIF 的MODESET. HDPOL=MODESET.VDPOL=0。在这种情况下,水平同步信号宽度为HDW (HD pulse width),以像素为单位。垂直同步信号宽度为 VDW (VD pulse width) ,以行数为单位。 PLLN(Pixels per line)是每行的像素个数,也就是相邻两个行同步信号间的像素个数。LPFR 是Lines per frame 的缩写,表示每帧数据有多少行,也是相邻两个场同步信号之间的行数。在slave 模式下,PLCK/HD/VD 都是外部输入的,ISIF 寄存器HDW/VDW/PLLN 是不需要配置的。图2 中的灰色区域我们叫做有效数据区域,也就是用户希望获得的有效数据。而斜线阴影区域就是消隐区域。消隐区域在视频前端处理中也是必不可少的部分,关于这点我们会在第3 节详细介绍。
如果你使用的是单次(one shot)模式,或者在连续(continuous)模式下,你需要保存RAW 数据,那你就需要配置 SPH( Start pixel horizontal 水平方向起始像素),SLV0/1 (Start line vertical - field 0/1 垂直方向奇偶场起始行),LNH( Number of pixels in line 每行像素个数),LNV (Number of lines vertical 垂直方向行数)。这是为了告诉DM368你需要把输入的图像的哪部分写到DDR。也就是说你可以选择只输出有效数据里面的某一部分到DDR。
SPH 告诉硬件在同步信号有效以后从哪个像素开始写入DDR。请注意这里的HD 信号有效起始点是指同步信号有效的沿,不是从同步信号脉冲结束后作为计数像素的起点。例如,如果HD 信号高电平有效,就是HD 上升沿后开始计数,LNH 个PCLK(也就是像素)后将接收到的数据写入DDR。同样 SLV0/1 告诉硬件从哪行数据开始需要写入 DDR,LNV 决定了写多少行数据到 DDR。所以调整ISIF 的SPH,SLV0/1, LNH 和LNV 就可以调整保存到DDR 上的RAW 数据在原图中的位置,以及 RAW 数据段大小(长宽)。如果不需要写入 RAW 到DDR,那就不需要配置 SPH, SLV0/1 ,LNH 和LNV。
图2 的时序如果配置为同步信号低电平有效也是可以的。但是如果配置为低电平有效,相关的参数就发生了变化。例如水平同步信号宽度就变为 PPLN-HDW,垂直同步信号宽度为 LPFR- VDW。SPH 和 SLV0/1 都变成了 0。所以在配置 ISIF 相关寄存器前首先需要把同步信号的极性确定下来。 要采集到正确的数据,DM368 采样数据时机必须和传感器输出数据的时机匹配。在DM368 上默认是PCLK 的下降沿采样数据。用户可以通过修改SYSTEM module 寄存器VPSS_CLK_CTRL的PCLK_INV[2] 位来改变 PCLK 采样沿。
2.2.2 IPIPE 和Resizer 对信号的解析和处理
如果ISIF 直接通过IPIPEIF 连接到IPIPE,那所有的图像数据,也就是图2 里的global frame 都会传输到IPIPE。在IPIPE 里面 用户需要配置SRC_HPS (Horizontal Start Position ),SRC_VPS(Vertical Start Position),SRC_HSZ( Horizontal Processing Size)和SRC_VSZ( Vertical Processing Size),来确认global frame 里面的哪一部分需要IPIPE 来处理。
在resizer 的模块里面,也有SRC_HPS,SRC_VPS,SRC_HSZ 和SRC_VSZ 可以配置resizer处理的图像的区域。如果IPIPE 的输出到resizer 已经是需要处理的区域,那SRC_HPS,SRC_VPS 就可以配置为0,而resizer 的SRC_HSZ,SRC_VSZ 等于IPIPE 的SRC_HSZ,SRC_VSZ。如果ISIF 的输出是通过IPIPEIF 直接到resizer(没有经过IPIPE),resizer 的SRC_HPS,SRC_VPS 就不能配置为0 了,需要用户根据需要处理的图像合理的配置resizer 的SRC_HPS,SRC_VPS 寄存器。
2.2.3 RAW 数据和YUV 数据的匹配
在连续模式下,用户同时获得resizer 输出的YUV 和ISIF 输出的RAW,时常有用户发现自己保存的RAW 数据和Resizer 输出的YUV 数据不匹配,有一定的偏移。这种问题的原因是IPIPE,Resizer 里面的SRC_HPS,SRC_VPS,SRC_HSZ 和SRC_VSZ 和ISIF 里面的写入DDR 时候配置的偏移和大小不匹配。IPIPE/Resizer 和ISIF 的寄存器本身是没有直接关系的,这就需要用户将它们一一对应,匹配起来。例如ISIF 输出的数据输入给IPIPE,为了让RAW 和YUV 匹配,需要ISIF 的SPH 等于IPIPE 的SRC_HPS,ISIF 的SLV0/1 等于IPIPE 的SRC_VPS,ISIF 的LNH 等于IPIPE 的SRC_ HSZ,ISIF 的LNV 等于IPIPE 的SRC_ VSZ。而Resizer 的SRC_HPS,SRC_VPS 需要配置为0,而resizer 的SRC_HSZ,SRC_VSZ 要等于IPIPE 的SRC_HSZ,SRC_VSZ。
在单次模式下,也就是数据通路ISIF->DDR->IPIPEIF->IPIPE(Resizer),由于IPIPE 的输入是DDR 上的RAW 数据,有效数据的获取已经在ISIF 输出到DDR 配置里面实现了,IPIPE 里面的处理数据的起始位置就可以是(0,0)了。
这样无论是在连续模式还是在单次模式下,RAW 数据和RAW 输出转换出的YUV 数据就可以完全匹配了。