`
isiqi
  • 浏览: 16491452 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

基于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 控制器+ov9650ov9655

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 是低电平复位。

分享到:
评论

相关推荐

    基于V4L2的视频驱动开发.doc

    在Linux系统中,基于V4L2(Video for Linux Two)接口进行视频驱动开发是一项关键任务,它涉及多个层面的技术知识。首先,开发者需要对所选摄像头的特性有深入理解,包括但不限于访问控制机制、参数配置方法以及信号...

    linux基于V4L2的视频驱动开发

    编写基于V4L2视频驱动主要涉及到以下几个知识点: ● 摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法、各种参数的配置方法、信号输出类型等。 ● Camera解码器、控制器 如果摄像头是模拟量输出的,...

    基于V4L2的视频驱动开发

    【基于V4L2的视频驱动开发】 在Linux系统中,开发基于V4L2(Video for Linux Two)的视频驱动是一项复杂而重要的任务,它涉及到多个层面的技术知识。V4L2是Linux内核中用于多媒体设备,尤其是摄像头设备的接口标准...

    基于Qt开发平台,利用linux下视频采集驱动V4L2,实现视频的采集

    在本项目中,我们将基于Qt开发平台,结合V4L2驱动,来实现视频的实时采集和帧数据的保存。 首先,Qt是一个跨平台的C++图形用户界面应用程序框架,它提供了丰富的库和工具,使得开发者可以在不同操作系统上构建用户...

    V4L2的视频驱动/应用层开发

    V4L2 视频驱动开发是基于 Linux 操作系统的视频驱动开发,主要涉及到摄像头方面的知识、Camera 解码器和控制器、V4L2 的 API 和数据结构、V4L2 驱动架构等几个知识点。下面将详细介绍这几个知识点。 摄像头方面的...

    基于v4l2视频采集和传输

    综上所述,"基于v4l2视频采集和传输"涉及到Linux下的视频处理、多线程编程和设备驱动交互等多个核心知识点。通过v4l2 API,我们可以构建高效的视频采集和传输系统,同时利用多线程架构来优化系统的响应和性能。

    基于V4L2的简单抓图程序

    本项目“基于V4L2的简单抓图程序”旨在教我们如何利用V4L2接口来实现从摄像头或者其他视频源抓取图像。 首先,我们要理解V4L2的核心概念。V4L2是一个驱动模型,它提供了标准的API,使得开发者可以轻松地处理各种...

    基于Linux视频驱动接口V4L2视频采集编程

    ### 基于Linux视频驱动接口V4L2视频采集编程深入解析 #### 一、V4L2视频采集概述 视频采集在嵌入式系统、监控系统以及各种需要实时视频处理的应用中扮演着关键角色。Linux操作系统提供了丰富的工具和API来支持视频...

    基于V4L2的摄像头驱动程序

    这个基于V4L2的摄像头驱动程序提供了一种在Linux系统中与摄像头交互的方法,无论是在嵌入式开发板上还是在个人计算机上。下面将详细解释这个驱动程序的工作原理、V4L2框架以及如何编译和使用。 1. V4L2框架详解: ...

    基于Linux的v4l2视频架构驱动编写

    ### 基于Linux的V4L2视频架构驱动编写详解 #### 一、V4L2概述 V4L2 (Video for Linux Version 2) 是Linux操作系统中用于视频采集设备的一种标准接口,它是V4L (Video for Linux) 的升级版本。V4L最初在1997年发布...

    v4l2驱动学习

    V4L2(Video for Linux Two)是Linux内核中用于多媒体设备,特别是视频捕获设备的接口。这个驱动学习的主题对于嵌入式系统开发者,尤其是那些在JZ2440平台上工作的人来说,是非常重要的。JZ2440是一款基于ARM920T...

    基于v4l2的视频监控

    总的来说,基于V4L2的视频监控项目涉及了嵌入式系统开发、Linux驱动编程、视频处理和网络通信等多个领域的知识,是一个综合性的实践项目。通过分析`video_linux.c`,我们可以深入理解如何在Linux环境中利用V4L2接口...

    V4L2 驱动编程指南.pdf

    V4L2驱动编程指南是指导开发者如何编写基于V4L2框架的视频驱动的文档,通常涉及到视频设备的注册、初始化、配置以及数据传输等核心概念。文档基于经典系列文章《Video4Linux2》进行翻译和整理,适合对V4L2编程有初步...

    基于Linux V4L2子系统的ISP及Camera驱动接口标准化方法及应用.pdf

    基于 Linux V4L2 子系统的 ISP 及 ...本文讨论了基于 Linux V4L2 子系统的 ISP 及 Camera 驱动接口标准化方法及应用,涵盖了 ISP 的硬件接口、驱动实现方法、应用开发等方面的内容,为开发者提供了有价值的参考信息。

    linux下基于V4L2/Qt的usb摄像头采集显示程序

    在Linux系统中,开发一个基于V4L2(Video for Linux Two)和Qt的USB摄像头采集显示程序是一项常见的任务,特别是在嵌入式设备或者多媒体应用中。V4L2是Linux内核提供的一种接口,用于与视频设备进行交互,如USB...

    qt基于V4l2的摄像头采集和ffmpeg的视频编码源码

    3. **V4L2视频采集**:通过调用V4L2 API,打开摄像头设备,设置捕获参数(如分辨率、帧率等)。然后,使用`mmap`或`read`方法从设备读取视频帧。 4. **处理视频帧**:将从V4L2设备读取的原始视频帧数据转换为Qt可以...

    linux v4l2 视频编解码资料

    Linux V4L2(Video for Linux two)是Linux内核中用于视频设备驱动开发的API(应用程序接口)。V4L2提供了一套标准方法,用于访问和控制各种视频捕获设备和视频输出设备。本文旨在介绍V4L2的驱动编写指南,这包括了...

    linux+qt4.7+opencv2.31的基于v4l2驱动的tiny6410视频采集显示

    "linux+qt4.7+opencv2.31的基于v4l2驱动的tiny6410视频采集显示"这个项目,就是这样一个例子,它特别针对了tiny6410开发板,该开发板通常用于嵌入式设备,如摄像头或监控系统。V4L2(Video for Linux Two)是Linux...

Global site tag (gtag.js) - Google Analytics