基于V4L2的视频驱动开发(1)
编撰基于V4L2视频驱动主要涉及到以下几个知识点:
l摄像头方面的知识
要了解选用的摄像头的特点,包括访问控制方式、各种参数的配置方式、信号输出类型等。
lCamera解码器、控制器
假如摄像头是模拟量输出的,要熟悉解码器的配置。最后数字视频讯号步入camera控制器后,还要熟悉camera控制器的操作。
lV4L2的API和数据结构
编撰驱动前要熟悉应用程序访问V4L2的方式及设计到的数据结构。
lV4L2的驱动构架
最后编撰出符合V4L2规范的视频驱动。
本文介绍基于S3C2440硬件平台的V4L2视频驱动开发。摄像头采用OmniVision公司的OV9650和OV9655。主要包含以下几个方面的内容:
l视频驱动的整体驱动框架
lS3C2440camera控制器+ov9650(ov9655)
lV4L2API及数据结构
lV4L2驱动框架
lov9650(ov9655)+s3c2440+V4L2实例
一、视频驱动的整体框架
视频驱动的整体框架见右图:
二、S3C2440camera控制器+ov9650(ov9655)
(1)S3C2440camera控制器介绍
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分离储存。
S3C2440camera控制器LastIRQ功能的使用,也是须要把握的。假如处理不好,输出的图象疗效会受影响。
控制器会在每位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摄像头linux rar,130万象素,支持SXVGA、VGA、QVGA、CIF等图象输出格式。最大速度在SXVGA时为15fpslinux开发视频,在VGA时为30fps。
OV9650摄像头时序如右图:
上图中D[9:2]用于8-bitYUV或则RGB565/RGB555(D[9]MSB、D[2]LSB)。D[9:0]用于10-bitRGB。本例中使用8-bitYUV模式。
我手边开发板的Camera和S3C2440的接线原理图如下(对应camera中具体的讯号名称参见前文的驱动整体构架图)。
注:GPG12用于PWEN讯号
(3)编撰ARM测试代码测试camera功能
在Keil环境下编撰一个测试代码完成从摄像头采集图象输出到液晶屏。下边列举程序的流程。
(4)编撰测试代码过程中常见的问题
l摄像头寄存器的配置
由于摄像头有好多寄存器,可能一下难以理解上面所有的配置含意,所以开始时希望得到一份可用的配置。但常常从他人的测试代码中领到配置后,依然未能使用。我这儿列举几个可能的诱因:(1)摄像头中的图象输出格式和你在camera控制器中设置的不一致linux删除命令,同一个摄像头可以设置多种输入格式linux开发视频,如:YCbYCr或CbYCrY。(2)图象输出的一些时序和你的camera控制器设置不一致,摄像头可以设置一些时序,如:图象数据在CAMPCLK的上升沿有效还是增长沿有效。(3)注意输出图象的格式和Framebuffer控制器的匹配,如字节次序等问题。
lOv9650和ov9655的使用区别
这儿主要列举三者之间在复位讯号上有差异,ov9650是高电平复位,而ov9655是低电平复位。