摘 要:介紹了一種較為通用的PCI接口卡的硬件結(jié)構(gòu),說明了硬件設(shè)計(jì)的幾種可行性方案和硬件設(shè)計(jì)時(shí)需要注意的問題,同時(shí)詳細(xì)地闡述了PCI設(shè)備WDM驅(qū)動(dòng)程序開發(fā)的基本方法,比較了幾種常用開發(fā)工具的優(yōu)缺點(diǎn),并對驅(qū)動(dòng)程序中的PCI設(shè)備I/O端口與存儲器的讀寫、中斷處理以及應(yīng)用程序與驅(qū)動(dòng)程序之間多種通信方式作了詳細(xì)的介紹。
關(guān)鍵詞: 雷達(dá)模擬器;PCI接口卡;WDM驅(qū)動(dòng)程序;共享內(nèi)存; 中斷
一、引言
目前,PCI技術(shù)已廣泛應(yīng)用于電子行業(yè)的各個(gè)領(lǐng)域,特別是在計(jì)算機(jī)控制、數(shù)據(jù)采集與傳送方面,PCI技術(shù)已經(jīng)成為一種非常成熟的技術(shù)。PCI插卡分為長卡與短卡,雖然長卡提供多達(dá)49平方英寸的設(shè)計(jì)空間[1],但其物理尺寸在復(fù)雜的系統(tǒng)中總會(huì)受到限制,當(dāng)信號處理模塊需要較大空間時(shí),制作一塊很大尺寸的PCI卡插入計(jì)算機(jī)理論上沒有問題,但對整體的結(jié)構(gòu)會(huì)造成問題,更多的想法是設(shè)計(jì)一塊PCI接口卡,使之成為計(jì)算機(jī)與信號處理板的橋梁,通過它完成計(jì)算機(jī)與信號處理板卡間的控制命令發(fā)布、數(shù)據(jù)發(fā)放和接收工作等。
二、接口卡硬件設(shè)計(jì)
PCI規(guī)范是比較復(fù)雜的,要深入了解并應(yīng)用需要較長時(shí)間,為了節(jié)省PCI產(chǎn)品的開發(fā)周期,推廣PCI技術(shù),已經(jīng)有很多公司開發(fā)了專門針對PCI總線的產(chǎn)品。
利用這些產(chǎn)品,針對不同的應(yīng)用要求,對PCI接口卡采用不同的設(shè)計(jì)方案:①使用PCI專用接口芯片與EPLD相結(jié)合的設(shè)計(jì)方案,接口芯片很多,如AMCC公司的S5920、S5933、PLX的9052、9054、9656等,專用接口芯片完成從PCI總線到本地用戶總線的轉(zhuǎn)接,EPLD靈活地轉(zhuǎn)換邏輯時(shí)序,以適應(yīng)不同的外設(shè);②使用PCI專用接口芯片與DSP芯片相結(jié)合的設(shè)計(jì)方案,這種方案能夠利用DSP芯片編程的靈活性以及DSP芯片本身所帶有的豐富資源,其外部存儲器接口(EMIF)幾乎可以與目前所有的存儲器(SBSRAM、SDRAM、SRAM、ROM、FLASH等)直接對接;③使用專用ASIC設(shè)計(jì)方案,如網(wǎng)卡、Modem的設(shè)計(jì);④僅使用可編程邏輯器件的設(shè)計(jì)方案,Xlinx的LogicCore、Alter的PCI MegaCore等就是一類專門針對PCI總線接口設(shè)計(jì)的軟件模塊,可以將它們模塊嵌入到用戶的可編程邏輯器件中完成設(shè)計(jì)。總的說來,不管是通用型PCI接口芯片還是面向某一領(lǐng)域的專用PCI芯片,它們都是把與PCI接口的信號做在一個(gè)芯片之中,當(dāng)使用這些芯片設(shè)計(jì)PCI產(chǎn)品時(shí),不必對PCI規(guī)范作全面深入理解,主要工作在于針對該芯片的功能與時(shí)序設(shè)計(jì)自己的電路。
下面介紹一種采用第一種方案設(shè)計(jì)的PCI接口卡的硬件結(jié)構(gòu),其框圖如圖1所示。
該接口卡應(yīng)用于某型雷達(dá)模擬器中,主要完成主控計(jì)算機(jī)對信號處理板加載雷達(dá)雜波和目標(biāo)數(shù)據(jù)、發(fā)布主機(jī)控制命令、監(jiān)控系統(tǒng)工作狀態(tài)、實(shí)時(shí)采集目標(biāo)軌跡信息等功能。我們選用AMCCS5920作為接口芯片,主要使用了S5920的Pass_Thru通道作為數(shù)據(jù)加載和接收途徑,信箱Mailbox輸出MD[7∶0]作為命令發(fā)布通道;EPM7128SQC100完成從S5920的Add_on用戶總線與信號處理板上的多片雙口存儲器的時(shí)序轉(zhuǎn)換,主要利用Pass_Thru通道指示輸出PTNUM[2∶0]完成對多塊雙口存儲器的選擇,根據(jù)時(shí)序鎖存并產(chǎn)生地址信息,完成地址/數(shù)據(jù)復(fù)用總線的分離等。信號處理板上由DSP芯片將雙口存儲器數(shù)據(jù)傳送到大容量SDRAM中。
該卡結(jié)構(gòu)簡單,通過可編程邏輯器件能夠靈活地針對不同外設(shè)進(jìn)行邏輯時(shí)序的調(diào)整,使該接口卡具有較強(qiáng)的通用性。電路板設(shè)計(jì)中最好選用多層布線,在枷叻矯孀⒁獯穎咴盜悠韉?SPAN lang=EN-US>PCI器件的引腳之間,其所有32位接口信號走線的最大長度為1.5英寸,用于64位擴(kuò)展的附加信號走線長度最大為2英寸,特別注意時(shí)鐘信號走線長度為2.5±0.1英寸,而且只能連接到一個(gè)負(fù)載上[1]。
三、驅(qū)動(dòng)程序設(shè)計(jì)
雖然有些專用芯片帶有相應(yīng)的軟件開發(fā)包,其中含有一些通用的驅(qū)動(dòng)程序和應(yīng)用程序接口,但在實(shí)際應(yīng)用中往往不能做面面俱到,而且用戶對自身的項(xiàng)目,通常會(huì)有些特殊的要求和不同工作模式,故而需要編寫自己板卡的驅(qū)動(dòng)程序。
1. WDM模型簡介
WDM模型[2,3](Windows Driver Model)是微軟公司為當(dāng)前主流操作系統(tǒng)Windows98和Windows 2000的驅(qū)動(dòng)程序設(shè)計(jì)的一種構(gòu)架,它和傳統(tǒng)的win3.x和win95使用的VXD的驅(qū)動(dòng)是完全不同的體系結(jié)構(gòu)。Window2000系統(tǒng)結(jié)構(gòu)圖如圖2所示,應(yīng)用程序調(diào)用Windows子系統(tǒng)win32 API,這個(gè)調(diào)用由系統(tǒng)服務(wù)接口作用到I/O管理器,I/O管理器進(jìn)行必要的參數(shù)匹配和操作安全性檢查,然后由這個(gè)請求構(gòu)造出合適的IRP(IO Request Package),它實(shí)際上是一個(gè)數(shù)據(jù)結(jié)構(gòu),具有豐富的成員,對于單層的驅(qū)動(dòng)程序直接接受并執(zhí)行這個(gè)請求包,并完成對硬件的操作,從而完成I/O請求工作,并將執(zhí)行的結(jié)果通過I/O管理器返回給應(yīng)用程序,而對于多層的驅(qū)動(dòng)則將驅(qū)動(dòng)程序分成了若干層,每層驅(qū)動(dòng)再把I/O請求劃分成更簡單的請求,以傳給更下層的驅(qū)動(dòng)執(zhí)行。
2. 開發(fā)工具
目前開發(fā)WDM驅(qū)動(dòng)程序通常有3種工具,如表1所示。
3種開發(fā)工具的使用:Windows DDK需要對整個(gè)體系結(jié)構(gòu)有很好的理解和把握;DriverStudio對一些基本的操作做了封裝,減少了很多瑣碎的工作;Windriver幾乎不需要什么代碼的編寫,它只需要用戶定制和調(diào)用它提供的通用驅(qū)動(dòng),但在效率上受到了限制;谝陨系奶攸c(diǎn),大多數(shù)驅(qū)動(dòng)開發(fā)人員用Windriver作驅(qū)動(dòng)程序的原型,用Driverstudio作最終發(fā)行的驅(qū)動(dòng)程序,如果驅(qū)動(dòng)程序很復(fù)雜的話,則使用DDK開發(fā)。
3. 設(shè)計(jì)方法
我們使用VC+DDK+Driverstudio來進(jìn)行驅(qū)動(dòng)的開發(fā)。Driverstudio為驅(qū)動(dòng)程序設(shè)計(jì)提供了DriverWizard向?qū)В梢院芊奖愕亟⒁粋(gè)完整的驅(qū)動(dòng)程序框架。設(shè)計(jì)PCI驅(qū)動(dòng)程序基本步驟為:
①選擇PCI總線類型,填寫相應(yīng)的VendorID、DeviceID、SubsystemID、RevisionID,這些必須和PCI板卡上的配置信息一致,用于產(chǎn)生INF文件,在安裝時(shí)識別板卡;
②填寫注冊表信息;
③添加資源,包括I/O、Memory、IRQ、DMA等;
④選擇設(shè)備接口方式、讀寫方式、電源管理方式等;
、萏砑IOCTL命令字,并選用相應(yīng)的輸入輸出模式;
⑥產(chǎn)生框架代碼,添加用戶代碼;
、呔幾g調(diào)試。
驅(qū)動(dòng)程序設(shè)計(jì)的工作主要在步驟⑥、⑦,編寫驅(qū)動(dòng)主要針對以下的幾個(gè)方面[3]。
(1) 端口和內(nèi)存映射區(qū)域讀寫
驅(qū)動(dòng)程序框架已經(jīng)在添加資源時(shí),創(chuàng)建了操作資源的KMemoryRange類和KIoRange類的對象,如:將PCI的Base1空間設(shè)定為一個(gè)內(nèi)存映射的空間,這個(gè)空間實(shí)際上就是雙口存儲器映射的空間,我們要訪問雙口存儲器就是訪問Base1空間,這時(shí)S5920的PTNUM [2∶0]會(huì)輸出001,可以使用它完成對映射到該空間雙口存儲器的片選使能,驅(qū)動(dòng)程序中需要?jiǎng)?chuàng)建對象KMemoryRange m_MemoryRangeFor





