USB数据采集系统论文(8)

2019-04-13 23:18

上的基本芯片。它查找任何简单的设备,如内置的串行口和键盘,它还查找PCI适配器(控制PCI总线的电路)。然后,PCI总线驱动程序枚举和配置它所发现的所有硬件。首先,它发现到ISA总线的桥,它的驱动程序然后发现一个PnP ISA声卡,并装入该声卡的驱动程序。PCI总线驱动程序不像其他的硬件驱动程序通过硬件抽象层(HAL)访问它的硬件,USB的驱动程序依赖于它的总线驱动程序(USBD.SYS)。为了发送一个请求给设备,驱动程序要创建一个USB请求包(URB,USB request block),并将它发送给USB总线驱动程序。例如为了配置一个USB设备,驱动程序需要递交几个URB,以读取配置和发送命令。USBD.SYS根据命令和总线带宽调度这些请求,并将它们发送到总线上。

根据USB协议的规定,每一个USB设备都可以有一个或多个配置,它们控制着设备的行为。设备的每一种配置可以包含一个或多个接口,这个接口描述软件操作硬件的方式。对于支持相同接口的设备,它们的软件是可以互相替换的,因为相同的接口规定了相同的命令和方法。同时,接口也有一个可选设置,以适应不同带宽的需要。每一个设备的接口可以有很多的端点,每一个端点代表着一个管道。Windows提供了几个系统驱动程序,用其支持USB总线。它们包括了一个主机控制器的驱动(OPENHCI.SYS/UHCD.SYS),一个集线器驱动(USBHUB.SYS),一个被控制器驱动所用的类驱动程序(USBD.SYS)。由于我们的客户端驱动程序主要和USBD.SYS打交道,所以可以把以上的所有驱动统一用USBD.SYS来表示。因此我们所要做的USB驱动程序就是根据系统方案和USB协议,构筑不同的URB,并将其通过内部IOCTL的方式,发送给USB的总线驱动程序(USBD.SYS)。

图4-4 USB的WDM接口框图

4.3 USB驱动的开发环境 4.3.1 驱动的开发工具

本设计采用Visual C++6.0、Win DDK 2600和 DriverStudio v3.2作为开发基于USB的数据采集系统驱动程序的软件开发环境。其中DriverStudio为主要开发工具。DriverStudio是设备驱动程序开发工具中的极品 。这套革新的软件包括久经考验的工具SoftICE、DriverWorks、VtoolsD和DriverAgent,以及基于应用层技术的新的设备驱动程序工具。目前又最新推出了针对网络驱动程序开发的工具DriverNetworks。这就构成了一整套工具软件,它们加快了设备驱动程序的开发、调试、测试、调谐以及部署。DriverStudio把高质量的工具和现代的软件工程实践带给了一度被忽视的设备驱动程序编程领域。

由于采用了即插即用、电源管理和新的WDM驱动程序体系结构等技术,开发和测试哪怕最简单的设备驱动程序也变得比任何时候都复杂。DriverStudio采用新的WDM类、即插即用消息的缺省处理,以及可以揭示Windows 2000内核真实运行状况的全面追踪功能。这就使Windows 2000驱动程序的开发工作,从设计到部署,都得到了简化。DriverStudio提供的视窗系统设备驱动程序开发工具可以提高开发速度,改善测试方法,增强可靠性。不管你的专业技术水平如何,不管你处于哪个开发阶段,也不管你现在选用的是什么工具,DriverStudio都会使你在开发设备驱动程序时感到更轻松。DriverStudio中的DriverWorks工具为开发Windows NT、Windows 2000和Windows 98 WDM设备驱动程序提供了一个自动化的方法,这个产品包括改进的DriverWizard。DriverWorks提供独特的DriverWizard可以自动生成代码,可以引导开发人员完成设备驱动程序开发的全过程,并能根据你的硬件种类自动生成设备驱动程序源代码。类库把常用的操作封装起来,大大减少了你的编码工作。精心制作的类库减少了对简单接口的复杂操作,而且在模仿基本操作系统的面向对象特性时,甚至比微软的DDK所提供的程序性基于C语言的接口做得更好。

4.3.2 驱动开发环境的安装与设置

开发驱动程序之前,先要安装和设置开发环境。安装开发软件时必须按照先装Visual

C++6.0,再装Win DDK 2600,最后装DriverStudio v3.2的顺序进行。三个软件最好都选择完全安装,可以避免发生找不到文件或类库之类的错误,安装DDK时可以去除对应64位操作系统的选项。安装完成后还需要进行一些设置,首先需要设置DDK的开发环境,在开始菜单中找到并点击Checked Win XP DDK Build EnvelopMents,在窗口中键入build –cZ,开始执行批处理SETENV.BAT,会自动设置环境并创建所需类库和文件。然后就需要编译DriverWorks中的类库。在Visual C++ 中选择菜单 File|Open Workspace,打开位于C:\\Program files\\ DriverStudio\\ DriverWorks\\Source\\vdwlibs.dsw的工作空间文件,选择菜单 Build|Batch Build,在弹出的对话框中选择x86系列的库,点击Build编译选择的库,点击Rebuild重新编译一次类库。点击开始菜单中Compuware DriverStudio\\Develop\\ DDK Build Settings设置并进入组合开发环境,到此就完成了驱动开发环境整个设置。

