网站导航: 首页 > 设计参考 > 正文 文章搜索
Usb开发的经验
 
文章编号:
081126161625
文章分类: 接口技术 USB
点 击:
...
关 键 词: 经验
文章来源:
网络
摘 要:
我在学习USB开发的过程中走了不少弯路,现在想开发USB的网友越来越多,我也不妨把这几个月以来自己开发中的经历告诉大家,也许少走些弯路...

BTW:C51的编译环境推荐使用Keil C51 uVision 6.20版的完全解密版。没有解密的版本用起来有很多的不便。而且会有写bug,当然这个版本据说也是有一些bug,但是至少现在觉得还是比较好用的。
    说了那么多,其实设备端的Firmware的设计相比于整个“工程”来说只是很小的一部分,真正的困难的地方是开发Windows端的驱动。在我自己的经历中,研究驱动的开发这段过程几乎占据了80%的时间,可以说现在也在研究,以后还得继续研究。有点庆幸自己大一的时候C语言学得还可以,现在的整个工程几乎没有那个环节和c语言没有关系的。从设备端的Firmware开发,设备驱动的开发和驱动程序的编写,没有一样离得开C语言的。当然,开发驱动所用到的C语言环境有和以前所接触到的C语言的环境有很大的不一样,也许语法结构是一样的。但是以前很多标准的有用的C库函数就不能随便乱用了。

    刚开始的时候,包括我和我的老板都有那样的想法,Windows本身已经有了Usb总线的驱动程序,所以在硬件设计完毕之后只要再设计Pc端的应用程序就可以和设备进行通讯了。就连Phil的资料也是直接就给了几个CreateFile,ReadFile和WriteFile,说这样就可以和设备进行通讯了。其实不然,总线驱动固然可以和你的设备直接通讯,但是不同的Usb设备还是有自己不同的特点的,这些特点总线驱动不可能都服务到的,总线驱动只是完成一些最基本的工作,根据设备的特点来控制对设备的读写等操作还是必须得由设备的客户驱动来完成,不过客户驱动也只是管理对总线驱动的调用就可以了。对于WDM驱动开发,书籍和网上的资料也不少,我也不可能完全的按照我自己的理解都说出来。不过我还是可以把我学习过程中的一些感受跟大家说说,刚开始看的书是我们组里的一本《Windows WDM设备驱动开发指南》,Chris Cant编的,那本书看得我好费劲呀,感觉他写得太笼统了,如果对Windows的内核环境以前从来没有过什么了解的话很多概念理解起来比较困难。尤其是Usb开发的那章。后来换了一本Microsoft Press的《WDM设备驱动开发》Walter oney写的那本,那本书不知道现在有没有翻译好的发行。我在DriverDevelop下载了一本站长翻译的电子版的。感觉这本比较适合入门,讲得比较详细,像设备接口,中断请求级(IRQL)以及内核同步问题,Chris Cant那本书对这些概念问题几乎避而不谈,而这些概念我都是看了Walter oney的书之后才比较理解,尽管看电子版的书比较痛苦,而且也付出了视力下降的代价。但是Walter oney的书中的例子不太好理解,因为他自己也做一个Generic的封装,移植性不是很好,而且书中的大部分程序都需要合适的外设才能调试。而Chris Cant的例子很值得好好研究(个人觉得),首先他的程序设计完全是利用DDK,除了借助VC的IDE开发环境之外,而且DebugPrint的调试方式更有利于理解驱动程序的原理。设想一下,你可以打开DebugPrint的Monitor,然后把你的设备插入PC的Usb插槽,你就可以很清楚的看见整个驱动的工作过程,Pnp管理器的工作过程。

    刚开始接手这个工作的时候,有个师兄吓唬我说:写驱动啊?很恐怖的,调试的时候必须用两台电脑拿电缆连接起来才行。幸亏我没被吓倒,不过写驱动的确是很头痛的事情,调驱动则是更恐怖的事情。你会有机会经常看见win2000的难得一见的死亡蓝屏,呵呵。不过幸运的是,写Usb驱动相比于其他驱动程序来说要简单一下,因为我们所需要的Usb设备的客户驱动几乎不用直接和设备的硬件打交道,很多事情都可以交给总线驱动来完成,就像前面所说的一些标准的请求。我们所要做的事情就是响应应用程序的IO请求,稍加处理后将请求发送给总线驱动,我们这里所要做的请求不是很复杂,比如管理读写的数据量,管理读写对应的管道等。还有Io控制请求,比如我们可以像设备发送一个Vendor Request,让小灯一灭一闪。这些请求都是通过Usb的总线驱动来完成,具体怎么完成我们就不用管太多了。一般来说,只要你循规蹈矩的,不要做什么“越轨”的事情,死亡蓝屏很少出现的,顶多是输入输出的数据不太对罢了。建议使用Win2000作为开发平台,个人感觉Win2000的Pnp管理似乎更加完善。开发的时候可以省去很多麻烦,至于和98兼容的问题可以以后在慢慢考虑,应该不是主要问题。

    Visual Studio和2000DDK是必不可少的开发工具,另外Platform SDK也应该装上,里面有很多有用的工具可以用的上的,比如Guiden,我就经常得用到。另外作为调试,DriverStudio也是必须的。
    前段时间邮购了一套DriverDevelop开发的Usb开发板,感觉还是很好使的。虽然暂时只有LedOn,LedOff和LedFlash几个功能,但是用于测试你的程序还是比较方便的。而且我觉得有了这么一个硬件环境来实践你的程序的确是相当难得的,我就是因为没有一个好的硬件环境使得我的工作搁浅了很长的一段时间。驱动开发网上有一篇文章是“10分钟开发一个Usb驱动”,完全照着那个驱动开发一个DriverWorks的驱动程序就可以对这个设备进行控制了。整个工作是相当方便的,至于应用程序的编写,相比之下就是小case了。呵呵。另外用DriverWorks你还可以很方便的测试Usb的其他几种类型的传输比如Bulk,interrupt和Iso,但是为了加深对WDM驱动的理解,我最后还是用DDK重写了它的驱动。虽然费了点事,但最后还是获得了成功。就Chris Cant的那本书的章节而言,我觉得只要理解了前9章的内容(包括驱动的框架,驱动的初始化,IRP分发例程,PNP管理)和后面关于中断控制,Usb传输的内容之后就可以设计一个基本的Usb客户驱动了。其他方面以后可以慢慢加深,也不是说没有必要。

   关于驱动程序的调试,正如前面说的DebugPrint是很不错的工具,另外,DriverStudio中的SoftIce还是必不可少的,毕竟可以在单机上进行源代码级的程序调试还是很爽的事情。不过SoftIce的界面不是很友好哦,有时候它莫名其妙的弹出来会给你一种恐怖感。另外你就不能一边调驱动一边听音乐了。呵呵。

    对于SoftIce不是很熟,目前也就会加载程序,设断点而已。程序的代码加载的过程不是很复杂,用SoftIce symbol Loader打开你的驱动(*.sys文件),然后生成SoftIce需要的*.nms符号文件,打开*.nms文件并载入模块,就可以在SoftIce中调试你的驱动了,比如你可以在Read的分发例程中设一个断点,调用你的应用程序读你的设备,你就会看见SoftIce的窗口弹了出来,停在你设的端点上了。是不是很爽?不过我以前犯过一个比较愚蠢的错误,就是用Free版本的模块去调试,结果断点永远不起作用。呵呵,记住得用Checked版本的驱动。

    关于驱动的安装和Inf文件的编写,可以参考那两本书,说得还是比较详细的。

    我所做的工作目前也就是这个地步,虽说已经迈出了“人类历史的一大步”,但是后面还是很多“步”要走,所以,继续吧。

    在这里还得谢谢DriverDev版的许多网友在这段时间给我的帮助,让我能迅速的得到提高。希望我的文章也能对初接触Usb的朋友有所帮助。也希望大侠能提供一些更好的建议。

温馨提示:

  百合电子工作室有一个关于USB开发方面的开源项目-Easy USB 51 Programer,整个开发过程写得非常详细,不防参考一下,您还可以进入她的论坛参与此项目的讨论。

 
相关文章:

上一页 12
 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4