由于公司项目需要,做一个摄像头采集再通过WIFI传输至上位机端的设备。初步定的方案是用ARM-CortexA8内核的CPU+摄像头+WiFi的方式。看起来跟现在流行的无线网络摄像头差不多,但是要求高帧率,低延迟,所以打算先把原理样机搭好,编程试验这两项指标依照现有的技术是否能满足要求,所以就有了这个OV9650驱动的移植。
买了广州天嵌的TQ210开发板和摄像头模块及WIFI模块,就开干了。没想到买时销售信誓旦旦的说摄像头模块有驱动,买回来才发现是封装好的module,根本没有开源,顿时欲哭无泪。没办法,只能自己移植了。网上找了相关的驱动源码,发现大多数是一个S3C2440芯片下的驱动ov9650.c,内核版本也不是跟开发板一样的,没有多少参考价值。找啊找,终于找到一个这个内核下的,并且也是该芯片的驱动源码。(为了不泄露厂家的商业技术机密,这里就不透露是哪个厂家的了。)
移植过程很简单,把找到的内核的fimc文件夹整个替换掉天嵌的内核的fimc文件夹,修改一些相关参数(主要是编译内核时的配置),编译成功。开发板tftp启动内核,运行天嵌的应用例程,显示驱动不成功。这下难办了,驱动哪里有问题呢?
跟踪报错的函数,查了网上的一些相关资料,也没有什么头绪。突然想到,原来的内核(指下载的)既然已经是移植好了ov9650驱动,那它肯定没有问题。使用笨办法,把两个内核的相同文件一一比较,以天嵌的原文件为基础,修改移植的文件,驱动成功。
修改的文件主要有2个:fimc_capture.c和mach-tq210.c。一个是天嵌加了摄像头自动识别的部分(增加了驱动移植的难度,网上查到不少人就因为这个没有能继续做下去),一个是平台相关的代码。
虽然修改OV9650输出60帧/秒YUV格式及灰度图显示还没有调出来,但也算是一个良好的开端。这也是自己第一次进行嵌入式linux驱动的移植,重要的不是改了哪些代码,而是当遇到困难时,解决问题的思路和方法。现总结一下:
1、看书千遍不如亲自动手做一遍。开始的头几天都是看人家的源代码,网上人家的各种技术帖子。看得虽然多,但是基本上什么都没记住。利用内核自带的OV9640.c修改编写成OV9650.c的驱动,一个函数一个函数的代码拷贝和修改,只花了1天,整个驱动的流程就全部清楚了。当然,看得多也为后面解决一些问题时提供不少帮助。
2、目前解决问题的方法是在网上搜索错误代码,看网上的高手是怎么解决的。即使暂时解决不了的问题,也要沉下心,一个一个原因地去分析查找和故障排除,最终总能把问题解决。
3、做技术的最忌心浮气躁。老想着网上一查就有一个完美的例程和没有错误的源码刚好适合你,这是不可取的。有时最笨最踏实的办法就是最好的办法。(明明代码可以整块复制过来的,非要一行行得敲或粘贴。这样虽然慢,但理解得深刻,记得牢。)想要更快最后反而更慢。