《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 業(yè)界動態(tài) > 利用WinDriver開發(fā)PCI設(shè)備驅(qū)動程序

利用WinDriver開發(fā)PCI設(shè)備驅(qū)動程序

2009-03-24
作者:黃 迅 孫政順

  摘 ?要: WinDriver是一套PCI驅(qū)動程序開發(fā)包。它改變了傳統(tǒng)驅(qū)動程序開發(fā)的方法與思路,極大地簡化了驅(qū)動程序的編制;同時,又沒有犧牲驅(qū)動程序的性能,是一套高效、快捷的PCI驅(qū)動程序開發(fā)軟件包。特別適合專業(yè)硬件人員的使用。

  關(guān)鍵詞: 設(shè)備驅(qū)動程序? WinDriver? PCI

?

??? WinDriver是Jungo公司出版的一個設(shè)備驅(qū)動程序開發(fā)組件,它可以大大加速PCI設(shè)備驅(qū)動程序的開發(fā)。作者在實際的項目中采用了WinDriver來開發(fā)設(shè)備驅(qū)動程序,取得了相當(dāng)好的運行效果。從目前國內(nèi)的資料上來看,大多數(shù)設(shè)計人員還是在用DDK、Vtools開發(fā)設(shè)備驅(qū)動程序,因而作者覺得有必要向大家介紹與推薦這個軟件。

  WinDriver是一套設(shè)備驅(qū)動程序開發(fā)組件,它的目的就是方便Windows程序員快速開發(fā)出PCI/ISA設(shè)備的Windows驅(qū)動程序(目前最新的版本V4.32還支持PCMCIA、USB設(shè)備的驅(qū)動程序的開發(fā),并且除了支持Windows9X/NT系統(tǒng)外,還有支持Unix、Windows CE的版本推出)。利用WinDriver開發(fā)設(shè)備驅(qū)動程序,不需要熟悉操作系統(tǒng)的內(nèi)核,整個驅(qū)動程序中的所有函數(shù)都是工作在用戶態(tài)下的,通過與WinDriver的.Vxd或者.Sys文件交互來達(dá)到驅(qū)動硬件的目的。由于是一個用戶態(tài)程序,效率的高低也就成了人們選擇WinDriver時關(guān)心的一個問題。大量實踐數(shù)據(jù)表明,WinDriver并沒有通過犧牲系統(tǒng)性能來換取驅(qū)動程序的快速開發(fā),的確是一個“像開發(fā)用戶態(tài)程序那樣簡單,像核心態(tài)程序那樣高效”[1]的開發(fā)工具。

  圖1是WinDriver的體系結(jié)構(gòu)圖。

1 WinDriver主要特征

  ·提供了從用戶層訪問硬件的簡單方法;

  ·能夠方便地將性能要求特別苛刻的部分通過Windriver提供的API插入到核心態(tài)模式運行,提高執(zhí)行效率;

  ·對主流PCI接口芯片(AMCC、PLX、V3系列)提供了很好的支持;

  ·可以利用常見的軟件開發(fā)平臺(Visual C++、Borland C++、VB4、Java、Delphi);

  ·支持I/O、DMA、中斷處理,支持PCI、ISA、EISA設(shè)備的開發(fā);

  ·無需DDK以及核心態(tài)程序開發(fā)的經(jīng)驗。

2 開發(fā)步驟

  a.根據(jù)WinDriver的文檔,建議開發(fā)步驟如下:

  · 打開WinDriver? Wizard,利用Wizard來分析待開發(fā)驅(qū)動程序的卡,然后自動生成驅(qū)動程序的框架代碼;

  · 修改代碼,加入定制功能;

  · 在用戶態(tài)執(zhí)行與調(diào)試代碼;

  · 將性能苛刻部分插入到核心態(tài);

  b.我們在實際編寫驅(qū)動程序的過程中發(fā)現(xiàn),完全用WinDriver提供的API來寫驅(qū)動程序比在Wizard生成的框架代碼上修改更為靈活。一般來說,PCI驅(qū)動程序分成3個部分:初始化部分,對硬件資源的訪問函數(shù)庫、具體調(diào)用部分。其中,后面兩個部分對于不同的硬件都是基本一致的。比如說,我們先后開發(fā)的基于AMCC5933與PLX9052的PCI接口卡,對于他們的硬件資源訪問,用的都是WinDriver下面相同的API;兩者開發(fā)的不同只在于初始化時對于硬件資源的鎖定。所以只要開發(fā)出了針對一種接口芯片的系統(tǒng)的驅(qū)動代碼后,以后一般只要修改接口芯片的ID值及一些寄存器的偏移值,就能夠移植了,比每次生成不同的框架代碼再改動也許要更簡便。

3 實例分析

  整個驅(qū)動程序的結(jié)構(gòu)大致如下:

????· 打開WinDriver設(shè)備;

????· 查找我們要訪問的PCI設(shè)備;

