第四篇:两利相权取其重-多个USB设备通用驱动程序的综合比较

自接触WINDOWS驱动开发,接触USB应用与IP开发以来,使用与修改了一批USB的驱动程序.


Windows7以前的系统自带了, EHCI, O/UHCI, USB HUB 2.0, USB STORAGE, USB VIDEO, USB AUDIO, USB HID等驱动程序.

Windows8系统还增加了xHCI, USB HUB 3.0, UASP的驱动程序.

同时,还有一些第三方的xHCI HOST驱动程序,比如NEC, FRESCO, MCCI等, 这些驱动程序主要有两个方面的作用:第一,在WINDOWS8上市之前,作为WINDOWS7上的XHCI HOST驱动程序使用, 随着WINDOWS8的上市,他们也将慢慢地被WIN8 XHCI驱动所代替,退出市场.第二,在这些XHCI HOST IP未成熟期间,对他们进行一些BUG的软件修改.

下图是对WINDOWS系统上USB驱动栈的一个描述图:

从该描述图中,我们可以看到,WINDOWS对USB的支持是一如既往的与紧跟着时代潮流的,其背后的驱使动力就是USB应用的广泛普及与商界利益的成功.

所以说,WINDOWS已经为USB应用开发者与IP开发者提供了比较完善的应用生态系统,让开发者从费时,费力,且技术壁垒不算低的驱动开发中解放出来,让开发者将时间,精力,财力致力于其专业特色方面,

第四篇:两利相权取其重-多个USB设备通用驱动程序的综合比较_第1张图片


但是,无论是USB应用开发,还是USB IP开发,即使有了WINDOWS8的提供的比较完善的USB驱动软件生态系统,也是离不开软件开发的工作的.

单从一个USB mass storage设备开发来讲,需要编写与调试符合USB3.0/2.0/1.1/1.0协议,BOT协议的固件程序,软件的工作占据了整个项目近50%的开发工作量,剩下的另外50%包括芯片选型,方案论证,硬件制板调试,以及测试.


在USB应用产品/USB 设备IP开发初期, 选择一款通用的USB测试验证驱动程序是必须的,往往起到了事半功倍的效果.

就我所使用或者修改过的USB通用测试验证驱动程序来讲,主要包括以下几款:

1) Philips PDIUSBD12 USB1.1 driver

2) Cypress USB2.0 driver

3) WinUSB driver

4) osrusbfx2 driver

5) usbsamp driver

6) Cypress USB3.0 driver


Philips PDI USB D12是应用于D12一块USB1.1开发板上的驱动程序,由于USB1.1已经基本被USB2.0甚至USB3.0所替代,所以,目前很少人知道有这样一款芯片及其驱动程序,但是,就这款驱动程序的功能而言,它是完善的,包括了USB传输的全部四种类型:control, bulk, int, iso. 对于第一次学习USB协议,WINDOWS WDM驱动,USB驱动程序而言,它的代码质量比较高,而且其中包含了一套完整的"SetupDiXXX"应用程序API取得USB设备名柄的过程. 这款驱动稍加修改,完全可以应用在USB2.0设备上.


Cypress USB2.0驱动程序:

不同于PDI USB D12的设备驱动,Cypress USB2.0驱动使用"Symbol link"取代"SetupDiXXX"来提供给上层应用程序取得USB设备句柄.

值得注意的是,Cypress USB2.0驱动后续版本, 将USB设备驱动以C++类的形式管理起来, 比如, USB DEVICE, USB INTERFACE, USB PIPE, 应用程序开发者甚至不需要了解"SetupDiXXX"或者"Symbol link",而只需要实例化一个USB DEVICE类,就用方便地使用它的驱动程序,所以说,这是一个非常大的进步.

不过,就C++前的版本而言,笔者就在使用/测试过程中,碰到过一个非常明显的驱动BUG:由于它未实现WMI例程,所以在DRIVER VERIFIER测试时,直接导致系统蓝屏,修复的办法很简单,在WMD驱动中增加对WMI的支持函数.

Cypress USB3.0驱动从本质上来讲,没有根本性的变化,而且,它目前并不支持对USB3.0 Bulk Streaming的支持,所以,没有太大的突破,其保留了C++类管理的形式.


关于

WinUSB, osrusbfx2两个驱动,MSDN上有非常详细的介绍可以参考:

http://www.microsoft.com/whdc/connect/usb/winusb_howto.mspx

http://code.msdn.microsoft.com/windowshardware/wdfosrfx2lab-c10cb375

这两个程序无法用在USB IP项目上,主要原因为他不支持USB ISO传输,且WINUSB没有源码.


最后,讲一讲USBSamp这个驱动程序:

MSDN上也有对其比较详细的介绍:

http://code.msdn.microsoft.com/windowshardware/Usbsamp-Sample-6bbfe145


但是笔者在USB DEVICE IP验证项目过程中,由于实际需要,还是做了一些功能的补充与修改:

1. USB3.0增加了EP DESCRIPTOR的COMPANION DESCRIPTOR, 需要在驱动中增加读取与解析的功能

2. 针对USB BOT协议,增加RESET DEVICE与GET MAX LUN的CONTROL REQUEST,方便应用层的直接调用

3. 修改ISO读写的算法,由于原来的平均算法会导致ISO IN BABBLE ERROR,但是ISO OUT没有这个问题

4. 修改代码中的一个硬编码错误, 需要根据EP SERVICE INTERVAL来决定所需传输包的最小公约数

http://msdn.microsoft.com/en-us/library/windows/hardware/hh406225.aspx

同时,增加了USB3.0的重要功能:

5. 增加对USB3.0中, BULK STREAMING的支持


与此USB通用驱动程序配套的是一个命令行APP.

同样,根据项目需要,我也增加了一些相对应的功能,包括如下:

1. 发送符合BOT协议的数据包, CBW, DATA IN/OUT, CSW,用来测试BOT MASS STORAGE DEVICE

2. 增加多实例的选择

3. 增加通过读取文件数据, 用作测试数据, 以验证USB IP中的EP OUT/IN的正确性, 而这些文件主要是USB analyzer中所保存的存在疑点的数据包.

4. 将原来的同步读写,改为异步读写,以便检测读写超时, 如果超时发生的时候,发送特定的USB CONTROL REQUEST, 方便我们在USB ANALYZER中找到出问题的时间点


综合以上所述:

所有的驱动程序都有一些自带的问题在里面, 使用者需要根据自身的需要, 项目的需要,选择适合的一款, 并且有针对性的加以修改.

如果项目开发过程中, 出现了新的需求, 还应该加以修改, 一方便满足项目的需要,方便软件硬件工程师的应用与测试需求,另一方面,提高作为底层软件工程师的驱动开发能力.





你可能感兴趣的:(usb,设备驱动,Windows驱动)