ov9650学习(2)

news/2024/10/18 19:23:55/


已经在2.6.24的内核将飞凌公司提供的ov9650的驱动和测试源码运行成功,不过之前那个天嵌提供的驱动和测试程序还没调通,先mark一下吧。

10月8号更新了第3篇文章实现了解决了很多第1,2篇中的问题:http://blog.csdn.net/liuzijiang1123/article/details/48970623 


具体实现:


代码放在了这里http://git.oschina.net/cw_lzj/ov9650

还有一些jpeg的动态库文件我没放上去。


关于jpeg库的编译和移植 参考这个博客http://blog.sina.com.cn/s/blog_68282f2e0102uyeo.html

在编译测试程序的时候如果出现了这个错误


函数有一点小错误,我已经改过了。


前面要加上一个*号,因为强制转换为指针,但是后面赋值的是一个整数,所以需要用*取这个指针的值。


编译的时候首先把头文件放到当前目录下,然后在配置文件中加入jpeg库的路径 sudo vim /etc/profile


然后进行编译

 ~/arm920t/arm-linux-gcc testcamera.c -ljpeg


更新 2016/4/20:

今天从新在自己虚拟机上编译还是发现找不到动态库


解决方法是将交叉编译好的动态库放到/opt/buildroot-2012.08/arm920t/usr/arm-unknown-linux-uclibcgnueabi/lib 下去即可


这里大家可以了解一下编译的时候 -l -L -i这些选项http://blog.csdn.net/zqt520/article/details/7727051 


第一次运行的时候出现了这个:


这个原因是我的fb_info参数没设置对


具体为什么要这样我也不清楚,应该是上面这样。


当你删除驱动的时候可能会出现这个问题


解决方法就是,在lib目录下创建这个文件即可:rmmod s3c2440a_camif


可以讲讲我是如何发现的:一开始出现这个错误我以为是摄像头接口的寄存器没配置好或者是ov9650的寄存器没配置好,换了几组寄存器的配置后发现还是这样,然后我就想到是不是屏的原因,但是我发现我的logo(小企鹅)在屏上是正常的,只有一个,没有出现多个的现象,然后我就用到了fb操作中画线的操作的那个程序,当它运行的时候就出问题了,发现也出现了偏移,后来我再去看我的lcd屏的信息,就发现上面这个错误了,改过来后就好了! (正常的情况下企鹅应该在左上角,而我的那个企鹅是出现在右上角的,我当时没发现)


还有一个小问题:我摄像头驱动里面设置的屏幕大小是480*272这个是拍摄出来的图片的大小么?因为原来摄像头驱动是320*240的,我改和没改从lcd里面看都没差,这个就是datasheet里面的那个窗口的大小设置,我还是不明白,因为我是4.3的屏,所以我是这样设的,发现从摄像头里看起来都没差,只是捕捉图片会发现是480*272的。


上面是代码修改和编译的工作,看似就几步,但是也要下功夫的。

****************************************************************************************************************************************************************************************

然后我再说说自己对摄像头数据流向的理解

ov9650摄像头采集数据(原始图像)-------------->摄像头接口(接收)----------->DMA通道------------>帧存储器SDRAM

****************************************************************************************************************************************************************************************


  原始数据传过来,然后如果你想到使用哪个通道就配置哪个通道的寄存器,例如我用的P通道,就配置它的寄存器,将我们的原始数据转换为RGB格式然后再通过DMA把数据传到我们的帧存储器中。如果对存储器中的数据进行操作的话就将编码DMA的RGB的第1(2,3,4)帧开始地址赋值给我们的buffer。

    iowrite32(img_buff[0].phy_base, S3C244X_CIPRCLRSA1); //预览DMA RGB第一帧开始地址
    iowrite32(img_buff[1].phy_base, S3C244X_CIPRCLRSA2); //2
    iowrite32(img_buff[2].phy_base, S3C244X_CIPRCLRSA3); //3
    iowrite32(img_buff[3].phy_base, S3C244X_CIPRCLRSA4);// 4



上面是我对整个摄像头的数据流向的理解(这个是参考天嵌的驱动)




不过对于飞凌的驱动我对数据的流向就不太理解了,因为它加V4L
 
加入了V4L是把它注册了V4L的设备?(因为开发板中设备名称变成了video),然后数据是通过v4l的api来操作的么?

今天又开了一些文章,我觉得数据流向还是跟我以前分析的那样,数据还是在内存中,只不过v4l用了mmap来讲这段内存映射到了用户空间,用户空间再mmap来找到这个映射,就能直接操作这段内存,节约了很多数据拷贝的时间。 

这个是整个驱动的fops

 static struct file_operations  cam_ops ={.open     = v4l_cam_open,.release    = v4l_cam_release,.read     = v4l_cam_read,.ioctl    = v4l_cam_ioctl,.poll     = v4l_cam_poll,.mmap     = v4l_cam_mmap,}; 

V4L2支持两种方式来采集图像:内存映射方式(mmap)和直接读取方式(read)。

V4L2支持内存映射方式(mmap)和直接读取方式(read)来采集数据,前者一般用于连续视频数据的采集,后者常用于静态图片数据的采集.

http://blog.chinaunix.net/uid-26101960-id-3297657.html

http://blog.chinaunix.net/uid-11765716-id-196071.html

