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

时间:2022-08-10 09:03:59

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

摘 要: 为了实现在主控计算机和信号处理板之间快速通信,采用了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简介

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种方式:通过驱动程序向导生成驱动程序框架,再对框架程序进行修改和调试;直接编写驱动程序。

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

直接编写代码方式步骤:

(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的状态存储区读取信号处理板的状态数据;

(4)DSP6416DLL_ReadResult(BYTE *ResultData):从DSP的Block1或Block2数据缓存区读取结果数据;

(5)DSP6416DLL_Exit():关闭中断,关闭设备,关闭WDC库。

2.3 CPCI驱动程序实现

在硬件环境和接口、驱动程序封装形式及其软件接口确定后,剩下的工作就是CPCI驱动程序的实现。该工作主要内容为驱动程序DLL各接口函数的编码实现和WinDriver库函数调用。

2.3.1 文件包含

包含与WinDriver相关的头文件:windrvr.h,windrvr_int_thread.h,wdc_lib.h。

2.3.2 驱动程序初始化

驱动程序初始化主要工作和步骤包括:打开WinDriver,WinDriver授权、版本号检查、板卡检测、板卡信息获取、模块配置、板卡注册和PCI中断使能,驱动程序初始化流程见图3。

2.3.3 驱动程序向DSP内存写数据

DSP6416的PCI接口支持四种类型的数据交换[9?10]:从模式写,外部PCI主设备通过PCI接口写数据到DSP;从模式读,外部PCI主设备通过PCI接口读取DSP中的数据;主模式写,DSP主设备通过PCI接口向外部设备写数据;主模式读,DSP主设备通过PCI接口向外部设备读数据。

4 结 语

通过实际应用,发现用WinDriver开发的本驱动程序运行稳定可靠,达到了主控计算机对信号处理板实时控制,特别是信号处理板中大容量数据实时上传的目的。由于系统方案确定了CPCI并行总线作为通信手段,硬件设计时采用了自带主从式PCI接口模块的DSP6416芯片,驱动开发工具选择了快速高效的WinDriver工具包,以及对驱动程序形态进行DLL封装,本驱动程序从需求设计到完成编码和调试不到一个月的时间,在保证软件质量的同时,缩短了研制周期,提高了开发效率。

参考文献

[1] 李贵山,戚德虎.PCI局部总线开发者指南[M].西安:西安电子科技大学出版社,1997.

[2] PICMG. Compact PCI core specification PICMG 2.0 R3.0 [R]. [S.l.]: PICMG, 1999.

[3] 王磊,鲁新平,李吉成.WinDriver在开发基于PLX9056芯片的PCI设备驱动程序中的应用[J].现代电子技术,2006,29(18):77?79.

[4] 李静,赵保军.基于TMS320C6416内嵌PCI设备驱动程序开发[J].微机发展,2005,15(10):135?137.

[5] Jungo Ltd. WinDriver PCI/ISA/CardBus v8.02 user’s guide [R]. US: Jungo Ltd, 2005.

[6] 简育华.基于WinDriver的 PCI驱动程序开发[J].火控雷达技术,2011,40(1):68?70.

[7] Jungo Ltd. WinDriver PCI/PCMCIA/ISA v8.02 Low?Level API Reference[R]. US: Jungo Ltd, 2005.

[8] 宋新超,柴恒.基于WinDriver的数字信号处理器PCI驱动开发[J].舰船电子对抗,2012,35(4):82?84.

[9] Texas Instruments. TMS320C6000 DSP peripheral component interconnect (PCI) reference guide [R]. US: Texas Instruments, 2003.

[10] 张秋菊,李丽芬,白彦霞,等.基于DSP的驱动程序开发[J].现代电子技术,2009,32(14):18?21.

上一篇:河流生态健康评价中功能指标分析与计算 下一篇:DOS环境下用BorlandC实现中断方式的串口编程实...