您的位置:首页 > 其它

基于V4L2的视频驱动开发(1)

2011-03-28 14:13 429 查看
基于V4L2
的视频驱动开发(1



华清远见

刘洪涛

编写基于
V4L2

视频驱动主要涉及到以下几个知识点:

l

摄像头方面的知识

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

l

Camera

解码器、控制器

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

控制器后,还要熟悉
camera

控制器的操作。

l

V4L2


API

和数据结构

编写驱动前要熟悉应用程序访问
V4L2

的方法及设计到的数据结构。

l

V4L2

的驱动架构

最后编写出符合
V4L2

规范的视频驱动。

本文介绍基于
S3C2440

硬件平台的
V4L2

视频驱动开发。摄像头采用
OmniVision

公司的
OV9650


OV9655

。主要包含以下几个方面的内容:

l

视频驱动的整体驱动框架

l

S3C2440 camera

控制器
+ov9650


ov9655



l

V4L2 API

及数据结构

l

V4L2

驱动框架

l

ov9650


ov9655


+s3c2440+V4L2

实例

一、

视频驱动的整体框架

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



二、S3C2440 camera
控制器+ov9650
(ov9655



1



S3C2440 camera


控制器介绍


S3C2440

支持
ITU-R BT601/656

格式的数字图像输入
,支持的
2

个通道的
DMA


Preview

通道和
Codec

通道,参见下图。



Preview

通道可以将
YCbCr4:2:2

格式的图像转换为
RGB


16bit


24bit

)格式的数据,并存放于为
Preview DMA

分配的内存中,最大分辨率为
640*480

。主要用于本地液晶屏显示。如果将
Preview DMA

的内存和
Framebuffer

内存重叠的话,就可以实现采集直接输出到液晶屏上了。

Codec

通道可以输出
YCbCr4:2:0


YCbCr4:2:2

格式到为
Codec DMA

分配的内存中。最大分辨率为
4096*4096

。主要用于图像的编解码处理。



上图中的
window cut

功能是指在图像可以先做一个裁剪。通过设置
CIWDOFST
完成此功能,见下图。图像进入
P

C
通道后,各自的
scaler
单元还可以对其进行缩放、旋转等处理。



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

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

Cb

Cr
分离存储。



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



控制器会在每个
VSYNC

下降沿判断
ImgCptEn

信号等命令。如果在下降沿发现
ImgCptEn

信号有效,则产生
IRQ

中断。然后才开始一帧图像的真正采集。而如果在
VSYNC

下降沿判断到
ImgCptEn

为低电平且之前
LastIRQEn

没有使能,则不会产生任何中断,且不会再进行下一帧的采集。如果你想在
ImgCptEn

关闭后,一帧采集完后产生一个中断通知你,那么就需要在最后一次中断产生前(
stop capturing

后的
vysnc

下将沿)使能
lastirq

就可以了。

我在移植
linux

驱动时就遇到了一个
Last IRQ

的问题。现象是输出图像上面总是有一条比其它部分反应慢。采集运动图像,就能看出现象。查看代码是因为没有设立
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-bit RGB

。本例中使用
8-bit YUV

模式。

我手边开发板的
Camera


S3C2440

的接线原理图如下(对应
camera

中具体的信号名称参见前文的驱动整体架构图)。

注:
GPG12

用于
PWEN

信号




3


)编写
ARM


测试代码测试
camera


功能



Keil

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




4


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


l

摄像头寄存器的配置

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

)摄像头中的图像输出格式和你在
camera

控制器中设置的不一致,同一个摄像头可以设置多种输入格式,如:
YCbYCr

CbYCrY
。(
2
)图像输出的一些时序和你的
camera
控制器设置不一致,摄像头可以设置一些时序,如:图像数据在
CAMPCLK
的上升沿有效还是下降沿有效。(
3
)注意输出图像的格式和
Framebuffer
控制器的匹配,如字节顺序等问题。

l

Ov9650

ov9655
的使用区别

这里主要列出两者之间在复位信号上有差别,
ov9650

是高电平复位,而
ov9655

是低电平复位。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: