基于WinDriver的CPCI板卡Windows驱动程序设计 下载本文

内容发布更新时间 : 2025/1/8 14:54:37星期一 下面是文章的全部内容请认真阅读。

龙源期刊网 http://www.qikan.com.cn

基于WinDriver的CPCI板卡Windows驱动程序设计

作者:先登飞

来源:《现代电子技术》2013年第18期

摘 要: 为了实现在主控计算机和信号处理板之间快速通信,采用了CPCI并行总线技术。为简化开发难度,信号处理板采用内嵌PCI模块的DSP6416数字信号处理芯片实现通信和控制功能,软件开发环境基于VC++6.0,利用WinDriver工具开发了Windows下以DLL形式封装的CPCI驱动程序。通过实际使用验证,该驱动程序运行稳定可靠,实现了主控计算机对信号处理板的实时控制和信号处理板中结果数据向主控计算机实时上报功能。 关键词: WinDriver; Windows驱动程序; CPCI总线; VC++6.0

中图分类号: TN964?34 文献标识码: A 文章编号: 1004?373X(2013)18?0051?04 0 引 言

外围设备互联(PCI)总线是一种先进的高性能局部总线,可同时支持多组外围设备[1]。CPCI总线应用于工业和嵌入式领域,其规范改进自PCI规范,CPCI规范在电气方面兼容PCI规范,只是在封装结构上进行了加强,CPCI板的封装结构基于IEC 60297?3,IEC 60297?4以及IEEE 1101.10定义的欧式板卡外形[2]。既然电气特性上兼容PCI规范,因此CPCI驱动程序的设计本质就是PCI驱动程序设计。

当前Windows环境下用于PCI设备驱动开发的工具主要是DDK,DriverStudio以及WinDriver。前两者功能强大,但是开发者需要熟知操作系统的体系结构、汇编语言和设备驱动程序结构体系方法,还需要具备丰富的驱动程序开发经验,否则可能造成软件不稳定甚至系统崩溃,另外前两者开发周期长。而Jungo公司开发的WinDriver改变了传统的驱动程序开发方法,其整个驱动程序中的所有函数都是工作在用户态下,使开发者不需要掌握前两者所需的预备知识就可以开发出与之相媲美的程序[3]。

为了实现在主控计算机和信号处理板之间快速通信,采用了CPCI并行总线技术,信号处理板采用内嵌PCI模块的DSP6416芯片。软件开发基于Windows平台和VC++6.0编程环境,为了便于应用程序调用驱动程序,按照模块化的软件设计思想,驱动程序以DLL动态链接库的形式封装。为提高工作效率、缩短开发周期,开发工具选用WinDriver。 1 WinDriver简介

龙源期刊网 http://www.qikan.com.cn

WinDriver是一套设备驱动程序开发组件,它的目的就是方便程序员快速开发出PCI,ISA,CPCI,PCIE等设备的Windows驱动程序[4]。 1.1 WinDriver原理

WinDriver的体系架构分为两种模式:用户模式和内核模式。对硬件进行操作时,开发者应用程序调用WinDriver用户模式的库函数,用户模式的库函数再调用WinDriver内核,WinDriver内核再调用操作系统底层函数实现对硬件的最终访问。其与硬件模板、用户驱动程序、用户应用程序之间的关系即体系架构见图1[5?6]。对于某些在用户模式下不能实现的高性能硬件驱动程序,可通过WinDriver的内核插件功能实现:在用户模式下完成编程和调试,不做任何修改,直接将该高性能要求的程序模块植入内核插件,WinDriver即从内核模式下调用该程序模块。 1.2 WinDriver特点

作为一款实用的驱动程序开发工具包,WinDriver的主要优点和特征如下:

(1)通过内核插件功能(Kernel PlugIn)能够实现用户模式的易用和内核模式的高性能; (2)友好的驱动向导允许不写一行代码即可实现硬件诊断;

(3)支持所有PCI/PCMCIA/CardBus/ISA/EISA/CompactPCI/PCIExpress设备,与制造商无关;

(4)可以利用常见的软件开发平台包括MSDEV/VisualC/C++,Borland Delphi,Visual Basic6.0等;

(5)开发者不需要知道DDK,ETK,DDI及任何其他系统层面的编程知识; (6)支持I/O、DMA中断处理和直接访问板卡映射的存储器; (7)支持多CPU及多PCI总线平台。 1.3 用WinDriver开发驱动程序

利用WinDriver开发驱动程序有2种方式:通过驱动程序向导生成驱动程序框架,再对框架程序进行修改和调试;直接编写驱动程序。

通过驱动程序向导开发步骤:板卡检测、诊断;生成驱动程序框架;调试、编译驱动程序。

龙源期刊网 http://www.qikan.com.cn

直接编写代码方式步骤:

(1)包含WinDriver相关的头文件;

(2)WinDriver库函数调用,WinDriver库函数典型调用流程见图2[7]。 2 CPCI信号处理板卡驱动程序设计 2.1 硬件环境

实现PCI总线协议一般有2种方法:一是用FPGA设计实现,由于PCI协议比较复杂,实现较困难;二是采用专业PCI总线控制芯片,如AMCC公司的S5933、PLX公司的PCI 9080等通用PCI接口芯片[8]。本信号处理板采用第二种方法,选用自带PCI接口模块的

DSP6416,主控计算机上的应用程序通过驱动程序将控制命令字主动写入DSP内存,实现主控计算机对信号处理板的控制;信号处理板结果数据处理完毕后,向主控计算机发中断,驱动程序响应该中断,并主动读取指定DSP内存获取结果数据。

结果数据和模块状态信息存入L2缓存单元,主控计算机下发的命令字也写入L2缓存单元。结果数据缓存划分为大小各为28 KB的Block1和Block2两块区域;模块状态信息缓存大小为24字节;控制命令缓存大小为1 B。DSP中与PCI操作有关的缓存定义见表1。 表1 DSP中与PCI操作有关的缓存定义

当Block1缓存填满后,新的结果数据存入Block2缓存,同时DSP给主控计算机发PCI中断,主控计算机通过PCI接口读取Block1;同理当Block2填满后,新的结果数据存入Block1缓存,主控计算机通过PCI读取Block2。Block1和Block2缓存交替接收结果数据。 2.2 CPCI驱动程序DLL接口设计

为了便于应用程序访问驱动程序,按照模块化的软件设计思想,驱动程序以DLL动态链接库的形式进行封装,应用程序通过与驱动程序DLL之间的接口来访问信号处理模块的板上资源,下发控制命令、获取结果数据。主要接口及其功能描述如下:

(1)DSP6416DLL_Init(CWnd* pMainWnd):打开并注册WDC库、打开设备,初始化中断;

(2)DSP6416DLL_SendCmd(BYTE BCommand):主控计算机中的控制命令数据写入DSP中命令存储区;

(3)DSP6416DLL_ReadState(BYTE *StateData):从DSP的状态存储区读取信号处理板的状态数据;