驱动程序设计范文10篇

时间:2023-03-24 15:33:03

驱动程序设计

驱动程序设计范文篇1

关键词:PCI总线PCI2040DSPDDKWDM

TI公司专门推出了PCI2040桥芯片是专门针对PCI总线和DSP接口用的,本文利用它和DSP来处理视频信号,并用双端口RAM实现DSP之间的数据传输。

1硬件设计

1.1PCI总线控制芯片PCI2040

PCI总线是一种不依附于某个具体处理器的局部总线,它支持32位或64位的总线宽度,频率通常是33MHz,目前最快的PCI2.0总线工作频率是66MHz。工作在33MHz、32位时,理论上最大数据传输速率能达到133MB/s。它支持猝发工作方式,提高了传输速度,支持即插即用,PCI部件和驱动程序可以在各种不同的平台上运行[1]。

实现PCI总线协议一般有两种方法,一是用FPGA设计实现,但PCI协议比较复杂,因此难度较大;二是采用PCI总线控制芯片,如AMCC公司的S5933、PLX公司的PCI9080等通用的PCI接口芯片。TI公司专门推出了针对PCI总线和DSP接口的芯片PCI2040[2],它不但实现了PCI总线控制的功能,而且提供了和DSP芯片无缝的接口,因而大大简化了系统设计的复杂度并缩短了开发时间。

PCI2040是一个PCI-DSP桥接器件,它提供了PCI局部总线和TMS320C54X8位主机接口(HPI)与TMS320C6X16位主机接口的无缝连接。一片PCI2040最多能同时挂接4片DSP芯片。同时,它还提供了一个串行EEPROM接口,一个通用输入输出接口(GPIO)和一个16位通用总线接口(为TIJTAG测试总线控制器提供接口)[2]。PCI2040只能作为PCI目标设备使用,不能作为PCI主设备使用;它只支持单字的读写,不能提供DMA操作。PCI2040能够兼容3.3V和5V信号环境系统中的3.3V和5V信号可以直接从PCI插槽中获得。

PCI2040和TMS320C6201的接口如图1所示。

1.2PCI2040寄存器说明

PCI2040桥256字节的配置头如图2所示,HPICSR基地址、控制空间基地址(ControlSpaceBaseAddress)值都是系统自动分配的。所有的PNP器件都是如此它将控制空间映射到主机内存,映射的空间大小为32KB。4片DSP芯片的选择是通过解码PCI_AD14、PCI_AD13来实现的,其对应关系如表1所示。而DSPHPI寄存器的地址则是由PCI_AD12和PCI_AD11来决定的,其对应关系如表2所示。

图1PCI2040和TMS320C6201的接口

表1DSP选择

AD[14:13]

TMS320C6xDSP

00

HCS0(选择第一块DSP)

01

HCS1(选择第二块DSP)

10

HCS2(选择第三块DSP)

11

HCS3(选择第四块DSP)

表1HPI寄存器映射

AD[12:11]

TMS320C6xHPIRegister

00

HPI控制寄存器

01

HPI地址寄存器

10

HPI自增数据寄存器

11

HPI数据寄存器

因此,DSP与主机交换数据的过程,也就是读写HPI寄存器的过程。也就是说,通过主机访问DSP板上资源,只需要将相应地址赋予HPIA寄存器中,然后读写数据就可以通过HPID寄存器。具体描述如下:

(1)初始化PCI2040内部配置寄存器,指向特定的DSP(因为本系统有两块DSP和PCI2040相连),指定数据传输宽度为16位。

(2)分配HPICSR基地址和控制空间基地址,允许PCI2040进行内存映射或I/O端口映射。值得注意的是,PCI2040控制空间只能映射在主机的内存空间里,不能映射在I/O空间。以上两步都由驱动程序完成。

(3)脱离复位状态后,PCI2040解码从PCI总线来的地址,以此来做出响应。若落入32KB的控制空间中,则根据PCI_AD12、PCI_AD11及PCI_AD14、PCI_AD13片选情况访问相应HPI寄存器。

(4)设定HPI控制寄存器中的BOB位,选择正确的高低16位排列方式。

(5)主机开始对HPI寄存器进行读写。

1.3双DSP系统硬件设计

本文所采用的双DSP系统主要用来处理视频信号及高速数据采集,该系统是基于TMS320C6201DSP和PCI2040而设计的。此卡的主要功能是:(1)采集视频信号或其他模拟信号经A/D转换后,交给DSP进行相应处理,然后将处理后的数据通过PCI2040经PCI总线存放在计算机硬盘上或者直接存储到板上RAM中,然后通过PCI总线将视频数据传送到主机后显示。(2)两块DSP之间的通信可以通过McBSP或双端口RAM。

该系统的特点有:两块TMS320C6201DSP,处理能力可达3200MIPS;每片C6201带512KSBSRAM,256KBFLASH;16KB高速双口RAM用于两块C6201之间进行数据交换;12位ADC;32位高速FIFO。系统硬件框图如图3所示。

2基于WDM的PCI驱动程序设计

WDM是新一代的驱动程序构架,它是一个跨平台的驱动程序模型,在WINDOWS98以上的操作系统中都实现了全面兼容。不仅如此,WDM驱动程序还可以在不修改源代码的情况下经过重新编译后在非Intel平台上运行,因而为驱动程序开发人员提供了极大的方便。

WDM驱动程序是分层的,即不同层上的驱动程序有着不同的优先级,而Windows9x下的VxD则没有此结构。另外,WDM还引入了功能设备对象FDO(FunctionalDeviceObject)与物理设备对象PDO(PhysicalDeviceObject)两个新概念来描述硬件。PDO代表实际存在的硬件设备,它是在总线驱动程序(BUSDRIVER)下枚举并建立的,负责与真实硬件进行I/O操作。FDO是由用户驱动程序建立的,一般来说,它是用户与真实硬件进行I/O操作的一个窗口,是Win32赖以沟通内核的一个桥梁。对于驱动程序开发者,真正需要做的就是开发FDO。至于PDO,则由BUSDRIVER建立,并在需要的时候作为参数由I/OManager或其它系统组件传给你的FDO。

在应用层与底层进行通讯时,操作系统为每一个用户请求打包成一个IRP(IORequestPacket)结构,将其发送至驱动程序,并通过识别IRP中的PDO来识别是发送给哪一个设备的。另外,WDM不是通过驱动程序名称,而是通过一个128位的全局惟一标识符(GUID)来识别驱动程序的[3]。

WDM驱动程序都有一个初始化入口点,即DriverEntry,它相当于C语言中的main函数。当WDM驱动程序被装入时,内核调用DriverEntry例程。另外WDM设备驱动程序还需要一个即插即用模块,即AddDevice。AddDevice例程就是PnP管理器在用户插入新设备时调用它来创建WDM设备对象的。

本文主要采用Windows2000DDK来设计该驱动程序。调试工具为SOFTICE。驱动程序的主要工作集中在:

(1)DriverEntry(),这是驱动程序的入口点,驱动程序被装入时首先执行DriverEntry例程。主要工作是建立驱动程序这所需的函数。

(2)dspPciAddDevice(),在这个例程里驱动程序主要是创建设备。

(3)dspPciPnp(),在这个例程中驱动程序主要是启动设备和停止设备等,并且从PnP管理器读出为双DSP所分配的硬件资源,包括HPICSR基地址和HPI控制空间基地址,对PCI配置空间进行初始化。初始化中断等。需要注意的是,在初始化中断之前禁止卡向主机发中断,因此应有屏蔽中断的操作。

(4)dspPciDeviceControl(),在这个例程中可以定制自己的函数来达到Ring3层和Ring0层相互通讯的目的。通过IOCTL_CODE可以区分不同的请求。

(5)Isr_Irq(),这个例程是用来处理中断的。Windows2000的中断处理机制是假定多个设备可以共享一个硬件中断。因此,Isr的首要工作就是找出哪一个设备发生了中断。如果没有,则应该立刻返回FALSE,以便HAL能把中断送往其它设备驱动程序。中断服务例程Isr执行在提升的IRQL上,在DIRQL级别上运行的代码需要尽可能快地运行。通常情况下,若判断中断是由自己的设备产生的,则调用一个在DISPATCH_LEVEL级别上运行的延迟过程调用(DpcFor_Irq)。

注意:当确定是自己卡的中断时,要马上屏蔽中断位防止中断再进来,等到DpcFor_Irq的结尾处再开中断。

驱动程序设计范文篇2

关键词:PCI总线设备驱动程序WDM模式DriverStudio

PCI总线规范是为提高微机总线的数据传输速度而制定的一种局部总线标准。在设计自行开发的基于PCI总线的数据传输设备时,需要开发相应的设备驱动程序。通常开发PCI设备驱动程序有多种模式,在Windows2000环境下,主要采用WDM模式。本文针对自行开发的基于PCI总线的CCD视频信号传输控制卡,编写了符合WDM模式的驱动程序。

1WDM模式驱动程序

1.1WDM模式(WindowsDriverModel)

Windows2000对驱动程序的编写不再基于以往的Win3.x和Win9x下的VxD(虚拟设备驱动程序)结构,而是基于一种新的驱动模型——WDM(WindowsDriverModel)。

