已经在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
****************************************************************************************************************************************************************************************
这个是整个驱动的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互相转化等很多相关专业知识。目前通过这个小项目明白了自己的太多不足,如果想从事底层驱动相关的工作,必须得知道这些东西。