您的位置:首页 > 其它

ov9650学习(2)

2015-09-20 17:05 183 查看
已经在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

这里大家可以了解一下编译的时候 -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的,对于我们的测试程序理解还是有帮助的,比较飞凌用的是v4l/article/2422618.html

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

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



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

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

V4L的视频流数据读取:

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

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

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

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

第五,停止视频采集。

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

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

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

对于飞凌的驱动我就不再多说了,因为越看下去感觉自己好多都不懂,确实现在能力不够,要想明白整个驱动,必须得了解内核的内存管理机制,mmap, dma,v4l,中断,poll机制.....................还有关于yuv rgb互相转化等很多相关专业知识。目前通过这个小项目明白了自己的太多不足,如果想从事底层驱动相关的工作,必须得知道这些东西。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: