Camera driverV4L2驱动架构介绍
http://blog.csdn.net/ypist/article/details/6664193
http://blog.csdn.net/ypist/article/details/6664207
编写基于V4L2视频驱动主要涉及到以下几个知识点:
● 摄像头方面的知识
要了解选用的摄像头的特性,包括访问控制方法、各种参数的配置方法、信号输出类型等。
● Camera解码器、控制器
如果摄像头是模拟量输出的,要熟悉解码器的配置。最后数字视频信号进入camera控制器后,还要熟悉camera控制器的操作。
● V4L2的API和数据结构
编写驱动前要熟悉应用程序访问V4L2的方法及设计到的数据结构。
● V4L2的驱动架构
最后编写出符合V4L2规范的视频驱动。
本文介绍基于S3C2440硬件平台的V4L2视频驱动开发。摄像头采用OmniVision公司的OV9650和OV9655。主要包含以下几个方面的内容:
视频驱动的整体驱动框架
● 3C2440 camera控制器+ov9650(ov9655)
● V4L2 API及数据结构
● V4L2驱动框架
● 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信号
OV9650摄像头设置方法是通过SCCB总线设置
SCCB可以看作是一种简化的I2C总线,可以使用IO模拟SCCB时序。
(3)编写ARM测试代码测试camera功能
在Keil环境下编写一个测试代码完成从摄像头采集图像输出到液晶屏。下面列出程序的流程。
(4)编写测试代码过程中常见的问题
● 摄像头寄存器的配置
因为摄像头有很多寄存器,可能一下无法理解里面所有的配置含义,所以开始时希望得到一份可用的配置。但往往从别人的测试代码中拿到配置后,仍然无法使用。我这里列出几个可能的原因:(1)摄像头中的图像输出格式和你在camera控制器中设置的不一致,同一个摄像头可以设置多种输入格式,如:YCbYCr或CbYCrY。(2)图像输出的一些时序和你的camera控制器设置不一致,摄像头可以设置一些时序,如:图像数据在CAMPCLK的上升沿有效还是下降沿有效。(3)注意输出图像的格式和Framebuffer控制器的匹配,如字节顺序等问题。
● Ov9650和ov9655的使用区别
这里主要列出两者之间在复位信号上有差别,ov9650是高电平复位,而ov9655是低电平复位。
Camera driverV4L2驱动架构介绍相关推荐
- camera驱动电源配置_Camera driverV4L2驱动架构介绍
大约一年前写的东西,介绍性部分是当时在网络上找的内容,后面的分析部分是基于当时的项目,基于Mavell Pxa920,希望对初学者有点点的帮助吧.转载请注明出. 1. Camera相关介绍 ...
- DDD(Domain-Driven Design)领域驱动架构介绍
1. 什么是领域模型 在理解领域模型之前,我们先思考一下软件开发的本质是什么.从本质上来说,软件开发过程就是问题空间到解决方案空间的一个映射转化,如图1所示. 在问题空间中,我们主要是找出某个业务面临 ...
- 第一个驱动程序之i2c驱动架构介绍
编写一个I2C设备驱动程序的工作可分为两部分,一是定义和注册I2C设备,即i2c_client:二是定义和注册I2C设备驱动,即i2c_driver.下面我们就以mini2440的I2C设备at24c ...
- 安卓平台下的GPS架构介绍及驱动移植记录
一.前言 我的工作是关于汽车车机BSP部分. 汽车车机,其实基本和人们日常所用的手机一样,也是安卓平台的.所谓安卓,就是一层安卓服务包裹着Linux内核所形成的操作系统. BSP组,主要工作内容就是负 ...
- SDIO_WiFi驱动学习之SDIO架构介绍及源码分析
一.引言 因为WiFi驱动比较复杂,所以WiFi驱动的博客将多分几篇来写. 本篇博客主要介绍Linux下的SDIO架构及源码分析. 本文部分内容摘抄自网络,若有侵权,请联系删除. 二.SDIO WiF ...
- Camera5 MTK camera驱动框架介绍
一.概序: 前文已经介绍了camera驱动部分的内容Camera4 MTK camera驱动结构介绍,这里在回顾下之前的框架图, 这篇主要介绍红框部分的内容: imgsensor起到承上启下的作用,在 ...
- Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...
- Linux SPI总线和设备驱动架构之三:SPI控制器驱动
通过第一篇文章,我们已经知道,整个SPI驱动架构可以分为协议驱动.通用接口层和控制器驱动三大部分.其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能: 1 ...
- Lind.DDD敏捷领域驱动框架~介绍
最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要参考了微软的DDD大作 ...
最新文章
- 智能医疗?轻松实现!
- html引入php文件中的函数,在b2core框架和simple_html_dom.php文件里面都有一个load()函数...
- powertoys中文版
- Linux从零开始(一、安装系统)
- edp1.2和edp1.4_EDP​​的完整形式是什么?
- Asp.net C# 遍历Excel中的表格名称
- python爬取qq音乐周杰伦首页歌词
- 为什么谈及硬件,必言软件?软硬件协同让开源世界“阴阳调和”
- 退出命令_利好消息!上级命令:乡村医生满60岁要办退出手续
- 【DTOJ】2701:问候
- 如何将jar包加入到Maven本地仓库
- 计算机桌面有阴影,电脑桌面图标有蓝色阴影 怎么去除桌面图标阴影
- 关于计算机设计的英语作文,计算机专业设计英文参考文献 计算机专业设计专著类参考文献有哪些...
- 基于PHP+MySQL客户信息管理系统的设计与实现
- matlab求cos角,科学网—MATLAB求太阳高度角的小程序 - 张乐乐的博文
- 二次采样设置的四种彩色模式RGB565,ARGB8888,ARGB4444,ALPHA_8
- STM32 解析 JSON 之 cJSON
- 导出多个excel,打包成zip压缩包进行下载~~~~~~~~~
- SQLSERVER 数据库或表修复(DBCC CHECKDB)
- 【oracle工具】plsqldev美化规则文件详细解释(关键字大写,标识符小写等规则)
热门文章
- Hello Vulkan(三)| 图形渲染新技术Vulkan 着色器及SPIR-V
- 【阿里云】企业自建 Hadoop 迁移至 MaxCompute 最佳实践学习
- AssemblyInfo.cs文件的作用(转)
- 软件工程复习07:软件需求
- JavaScript 【库】测试题
- Python爬取链家地产二手房信息
- Android系统设置开机音乐、开机动画
- [BZOJ4861][Beijing2017]魔法咒语 AC自动机+动态规划+矩阵快速幂
- 如何通过图像消失点计算相机的位姿?
- 2019百家号自媒体运营攻略