Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1412925
  • 博文数量: 1334
  • 博客积分: 645
  • 博客等级: 上士
  • 技术积分: 5762
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-25 16:56
文章分类

全部博文(1334)

文章存档

2014年(108)

2013年(1059)

2012年(169)

分类: LINUX

2013-02-21 05:04:55

原文地址:视频驱动分析1: 作者:leon_yu

项目需求:通过模拟相机采集数据,对于采集到的数据,通过DMA转换得到RGB格式的用来做显示,YUV格式的用来做算法。


视频驱动涉及以下几个方面:

1.摄像头输入信号相关知识。

Tvp5150可以接收2路复合视频信号(CVBS)或1S-Video信号。当接收复合信号时,可选择通道A或者通道B,当输入S-Video信号时,通道A输入Luminance信号,通道B输入Chrominance信号。复合信号PALNTSC硬件接口相同,均为一根信号线输入,区别是NTSC分辨率为720x480分辨率,PAL720x576

输出可配置为BT601,BT656.

2.camera解码,控制器,

s3c2451集成的camera控制器可以接受BT601/BT656格式数字信号,两个独立DMA通道P/C解码,可以分别得到需求的RGB/YUV数据。

3.V4L2的驱动架构

熟悉应用程序访问V4L2的方法及设计到的数据结构。

由模拟相机+AD芯片(tvp5150+camera驱动器(s3c2451集成)+LCD构成一个完整的视频系统,框架如下图


需要注意的是:数据传输的格式,我们这里采用PAL制输入,最终得到320x240yuv输出


驱动分析:

1.输入端:

tvp5150可以接收NTSC (M, 4.43), PAL (B, D, G, H, I, M, N), and SECAM (B, D, G, K, K1, L) 格式的视频数据,支持2路复合视频信号(CVBS)或1S-Video信号,通过一个高速9ADC解码,可以支持BT.601/BT.656标准输出。

Tvp5150是一个I2C接口芯片,利用内核自带驱动,稍加修改就可以正常工作。主要需要配置的寄存器是输入通道选择,输出格式等。

2.camera解码—s3c2451控制器

S3C2451支持ITU-R BT601/656格式的数字图像输入,支持的2个通道的DMAPreview通道和Codec通道,参见下图。


Preview通道可以将YCbCr4:2:2格式的图像转换为RGB16bit24bit)格式的数据,并存放于为Preview DMA分配的内存中,最大分辨率为640*480。主要用于本地液晶屏显示。如果将Preview DMA的内存和Framebuffer内存重叠的话,就可以实现采集直接输出到液晶屏上了。

 Codec通道可以输出YCbCr4:2:0YCbCr4:2:2格式到为Codec DMA分配的内存中。最大分辨率为4096*4096。主要用于图像的编解码处理。


上图中的window cut功能是指在图像可以先做一个裁剪。通过设置CIWDOFST完成此功能,见下图。图像进入PC通道后,各自的scaler单元还可以对其进行缩放、旋转等处理。


我实际调试中得到如下图片


左边有几列一直是黑条,不知道什么原因,所以干脆就剪切掉,得到640x576图像(取8的整数倍)。

S3C2451 camera控制器支持乒乓存储。为了防止采集和输出之间的冲突,采用了乒乓存储方式。每次采集一帧后,自动转到下一个存储区。如果你因为内存空间不足,不想使用此功能的话,可以将四个区域设置到同一块空间。

在做图像处理时,需要关注到最后存储区中的图像格式,如codec通道硬件自动把YCbCr分离存储。


S3C2451 camera 控制器Last IRQ功能的使用,也是需要掌握的。如果处理不好,输出的图像效果会受影响。


控制器会在每个VSYNC下降沿判断ImgCptEn信号等命令。如果在下降沿发现ImgCptEn信号有效,则产生IRQ中断。然后才开始一帧图像的真正采集。而如果在VSYNC下降沿判断到ImgCptEn为低电平且之前LastIRQEn没有使能,则不会产生任何中断,且不会再进行下一帧的采集。如果你想在ImgCptEn关闭后,一帧采集完后产生一个中断通知你,那么就需要在最后一次中断产生前(stop capturing后的vysnc下将沿)使能lastirq就可以了。

 我在移植linux驱动时就遇到了一个Last IRQ的问题。现象是输出图像上面总是有一条比其它部分反应慢。采集运动图像,就能看出现象。查看代码是因为没有设立lastirq,因为每次如果不在lastirq产生的情况下读取,图像缓冲中的数据是不稳定的,可能照成图像不完整。修改代码支持lastirq后,问题解决。

3.本例中采用BT.656输入

所以不需要连接同步信号,行场同步信号包含在数据流中,s3c2451硬件解码,假如接的BT601格式,比如ov7740,那么还要设置时钟,行场同步等信号,采集使能及信号控制一般在中断服务程序里做,典型应用如下图


4.调试中常见的问题

因为摄像头有很多寄存器,可能一下无法理解里面所有的配置含义,所以开始时希望得到一份可用的配置。但往往从别人的测试代码中拿到配置后,仍然无法使用。我这里列出几个可能的原因:

1)摄像头中的图像输出格式和你在camera控制器中设置的不一致,同一个摄像头可以设置多种输入格式,如:YCbYCrCbYCrY

2)图像输出的一些时序和你的camera控制器设置不一致,摄像头可以设置一些时序,如:图像数据在CAMPCLK的上升沿有效还是下降沿有效,以及行场同步反转等。

3)注意输出图像的格式和Framebuffer控制器的匹配,如字节顺序等问题。

(4)图像属性设置,比如宽高是否超范围或是否为4/8 整数倍。

(5)查看图像,RGB格式的数据,可以直接丢到LCD显示,验证图像效果。YUV可以用专门的YUV工具查看,或者用Photoshop查看。

(6)camera控制器中,隔行,逐行的控制位设置。

参考链接:刘洪涛博客http://blog.csdn.net/hongtao_liu/article/details/5867351












阅读(152) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~