????· 枚舉該設(shè)備的資源(內(nèi)存、I/O、中斷);

  · 鎖定該設(shè)備的資源只能為我們所用,不能被其他程序訪問;

  · 訪問板上的資源;

  · 解鎖資源;

  · 關(guān)閉WinDriver設(shè)備。

  以下為一段使用WinDriver開發(fā)的AMCC5933DMA的驅(qū)動代碼,利用這個程序來演示W(wǎng)inDriver的程序結(jié)構(gòu)。這個程序只要稍加修改,就可以用來作為其他PCI卡的驅(qū)動程序的一部分,例如PLX9050、9054。為了節(jié)省篇幅,省略了變量說明部分。程序中出現(xiàn)的變量大都由其名稱可以反映含義,具體可以參見WinDriver的設(shè)計文檔中的說明。

  hWD=WD_Open();?????????????      ???//打開WinDriver設(shè)備,每次使用前必須調(diào)用;

  pciScan.searchId.dwVendorId=0x10e8;???? ?//AMCC公司供貨號

  pciScan.searchId.dwDeviceId=0x4750;

???????????????????????????????????????????? ?//AMCC5933的設(shè)備號

  WD_PciScanCards (hWD, &pciScan);

???????????????????????????????????????????? ?//枚舉PCI槽上的設(shè)備

  pciSlot=pciScan.cardSlot[0];     ?? //假設(shè)只有我們一個設(shè)備,得到設(shè)備槽的號碼

  pciCardInfo.pciSlot=pciSlot; 

  WD_PciGetCardInfo(hWD,&pciCardInfo);? //得到該設(shè)備槽上的設(shè)備信息

  Card=pciCardInfo.Card;????        //Card為一個反映PCI卡上資源的結(jié)構(gòu)

  cardReg.Card=Card;

  WD_CardRegister(hWD,&cardReg);???????? //向核心態(tài)登記,鎖定卡上資源

  Item=Card.Item[2];????        ??? //將卡上的號為2的資源賦給Item

  if(Item.item==ITEM_MEMORY)

  {

????regAddr=Item.I.Mem.dwUserDirectAddr;? //得到PCI卡上的內(nèi)存映射到用戶態(tài)的地址

??? }

??? Dma1.dwBytes=4*dwDWord;

??? Dma1.pUserAddr=pBuffer1;

??? Dma1.dwOptions=0;

??? WD_DMALock(hWD,&Dma1);??????????? ?? //鎖定用于DMA的內(nèi)存資源

??? 至此與PCI卡上的內(nèi)存進(jìn)行DMA傳輸?shù)臏?zhǔn)備已經(jīng)完成,下面只要寫相應(yīng)的控制字就可以啟動DMA操作了。

4 常見問題的解答

??? (1)評估版本的功能限制及其解決

??? 評估版本除了30天的限制外,與正式版本相比還有3個限制。其中影響最大的是所有的關(guān)閉函數(shù)(DMA鎖定內(nèi)存的解鎖,資源的關(guān)閉...)都加了延時。這樣我們在做數(shù)據(jù)采集卡的驅(qū)動程序時就要注意,最好只分配一次資源。比如說做DMA操作,不要反復(fù)地鎖定內(nèi)存,這樣會在解鎖時損失效率。一個折衷的方法是鎖定DMA內(nèi)存后,一旦這塊內(nèi)存寫滿后,就將其中數(shù)據(jù)拷到用戶態(tài)程序分配的大內(nèi)存中去。

  (2)用WinDriver開發(fā)的程序效率

  在使用WinDriver或者VxdTools這類工具時,大家最關(guān)心的一個問題可能就是效率問題。從實踐與分析來看,WinDriver生成的驅(qū)動代碼的效率相當(dāng)?shù)馗?。比如PCI卡的高速數(shù)據(jù)采集涉及到DMA的應(yīng)用,WinDriver提供了相應(yīng)的API來將卡上的內(nèi)存映射到用戶態(tài)程序所能直接訪問的地址空間中,然后直接對這個映射后得到的地址進(jìn)行DMA操作。也就是說,與用DDK來直接編寫驅(qū)動程序的區(qū)別就在于地址映射的操作上,在這部分工作上面,用WinDriver的API肯定沒有直接用DDK寫的專門面向特定硬件優(yōu)化的代碼來得高效。但是這部分代碼實際上屬于初始化工作,這部分的效率高低事實上并不會影響總體上的效率。

  實際中,用WinDriver編寫的PCI驅(qū)動程序在賽揚466、64M內(nèi)存的機(jī)器上,在8位模式下可以穩(wěn)定地采集4~8Mbytes/s的數(shù)據(jù)。而且隨著硬件設(shè)計的改變,肯定還有提高余地。

  經(jīng)過實際應(yīng)用,發(fā)現(xiàn)WinDriver這個軟件使用快速,無論是開發(fā)效率還是實際達(dá)到的性能指標(biāo)都相當(dāng)令人滿意。特別對于硬件開發(fā)人員來說,可以不必了解繁瑣的操作系統(tǒng)的內(nèi)核知識,就可以快速地開發(fā)出驅(qū)動程序,對于調(diào)試硬件是一個很好的幫助工具。

?

參考文獻(xiàn)

1 Applied Micro Circuit? Corporation.PCI PRODUCTS DATA BOOK

2 Jungo? Corporation.WinDriver V4.0 Developer's Guide

3 PLX Corporation. PCI 9052 Data Book

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。