好文档 - 专业文书写作范文服务资料分享网站

高速线阵CCD图像数据采集系统的研究

天下 分享 时间: 加入收藏 我要投稿 点赞

第四章A/D数据采集及计算机接口设计即发现总线上的全部设备和检测设备何时被添加或删除。总线驱动程序为发现的设备创建一个物理设备对象(PDO)。功能驱动程序知道如何控制设备的主要功能,它位于总线驱动程序的上面。功能驱动程序创建一个功能设备对象(FDO),放在设备堆栈中。在USB情况下,功能驱动程序必须使用USB类驱动程序访问它的设备。各种类型的过滤程序可以插在设备堆栈中。对总线上的所有设备,总线过滤驱动程序被加在总线驱动程序之上;而对于一个特定类的所有功能驱动程序,添加类过滤驱动程序。设备驱动程序仅对特定的设备添加。上层的过滤驱动程序在功能驱动程序之上,而低层的驱动程序在功能驱动程序之下。用户的请求总是在设备栈的顶部进入。用户程序表示了一个它想访问的功能设备,I/O管理器保证它的全部请求都发送到设备栈的顶部,这样任何高层的过滤驱动程序或者是功能驱动程序首先得到处理这些请求的机会。驱动程序有一个主要的初始化入口点——DriverEntry()函数,它有一个标准的函数原型。当驱动程序装入时,内核调用DriverEntry0函数,然后,内核会调用驱动程序中许多其它函数,这些函数称为回调(CALLBACK)函数。只要告诉内核该函数的名字,以后内核会在合适的环境下调用这个函数。驱动程序的DriverEntry0通常不创建任何设备,而是给内核提供各种回调铡程指针。在每次驱动程序要刨建,A设备时,即插&口用管理器调用驱动程序的AddDevice0回调例程。所有分发例程的代码均相似。3.USB驱动程序USB驱动程序属于标准WDM驱动程序,但它不直接与硬件对话。它也称客户驱动程序,仅靠创建URB(USBRequestBlock)并使用USB驱动程序接口(USBDI)将URB提交给总线驱动程序就可完成硬件操作。FhUSBD.sys接受URB,向USBD的调用被转化为带有主功能代码为IRPMJINTERNALDEVICECONTROL的IRP。然后USBD再调度总线时间,发出URB中指定的操作。USB驱动程序接口和USB驱动程序栈的结构如图4.13所示。USBHUB.sys是USB根集线器驱动程序,当USBD.sys枚举每个USB主机控制器中的根结点集线器时被加载。USBD.sys是USB类驱动程序,使用UHCD.sys访问通用主机控制器接口设备,或使用0penHCI.sys访问开放式主机控制器接口设备。UHCD.sys和OpenHCI.sys是USB主机控制器驱动程序。其中,UHCD.sys是通用主机控制器(UniversalHostControllerDriver)驱动程序,第四章A/D数据采集及计算机接口设计OpenHCI.sys是开放主机控制器接口(Open动程序。HostControllerInterface)驱另外,HIDCLASS.sys是人机接口设备(HumanInterfaceDevice)的类驱动程序,接收和发送迷你驱动程序(Minidriver)的HID报告。HIDUSB.sys是HID设备驱动程序,通过USB总线接收和发送HID报告,PCIEnumerator是PCI枚举器,当检测到usB总线时,它负责加载USB栈驱动程序组件。BULKUSB.sys代表用户真正需要编写的USB设备驱动程序,或其它的设备驱动程序。USB驱动程序接口亚亟巫][巫画USBD.SYSPCIEnumeratorUSBBusUSB驱动程序栈图4—13USB驱动程序接口和USB驱动程序栈结构4.IRP处理IRP(I/ORequestPackage)是驱动程序操作的核心,它是一个预先定义的数据结构,带有一组对它进行操作的I/O管理器例程。I/O管理器接收一个I/O请求,然后再把它传递到合适的驱动程序栈中的最高驱动程序之前,分配并初始化一个IRP。一个IRP有一个固定的头部和可变数目的IRP栈单元。每个I,0请求有一个主功能代码,并可能有次功能代码。常用的Win32函数及其对应的IRP如表4—3所示。表4-3常用的分发例程Win32函数CreateFileCloseHandleReadFi1eWriteEi1eDeviceIoControlIRPIRP主功能代码IRP—MJ—CREATEIRP_MJ—CLOSEIRP_MJ—READ驱动程序例程的基名称CreateC10seReadWriteDeviceControlIRP』J—WRITEMJ—DEVICECONTROL一个驱动程序不必处理所有的IRP,但至少应该处理“创建”和“关闭”第四章A/D数据采集及计算机接口设计着两个IRP。5.USB驱动程序接口的IOCTLUSB总线类驱动程序主要通过表4.4中所示的USB驱动程序接口(USBDI)的内部IOCTL来使用。它们都是内部IOCTL,所以只能用于内核的调用(如设备驱动程序),不能用于用户态应用程序。这些内部IOCTL实际上是利用Windows系统提供的ICO_CODE宏而由驱动程序开发人员新定义的I/O控制代码。表4-4USB驱动程序接口的IOCTL内部10CTL说明用于发送URB(USB等待结果RequestIOCTL——INTERNAL_USB——SUBidIT—U—RBIOCTL—.INTERNAL——USB_RESET——PORTBlock),并停止复位并重新启动一个端口模拟一个集线器端口上出现的接入/拆除操作集线器驱动程序内部使用集线器驱动程序内部使用请求集线器重新启用一个被禁用的端口返回当前端口状态:USBD—PORT_ENABLEDUSBD—PORT-CONNECTED10CTL—.INTERNAL_USB——CYCLE—.PORTIOCTL——INTERNAL—.USB..GET——R00TIIUB——PD0IOCTL—.INTERNAL——USB_GET—.HUB_COUNTz。c孔一?NTERNAL-U邬一ewne比一r。ntIocTL—INTERNAL-USB_GET_PoRTSTATus6.设备驱动程序的开发在Windows操作系统下,根据不同的情况以及用户对驱动程序功能的不同需求,可以选择不同的开发工具。通常有以下两种不同的选择。一种是使用Microsoft公司的DDK(DeviceWindows98Developer2000Kit),包括Windows2000DDK和DDK。其中,Windows98DDK只能开发基于Windows2000的驱动程序,而WindowsDDK只能开发基于Windows98的驱动程序。DDK提供了创建WDM驱动程序的开发环境,包括特点驱动程序的头文件、库函数、源代码、各种工具和文档,以及范例代码和函数说明等。选择DDK开发驱动程序属于从低层开发做起,必须自行编写所有的功能代码,对编写者的知识要求比较高。另一种就是选择驱动程序的辅助开发工具,如DriverStudio、Windriver、BSU_求请备设第四章A仍数据采集及计算机接口设计Vtoolsd等。这些开发工具可根据用户的需求为用户自动生成一个定做的驱动程序。用户只需在生成驱动程序之前,在向导框中按照提示输入自己的需求,并对生成的驱动程序稍加改动即可,无需了解确定程序内部与操作系统内核的工作过程,适于开发驱动程序的初学者。由于CYPRESS公司为其USB控制芯片提供了基于DDK方式开发的通用驱动程序,我们可以对其加以修改使用。7.对EZ-USB通用驱动程序的修改CYPRESS公司提供的EZUSB通用驱动程序(EZ基于EZUSBGPD)是用来和外设接口的通用设备驱动程序。驱动程序提供公共USBUSBControl和数据传输的用户态接口。除帮助设备和软件的开发者,配合EZPaneli鲤!l试其设备执行标准、USB设备请求和数据传输能力之外,更重要的是为USB设备开发者提供例程。以通用驱动程序为起点,通过使用WDMDDK修改其源程序代码并编译,可以创建一个用户驱动程序。EzUSBGPD是一个核心模式设备驱动,能够在一个时刻和单一设备接口通讯,可以选择设备的任何接口的备选设置,但不能在多接口设备上同时和多个接口通讯。支持多接口设备将要使用驱动的多实例来处理。在枚举阶段,EZ—USBGPD将会选择接口0的备选设置0。我们对GPD的修改主要集中在缓冲区大小、VID、PID设置等方面。在用户态应用程序中,可以使用CreateFileO和DeviceloControl0等函数完成对端口的访问。8.固件下载驱动程序如上所述,CY7C68013芯片的一个独特之处就是可以通过从主机方下载固件程序和再枚举的方式动态改变设备的设置,该方式需要主机有相应的固件下载驱动程序【261。CYPRESS公司提供相关的例程及说明文件以便生成所需的固件下载驱动程序,步骤如下:(1)首先为固件下载驱动程序选择PID和VID,注意不能与USB设备的PID相同;(2)根据例程ezloader修改相关程序代码:(3)使用DDK中Build_c命令建立确定程序的.sys文件;(4)使用提供的Hex2C程序将固件程序由.hex文件转为.c文件,并以此修第四章A/D数据采集及计算机接口设计改firmware.c文件,然后按步骤(3)重新建立驱动程序文件;(5)修改相关的.inf文件。9.INF文件的编写所有的USB设备在设备描述符中都有一个厂商ID(VID,VendorID)和产品ID(PID,ProductID)来Windows报告。Windows使用VID和PID寻找匹配的设备驱动程序。INF文件就是连接VID和PID和指定的驱动程序的连接,以便当Windows检测到它时能辨认出外设。4.4.8应用程序设计主机方应用程序主要用于访问USB设备,实现数据采集,主要使用以下几个API函数对设备进行操作:CreateFile():用于创建或打开一个USB设备并返回设备句柄;DeviceIoConHol():用于向设备驱动程(开始)0l打开设备驱动上l发读数控制命令上读取数据序发送控制代码,应用程序主要使用此函数实现对设备的操作;ReadFile():用于从设备方读数据到内存:C刃图4-14USB接口数据采集流程图WriteFile(1:用于将内存中数据发送给设备:CloseHandle0:用于关闭设备旬柄。数据采集流程如图4-14所示。数据采集程序代码片断如下:#include”devioctl.h”#include”yhusbsys.h”#include”winbase.h”#include”windows.h”BOOLEANOpenDriver(HANDLE+phDriver,CStringdevname)(SECURITY—ATTRIBUTESsecurity;security.nLength=sjzeof(sccurity);security.IpsecurItyDescriptor=NULL;//设置非继承属性

高速线阵CCD图像数据采集系统的研究

第四章A/D数据采集及计算机接口设计即发现总线上的全部设备和检测设备何时被添加或删除。总线驱动程序为发现的设备创建一个物理设备对象(PDO)。功能驱动程序知道如何控制设备的主要功能,它位于总线驱动程序的上面。功能驱动程序创建一个功能设备对象(FDO),放在设备堆栈中。在USB情况下,功能驱动程序必须使用USB类驱动程序访问它的设备。各种类型的过滤程序可以插在设备堆栈中。对总线上的所有设备,总
推荐度:
点击下载文档文档为doc格式
17bfm4fff923x6i11q42
领取福利

微信扫码领取福利

微信扫码分享