WDM为Windows98/2000/XP操作系统的设备驱动程序的设计提供了统一的框架。WDM来源于WindowsNT的分层32位设备驱动程序模型(layered32-bitdevicedrivermodel)。它支持更多的特性,如即插即用(PnP)、电源管理、WMI和NT事件。

1.2设备驱动程序

设备驱动程序是操作系统的一个组成部分,它由I/O管理器(I/OManager)管理和调动。Windows2000操作系统下的I/O管理器功能描述如图1所示。

I/O管理器每收到一个来自用户应用程序的请求就创建一个I/O请求包(IRP)的数据结构,并将其作为参数传递给驱动程序。驱动程序通过识别IRP中的物理设备对象(PDO)来区别是发送给哪一个设备。IRP结构中存放请求的类型、用户缓冲区的首地址、用户请求数据的长度等信息。驱动程序处理完这个请求后,在该结构中填入处理结果的有关信息,调用IoCompleteRequest将其返回给I/O管理器,用户应用程序的请求随即返回。访问硬件时,驱动程序通过调用硬件抽象层的函数实现。

1.3DriverStudio工具简介

NuMegaLab公司开发的DriverStudio是一整套开发、调试和检测Windows平台下设备驱动程序的工具软件包。它把DDK(DeviceDevelopmentKit)封装成完整的C++函数库,根据具体硬件通过向导生成框架代码,并且提供了一套完整的调试和性能测试工具SoftICE、DriverMonitor等。

2应用实例

本文利用PCI专用接口芯片PCI9052设计了一个数据传输控制卡。卡上主要的芯片有PCI9052、FIFO(CY7C4221)、CPLD(MAX7064S)和A/D转换器(MAX1197)。传输卡硬件框图如图2所示。面阵CCD得到的视频信号经过调理电路,生成的视频调理信号通过A/D转换器进行数字化处理,送入FIFO中。在CPLD的控制下,数据经过PCI9052送入PCI总线,再传送到计算机内存中,并显示在监视器上。驱动程序必须实现如下几个基本功能:(1)硬件中断;(2)能支持应用程序获取数据;(3)能根据外部FIFO(CY7C4221)的状态启动或停止突发传输。

在数据输入过程中,最重要的是对数据进行实时控制,因此需要硬件中断。在中断程序中,根据外部FIFO状态完成数据的读入。

2.1用DriverWizard生成驱动程序框架

DriverStudio中的DriverWorks软件为开发WDM程序提供了一个完整的框架。它包含一个可快速生成WDM驱动程序框架的代码生成向导工具DriverWizard,而且还带有许多类库。在用DriverWizard生成的程序框架中写入相对于设备的特定代码,编译后即可得到所需的驱动程序。

在利用DriverWorksV2.7的向导DriverWizard完成驱动程序的框架时共有11个步骤,其中关键步骤有:

(1)在第四步中选中PCI,并在VendorID和DeviceID中分别输入厂商号和设备号,还需填入PCISubsystemID和PCIRevisionID。这四项可以用网上的免费软件PCITree或PCIView浏览PCI设备,用这两个软件也可以得到BAR0~BAR5的资源分配情况和中断号。

(2)第七步IRP队列排队方法,它决定了驱动程序检查设备的方式。本设计选SystemManaged,则所有的IRP排队都由系统(即I/O管理器)完成。

(3)第九步是最关键的一步。首先在Resources中添加资源,在name中输入变量名,在PCIBaseAddress中输入0~5的序列号。0~5和BAR0~BAR5一一对应。在设置中断对话框中,在name栏写入中断服务程序的名称,选中创建中断服务程序ISR?穴CreateISR?雪,不选创建延迟程序调用DPC(CreateDPC),选中MakeISR/DPCclassfunctions,使ISR/DPC成为设备类的成员函数。

其次选中Buffer以选取读写方式,用于描述与I/O操作相关的数据缓冲区。本设计需要快速传送大量数据,因此采用DirectI/O方式。

(4)在第十步中,需要加入与应用程序或者其他驱动程序通信的I/O控制代码参量。

2.2驱动程序模块框图和代码分布

PCI设备驱动程序模块包括配置空间的访问模块、IO端口模块、内存读写模块和终端模块等。各模块之间是对等的。驱动程序模块框图如图3所示。

驱动程序初始化模块代码段放在#pragmacode_seg(″INT″)和#pragmacode_seg()之间。在系统初始化完成后,这部分代码从内存中释放,防止占用系统宝贵的内存资源。#pragmacode_seg()之后是驱动程序和系统的许多模块的实现部分。这部分在驱动程序运行后不会从内存中释放。

2.3驱动程序主要模块的实现

(1)配置空间的访问模块

DriverWorks的KPciConfiguration类封装了访问PCI设备配置空间的所有操作。首先初始化这个类的实例:

KpciConfigurationPciConfig()m_Lower.TopOfStack());

/?觹m_Lower是KpnpLowerDevice类的对象。m_LowerTopOfStack()返回当前设备堆栈顶部的设备对象。*/

初始化完后可以直接利用成员函数ReadHeader/WriteHeader函数访问所有的配置寄存器。

为了确定映射空间的类型和大小,先向目标基地址寄存器写入0Xffffffffh,然后回读该寄存器的值。如果最低位为1,表示映射于I/O空间,反之为存储空间;如果映射于存储空间,从第四位开始计算0的个数可以确定内存空间的大小;如果是I/O方式,从第二位开始计算0的个数可确定I/O空间的大小,最大为256字节。如果设备的存储空间超过256字节,要实现设备的整个存储部分的访问,就必须采用内存映射。

(2)I/O操作模块

Driverworks的KIoRange类封装了I/O端口访问的操作。部分代码如下:

{……

KIORangeDevIoPort();//创建实例

NTSTATUSstatus=DevIoPort().Initialize(pResListTranslated,pResListRaW,PciConfig.BaseAddressIndexToOrdinal(0));

/*第一个参数为转换后的资源列表指针;第二个参数为原始资源列表指针;第三个参数中的0为I/O口对应的基地址,用来转换成特定端口资源的序数?*/

If(NT_SUCCESS(status))

{……

DevIoPort.inb(0,LineBuf1,10);

/*成功初始化后可分别用KIoRange类的成员函数inb(/outb)从端口中读/写字节*/

}

else{Invalidate();returnstatus;

/*未能初始化成功,错误信息在status中*/

{

……}

(3)内存读写模块

DriverWorks的KMemoryRange类封装了端口访问的操作。

status=m_MemoryRange().Initialize(pResListTranslated,pResListRaw,PciConfig.BaseAddressIndexToOrdinal(0));

此函数的参数、意义及具体用法与I/O端口的操作基本相同。

内存对象也用来发送控制字,以控制CPLD的开始和停止等。实际上控制字是通过PCI9052发送的。该控制字地址已被映射成PCI的内存空间。所以定义一个指向内存空间的内存对象,通过该对象即可发送控制字。

(4)中断模块

在中断模块,首先要激活PCI9052中断使能位,然后判断硬件中断响应是否产生,如果有,则进行突发传输,读入FIFO中的数据。

BOOLEANTranCard::Isr_MyIrq(void)

{if(//中断未产生)

{……

returnFALSE;}

else

{/*如果产生硬件中断,设置命令寄存器,进行突发数据传输*/

returnTRUE;}

}

为了将硬件中断与编写的中断服务程序连接在一起,采用InitializeAndConnect方法,部分代码如下:

NTSTATUSTranCardDevice?押?押OnStartDevice(KIrpI)

{……

status=m_MyIrq.InitializeAndConnect(

pResListTranlated,

LinkTo(Isr_MyIrq),

This;)

……}

2.4驱动程序的调用

编写驱动程序本身不是最终目的,最终目的是调用驱动程序管理资源,并为用户应用程序使用。驱动程序加载以后,它的许多进程处于Idle状态,实际上需要用户应用程序去调用激活。应用程序利用Win32API直接调用驱动程序,实现驱动程序和应用程序的信息交互。

首先用CreateFile()打开设备,获得一个指向设备对象的句柄。使用CreateFile函数时应注意:由于驱动程序是*.sys,所以第一个参数应该是这个设备对象的标志连接(symboliclink)。该标志连接名有一个设置数据文件搜索路径的数字号,而这个数字号通常是零。如果这个连接名是″TranCard″,则传递给CreateFile的宇符串就是:″\\\\.\\TranCard0″。例如:

HANDLEhDevice=CreateFile(″\\\\.\\TranCard0″)GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL?,OPEN_EXISTING,0,NULL);

然后用DeviceIoControl()进行数据的传送。最后用CloseHandle()关闭设备句柄。

下面是应用DeviceIoControl()程序片段。

{……

m_b=DeviceIoControl(hDevice,TRANCARD_IOCTL_

RECEIVE(buffer,sizeof,buffer,NULL,0,&buffersize,NULL);

……}

2.5驱动程序的调试

采用SoftICE、DriverMonitor作为调试工具,基本调试过程如下:(1)使用symbolloader加载驱动程序,然后使用SoftICE跟踪调试,确认驱动程序正常加载;(2)对核心的中断响应程序代码,用SoftICE中的Genint命令产生虚拟中断,单步跟踪中断;(3)硬件发送大量的数据,通过查看内存的数据,确认数据传输是否正确。

驱动程序设计范文篇3

关键词:USBCAN总线固件编程适配器

现场总线作为二十世纪80年展起来的新兴技术,在工业现场已有了广泛的应用。在比较有影响力的几种现场总线中,CAN总线以其突出的优点不仅大量应用于工业现场,而且在楼宇自动化、智能终端设备等民用领域也有了长足的发展。

现场总线网络技术的实现需要与计算机相结合。以往CAN总线网络与计算机的连接采用RS232、ISA或PCI接口。但是随着计算机接口技术的发展,ISA接口已经逐渐被淘汰;RS232接口数据传输率太低;PCI虽然仍是高速外设与计算机接口的主要渠道,但其主要缺点是占用有限的系统资源、设计复杂、需有高质量的驱动程序保证系统的稳定,且无法用于便携式计算机的扩展。随着USB1.1、USB2.0规范的相继制定,为外设与计算机的接口提出了新的发展方向。USB的主要特点有:外设安装简单,可实现热插拨;通讯速率高,USB1.1全速传送速率为12Mbps,与标准串行端口相比,大约快100倍;支持多设备连接;提供内置电源。

本文给出一种在Windows2000下使用USB1.1协议实现CAN总线适配器的设计方法。整个设计主要开发适配器的固件及计算机的驱动程序、应用程序,以达到用USB接口连接现场CAN总线网络的目的。

图1

1适配器硬件接口设计

适配器硬件电路由微控制器、CAN总线接口、USB总线接口和DC-DC隔离电源模块等组成。原理框图如图1所示。

微控制器P89C51RD2是Philips公司生产的增强型MCS-51兼容单片机,片内集成64KB闪存和1KB扩展RAM,双数据指针,4级中断优先级,7个中断源,内置看门狗,可编程时钟输出,在6时钟模式下工作,速度是标准51单片机的两倍。此时外部最高频率可达20MHz。在高速、大程序容量、中小规模数据处理场合是一款非常理想的单片机型。

CAN总线接口使用Philips公司的独立CAN总线控制器SJA1000,并由光耦6N136进行总线隔离。SJA1000是一种独立控制器,用于移动目标和一般工业环境中的区域网络控制,符合CAN2.0A和2.0B规范,最高速率可在达1Mbps。CAN总线收发器采用PCA82C250。

PDIUSBD12是Philips公司推出的全速USB接口器件,完全兼容USB1.1规范。图1中D+引脚信号电平通过器件SoftConnect命令内部上拉,从而向主机表示为一个全速设备。EOT引脚自动检测USB接口的VBUS电压以确定USB电缆是否连接到了主机。SUSPEND是双向引脚,用以向微控制器指示器件是否挂起。当有USB总线事件发生时,引脚向微控制器发出中断信号。PDIUSBD12支持总线复用和非复用两种并行接口模式,以方便连接不同类型的微控制器。图1中采用总线复用方式,当用奇数地址访问PDIUSBD12时被认为是命令,偶数地址访问则被认为是数据读写。

各器件都需要外部时钟信号,而且它们自身也都有可编程的时钟输出功能,这就给系统的时钟设计带来了便利。图1中微控制器6时钟运行模式下,外部为12MHz晶振。P89C51RD2的P1.1引脚产生6MHz方波作为PDIUSBD12的输入时钟;通过PDIUSBD12的SetMode寄存器编程使CLKOUT输出时钟频率为24MHz,作为SJA1000的外部输入时钟。

2软件设计

软件设计包括微控制器的固件设计和计算机端USB驱动程序两部分。

2.1微控制器固件编程

固件编程是USB数据传输系统中终端设备程序设计的一个重要概念。微控制器通过固件是程序与计算机进行数据交换。固件设计的目的是:使PDIUSBD12在USB上达到最大的传输速率;增加系统的可扩展性和硬件无关性。

固件要实现的内容:一是对SJA1000初始化,接收CAN总线送来的数据,收集CAN网络状态信息,并将主机的数据下发到CAN网络;二是对PDIUSBD12初始化,完成USB总线连接过程,并组织CAN网络和主机之间的数据传送。设计中采用KeilC51软件编译环境,C51和ASM混合编程方式。

SJA1000和PDIUSBD12都有完善的中断机制,微控制器可以通过读它们的中断寄存器获得总线事件。为了提高固件的运行效率,主程序对系统进行实始化后开放中断,在中断服务程序中对事件进行分析和必要的处理,并设置相应的变量标志和数据缓冲区。主程序则循环查询变量标志,调用相应的子程序进行处理。这种程序结构使得主程序能够在前台处理各种数据传送任务,同时又可以通过中断在后台及时处理总线事件。

2.1.1CAN协议实现

SJA1000支持BasicCAN和PeliCAN两种协议模式。在适配器设计中采用了BasicCAN模式。中断设为电平中断方式,SJA1000中断服务程序框图如图2所示。

2.1.2USB1.1协议实现

PDIUSBD12支持所有的四种USB数据传输方式。在适配器的设计中使用了控制传输、中断传输和批量传输。控制传输中只用来传递控制信息,固定使用端点0;中断传输使用端点1,用来传送CAN网络状态信息;批量传输用来实现主机和CAN网络节点之间的数据传送,使用端点2。图3是PDIUSBD12中断服务程序框图。

2.2驱动程序设计

USB驱动程序属于WDM(Windowsdrivermodule)类型。WDM驱动程序是分层的,引入了FDO(FunctionDeviceObject)和PDO(PhysicalDeviceObject)两个新类来描述硬件,每一个物理硬件有一个PDO,但是可以有多个FDO,在驱动程序中直接操作的是PDO和FDO。系统通过全局唯一标识符GUID实现驱动程序的识别。应用程序和WDM驱动程序通信时,系统为每个用户请求打包形成一个I/O请求包发送到驱动程序。

图4是Windows中USB的通信层次结构模型。图4系统软件方块中的底部是Windows系统提供的驱动程序,包括主控制器驱动程序(OPENHCI.SYS或者UHCD.SYS)、HUB驱动程序(USBHUB.SYS)是一个类驱动程序(USBD.SYS)。

Windows2000下驱动程序的设计工具是VC++和Win2000DDK,但是直接使用DDK编程有相当大的难度。目前有第三方软件厂商提供了一些驱动程序开发工具,如Jungo公司的WinDriver、Compuware公司的DriverStudio等。这些工具仍然是基于WindowsDDK的,但是进行了新的封装,提供了驱动程序设计向导。

适配器设计中采用了DriverStudio作为驱动程序开发工具。利用其中的DriverWorks一步步地作出选择并修改少量参数,即可生成驱动程序框架和测试台应用程序框架,对USB设备的通用性部分支持得很好。在程序框架,对USB设备的通用性部分支持得很好。在VC++中对向导生成的代码作修改,并对设备特殊功能部分添加处理代码,然后用VC++编译为*.SYS文件,就是一个完整的驱动程序。SoftIce是DriverStudio的另一个调试工具,可以对驱动程序进行操作系统内核级的跟踪与调试。

驱动程序设计范文篇4

关键词:USB数据采集PDIUSBD12

1USB协议和芯片选择

理解好USB协议是USB系统开发的第一步。USB协议版本包括1.0、1.1和2.0,USBOTG是对2.0版本协议的补充。虽然USB协议内容繁多且复杂,然而,对USB开发影响较大的却只是少数部分,以下对协议版本1.1[1]中这些部分进行介绍。

1.1USB协议

一般,每个USB设备由一个或多个配置(Configuration)控制其行为。使用多配置原因是对操作系统的支持;一个配置由接口(Interface)组成;接口则是由管道(Pipe)组成;管道与USB设备的端点(Endpoint)对应,一个端点可以配置为输入输出两个管道。在固件编程中,USB设备、配置、接口和管道都用描述符报告其属性。

图1为USB多层次通信模型。端点0默认配置为控制管道,用来完成所规定的设备请求(USB协议第九章)。其它端点可配置为数据管道。对开发而言,主要的大数据传输都是通过数据管道完成的[2]。

USB传输类型包括批量传输、等时传输、中断传输和控制传输,每种传输类型的传输速度、可靠性以及应用范围都不同[3]。控制传输可靠性是最高的,但速度最慢;等时传输速度快,满足实时性,但可靠性低。在具体应用中,端点传输类型可根据传输速度和可靠性选择。

在USB通信协议中,主机取得绝对主动权利,设备只能是“听命令行事”,通过一定的命令格式(设备请求)完成通信。USB设备请求包括标准请求、厂商请求和设备类请求。设备的枚举是标准请求命令完成的;厂商请求是用户定义的请求;设备类请求是特定的USB设备类发出的请求,例如海量储存类、打印机类和HID(人机接口)类。固件编程中设备请求必须遵循一定的格式,包括请求类型、设备请求、值、索引和长度。

1.2USB接口芯片选择

USB接口芯片的类型有:

(1)按传输速度的高低:低速(1.5Mbps)和全速(12Mbps)可选USB1.1接口芯片,例如Philips公司的PDIUSBD12和Cypress公司的EZ-USB2100系列;高速(480Mbps)可选USB2.0接口芯片,例如Philips公司的ISP1581和Cypress公司的CY7C68013。

(2)是否带MCU(微控制器):一般Philips公司的都不带MCU,Cypress公司大多都带,例如AN2131。

(3)是否带主控器功能:不需要主机参与,主从设备间可进行数据传输,芯片有Philips公司的ISP1301和Cypress公司的SL811HS等。

还有专门用途USB芯片,例如闪存专用芯片IC1114。工程中用户可根据自己的需求选择一款性价比高的芯片。另外可用开发资源也是要考虑的重要方面,例如开发板和芯片厂商提供的网上资源,可大大降低开发的难度。

2基于USB接口的数据采集系统的设计

2.1系统简介

该系统能够实现16路温度数据自动采集,系统的组成框图如图2所示。主要包括8个组成部分:中央处理器选用AT89C52芯片,完成各部分控制功能和USB传输协议;实时时钟记录当前测量温度的时间;温度传感器和接口电路主要完成温度采集,并读入MCU处理;复位电路完成对MCU的上电复位和电源电压监视;看门狗电路用来监视MCU是否工作;存储电路主要存储采集到的温度数据以及采集的实时时间;电源电路主要为各部分提供要求的电源;外设与主机间的通信电路采用USB接口。

2.2接口芯片选择

接口电路采用Philips公司的PDIUSBD12[4](以下简称为D12)芯片。主要因为D12芯片信息、开发资源丰富,具有较高的性价比。

D12芯片的主要特点包括:

·符合USB1.1版本规范;

·可与任何外部微控制器/微处理器实现高速并行接口(2MB/s);

·采用GoodLink技术的连接指示器,在通信时使LED闪烁;

·主端点的双缓冲配置增加了数据吞吐量并轻松实现实时数据传输;

·在批量和等时模式下均可实现1MB/s的数据传输率;

·完全自治的直接内存存取DMA操作。

2.3接口硬件设计

由D12接口组成的通信电路原理如图3所示。关于D12的各引脚说明见参考文献[4]。多路地址/数据总线ALE接单片机的ALE脚,这样使用MOVX指令可以与D12接口,对D12操作就象对RAM操作一样,此时忽略A0(命令口和数据口地址线)的输入。因为没有使用DMA传输方式,所以没有用到DMACK_N、EOT_N和DMREQ_NDMA引脚。INT_N是USB中断请求脚,发出USB中断请求;GL_N是GoodLink指示灯,在调试过程中非常有用,在通信时会不停闪烁。如果一直亮或者一直暗,表示USB接口有问题,如果D12挂起,则LED关闭。CLKOUT是D12的时钟输出,可以通过固件编程改变其频率,在调试固件时,可作为参考。

2.4接口程序设计

USB接口程序设计是USB开发的核心。USB接口程序设计包括三部分:单片机程序开发、USB设备驱动程序开发、主机应用程序开发。三者互相配合,才能完成可靠、快速的数据传输。

2.4.1单片机程序设计

单片机程序(又称固件)采用模块化程序设计,主要模块包括:数据采集模块、数据处理、监控模块和数据通信模块。模块化设计的优点是可靠性高、可读性好、升级简单。

通信模块固件结构如图4所示。主循环和中断服务程序之间的数据交换可通过事件标志和数据缓冲实现。图3中USB中断引脚INT_N发出中断请求,中断服务程序根据中断请求类型操作,设置事件和填充数据缓冲区再传输给主循环;标准设备请求程序是对标准请求进行处理;用户可以根据实际需要编写厂商请求,例如发出启动或停止数据采集命令。

图3USB接口连接示意图

2.4.2驱动程序设计

驱动开发工具有DDK和第三方开发工具。其中DDK开发难度最大,第三方开发工具有DriverStudio和Windriver等。DriverStudio难度适中,而Windriver则属于应用层驱动开发,难度小,但效率低,并存在问题。

DDK驱动程序开发工作包括:开发环境设置(VC编译环境)[5]、驱动程序设计[6]、安装文件(INF文件)设计。

驱动程序设计采用WDM(WindowsDriveMode)。WDM设备驱动程序提供了一个参考框架,大大降低了由DDK书写驱动程序带来的难度。

D12驱动使用的例程包括:DriverEntry、AddDevice、DispatchPnp、DispatchRead、DispatchWrite和DispatchDeviceControl例程,以下是D12的WDM驱动程序函数:

DriverObject->MajorFunction[IRP_MJ_CREATE]=D12_Create;

DriverObject->MajorFunction[IRP_MJ_CLOSE]=D12_Close;

DriverObject->DriverUnload=D12_Unload;

DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL;

=D12_ProcessIOCTL;

DriverObject->MajorFunction[IRP_MJ_WRITE]=D12_Write;

DriverObject->MajorFunction[IRP_MJ_READ]=D12_Read;

DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL;

DriverObject->MajorFunction[IRP_MJ_PNP]=D12_Dispatch;

DriverObject->MajorFunction[IRP_MJ_POWER]=D12_Process-PowerIrp;

DriverObject->DriverExtension->AddDevice=D12_PnPAddDevice;

驱动程序与应用程序和硬件之间通信都是IRP(I/O请求包)完成的。IRP_MJ_PNP主要是实现USB即插即用,例如设备的添加、删除和资源的分配;IRP_MJ_POWER实现电源管理,例如设备的挂起和唤醒;IRP_MJ_CREATE(创建)、IRP_MJ_CLOSE(关闭)、IRP_MJ_

DEVICE_CONTROL(设备控制)、IRP_MJ_WRITE(读)和IRP_MJ_READ?穴写?雪是主要完成数据通信的函数,实现管道的创建、关闭和数据读写。其中设备控制具有输入输出缓冲区,可实现读和写功能;AddDevice和DriverUnload实现设备管理,在设备添加和卸载时,创建和删除设备,以及管理资源分配。

驱动程序通过安装文件(.inf文件)中PID(产品识别号)和VID(厂商识别号)识别USB设备。

2.4.3应用程序设计

主机应用程序的编写使用VC编译环境中的API函数实现。

应用程序的编程方法与串口编程类似。首先必须查找设备,打开设备的句柄;然后进行读写和控制操作;最后是关闭设备句柄。为了提高效率,可使用多线程技术实现读写。

应用程序通过GUID(注册表驱动唯一识别号)查找驱动程序。

2.5调试

首先是固件调试,可用仿真机完成,驱动开发工具Windriver也是很好的固件调试工具,例如测试标准请求、厂商请求和管道读写。其次是驱动调试,这是USB接口开发最困难的部分,调试工具可用DriverStudio中Softice工具和文献[6]中DebugPrint跟踪工具,监视工具BusHound可监视USB的实际数据传输情况。需要注意的是,驱动调试必须在应用程序正确调用的前提下。

2.6USB传输速度

驱动程序设计范文篇5

关键词:USB;视频卡;MPEG;WDM

通用串行总线(UniversalSerialBus,即USB)以其方便的即插即用和热插拔特性,以及较高的传输速率,成为PC领域广为应用的外设连接规范。目前,国内外普遍采用的是USB1.1规范,它支持两种传输速率:1.5Mbps和12Mbps,主要应用在低速传输要求的场合。2000年的USB2.0规范提供了480Mbs的传输速率,以满足更快的数据传输要求。

为了使MPEG视频卡快速地向PC机传送大量的数据,我们在设计MPEG视频卡与PC机的接口时采用USB2.0技术。对USB的设计与开发,我们是基于CYPRESS公司的EZ-USBFX2系列的CY7C68013芯片及其FX2开发包。

1、硬件设计

传统的采用PCI接口的MPEG视频卡,不但占用了有限的PCI插槽,安装不方便,而且不支持热插拔和即插即用。所以,在本设计中,我们选用USB2.0接口芯片对传统的MPEG视频卡进行了改进。

改进后的USB2.0接口的方案如图1所示。

该USB2.0接口的MPEG视频卡的工作原理为:音视频信号经AK4550音频处理芯片及AA7113视频处理芯片进行A/D转换,将模拟信号转换成8bit的PCM格式的数字信号,传入SZ1510音视频压缩采集芯片进行处理,将编码调制PCM格式的数据转化为符合格式MPEG-1的混合影视文件,最后MPEG-1数据经USB接口芯片送给PC机作进一步的处理,如存储、显示等。

设计中,我们选用的USB接口芯片是EZ-USBFX2系列的CY7C68013芯片。该芯片是针对USB2.0的,而且和USB1.1兼容,它支持两种传输速率:全速(Full_speed)12Mbps和高速(High_speed)480Mbps,它不支持低速(Low_speed)1.5Mbps。该芯片的内部结构如图2所示。

CY7C68013-128AC内部集成了一个增强的8051内核,它既与标准的8051兼容,又有诸多的改进:最高工作频率48MHZ,一个指令周期只需4个时钟周期,比标准的8051平均提高了2.5倍;2个UARTS端口;3个定时/记数器;扩展的中断系统及其更多I/O口等。CY7C68013内部集成的USB2.0的SIE能完成大部分USB2.0协议的处理工作,减少了用户对繁杂的USB协议的处理。另外,用户在开发时,可以利用GPIF和FIFO方式实现与高速设备之间的逻辑连接,并进行高速数据的传输。在该改进方案中,我们选用的是GPIF方式,实现和Z1510之间的通信。

2、软件设计

USB软件设计包括三方面的工作:固件(Fireware)设计,驱动程序设计和主机端应用程序的设计。

(1)固件设计

设计中,我们考虑到MPEG视频卡要求快速地持续地传送大量数据,并对数据的完整性要求不太高,我们采用ISO传输方式。另外,我们让CY7C68013工作在GPIF模式下的FIFORead方式,最多可以传输4Gbyte(WORDWIDE=0)或word(WORDWIDE=1)。外设的数据由于不需8051的处理,我们采用自动打包的方式(AUTOIN=1),直接从FIFO到SIE,这样有利于提高传输速率。其主要实现代码如下:

voidTD_Init()

{

CPUCS=0X01;file://CLKSPD[1:0]=10;for48MHzoperation.

GpifInit();

……

SYNCDELAY;

EP6CFG=0XDA;file://端点配置:同步IN方式、缓冲大小1024字节

SYNCDELAY;

FIFORESET=0X80;//activateNAK_ALLtoavoidraceconditions

SYNCDELAY;

FIFORESET=0X06;file://reset,FIFO6

SYNCDELAY;

FIFORESET=0X00;file://deactivateNAK_ALL

SYNCDELAY;

EP6FIFOCFG=0X0D;file://wordwide=1

SYNCDELAY;

……

}

(2)驱动程序设计

在WINDOWS平台下,USB驱动程序由三部分组成:USB设备驱动程序,USB总线驱动程序和USB主控制器驱动程序,它们必须遵循WIN32驱动程序模型(WDM)。其中,WINDOWS操作系统已经提供了处于驱动程序栈底的USB总线驱动程序和USB主控制器驱动程序。而USB设备驱动程序由设备开发者编写,它通过向USB总线驱动程序发送包含URB(USBRequestBlock)的IRP(I/ORequestPacket),来实现USB外设之间的信息交换。当主机应用程序要对USB设备进行I/O操作时,它调用WindowsAPI函数对Win32子系统进行Win32调用,由I/O管理器将此请求构造成一个合适的IRP,并把它传递给USB设备驱动程序。USB设备驱动程序接受到这个IRP后,根据IRP中包含的具体操作代码,构造响应的URB并把它放到一个新IRP中,然后把此IRP传递到USB总线驱动程序,USB总线驱动程序根据IRP中所包含的URB执行响应的操作,并把操作结果通过IRP返还给USB设备驱动程序。USB设备驱动程序接受到此IRP后,将操作结果通过IRP返还I/O管理器。最后,I/O管理器将此IRP中操作结果返还给应用程序,至此应用程序对USB设备的一次I/O操作完成。

开发USB设备驱动程序,可采用Numega公司的开发包DriverWorks和Microsoft公司的2000DDK,并以VC++6.0作为辅助开发环境。DriverWorks提供的驱动向导,,可根据用户的需要,自动生成代码框架。减少了开发的难度,缩短了开发的周期。

在CYPRESS公司的EZ-USBFX2开发包中,有一个通用的驱动程序,该程序可不加修改经DDK编译后直接使用。在本设计中,由于时间关系,我们采用的就是这个通用驱动程序(GPD)。

(3)应用程序设计

USB主机应用程序是计算机中完成特定功能的程序,其关键是实现从USB外设读取或发送特定数量的数据,USB标准设备请求和特定的命令等。另外,可以对数据做进一步的处理,如:存储、显示、快速傅立叶变换等。在WINDOWS2000下,我们所使用的应用程序开发工具是VC++6.0。

驱动程序设计范文篇6

关键词:通用串行总线实时数据采集设备固件驱动程序

在现代工业生产和科学技术研究的各行业中,通常需要对各种数据进行采集。目前通用的通过数据采集板卡采集的方法存在着以下缺点:安装麻烦,易受机箱内环境的干扰而导致采集数据的失真?熏易受计算机插槽数量和地址、中断资源的限制,可扩展性差。而通用串行总线USB(UniversalSerialBus)的出现,很好地解决了上述问题,很容易实现便捷、低成本、易扩展、高可靠性的数据采集,代表了现代数据采集系统的发展趋势。

1系统硬件设计与实现

1.1硬件总体结构

基于USB总线的实时数据采集系统硬件组成包括模拟开关、A/D转换器、单片机、USB接口芯片,其硬件总体结构如图1所示。多路模拟信号经过模拟开关传到A/D转换器转换为数字信号?熏单片机控制采集,USB接口芯片存储采集到的数据并将其上传至PC,同时也接收PC机USB控制器的控制信息。

1.2PDIUSBD12芯片

USB接口芯片采用Philips公司的一种专用芯片PDIUSBD12(以下简称D12)。该芯片完全符合USB1.1规范,集成了SIE、320B的多配置FIFO存储器、收发器、电压调整器、SoftConnect、GoodLink、可编程时钟输出、低频晶振和终端电阻等,支持双电压工作、完全自动DMA操作、多中断模式,内部结构如图2所示。

单片机通过8位并行接口传送经过A/D转换的采集数据,存储在FIFO存储器中。一旦存满,串行接口引擎SIE立刻对数据进行处理,包括同步模式识别、并/串转换、位填充/不填充、CRC校验、PID确认、地址识别以及握手鉴定,处理完毕后数据由模拟收/发器通过D+、D-发送至PC。上述过程遵循USB1.1协议。D12与89C51的具体实现电路如图3所示。

2系统软件设计与实现

系统软件包括USB设备固件编程、驱动程序和应用程序。其中设备固件是整个系统的核心,它控制芯片D12采集数据、接收并处理USB驱动程序的请求和应用程序的控制指令。

2.1USB设备固件程序设计与实现

设备固件是设备运行的核心,用C语言设计。其主要功能是控制A/D模块的数据采集;接收并处理驱动程序的请求,如请求描述符、请求或设置设备状态、请求设备设置、请求或设置设备接口等USB1.1标准请求;控制芯片D12接收应用程序的控制指令等。其程序主框图如图4所示。单片机检测到D12后进入主循环。此时PC机先发令牌包给D12,D12接收到令牌包后给单片机发中断,单片机据中断类型设定标志位Status;最后执行相应标志位的中断服务程序。单片机通过A/D模块的中断入口控制A/D模块的数据采集。

2.2驱动程序设计与实现

USB系统驱动程序采用分层结构模型:较高级的USB设备驱动程序和较低级的USB函数层。其中USB函数层由通用串行总线驱动程序模块(USBD)和主控制器驱动程序模块(HCD)组成。

图3PDIUSBD12与89C51的具体实现电路

为使驱动程序具有通用性,也为简化应用程序的开发,编写了供应用程序调用的动态链接库。这样应用程序只需调用此库提供的接口函数即可完成对USB设备的操作。USB函数层(USBD及HCD)由Windows98提供,负责管理USB设备驱动程序与USB控制器之间的通信、加载及卸载USB驱动程序等。目前Windows98提供的多种USB设备驱动程序并不针对实时数据采集设备,因此采用DDK开发工具设计专用的设备驱动程序。其由四个模块组成:初始化模块、即插即用管理模块、电源管理模块以及I/O功能实现模块。

初始化模块提供一个DriverEntry入口点执行一系列的初始化过程。

即插即用管理模块实现USB设备的热插拔及动态配置。当Windows98检测到USB设备接入时,查找相应的驱动程序,并调用它的DriverEntry例程,PnP管理器调用驱动程序的AddDevice例程,告诉它添加了一个设备;然后驱动程序为USB设备建立一个功能设备对象。在此过程中,驱动程序收到一个IRP_MN_START_DEVICE的IRP,包括设备分配的资源信息。至此,设备被正确配置,驱动程序开始与硬件进行对话。电源管理模块负责设备的挂起与唤醒。

I/O功能实现模块完成I/O请求的大部分工作。当动态链接库提出I/O请求时调用Win32API函数DeviceToControl向设备发出命令;然后由I/O管理器构造一个IRP并设置其MajorFunction域为IRP_MJ_DEVICE_CONTROL。USB设备驱动程序收到该IRP后取出其中的控制码,并利用一个开关语句找到对应的例程入口。

2.3应用程序设计与实现

应用程序采用VisualBasic6.0编写。由于其只需调用动态链接库,故开发较简单。主要功能包括检测USB设备、开启/关闭USB设备、设置A/D状态和数据采集端口、显示并分析实时采集的数据。主框图如图5所示。

由于D12的端点1的FIFO为16字节,端点2的FIFO为64字节,当缓冲区存满后自动将数据打包,由SIE自动发送数据包。程序获得数据包后需延迟至下组数据包准备完毕,从而保证程序与数据采集同步。另外程序还发出停止采集和关闭USB设备的命令。

3系统特点

基于USB总线的实时数据采集系统严格遵循USB1.1协议,有以下特点:

(1)易于扩展。最长传输距离5m,采用USBHub可达30m;最多可同时接127个设备。

(2)电磁干扰影响极小。本系统放置在计算机外部,不受板卡间的电磁干扰影响;若在电磁干扰极强的环境下工作,需专门为其设计电磁屏蔽方案。

(3)安装方便,支持即插即用。克服了以往数据采集板卡需要打开机箱的麻烦。

驱动程序设计范文篇7

1ARM的触摸控制系统的总体框架

ARM微处理器体积小,功耗低,成本低,高性能,在使用过程中支持十六位,三十二位双指令集,能很好的兼容八位或十六位器件,而且ARM微处理器的寻址方式非常简单,执行效率还很高,这一系列特点都能够很好应用于触摸控制系统,在这里我们以最为常见的彩色液晶屏为例,彩色液晶屏的ARM触摸屏控制系统的整体框架主要由五部分组成,分别是ARM微处理器,液晶屏控制器,触摸屏控制器,彩色液晶屏以及触摸屏,彩色液晶屏作为人机交换的最直接的交互画面,通过内部的液晶控制屏和ARM微处理器相连接,触摸屏控制器通过模数转换对信息进行处理,将转换完成后的信息传递到ARM微处理器,ARM微处理器对这些信息进行处理,然后控制液晶显示器进行相应的画面更新动作,实现人机交换功能,在这里需要注意的是,微处理器的型号为LPC2290,触摸屏控制器选择FM7843,液晶屏控制器选择SID13503。

2ARM微处理器触摸屏控制系统的总体设计

ARM触摸屏控制系统是当前液晶触摸屏系统中比较先进的,在整个触摸屏系统中占有主导地位,而且加入ARM微处理器的触摸屏控制系统能操作相比原来更加的简单,显示效果也变的比原来更好,符合原先触摸屏系统的设计要求,更重要的是ARM微处理器具有很高的实际应用价值。现在的ARM微处理器触摸控制屏系统的总体设计主要分为两大部分,第一部分是硬件设计,第二部分是软件设计,下面我们就对这两部分展开全面的分析和探讨。2.1ARM触摸屏控制系统硬件设计部分。我们还是以彩色液晶屏为例,其硬件设计部分主要包括显示器,彩色液晶屏的驱动电路,液晶屏控制器(SID13503),触摸屏驱动电路以及触摸屏控制器(FM843),在实际的连线过程中,SID13503液晶屏控制器需要用5伏电源进行供电,利用液晶屏控制器可以进行硬件配置的特点,在电路的设计过程中我们可以根据不同的需要对液晶屏控制器的16个引脚进行设置,总体设计我们采用8位总线方式对液晶屏控制器进行连接,液晶屏控制器的16个引脚和电源,寄存器,存储器以及上拉电阻等一些部件进行正确连接。另外就是触摸屏驱动电路和触摸屏控制器(FM7843),由于触摸屏的种类比较多,在这里我们选择电阻式触摸屏为例,所谓电阻式触摸屏,简单来说就是一种多层复合薄膜,分上导体层和下导体层,在实际工作中和显示器配合使用,在使用过程色液晶屏上的电阻式触摸屏只能够对数字信号进行检测,因此我们就需要引入FM7843模数转换器,将模拟信号转换成数字信号,转换精度根据ARM微处理器的需要来设定,最后通过SPI接口将转换的模拟信号传递给ARM微处理器。2.2ARM触摸屏控制系统软件部分设计。软件部分设计主要是对驱动程序的设计,这一部分是非常难的,相比于硬件部分的设计来说软件设计需要操作的部分很少,但是所包含的知识量是非常广泛的,软件部分的设计主要分为三大块,第一是触摸屏驱动程序设计,第二是液晶屏的驱动程序设计,第三是用户程序的设计。进行触摸屏驱动程序设计的第一步首先对触摸屏控制器进行定义,也就是创建库文件,然后就是对触摸屏控制器的I/O接口进行定义,最后就是创建驱动程序实现触摸屏控制器的驱动,在创建驱动程序的时候我们需要用到几个函数,第一个延时函数,实现整个驱动程序的延时功能,再就是检测延时函数,保证程序能够一步一步进行,还有就是写读函数实现对程序的读写操作,这些函数都是驱动程序中非常重要的一部分,一旦函数运用出现失误,那么整个驱动程序就不能够正常进行,因此在对这些函数进行编写的时候我们一定要正确运用这些函数。对于彩色液晶屏驱动程序的设计和触摸屏驱动程序的设计过程是相同的,但是所用到的函数是不同的,在对彩色液晶屏驱动程序的设计中需要用到几个特别的函数,分别是画图函数,填充函数,实现在指定位置上画点并且使LCD以图形的方式进行填充。用户程序和以上两个程序的设计存在很大的不同,设计用户程序的目的就是为了能够读取触摸屏的动作,在程序运行时,首先要对GPIO以及LCM进行初始化,将液晶屏片选信号CS调低,填充液晶屏幕背景色并校准,最后就是等待有效触摸,在获取有效触摸后对触摸坐标进行校准,然后通过液晶屏显示出来。

3结束语

驱动程序设计范文篇8

关键词:USB软件狗加解密技术反破解

在工业生产和科学技术研究过程的各行业中,常常要对各种数据进行采集,现在常用的采集方式是在PC机或工控机内安装数据采集卡,如A/D卡及422卡、485卡、采集卡不仅安装麻烦,易受机箱内环境的影响,而且由于受计算机插槽数量和地址、中断资源的限制,不可能挂接很多设备;而用串行总线USB(UniversalSerialBus)能很发地解决以上这些冲突。

利用89C51设计基于USB总线的数据采集设备,还可与MAX485结合起来实现数据的远程采集。该系统具有可靠性高、性价比高和多点采集等优点。

1系统硬件设计

USB数据采集系统硬件模块主要由串行A/D转换器、89C51芯片、USB接口芯片和多路模拟开关等组成。硬件总体结构框图如图1所示。

USB接口芯片采用NationalSemiconductor公司的一种专用芯片USBN9602。该芯片内部集成微处理器接口、FIFO存储器、时钟发生器、串行接口引擎(SIE)、收发器和电压转换器,支持DMA和微波接口。

多路模拟输入信号经多路模拟开关控制将其中的一路接入串行A/D转换器,A/D转换器经光电隔离后串行输出到移位寄存器,移位寄存器将此结果转为8位并行数据。89C51系统通过8位的并行接口传送A/D转换器采集的数据,存储在FIFO存储器中;一旦FIFO存满,SIE立刻对数据进行处理,然后89C51系统将数据从FIFO存储器中读出,由收发器通过数据线(D+、D-)送至主机。USBN9602与89C51的具体接口电路如图2所示。图中USBN9602的CLKOUT与89C51的XTAL1相连,即USBN9602的时钟输出为89C51提供时钟输入。USBN9602的复位端接RC电路,以保证复位电路可靠地工作。由于晶振频率较高,结合USBN9602内部网络,在XOUT端串接100μF电容及470μF电感,起稳定内部振荡频率的作用。

2系统软件设计

系统软件包括设备固件、USB设备驱动程序和应用程序。

2.1设备固件(firmaware)设计

此处固件是指固化到89C51Flash中的程序。其主要功能是:①控制A/D转换器的采样;②控制芯片USBN9602接受并处理USB驱动程序的请求及应用程序的控制指令。现主要介绍89C51系统如何控制USB控制器(USBN9602)与主机的通信。

89C51系统对USB控制器的操作是严格按照USB协议1.1进行的。按照USB协议1.1的规定,USB传输方式分为4种:控制传输、块传输、同步传输和中断传输。在实际开发中使用了控制传输和块传输。控制传输主要完成主机对设备的各种控制操作,也就是实现位于主机上的USB总线驱动程序(USBD.SYS)以及编写的功能驱动程序对设备的各种控制操作。块传输主要完成主机和设备间的大指数据传输以及对传输数据进行错误检测(若发生错误,它支持“重传”功能)。

89C51系统控制USB控制器的工作工程可以简单地概括为:当USB控制器从USB总线检测到主机启动的某一传输请求后,USB控制器通过中断方式将此请求通知89C51系统;89C51系统通过访问USB控制器的状态寄存器和数据寄存器,获得与此次传输有关的各种参数,并根据具体的传输参数,对USB控制器的控制寄存器和数据寄存器进行相应的操作,以完成主机的传输请求。理解了以上的工作过程就可以进行相应的固件设计。

2.2USB设备驱动程序设计

USB系统驱动程序的设计是基于驱动程序模型WDM(WindowDriverModel)的。WDM采用分层驱动程序模型:较高级的USB设备驱动程序和较低级的USB函数层。其中USB函数层由两部分组成:较高级的通用串行总线模块(USBD)和较低级的主控制器驱动程序模块(HCD)。

目前,Windwos98提供了多种USB设备驱动程序,但并不针对数据采集设备,因此需用DDK(设备驱动程序开发包)开发工具设计专用的USB设备驱动程序。目前,写USB驱动程序的软件也很多,它们均提供用于生成USB驱动的代码生成器,用户按照提示可以定义设备的配置和功能,然后做功能的修改即可。利用软件中提供的例子进行修改也是一个比较好的捷径。可以把USB设备驱动程序的功能划分成4个不同的模块来实现:初始化模块、即插即用管理模块、电源管理模块以及I/O功能实现模块。

初始化模块提供1个入口函数DriverEntry(),整个驱动程序的入口点为DriverEntry例程。在DriverEntry中,需要提供一个AddDevice例程,把驱动程序添加到驱动程序堆栈中去。另外,所有对各种IRP(I/O请求包,如:IRP_MJ_CREATE,IRP_MJ_WRITE,IRP_MJ_CLOSE,IRP_MJ_READ,IRP_MJ_DEVICE_CONTROL等)的处理例程都在此入口函数中作为定义,如:

DriverEntry(INPDRIVER_OBJECTDriverObject,…)//驱动程序入口

{

DriverObject->DriverExtension->AddDevice=USBAddDevice;

DriverObject->DriverUnload=USBUnload;

DriverObject->MajorFunction[IRP_MJ_READ]=USBRead;

DriverObject->MajorFunction[IRP_MJ_WRITE]=USBWrite;

}

图2USBN9602与89C51接口电路

即插即用管理模块用来实现USB设备的热插拔及动态配置。当硬件检测到有USB设备接入时,Windows98查找响应的驱动程序,并调用它的DriverEntry例程。PnP(即插即用)管理器调用驱动程序的AddDevice例程,告诉它添加了一个设备。在此处理过程中,驱动程序收到一个设备启动请求(IRP_MN_START_DEVICE)的IRP。同理,当要拔除时,PnP管理器会发出一个设备删除请求(IRP_MN_REMOVE_DEVICE)的IRP,由驱动程序进行处理。通过对这些PnP请求的处理,可支持设备的热插拔和即插即用功能。

电源管理模块负责设备的挂起与唤醒。

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

2.3应用程序设计

用户态的应用程序是数据采集系统的中心,其主要功能为:开启或关闭USB设备、检测USB设备、设置USB数据传输管道、设置A/D状态和数据采集端口、实时从USB接口采集数据、显示并分析数据。

由于USBN9602提供的FIFO不超过64字节,当它存满后,USBN9602自动将数据打包即时请求读入数据,由SIE自动发送数据包。另外,当系统启动A/D模块后,便会创建两个线程:采样线程和显示存盘线程。采样线程负责将采集数据写到应用程序提交的内存;而显示存盘线程负责给应用程序发送显示和存盘消息。当应用程序接收到此消息后,便从它提交的内存读取数据并显示和存盘。此处需要注意的是,采样线程和显示存盘线程在读写应用程序提交的内存时要保持同步。

3远程数据采集系统设计

传输距离是限制USB在工业现场应用的一个障碍,即使增加了中继或Hub,USB传输距离通常也不超过几十m,这对工业现场而言显然太短了。现在,工业现场有大量采用RS-485传输数据的采集设备,其优点主要为传输距离可达到1200m以上,并且可以挂接多个设备;但传输速度慢,且需要板卡支持,安装麻烦。将RS-485与USB结合起来,可以优势互补,产生一种快速、可靠、低成本的远程数据采集系统。

设计这样一个系统的关键设备是RS-485~USB转换器,可以采用USBN9602+89C51+MAX485实现这一功能。整个系统的基本思想是:将传感器采集到的模拟量数字化以后,利用RS-485协议将数据上传。RS-485~USB转换器在主机端接收485的数据。并通过USB接口传输到主机处理;而主机向USB发送数据时,数据通过RS-485~USB转换口转换为485协议向远端输送,从而实现远程数据的双向传输如图3所示。软件方面的设计与上面所述类似。

驱动程序设计范文篇9

关键词:USB;心电;数据采集

1引言

心电信号是最广泛的临床检查项目之一。心电信号数据采集系统是心电信号检查的关键部件,它能在较强的噪声背景下,通过电极将0.05~100Hz的微弱心电信号检测出来,然后经放大、A/D转换后送入计算机进行处理。计算机的使用使得该系统在信号分析、储存、打印等方面比传统的心电图机具有明显的优势。但采集系统与计算机的通讯接口都存在插卡插拔麻烦,安全性差,且扩展槽数目有限等不足。为此本文提出的基于USB接口的心电信号数据采集系统使用了目前最为先进的USB接口技术,能够支持即插即用和热插拔功能。这是其它非USB接口无法比拟的。同时也可以与笔记本电脑相连以构成移动式心电检测分析仪。

2系统的硬件组成

2.1系统组成

图1所示为基于USB接口的心电信号数据采集系统的组成框图。图中电极传感器检测到的心电信号经输入保护电路进行电压限幅、高频滤波后,再进行前置放大,然后经光电隔离后,再次进行电压放大,最后经干扰抑制电路消除干扰后,在多路模拟开关的控制下将其中某一路信号接入A/D。CY7C64613是带智能USB接口的单片机,通过它可以把A/D转接后的数字信号经USB接口传输到计算机。

下面就数据采集系统的抗干扰措施、信号放大及USB通信等问题进行重点论述。

2.2系统抗干扰

作为医疗器械的心电信号数据采集系统,由于其检测对象是低频、微弱的心电信号,干扰较大,因此系统的抗干扰能力及安全可靠性至关重要。针对这种情况,本系统采取了多方面措施。图2所示为输入保护电路和高频滤波电路。其中输入保护电路是在每个电极和地之间加入两个并联的硅二极管以进行电压限幅,从而限制输入电压不超过±600mv,确保病人和仪器的安全。高频滤波电路用于阻止高频干扰信号进入数据采集系统。本设计使用以FX101芯片为核心的低通滤波器。滤波截止频率为:

fc=1/[2p(R1R2C1C2)1/2]

使用光电隔离电路和干扰抑制电路可进一步提高抗干扰能力。干扰抑制电路包括50Hz干扰抑制电路和肌电干扰抑制电路。前者用来滤掉50Hz工频干扰(这是心电信号的主要干扰源),它是一个无源RC双T网络。后者用来抑制电极与皮肤接触时引进的肌电信号,它是一个高载RC滤波器。

此外,还可采用软件滤波的方法。可通过在软件中设置50Hz干扰滤波和漂移滤波等程序来进一步提高系统的抗干扰能力。

2.3放大电路

放大电路也是设计重点之一。一般情况下,心电信号必须进行放大才能送往计算机进行处理。由于极化电压的影响,放大器的增益不能太高,因而本系统采用了前置放大电路和电压放大电路两级放大的方法。对前置放大电路的要求是:输入阻抗高、失调温漂小、共模抑制比高、输入噪声小。为此笔者选用了INA121芯片。INA121是TexasInstrumentsBB公司生产的低功耗仪器放大电路,性能优越,它的差模输入电阻为1012Ω,共模抑制比为106dB,输入失调电压为±200μv,输入失调温漂为±2μv/℃,输入噪声为20nVHz1/2。前置放大电路的放大倍数设置为50。较小的前置放大倍数可以避免极化电压的影响。电压放大电路的放大倍数设置的较高(取为100倍),则可以保证总的放大倍数。

2.4USB专用芯片的选择

目前各个厂商推出的USB芯片类型众多,功能各异。本系统选用Cypress半导体公司推出的EZ-USBFX全速系列中的CY7C64613-128NC芯片。EZ-USBFX系列芯片是带智能USB接口的单片机,它以8051为核心。对于复杂与繁琐的USB通信,该器件可提供EZ-USB固件函数库与固件架构,从而可大幅度地降低编写固件程序代码的困难程度。CY7C64613支持USB协议1.1,同时可支持12Mbps的全速传输。此外,它还带有增强版的8051核心和4kB或8kB的RAM,端点数量为32个,可采用智能型的USB核心程序。

3软件设计

本系统的软件设计包括三部分:固件设计、驱动程序设计、应用程序设计。

本设计中将心电信号数据采集系统规划为人工接口设备HID群组。该HID群组原是针对键盘、鼠标等输入设备而设置与规划的。但是,对于需要以双向、适当的频率来进行数据交换的其它设备而言,也是一个非常好的设计范例与基础架构。因此,可以将这些设备规划为HID群组,只要它们符合HID规范中所定义的各种特性与条件,就可以执行HID设备的功能。在windows98与windows2000等操作系统中都已包含了HID群组的驱动程序,因此,用户开发新设备时,无须重新编写驱动程序。

3.1固件(Firmware)设计

由于EZ-USBFX系列已提供了固件架构(frameworks)。因此,可以利用这一架构来简化固件的开发。用户仅需提供其USB描述符以及实现功能的程序代码在PERIPH.C文件中,即可完成完全兼容的USB设备设置。此外,Cypress公司还提供了副函数钩子(functionhooks),利用该功能可以帮助用户进行固件的设计。

在程序开始执行后,固件架构会执行以下步骤:第一步,设置内部状态变量的起始值;第二步,调用用户的初始设置函数TD-Init;第三步,在1s间隔后重新设备列举(ReNumerate),直到收到SETUP封包为止;第四步,一旦SETUP封包被检测到,固件架构立即启动与其合作的工作分配器。

TD_Init()可用来对用户设备(即数据采集系统)进行初始化,并重新寻址描述符表。其程序代码如下:

TD_Init();

pDeviceDscr=(WORD)&DeviceDscr;

pConfigDscr=(WORD)&ConfigDscr;

pStringDscr=(WORD)&StringDscr;

if((WORD)&DeviceDscr&0xe000)

pReportDscr=(WORD)&ReportDscr

{

IntDescrAddr=INTERNAL_DSCR_ADDR;

ExtDescrAddr=(WORD)&DeviceDscr;

DevDescrLen=(WORD)&UserDscr(WORD)&De-viceDscr+2;

for(i=0;i<DevDescrLen;i++)

*((BYTExdata*)IntDescrAddr+i)=0xCD;

for(i=0;i<DevDescrLen;i++)

*((BYTExdata*)IntDescrAddr+i)=*((BYTExdata*)ExtDescrAddr+i);

pDeviceDscr=IntDescrAddr;

offset=(WORD)&DeviceDscr_INTERNAL_DSCR_ADDR;

pConfigDscr-=offset;

pStringDscr-=offset;

pReportDscr-=offset;

}

EZUSB_IRQ_ENABLE();

EZUSB_ENABLE_RSMIRQ();

3.2驱动程序设计

在Windows操作系统中,USB驱动程序是基于Win32DriverModelWDM的,它用阶层式驱动程序模式,每个驱动程序阶层负责处理一部分通信工作,具体框图如图3所示。设备驱动程序(含群组驱动程序)可与系统的总线驱动程序进行通信,总线驱动程序用来处理USB的硬件。用户应用程序并不直接与硬件打交道,而是使用Win32API调用函数对Win32子系统进行调用,同时给设备驱动程序发I/O请求包(IRP)。由于Windows操作系统中已包含了总线驱动程序和一些群组驱动程序,因此用户只需编写自己的用户设备驱动程序或选用Windows提供的群组驱动程序即可。

在Windows系统中,HIDDEV.INF文件中已提供有HID群组的驱动程序,可以直接引用。从而省去了编写繁琐的用户驱动程序的麻烦。

3.3应用程序设计

在应用程序中,需要设置与固件程序及驱动程序中相同的PID/VID码,才能在设备管理中找到对应的USB设备(数据采集系统)。具体的设置程序代码如下:

ConstMyVendorID=&H1234

ConstMyProductID=&H5678

在Windows98驱动程序开发工具组(DDK)中,一般都具有用户模式(即应用程序阶层)HID通信部分的完整指导准则。用户通过调用API函数,可以找到与设备描述符内设置的VID/PID码相符合的HID设备(即数据采集系统)。有了API函数传回的设备路径名称,就能用GreateFile()函数打开设备的指示(handle),然后使用HID特定的API函数来读取VID/PID码,最后再使用ReadFile()与WriteFile()函数来准备交换数据。具体编程方法可参阅Windows98DDK。

驱动程序设计范文篇10

关键词:JavaJDBCJDBCAPI数据库优化

0引言

目前,Web应用程序正在以非常快的速度在增长,Web应用程序不再是简单显示信息的网站,而逐渐融合核心的业务逻辑,成为IT领域的业务处理平台。Java以其面向对象、跨平台、安全性、健壮性等优秀特性已成为开发Web应用的主要选择。基于JDBC的结构和应用模式JDBC是一种可用于执行SQL语句的JavaAPI,由一些Java语言编写的类和接口组成。通过使用JDBC,开发人员可以很方便的将SQL语句传送给几乎任何一种数据库,有很好的可移植性。

1JDBC定义

JDBC是由Java编程语言编写的类及接口组成,同时它也为程序开发人员提供了一组用于实现对数据库访问的JDBCAPI,并支持SQL语言。利用JDBC可以将Java代码连接到Oracle、DB2、SQLServer、MySQL等数据库,从而实现对数据库中的数据进行操作的目的。

JDBC类似与Microsoft的ODBC,但两者有很大的区别,JDBC是Java操作数据库的方法,有Sun公司提供ODBC是有微软公司提供的数据库操作的方法。也可以说JDBC是连接数据库的一套标准。ODBC不适合直接在Java中使用,因为它使用C语言接口。

2JDBC与Java结合的优点

JDBC与Java结合,再一次验证了Java那句话“一次编写,到处运行”。它使程序员可以只写一次数据库程序后,就可以在各种数据库系统上运行。通过使用JDBC,程序员可以很方便地将SQL语句传给任何一种数据库。也就是说,程序员不需要写多个程序分别对应不同的数据库,用JDBC编写的程序能自动将SQL语句传给相应的数据库管理系统(DBMS)

Java具有坚固、安全、易于使用和易于理解等特性,是编写数据库应用程序的杰出语言。所需要的只是Java应用程序与各种不同数据库之间进行对话的方法,JDBC提供了这种方法。可以说JDBC扩展了Java的功能。

3JDBC工作原理

JDBC作为JavaEnterpriseAPI的一部分于1996年5月由JavaSoft公司推出,它为Java程序员在Java代码中访问关系数据库提供了标准API。这个标准API提供了编写标准和考虑所有不同应用程序设计的标准.其奥秘是一组由驱动程序实现的Java接口。驱动程序负责标准JDBC调用向支持的数据库所要的具体调用转变。这样应用程序编写一次就能移植到各种驱动程序上,应用程序不变,驱动程序则各不相同。驱动程序可以用于开发多层数据库设计的中间层,也称中间件。

4JDBC数据库连接中存在的问题及解决方案分析

JDBC的连接过程是JDBC达到正常运行的最困难部分。常遇到的问题有:

4.1ClassNotFoundException异常如果出现“Exceptioninthreadmainjava.lang.ClassNotFoundException”异常,这表示找不到数据库的JDBC驱动程序,可能的原因:一是没有为SQLSever安装JDB驱动程序,或者Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”)代码拼写有误。

解决方案如下:

step1:判断是否已经安装JDBC驱动程序,若没有安装,则从网上下载并安装,安装后的目录一般为C:\ProgramFile\MicrosoftSQLServer2000DriverForJDBC\Lib,该目录下有三个.jar文件:msbase.jar、mssqlserver.jar、msutil.jar,所需的类都在这三个文件中。

step2:动态指定classpath。将以上三个文件的路劲加入classpath之中:Classpath=.C:

\ProgramFile\MicrosoftSQLServer2000DriverForJDBC\Lib\msbase.jarC:

\ProgramFile\MicrosoftSQLServer2000DriverForJDBC\Libtmsutil.jarC:

\ProgramFile\MicrosoftSQLServer2000DriverForJDBC\Lib\mssqlserver.jar。注意,字符串“.”必不可少,否则会出现异常:“Exceptioninthreadmainjava.1ang.NoClassDefFoundError”。

Step3:加载SQLServer的驱动程序,就是在Class的forName方法中,引用SQLServer驱动程序的主要类,SQLServer驱动程序的主要类是COB.microsoft.jdbc.sqlserver.SQLServerDriver,这个类包含在mssqlserver.jar文件中,代码如下:Class.forName(“COB.microsoft.jdbc.sqlserver.SQLServerDriver”)

4.2Nosuitabledriver异常出现“Nosuitabledriver”异常的原因可能是SQLServer2000DriverForJDBC\Lib目录下的三个.jar文件:msbase.jar、mssqlserver.jar、msutil.jar未加入到ClassPath中,或者加入到项目的RequiredLibrary中。

解决方案:检查上面的step2中的操作是否正确:路径是否指定正确,文件名是否正确等。

4.3Errorestablishingsocket异常出现“Errorestablishingsocket”异常的原因,这是1433端口问题,因为在WindowsXPSP2及以上版本的Windows操作系统中,防火墙默认的是关闭这个端口的。需要为SQLServer打上补丁程序以打开1433端口。

解决方案如下。

Step1:版本的检查SQLServer的补丁版本检查不如Windows补丁版本检查直接,一个系统管理员,如果不了解SQLServer版本对应的补丁号,可能也会遇到一点麻烦,在这里说明一下,通过这些办法判别机器是否安全的办法,不会对系统产生任何影响。

Step2:1433端口的检查。

在命令行窗口中输入命令:netstat—an。检查1433端口是否被打开侦听。

5总结

开发需要将数据持久性保存到关系数据库管理系统的应用程序是IT行业持续增长的一个需要。使用JDBC技术,利用JDBCAPI提供的各种不同特性,有利于用户选择最佳特性来满足自己特定的应用程序体系结构。

本文主要针对目前在Web应用程序开发中使用JDBC技术解决数据库访问时,提出了解决性能问题的若干方法,并对这些方法的提升Web数据库性能的原理进行了分析,最后提出了对关系数据模型优化方法,这些技术方法在开发中都得到了验证,能够提升Web应用程序在服务上的性能。

参考文献:

[1]萧仁惠,陈锦辉编著.JDBC数据库程序设计[M].北京:中国铁道出版社.2004.2.

[2]林胜利,王坤茹,孟海利编著.Java优化编程[M].北京:电子工业出版社.2005.5.

[3]张晓东等编著.Java数据库高级教程[M].北京:清华大学出版社.2004.