基于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
实例
一、
视频驱动的整体框架
视频驱动的整体框架见下图:
![](http://hi.csdn.net/attachment/201009/6/0_1283784803oA8h.gif)
二、S3C2440 camera
控制器+ov9650
(ov9655
)
(
1
)
S3C2440 camera
控制器介绍
S3C2440
支持
ITU-R BT601/656
格式的数字图像输入
,支持的
2
个通道的
DMA
,
Preview
通道和
Codec
通道,参见下图。
![](http://hi.csdn.net/attachment/201009/6/0_128378488643Z4.gif)
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
。主要用于图像的编解码处理。
![](http://hi.csdn.net/attachment/201009/6/0_1283784994n9X3.gif)
上图中的
window cut
功能是指在图像可以先做一个裁剪。通过设置
CIWDOFST
完成此功能,见下图。图像进入
P
、
C
通道后,各自的
scaler
单元还可以对其进行缩放、旋转等处理。
![](http://hi.csdn.net/attachment/201009/6/0_1283785074pUnx.gif)
S3C2440 camera
控制器支持乒乓存储。为了防止采集和输出之间的冲突,采用了乒乓存储方式。每次采集一帧后,自动转到下一个存储区。如果你因为内存空间不足,不想使用此功能的话,可以将四个区域设置到同一块空间。
在做图像处理时,需要关注到最后存储区中的图像格式,如
codec
通道硬件自动把
Y
、
Cb
、
Cr
分离存储。
![](http://hi.csdn.net/attachment/201009/6/0_1283785147Jhs2.gif)
S3C2440 camera
控制器
Last IRQ
功能的使用,也是需要掌握的。如果处理不好,输出的图像效果会受影响。
![](http://hi.csdn.net/attachment/201009/6/0_128378522888n5.gif)
控制器会在每个
VSYNC
下降沿判断
ImgCptEn
信号等命令。如果在下降沿发现
ImgCptEn
信号有效,则产生
IRQ
中断。然后才开始一帧图像的真正采集。而如果在
VSYNC
下降沿判断到
ImgCptEn
为低电平且之前
LastIRQEn
没有使能,则不会产生任何中断,且不会再进行下一帧的采集。如果你想在
ImgCptEn
关闭后,一帧采集完后产生一个中断通知你,那么就需要在最后一次中断产生前(
stop capturing
后的
vysnc
下将沿)使能
lastirq
就可以了。
我在移植
linux
驱动时就遇到了一个
Last IRQ
的问题。现象是输出图像上面总是有一条比其它部分反应慢。采集运动图像,就能看出现象。查看代码是因为没有设立
lastirq
,因为每次如果不在
lastirq
产生的情况下读取,图像缓冲中的数据是不稳定的,可能照成图像不完整。修改代码支持
lastirq
后,问题解决。
Camera
控制器时钟设置也是需要注意的,
ov9650
需要
Camera
控制器为其提供时钟。
![](http://hi.csdn.net/attachment/201009/6/0_1283785343WW3A.gif)
提供给外部摄像头的时钟是由
UPLL
输出时钟分频得到的。而
CAMIF
的时钟是由
HCLK
提供的。本例中,提供给
ov9650
的时钟为
24M
。
(
2
)
ov9650
(
ov9655
)设置方法
OV9650
是
OmniVision
公司的
COMS
摄像头,
130
万像素,支持
SXVGA
、
VGA
、
QVGA
、
CIF
等图像输出格式。
最大速率在
SXVGA
时为
15fps
,在
VGA
时为
30fps
。
OV9650
摄像头时序如下图:
![](http://hi.csdn.net/attachment/201009/6/0_12837854740jPk.gif)
上图中
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
信号
![](http://hi.csdn.net/attachment/201009/6/0_1283785618ffvK.gif)
(
3
)编写
ARM
测试代码测试
camera
功能
在
Keil
环境下编写一个测试代码完成从摄像头采集图像输出到液晶屏。下面列出程序的流程。
![](http://hi.csdn.net/attachment/201009/6/0_1283785687ap87.gif)
(
4
)编写测试代码过程中常见的问题
l
摄像头寄存器的配置
因为摄像头有很多寄存器,可能一下无法理解里面所有的配置含义,所以开始时希望得到一份可用的配置。但往往从别人的测试代码中拿到配置后,仍然无法使用。我这里列出几个可能的原因:(
1
)摄像头中的图像输出格式和你在
camera
控制器中设置的不一致,同一个摄像头可以设置多种输入格式,如:
YCbYCr
或
CbYCrY
。(
2
)图像输出的一些时序和你的
camera
控制器设置不一致,摄像头可以设置一些时序,如:图像数据在
CAMPCLK
的上升沿有效还是下降沿有效。(
3
)注意输出图像的格式和
Framebuffer
控制器的匹配,如字节顺序等问题。
l
Ov9650
和
ov9655
的使用区别
这里主要列出两者之间在复位信号上有差别,
ov9650
是高电平复位,而
ov9655
是低电平复位。
的视频驱动开发(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
实例
一、
视频驱动的整体框架
视频驱动的整体框架见下图:
![](http://hi.csdn.net/attachment/201009/6/0_1283784803oA8h.gif)
二、S3C2440 camera
控制器+ov9650
(ov9655
)
(
1
)
S3C2440 camera
控制器介绍
S3C2440
支持
ITU-R BT601/656
格式的数字图像输入
,支持的
2
个通道的
DMA
,
Preview
通道和
Codec
通道,参见下图。
![](http://hi.csdn.net/attachment/201009/6/0_128378488643Z4.gif)
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
。主要用于图像的编解码处理。
![](http://hi.csdn.net/attachment/201009/6/0_1283784994n9X3.gif)
上图中的
window cut
功能是指在图像可以先做一个裁剪。通过设置
CIWDOFST
完成此功能,见下图。图像进入
P
、
C
通道后,各自的
scaler
单元还可以对其进行缩放、旋转等处理。
![](http://hi.csdn.net/attachment/201009/6/0_1283785074pUnx.gif)
S3C2440 camera
控制器支持乒乓存储。为了防止采集和输出之间的冲突,采用了乒乓存储方式。每次采集一帧后,自动转到下一个存储区。如果你因为内存空间不足,不想使用此功能的话,可以将四个区域设置到同一块空间。
在做图像处理时,需要关注到最后存储区中的图像格式,如
codec
通道硬件自动把
Y
、
Cb
、
Cr
分离存储。
![](http://hi.csdn.net/attachment/201009/6/0_1283785147Jhs2.gif)
S3C2440 camera
控制器
Last IRQ
功能的使用,也是需要掌握的。如果处理不好,输出的图像效果会受影响。
![](http://hi.csdn.net/attachment/201009/6/0_128378522888n5.gif)
控制器会在每个
VSYNC
下降沿判断
ImgCptEn
信号等命令。如果在下降沿发现
ImgCptEn
信号有效,则产生
IRQ
中断。然后才开始一帧图像的真正采集。而如果在
VSYNC
下降沿判断到
ImgCptEn
为低电平且之前
LastIRQEn
没有使能,则不会产生任何中断,且不会再进行下一帧的采集。如果你想在
ImgCptEn
关闭后,一帧采集完后产生一个中断通知你,那么就需要在最后一次中断产生前(
stop capturing
后的
vysnc
下将沿)使能
lastirq
就可以了。
我在移植
linux
驱动时就遇到了一个
Last IRQ
的问题。现象是输出图像上面总是有一条比其它部分反应慢。采集运动图像,就能看出现象。查看代码是因为没有设立
lastirq
,因为每次如果不在
lastirq
产生的情况下读取,图像缓冲中的数据是不稳定的,可能照成图像不完整。修改代码支持
lastirq
后,问题解决。
Camera
控制器时钟设置也是需要注意的,
ov9650
需要
Camera
控制器为其提供时钟。
![](http://hi.csdn.net/attachment/201009/6/0_1283785343WW3A.gif)
提供给外部摄像头的时钟是由
UPLL
输出时钟分频得到的。而
CAMIF
的时钟是由
HCLK
提供的。本例中,提供给
ov9650
的时钟为
24M
。
(
2
)
ov9650
(
ov9655
)设置方法
OV9650
是
OmniVision
公司的
COMS
摄像头,
130
万像素,支持
SXVGA
、
VGA
、
QVGA
、
CIF
等图像输出格式。
最大速率在
SXVGA
时为
15fps
,在
VGA
时为
30fps
。
OV9650
摄像头时序如下图:
![](http://hi.csdn.net/attachment/201009/6/0_12837854740jPk.gif)
上图中
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
信号
![](http://hi.csdn.net/attachment/201009/6/0_1283785618ffvK.gif)
(
3
)编写
ARM
测试代码测试
camera
功能
在
Keil
环境下编写一个测试代码完成从摄像头采集图像输出到液晶屏。下面列出程序的流程。
![](http://hi.csdn.net/attachment/201009/6/0_1283785687ap87.gif)
(
4
)编写测试代码过程中常见的问题
l
摄像头寄存器的配置
因为摄像头有很多寄存器,可能一下无法理解里面所有的配置含义,所以开始时希望得到一份可用的配置。但往往从别人的测试代码中拿到配置后,仍然无法使用。我这里列出几个可能的原因:(
1
)摄像头中的图像输出格式和你在
camera
控制器中设置的不一致,同一个摄像头可以设置多种输入格式,如:
YCbYCr
或
CbYCrY
。(
2
)图像输出的一些时序和你的
camera
控制器设置不一致,摄像头可以设置一些时序,如:图像数据在
CAMPCLK
的上升沿有效还是下降沿有效。(
3
)注意输出图像的格式和
Framebuffer
控制器的匹配,如字节顺序等问题。
l
Ov9650
和
ov9655
的使用区别
这里主要列出两者之间在复位信号上有差别,
ov9650
是高电平复位,而
ov9655
是低电平复位。
相关文章推荐
- 基于V4L2的视频驱动开发(2)
- 基于V4L2的视频驱动开发
- 基于V4L2的视频驱动开发(2) 华清远见 刘洪涛
- 基于V4L2的视频驱动开发(1)
- 基于V4L2的视频驱动开发(2)
- 基于V4L2的视频驱动开发(2)
- 基于V4L2的视频驱动开发(1)---Camera
- 基于V4L2的视频驱动开发(3)
- 基于V4L2的视频驱动开发(以s3c2440和ov9650举例)
- 基于V4L2的视频驱动开发(2)
- 基于V4L2的视频驱动开发
- 基于V4L2的视频驱动开发(1)
- 基于V4L2的视频驱动开发(1)
- 基于V4L2的视频驱动开发(2)
- 基于V4L2的视频驱动开发(2)
- 基于V4L2的视频驱动开发(4)
- 基于V4L2的视频驱动开发(1)---Camera
- 基于V4L2的视频驱动开发(2)
- 基于V4L2的视频驱动开发
- 基于V4L2的视频驱动开发(3)