4.4 驱动程序的实现

USB设备驱动程序在本设计中由四个模块实现:初始化模块、即插即用管理模块、电源管理模块以及I/O功能实现模块。初始化模块提供一个入口函数DriverEntry(),所有对各种IRP(I/O Request Packet,IRP请求包)的处理例程都在此入口函数中做出定义。即插即用管理模块实现USB设备的热拔插及动态配置。当硬件检测到USB设备接入时,Windows98查找响应的驱动程序,并调用它的DriverEntry例程,PnP管理器调用驱动程序的AddDevice例程,告诉它添加了一个设备;在此处理过程中,驱动程序收到一个设备启动请求(IRP_MN_START_DEVICE)的IRP。同理,当要拔除时,PnP管理器会发出一个设备删除请求(IRP_MN_REMOVE_DEVICE)的IRP,由驱动程序进行处理。通过对这些PnP请求的处理,可支持设备的热插拔和即插即用功能。电源管理模块负责设备的挂起与唤醒。

I/O功能实现模块完成I/O请求的大部分工作。若应用程序想对设备进行I/O操作,它便使用Windows API函数,对WIN32子系统进行WIN32调用。此调用由I/O系统服务接收并通知I/O管理器,I/O管理器将此请求构造成一个合适的I/O请求包(IRP)并把它传递给USB设备驱动程序,USB设备驱动程序接收到这个IRP以后,根据IRP中包含的具体操作代码,构造相应的USB请求块并把此URB放到一个新的IRP中,然后把此IRP传递到USB总线驱动程序,USB总线驱动程序根据IRP中所含的URB执行相应的操作(如从USB设备读取数据等),并把操作结果通过IRP返还给USB设备驱动程序。USB设备驱动程序接收到此IRP后,将操作结果通过IRP返还给I/O管理器,最后I/O管理器将此IRP中操作结果返还给应用程序,至此应用程序对USB设备的一次I/O操作完成。

4.4.1 驱动入口

USB驱动程序和一般的DOS/Windows C语言程序不一样,它没有main()或者WinMain()函数入口。和DLL类似地,它向操作系统显露一个名称为DriverEntry()的函数,在启动驱动程序的时候,操作系统将调用这个入口。DriverEntry除了做一些必要的设备初始化工作外,还初始化一些Dispatch例程入口。我们知道,USB应用和设备驱动程序打交道主要是通

过CreateFile、ReadFile、WriteFile和DeviceIoControl等Win32 API来进行的。这些API其实都对应着驱动程序的一些Dispatch例程。而驱动程序除了DriverEntry以外,主要就是由这些Dispatch例程组成的。例如调用Win32 API CreateFile的时候,操作系统最终转化为对驱动程序IRP_MJ_CREATE功能代码所对应的Dispatch例程的调用,如果驱动程序没有提供该例程,CreateFile调用就会失败。

驱动程序入口的代码如下:

NTSTATUS DataCollectDriver::DriverEntry(PUNICODE_STRING RegistryPath) {

T.Trace(TraceInfo, __FUNCTION__\\; #ifdef DBG

//DbgBreakPoint(); #endif

NTSTATUS status = STATUS_SUCCESS; m_Unit = 0;

UNREFERENCED_PARAMETER(RegistryPath);

T.Trace(TraceInfo, __FUNCTION__\, status); return status; }

4.4.2数据传输控制

本数据采集系统有八个数据采集通道,所以需要对数据采集通道进行控制,以便于选取合适通道和进行通道的切换,这些任务就由IOCTL_ChannelControl_Handler(KIrp I)函数完成。采集后的数据通过USB总线传送的计算机的指定缓冲区中,以便于调用和进行处理,所以用IOCTL_GetData_Handler(KIrp I)函数从USB设备获取数据,并将所得数据传递给应用程序。IOCTL_GetData_Handler(KIrp I)和IOCTL_GetData_Handler(KIrp I)函数代码如下:

NTSTATUS DataCollectDevice::IOCTL_ChannelControl_Handler(KIrp I) {

T.Trace(TraceInfo, __FUNCTION__\, I); NTSTATUS status = STATUS_SUCCESS;

ULONG inputSize = I.IoctlInputBufferSize(); ULONG outputSize = I.IoctlOutputBufferSize();

PVOID inputBuffer = I.IoctlBuffer();

PVOID outputBuffer = I.IoctlBuffer();

// TODO: Validate the parameters of the IRP. if (FALSE) { status = STATUS_INVALID_PARAMETER; I.Information() = 0;

} else {

// TODO: copy data

I.Information() = 0; }

T.Trace(NT_SUCCESS(status)?TraceInfo:TraceWarning, __FUNCTION__\STATUS %x\\n\, I, status);

return status; }

NTSTATUS DataCollectDevice::IOCTL_GetData_Handler(KIrp I) {

T.Trace(TraceInfo, __FUNCTION__\, I); NTSTATUS status = STATUS_SUCCESS;

ULONG inputSize = I.IoctlInputBufferSize(); ULONG outputSize = I.IoctlOutputBufferSize();

PVOID inputBuffer = I.IoctlBuffer()


USB数据采集系统论文(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2015年考研公共课必看书籍及时间规划一览

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: