当前位置:首页 > > 充电吧
[导读]作者:刘洪涛,华清远见嵌入式学院讲师。 编写基于V4L2视频驱动主要涉及到以下几个知识点: ●    摄像头方面的知识                 要了解选用的摄像头的特性,包括访问控制方法、各种

作者:刘洪涛,华清远见嵌入式学院讲师。

编写基于V4L2视频驱动主要涉及到以下几个知识点:

●    摄像头方面的知识
                要了解选用的摄像头的特性,包括访问控制方法、各种参数的配置方法、信号输出类型等。

●    Camera解码器、控制器
                如果摄像头是模拟量输出的,要熟悉解码器的配置。最后数字视频信号进入camera控制器后,还要熟悉camera控制器的操作。

●    V4L2的API和数据结构
                编写驱动前要熟悉应用程序访问V4L2的方法及设计到的数据结构。

●    V4L2的驱动架构
                最后编写出符合V4L2规范的视频驱动。

本文介绍基于S3C2440硬件平台的V4L2视频驱动开发。摄像头采用OmniVision公司的OV9650和OV9655。主要包含以下几个方面的内容:

视频驱动的整体驱动框架

●    3C2440 camera控制器+ov9650(ov9655)
        ●    V4L2API及数据结构
        ●    V4L2驱动框架
        ●    ov9650(ov9655)+s3c2440+V4L2实例

一、 视频驱动的整体框架

视频驱动的整体框架见下图:

二、S3C2440 camera控制器+ov9650(ov9655)

(1)S3C2440 camera控制器介绍

S3C2440支持ITU-RBT601/656格式的数字图像输入,支持的2个通道的DMA,Preview通道和Codec通道,参见下图。

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

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

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

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

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

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

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

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

Camera控制器时钟设置也是需要注意的,ov9650需要Camera控制器为其提供时钟。

提供给外部摄像头的时钟是由UPLL输出时钟分频得到的。而CAMIF的时钟是由HCLK提供的。本例中,提供给ov9650的时钟为24M。

(2)ov9650(ov9655)设置方法

OV9650是OmniVision公司的COMS摄像头,130万像素,支持SXVGA、VGA、QVGA、CIF等图像输出格式。最大速率在SXVGA时为15fps,在VGA时为30fps。

OV9650摄像头时序如下图:

上图中D[9:2]用于8-bitYUV或者RGB565/RGB555(D[9]MSB、D[2]LSB)。D[9:0]用于10-bitRGB。本例中使用8-bit YUV模式。

我手边开发板的Camera和S3C2440的接线原理图如下(对应camera中具体的信号名称参见前文的驱动整体架构图)。

注:GPG12用于PWEN信号

OV9650摄像头设置方法是通过SCCB总线设置

SCCB可以看作是一种简化的I2C总线,可以使用IO模拟SCCB时序。

(3)编写ARM测试代码测试camera功能

在Keil环境下编写一个测试代码完成从摄像头采集图像输出到液晶屏。下面列出程序的流程。

(4)编写测试代码过程中常见的问题

●    摄像头寄存器的配置

因为摄像头有很多寄存器,可能一下无法理解里面所有的配置含义,所以开始时希望得到一份可用的配置。但往往从别人的测试代码中拿到配置后,仍然无法使用。我这里列出几个可能的原因:(1)摄像头中的图像输出格式和你在camera控制器中设置的不一致,同一个摄像头可以设置多种输入格式,如:YCbYCr或CbYCrY。(2)图像输出的一些时序和你的camera控制器设置不一致,摄像头可以设置一些时序,如:图像数据在CAMPCLK的上升沿有效还是下降沿有效。(3)注意输出图像的格式和Framebuffer控制器的匹配,如字节顺序等问题。

●    Ov9650和ov9655的使用区别

这里主要列出两者之间在复位信号上有差别,ov9650是高电平复位,而ov9655是低电平复位。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