摘 要: 為了實現在主控計算機和信號處理板之間快速通信,采用了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.