分类: C/C++
2008-03-17 13:40:25
本篇适合没有接触过驱动或者初学驱动的朋友。运行本程序以及源代码都请先看 ReadMe.txt 文件。
在本文中阐述的驱动是用windriver做出来的,没有采用DDK或DriverStudio,可能看起来并不像是一个”很正式“的驱动,而且本文中的驱动程序不可以用于DirectShow接口。对于DDK和DriverStudio我也了解了一些内容,在刚开始的时候我是满怀激情的想用DDK或DriverStudio的,很快我的激情之火就被无情的熄灭了,对于一个完全没有接触过驱动开发的人来说(在这之前我都不知道系统是如何找到某个设备驱动的),我个人觉得DDK或DriverStudio有点难了,当你对DDK或DriverStudio有些了解的时候,当你有了想编一点代码的欲望时候,你会发现结果是多么的残酷,要么运行出错,要么黑屏重启,最后你无处下手,特别是编一个硬件设备不是自己做的,对于一些产商命令都不熟悉的时候,对于初学者来说,DDK或DriverStudio显得特别难,刚开始我就是这个样子。但在我个人看来在了解了一些驱动的知识后,在用DDK或DriverStudio遇到困难的时候,不妨试试windriver,你会兴奋的发现这个工具居然不用做什么工作就可以和你的硬件通信了,这时候你会对windriver有更好把握,因为对象始终是同一个设备,共同之处还是有的。
虽然在用windriver时,你只是开发了一个看起来只是开发了一个位于应用层的软件,其实它相当于把一部分驱动程序功能提到应用程序来做了(注意:只是一部分),当然这需要windriver的api支持(所以会影响速度),其实我想这也就是windriver的开发思路吧。而且我想如果在windriver下做通的话,再用DDK或DriverStudio难度也会下降不少吧,特别是对于USB驱动来说,搞清楚URB后应该就比较容易了。好了,不多说了,下面就步入正题吧。
1、准备--知己知彼,百战不殆
对于像我这样的驱动文盲来说,了解一些驱动相关的知识是必需的。我们应该对驱动有个概念性的把握,像驱动是什么,驱动的作用是什么,硬件是如何找到对应的驱动的,应用程序又是如何与硬件通信的,驱动最终产生文件是什么,开发驱动都有什么方式等。在这个过程中,我们可以随便找些驱动开发的书看看,积累一些概念性的知识。
2、工具--欲先攻其事,必先利其器
说到开发,当然需要一个开发工具了,在这里VC是离不开的,但开发驱动,必需还有另外一个工具要我们选择。其实也就是用什么方式来产生驱动的框架,就象VC下的应用程序可以自动产生一个初始的框架一样。在这里,我们有三种方式可以选择:
3、看linux下源代码--它山之石,可以攻玉
由于linux是开源项目,所以在windows下没有的源代码,在linux往往可以找到对应的源代码,摄像头驱动就是这么一种情况。摄像头图像数据是很不好分析的,就算是ov511+摄像头的未压缩数据也不好分析,但通过linux的源代码我们可以发现(320*240, yuv420):它是通过块来进行处理的的,一块384 bytes,256 bytes y,64 bytes u,64 bytes v,可以发现其一帧数据是不是标准的yuv420格式。所以图象处理基本流程应为ov511+的yuv420->标准yuv420->rgb24。如果是对于压缩的数据,那还要先进行一个解码的工作,这也是比较繁琐的,有耐心的话可以继续看linux的源代码,不过我就没做了。
总结——乘风破浪会有时,直挂云帆济沧海
在这次学习的过程,我得出一个经验是:知识是需要一个积累的过程的,心态要放平衡,不要急于求成。由于刚开始的时候起点太高(刚开始的时候是想编个通用驱动的),对难易程度把握不准,自己又没有基础,所以很郁闷,但慢慢的,随着对摄像头驱动的了解,意识到通用其实是很困难的,你需要对各个摄像头芯片都进行编程,然后集成到一个代码里(个人理解),但有些产商是不公开datasheet,如zc301,这使得开发驱动显得尤其困难,所以现在只是选择了一款芯片:ov511,也是只对其未压缩数据进行处理了,但总算是能看到摄像头的图象了,虽然这离初始的目标还很遥远。