本文详细介绍了title="DM368" target="_blank">DM368 视频前端支持的输入数字信号格式。并以MT9D131 和PC VGA 信号为例,将两者的时序和 DM368 视频前端配置参数一一匹配。同时介绍了如何合理配置和使用 VD 中断,为 DM368 用户正确采集数据提供了参考。本文内容也可以给 DM8127、DM385 芯片的用户在使用视频摄像并行输入口采集时提供帮助。
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. 视频处理前端[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 模式。
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 寄存器。
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 数据就可以完全匹配了。