前言:对于ov9650的学习做一个记录,目标是在我的fl2440的板子上移植ov9650的驱动并实现在lcd上显示摄像头拍摄的内容,虽然最后还是花屏,但是还需要做一个记录,记下自己学习到的一点东西。希望发到网上然后得到广大网友的帮助,如果能对你们学习的过程中有帮助我也是荣幸。
内核:linux-3.0
开发板:fl2440
交叉编译器:arm-linux-gcc 2012.08
下篇地址:http://blog.csdn.net/liuzijiang1123/article/details/48247605
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
遇到的难题(从浅到深)
源码的寻找
我用的3.0的内核里面并不自带ov9650的驱动,飞凌公司自带的驱动是2.6.32内核。(由于内核版本差别比较大,所以内核自身的一些api也有变化,编译出现了很多问题)
ps:这个问题其实就是最大的一个问题,找不到合适的驱动嵌入合适的内核中,最后失败的原因我估计也是跟这个问题有一定联系的。
自己解决的办法:
a.首先肯定是重新编译它的驱动,由于版本差别过大很多api都不一样了,改了一些错误,后面出现的错误也越来越多,导致放弃,后面直接找了2.6.32的内核
经行编译,运行内核的时候总是卡在一个地方进不去,这个待解决。
b.网上查询关于ov9650的驱动源码,各个网站留言求代码,得都的一些代码( ov9650近几年才开源,所以网上相关文章并不是很多),可是平台不一样,有一些自己也看不懂,最后决定用天嵌公司的ov9650的源码,进行移植。
驱动的移植
对于驱动的移植有两种方法,一驱动集成到内核,二是生产.ko文件,在内核运行后再加载进去。经后面的对于花屏的测试的经验,还是第二种方法好,生产.ko文件,不用反复编译内核,一直擦出nand flash容易损坏。
ps:下面我就把内核移植的过程贴一下给新手看看。
一共6个文件:s3c2440camif.c s3c2440camif.h s3c2440_ov9650.c sccb.c sccb.h Makefile
第一种方法不适合代码调试的阶段,但是也是有用的,所以得学会。
首先还是将这6个文件放在一起文件夹cmos130下
将这个文件夹放在 ./drivers/media/video/cmos130/
然后在video这个目录下的Kconfig文件中添加ov9650的选项,因为你make menuconfig进行配置的适合需要读取Kconfig
---------------------------------------------------------------------------------------------------------------------------------------------------------------
config VIDEO_OV9650
tristate "OmniVision OV9650/OV9652 sensor support"
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
---help---
This is a V4L2 sensor-level driver for the Omnivision
OV9650 and OV9652 camera sensors.
source "drivers/media/video/cmos130/Kconfig"
--------------------------------------------------------------------------------------------------------------------------------------
ps:---tristate 代表三种状态:1.[ ]不选择,2.[*]选择直接编译进内核,加载驱动到内核里,3.[m]动态加载驱动;
denpends on 后面的是它所依赖的,必须选上它们才能出现* 或者是出现个选项
在video下的Makefile中添加:
***********************************************************************************************************************
obj-$(CONFIG_S3C2440_CMOS_CAMERA130) += cmos130/ (进去coms130这个文件中寻找.o文件)
***********************************************************************************************************************
进去cmos130,vim Kconfig
***********************************************************************************************************************
menu CMOS_Camera_syd168
config S3C2440_CMOS_CAMERA130
tristate "OV9650 on the S3C2440 driver for SMDK2440"
depends on VIDEO_DEV && SMDK2440_CPU2440
default y if (VIDEO_DEV && SMDK2440_CPU2440)
endmenu
************************************************************************************************************************
然后你就可以make menuconfig,选上ov9650的驱动了。
下面是图解:
下面是Makefile 中的内容:
s3c2440camera-objs := s3c2440_ov9650.o sccb.o s3c2440camif.o
obj-$(CONFIG_S3C2440_CMOS_CAMERA130) += s3c2440camera.o
第二种方法:
这个方法只需要改变Makefile中的内容即可
ARCH=arm920t
CROSS_COMPILE ?=/opt/buildroot-2011.11/${ARCH}/usr/bin/arm-linux-
PWD := $(shell pwd)
KERNELDIR ?= ${PWD}/../fl2440/kernel/linux-3.0/
obj-m := s3c2440camera.o
s3c2440camera-objs :=s3c2440_ov9650.o sccb.o s3c2440camif.o
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
@make clear
clear:
@rm -f *.o *.cmd *.mod.c
@rm -rf *~ core .depend .tmp_versions Module.symvers modules.order -f
@rm -f .*ko.* *ko.* .*.o.cmd
clean: