Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1569588
  • 博文数量: 884
  • 博客积分: 52280
  • 博客等级: 大将
  • 技术积分: 13060
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-06 09:46
文章分类

全部博文(884)

文章存档

2008年(884)

我的朋友

分类: C/C++

2008-08-06 10:03:34

下载本文示例代码

下载源代码
 

本篇适合没有接触过驱动或者初学驱动的朋友。运行本程序以及源代码都请先看 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下的应用程序可以自动产生一个初始的框架一样。在这里,我们有三种方式可以选择:

  • 从DDK自带的例子(此时许包含DDK的编译工具),如usbintel出发编写,这种方式编出来的驱动质量应该是最好的,但同时难度也是最大的;
  • 用DriverStudio(此时许包含DDK的编译工具),其实DriverStudio就是对DDK进行了封装,其难度虽然有所下降,但对于我这样的初学者还是困难重重,有个比喻打的很好,DriverStudio与DDK的关系,就像VC与SDK的关系;
  • 用windriver,正如前面所说,windriver其实带了一个它自身的驱动(普通模式下),所以它可以直接与你的硬件通信,当然你需要对你的硬件进行一些设置,如一些产商命令的发送,也就是是一些寄存器的设置。然而,硬件往往都有很多的寄存器,所以要自己手动一个个设置显得很繁琐,如果你的硬件已经有现成的驱动(如摄像头),我们就可以借助像bushound工具跟踪驱动加载的整个过程,然后自己写个程序将结果转换为代码,再加上自己需要的特殊设置就可以了,我就是这样的做的,不过这样的代码风格可能显得很差。由于在这个过程中你需要对产商命令加以了解,所以看硬件的datasheet是必需的,这也是我选择ov511 芯片的摄像头的原因,它的datasheet是公开的。

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,也是只对其未压缩数据进行处理了,但总算是能看到摄像头的图象了,虽然这离初始的目标还很遥远。

下载本文示例代码
阅读(522) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~