这2篇文章是介绍v4l2比较好的一篇文章。


这篇是v4l的,对于我们的测试程序理解还是有帮助的,比较飞凌用的是v4lhttp://blog.csdn.net/wangrunmin/article/details/7766221

本人能力有限,目前对于这个的学习难度还是很大的。

我对于加入了v4l后数据流向的理解是将我们的dma缓冲区通过mmap映射到了用户空间,然后用户空间再利用这一段内存将其显示到LCD上,具体怎么实现我不会(应该是通过V4L里面的ioctl来实现的吧)。


内核中的mmap比较复杂,还要牵扯到vma,这里真的是深水区。我目前还不明白。


**********************************************************************************************************************************************************

V4L的视频流数据读取:

首先,打开视频设备文件,进行视频采集的参数初始化,通过V4L接口设置视频图像的采集窗口、采集的点阵大小和格式;

其次,申请若干视频采集的帧缓冲区,并将这些帧缓冲区从内核空间映射到用户空间,便于应用程序读取/处理视频数据;

第三,将申请到的帧缓冲区在视频采集输入队列排队,并启动视频采集;

第四,驱动开始视频数据的采集,应用程序从视频采集输出队列取出帧缓冲区,处理完后,将帧缓冲区重新放入视频采集输入队列,循环往复采集连续的视频数据;

第五,停止视频采集。

************************************************************************************************************************************


还是总结一下吧(感觉自己说得太乱了):

 首先前面数据流向还是一样的,就是后面加入了v4l后,dma中的数据去哪了,我目前觉得是把它重新申请了一个区域,然后应用程序再来操作这个空间的数据。


对于飞凌的驱动我就不再多说了,因为越看下去感觉自己好多都不懂,确实现在能力不够,要想明白整个驱动,必须得了解内核的内存管理机制,mmap, dma,v4l,中断,poll机制.....................还有关于yuv rgb互相转化等很多相关专业知识。目前通过这个小项目明白了自己的太多不足,如果想从事底层驱动相关的工作,必须得知道这些东西。












http://www.ppmy.cn/news/152471.html

相关文章

ov9650驱动分析

OV9650驱动程序跟踪 (2012-05-31 11:11:48) 转载▼ 标签: 杂谈分类: LINUX 学习了裸机OV9650的P通道LCD直接显示程序,作为这点基础开始分析OV9650在linux设备驱动程序。 我们跟踪程序按照常规方法,跟着驱动的编写脉络去读程序。 …

OV9650驱动程序跟踪分析

原文出自http://blog.csdn.net/mirkerson/article/details/8170227 学习了裸机OV9650的P通道LCD直接显示程序,作为这点基础开始分析OV9650在linux设备驱动程序。 我们跟踪程序按照常规方法,跟着驱动的编写脉络去读程序。 1、在程序中找到程序入口函数——…

ov9650学习(1)

前言:对于ov9650的学习做一个记录,目标是在我的fl2440的板子上移植ov9650的驱动并实现在lcd上显示摄像头拍摄的内容,虽然最后还是花屏,但是还需要做一个记录,记下自己学习到的一点东西。希望发到网上然后得到广大网友的…

TQ2440实验板OV9650测试程序的详解

我买的是TQ2440实验板,LCD是480*272。实验板给的测试程序是针对320x240的,下面给出详细注解,并且改成480*272显示。修改后的程序在板子上成功运行。 程序中的注解只是我作为一个初学者的角度来理解的,有什么不对的地方还望指教。…

三星s9刷android原生6,【极光ROM】-【三星S9/S9+ G9600/G9650-845】-【V22.0 Android-Q-TF6】...

● 支持机型: ● G9600(国/港行S9) ● G9608(移动定制版S9) ● G9650(国/港行S9+) 主要更新内容: 1、基于G9650官方最新安卓Q底包G9650ZCU6ETF6(OneUI2.1)制作。 2、基于官方最新ETF6内核源码重新编译内核。 3、所有APP升级至官方最新版本。 4、Magisk插件更新为最新版本。 5…

android9 三星 港版,三星S9+官方港版安卓9完整固件系统升级包:TGY-G9650ZHU5CSFB

咱们的这个三星Galaxy S9手机也是在最近发布的这个完整版本的系统rom包,是这个TGY-G9650ZHU5CSFB,也是官方线刷格式的多件套包,非常的实用的,可以用来进行系统的升级更新用,也可以进行救砖用的。 三星S9官方港版安卓9固…

网络摄像头4 cmos 0v9650,driver

将ov9650的驱动编译进内核 Device Drivers ---> <*> Multimedia support ---> <*> OV9650 on the S3C2440 driver 查看这项的help&#xff0c;可知符号 Symbol: S3C2440_CAMERA [y] 在目录/opt/FriendlyArm/mini2440/linux-2.6.32.2/drivers/media…

android9 三星 港版,三星S9+官方港版安卓9固件rom刷机包:TGY-G9650ZHS4CSD7

咱们的三星Galaxy S9手机也是在4月28日同步更新了最新的港版固件系统rom固件刷机包&#xff0c;也是这个安卓9的&#xff0c;是完整版本的线刷格式的rom系统包TGY-G9650ZHS4CSD7&#xff0c;可以用于系统的升级更新用&#xff0c;也可以用于救砖操作&#xff0c;有需要同学可以…