最近一段日子做了个模拟摄像头和cmos摄像头切换的小活。
也就是在嵌入式linux系统下,对cmos和模拟摄像头实时切换,达到一个设备可以同时查看,存储多个摄像头所监控的视频区域数据。
模拟摄像头多采用bt656模式。
模拟摄像头我尝试了内嵌行场同步信号的bt656模式,以及行场信号分离的ycbcr模式。后一种模式当然需要硬件支持,需要把行场信号都连接出去。我用的是ti的芯片,所以tvp芯片后端接的是ti的vpfe模块。
cmos数字摄像头采用的是行场分离的ycbcr模式,这个是以前别人调好的驱动,我也就没有改动视频传输模式。继续沿用行场分离的ycbcr传输模式。
硬件上把tvp芯片的后端跟cmos数据出来的信号线做一个二选一。两条线的数据通过二选一芯片选择后,输送给vpfe处理模块。
我做了两版,分别是:
1. 【模拟】行场分离的ycbcr + 【数字】行场分离的ycbcr
2. 【模拟】bt656 + 【数字】行场分离的ycbcr
第一版:
做第一个的时候的目的是为了尽量不修改后端的vpfe,可是后来发现隔行逐行的问题。加之cmos驱动是别人做的,没有修改和测试的时间,我就在vpfe上也做了两个接口,分别对应模拟和数字。
这个做的时候费了不少时间,不过最后也做出效果了。
第二版:
既然vpfe我没办法做到配置不变,于是我就采用第二版的方案做了一套测试。在vpfe里面加了对应的不同模式的配置,最终也实现了。
做这套东西的时候发现,其实难点在于,前期要想清楚自己的硬件电路适用哪种工作模式。如果自己的硬件电路模拟那条线的行场信号线压根就没连出来,那就只能选择bt656了。如果所有的线都连全了,可以考虑做第一种模式,当然后期可能需要对vpfe再做一些工作,因为我个人的看法是,既然前端输出的数据主要模式都一样,只是有个隔行逐行的问题,那么在前端稍做修改,就可以使得后面的vpfe永远只工作在一个模式下,这样未来如果要扩展开发一些新产品,那么逻辑就能简单很多。