2. USB驱动设计
和其他的USB接口通信一样,由于不是标准的USB设备,需要编写特定的WDM驱动程序。开发USB设备驱动程序需要专门的开发工具,目前应用广泛的工具主要有两大类。
一类是Microsoft公司提供的Windows DDK(Device Driver Kit),由于DDK基于汇编语言的编程方式和内核模式的调用,对没有深厚的OS原理和编程水平的人员来说,任务相当艰巨。通常我们会选择另外一类,也就是NuMega公司提供的DriverStudio,它是一个大的开发工具包,包含VtoolsD、SoftICE和DriverWorks等开发工具。 VtoolsD开发包提供了对VxD编程的C/C++类库支持,利用VtoolsD中的QuickVxD工具可以快速生成VxD的C/C++代码框架,开发者可以在此基础上根据各自的需要添加自己的代码。DriverWorks用于开发KMD和WDM驱动程序,并且对DDK函数进行了类的封装,从而为开发Windows NT、Windows 2000和Widnwos98 WDM设备驱动程序提供了一个自动化的方法。利用DriverWorks开发USB驱动程序,可以大大简化开发人员的工作量、缩短开发周期以及降低开发驱动程序的难度。下面我们简单地介绍一下使用DriverStudio开发USB程序的过程。
要想使用DriverWorks,必须先安装以下软件:DriverStudio3.2,VisualStudio6.0,以及Windows2000DDK(软件版本可以根据选择)。由于DriverWorks所用的类库是对DDK的库函数的封装,还必须在Visual C++中编译需要的库文件,下面介绍怎样在VC环境中创建自己的库文件。
(1) 启动Visual C++。
(2) 选择菜单File\Open Workspace。打开位于DriverStudio\DriverWorks\Source\vdwlibs.dsw的工作空间文件。
(3) 选择菜单Build\Batch Build,在弹出的对话框架中选择你想编译的库。
(4) 点击对话框中的Build即可编译你选择的库。
下面简单说明利用DriverWorks开发我们这里的USB设备驱动程序的方法。
这个USB设备有2个批量端点,每个端点的配置如下:
端点 类型 地址 最大包大小/最大传输大小
1 IN 批量(Bulk) 0x01 8/4096
2 OUT 批量(Bulk) 0x82 8/4096
驱动程序需要实现的功能就是通过端点1和端点2对设备进行读写。
(1) 首先,通过快捷方式“Setup DDK and Start MSVC”来启动VC IDE。这个快捷方式所指向的程序,会进行一些必要的设置,然后再启动VC IDE,这样我们的程序就可以使用DDK和DW的头文件和库了。
(2) 从VC IDE的菜单“DriverStudio”中选择“DriverWizard”,之后按对话框的提示填写项目名称及所在目录。并按向导选择驱动程序类型为WDM,总线类型为USB。
(3) 按端点的配置表进行端点的设置。由于在USB中规定端点0是必须存在的,所以我们只需对端点1和端点2进行定义即可。
(4) 选择端点1和端点2产生BULK Write及BULK Read的代码,DriverWorks会自动产生读写代码,只需要进行简单的修改,就可以直接使用。
(5) 最后按下“ Finish”按钮,就结束了Wizard。
在此过程中只针对需要修改的步骤进行了说明,未加说明的部分均可直接按“Next”按钮。
到此,驱动程序完成了,为确保最后生成的USB驱动程序能编译成功,一定要注意设置DriverWorks中的Driver Build Setting(在VC++6.0的菜单中)中的[basedir]和[CPU]等项。设置好后,选择“Build/Batch Build”,在弹出的对话框中进行正确的选择,之后按下”Rebuild”按钮,稍等片刻即可生成最终的.sys驱动程序。
3. PC程序设计
PC应用程序建立在驱动程序之上,是整个系统与用户的最直接接口,可选用多种语言进行开发。这这里我们将以VC++为开发平台,以最基本的两个功能(采样控制和采样数据收集)为例说明一下如何进行应用程序的开发。读者可以根据自身应用的需要进行扩展,例如对采样数据的波形显示处理、频谱分析等。
(1) 首先我们建立一个面向对话框的应用程序。
(2) 在对话框中添加一些控件,程序主界面如图5.94所示。表5.9列出了主要控件的功能。
? 查找硬件:在这里我们通过查找USB设备来确认硬件是否连接好,在硬件插入的时候,如果没有安装驱动程序,需要安装我们前面提到的驱动。因为应用程序是以驱动为桥梁来对硬件进行访问的。如果查找成功,则可以进行采样。
? 开始采样:通过USB接口发送采样开始命令。同时开启一个线程侦听USB接口的采样数据,接收到采样数据时刷新显示区域。这里会使用到在显示处理中经常用到的双缓冲技术,也就是所有的画面绘制工作将会在一张和窗口显示界面相同大小的内存位图上完成,待所有的绘制完成之后通知显示窗口更新。在初始化的时候根据显示窗口的大小建立内存位图和内存DC,并且根据设置的量程绘制坐标。依次将采样数据绘制到内存位图中,然后使用线连接当前绘制的点和前一个点,当所有的点都绘制完成之后,刷新显示区域(每次总是显示最近的不超过500个采样数据,对高速采样这显然是不够,这也是读者实际应用中需要扩展的地方)。
? 停止采样:通过USB接口发送采样停止命令,停止对USB接口上行数据的侦听。
程序流程图如图5.95所示。