基于PCI總線(xiàn)的數字衛星解調卡驅動(dòng)程序開(kāi)發(fā)
引言
PCI總線(xiàn)(即外圍部件互連總線(xiàn))是Intel公司提出的計算機接口總線(xiàn)。它的時(shí)鐘頻率為33MHz,有32位數據總線(xiàn),可支持突發(fā)傳輸模式,數據傳輸峰值速率高達132 MB/s。
此外,PCI總線(xiàn)還可擴展為64位數據總線(xiàn),擴展后的數據傳輸峰值速率高達264 MB/s,并支持即插即用功能而且獨立于處理器。由于PCI總線(xiàn)具有諸多優(yōu)點(diǎn),它已經(jīng)成為PC機的標準總線(xiàn)。因此,PCI接口設備的驅動(dòng)程序開(kāi)發(fā)就顯得尤為重要。
數字衛星解調卡主要用于接收衛星發(fā)來(lái)的調制信號的數字解調。設計中的橋接芯片可采用PLX公司的PCI9054。本文主要介紹數字衛星解調卡的WDM驅動(dòng)程序開(kāi)發(fā)方法。
1 PCI9054接口芯片
PCI9054是PLX公司推出的PCI接口芯片。它支持本地總線(xiàn)2.2版規范,工作頻率為0~33 MHz,可提供C、M、J三種本地工作模式,本地端到PCI總線(xiàn)的猝發(fā)傳輸速率高達132 MB/s。該芯片具有可編程的Serial EEPROM接口,可用于配置PCI9054的部分內部配置寄存器。其配置正確與否直接決定著(zhù)設備能否正常工作。其中的DeviceID和Vendor ID分別對應設備號和銷(xiāo)售商號,計算機主要靠這兩個(gè)號碼識別硬件。該器件內部有6種可編程的FIFO,可以進(jìn)行數據的發(fā)送與接收,而其兩種內部配置寄存器PCI Configuration Register和Local Configuration Register,可在本地端支持主模式、從模式租DMA傳輸方式。PCI9054的內部結構如圖1所示。
PCI9054支持兩個(gè)獨立的DMA通道,以用于完成本地端到PCI總線(xiàn)或者PCI總線(xiàn)到本地端的數據傳輸。每一個(gè)DMA通道包含一個(gè)DMA控制器和一個(gè)雙向FIFO,兩種通道都分別支持Block傳輸模式和Scatter/Gather傳輸模式。DMA通道0還支持Demand DMA數據傳輸模式。
Block DMA要求PCI主機或Local主機能提供PCI和Local的起始地址、傳輸字節數和傳輸方向。主機首先設定DMA開(kāi)始位并啟動(dòng)數據傳輸,一旦傳輸完成,PCI9054設定將DMACSR0[4]=1或者DMACSR1 [4]=1(分別對應通道0和通道1)來(lái)結束DMA。如果中斷Enable位DMAMODE0[10]或者DMAMODE1[10]使能,那么,在傳輸結束時(shí),PCI9054將向主機申請中斷。在DMA傳輸中,PCI9054既是PCI總線(xiàn)的主控設備,又是Local總線(xiàn)的主控設備。另外,通過(guò)編程DMA傳輸模式還可以完成以下設置或功能:
(1)將本地總線(xiàn)寬度設為8位、16位或32位;
(2)設置本地總線(xiàn)為允許/禁止內部等待狀態(tài),若允許,則可等待0~15個(gè)本地等待狀態(tài);
(3)設置本地總線(xiàn)為突發(fā)傳輸4個(gè)雙字長(cháng)度;
(4)使本地地址采用固定模式或線(xiàn)性增長(cháng)模式;
(5)完成PCI內存寫(xiě)和無(wú)效操作(commandcode=Fh)或者普通PCI內存寫(xiě)操作(commandcode=7h);
(6)使用/禁用BLAST#以暫停本地傳輸;
(7)在Scatter/Gather DMA傳輸模式中,當DMA傳輸完成或終止計數器計數到0時(shí),插入PCI中斷(INTA)或者本地中斷(LINT);
(8)工作于DMA清除計數模式。
2 WDM驅動(dòng)程序開(kāi)發(fā)工具
PCI總線(xiàn)的傳統開(kāi)發(fā)工具是微軟公司提供的DDK(Device Driver Kit),包括Windows98 DDK,Windows2000 DDK和Windows XP DDK。但是,使用其開(kāi)發(fā)驅動(dòng)程序比較復雜且開(kāi)發(fā)周期長(cháng),它只適合發(fā)行類(lèi)產(chǎn)品的驅動(dòng)開(kāi)發(fā)。
為了簡(jiǎn)化驅動(dòng)程序的開(kāi)發(fā),縮短開(kāi)發(fā)周期,常用的方法是使用Numage公司提供的開(kāi)發(fā)工具Driver Studio,這是一個(gè)開(kāi)發(fā)工具包(包含VtoolsD,Driver Works和SoftICE等開(kāi)發(fā)工具)。其中的Driver Works是Compuware公司開(kāi)發(fā)的工具,它提供了一系列類(lèi)。這些類(lèi)包含了許多更為底層的操作并且為一般驅動(dòng)操作提供了服務(wù)函數,從而為開(kāi)發(fā)人員提供了一個(gè)訪(fǎng)問(wèn)系統核心的標準界面。由于其驅動(dòng)程序開(kāi)發(fā)采用面向對象的框架結構,因而開(kāi)發(fā)過(guò)程比較簡(jiǎn)單易行。
3 DMA模式WDM驅動(dòng)程序開(kāi)發(fā)
本文介紹的數字衛星解調卡的硬件框圖如圖2所示。圖中,當FPGA中的數據放進(jìn)FIFO后,要經(jīng)過(guò)PCI9054橋接芯片傳輸到PC機內存中,但由于應用程序不能直接操作硬件,所以在應用程序和硬件之間必須安裝硬件驅動(dòng)程序來(lái)完成應用程序對硬件的訪(fǎng)問(wèn)??梢?jiàn),驅動(dòng)程序對于整個(gè)設計至關(guān)重要,它關(guān)系到數據能否準確無(wú)誤的送到指定的目的地。
驅動(dòng)程序完成的主要功能如下:
(1)接收應用傳送的符號率,配置符號率;
(2)接收應用程序傳送的控制字,配置AD9851用作外部FIFO數據傳輸的時(shí)鐘;
(3)設置數據傳輸為DMA方式,直到接收到應用程序發(fā)來(lái)的停止數據采集命令為止。驅動(dòng)要保證數據傳輸順利進(jìn)行。
本設計使用Driver Works來(lái)開(kāi)發(fā)WDM驅動(dòng)程序。
3.1 基于Driver Works的WDM驅動(dòng)程序框架
這里所要生成的是PCI設備的驅動(dòng)程序。采用DMA方式傳輸時(shí),生成WDM驅動(dòng)程序框架的主要步驟如下:
(1)從VC++中啟動(dòng)Driver Works,設置驅動(dòng)程序名稱(chēng)及存放的路徑,設計時(shí)可取驅動(dòng)名稱(chēng)為BPSKDRIVER;
(2)選擇工程類(lèi)型為WDM DRIVER;
(3)選擇驅動(dòng)類(lèi)型為WDM Function Driver;
(4)選擇硬件總線(xiàn)類(lèi)型為PCI,在這里要注意,PCI Vendor ID和PCI Device ID應根據硬件信息填寫(xiě);
(5)添加存儲器空間和I/O空間所需的類(lèi)對象,添加DMA資源,使用設備接口打開(kāi)設備;
(6)用控制代碼完成應用程序和驅動(dòng)的交互,即在應用程序中使用Device IO Control來(lái)完成應用程序向驅動(dòng)傳輸數據。
3.2 DMA傳輸控制
(1)DMA傳輸類(lèi)的概念及初始化
按照上述步驟生成WDM驅動(dòng)的框架后,其大部分例程函數(如Driver Entry、Add Device、Device Control、On Start Device)等已經(jīng)由軟件自動(dòng)生成并能基本滿(mǎn)足設計要求,下面重點(diǎn)介紹DMA傳輸控制函數。
設計中,對DMA寄存器的訪(fǎng)問(wèn)可采用I/O方式,并可利用Driver Works提供的KIoRange類(lèi)產(chǎn)生該類(lèi)的一個(gè)實(shí)例,然后在設備啟動(dòng)例程中初始化該實(shí)例,即可實(shí)現對硬件的兩個(gè)I/O地址空間的映射,其中一個(gè)I/O地址空間用于訪(fǎng)問(wèn)橋接芯片PCI9054的寄存器,另一個(gè)I/O地址空間用于訪(fǎng)問(wèn)本地端的設備,其初始化方法如下:
其中,pResListTranslated、pResListRaw分別是IRQ中系統分配的翻譯資源列表和原始資源列表。初始化完成后,就可以使用類(lèi)的成員函數in,out對端口進(jìn)行操作。例如:m_IoPortRange0.outd(0x30,0x40100),就可向IO端口0的偏移量為0x30的地址中寫(xiě)入0x40100。
進(jìn)行DMA傳輸需要用到三個(gè)DMA傳輸類(lèi),分別為KdmaAdapter、KCommonDmaBuffer和KdmaTransfer。
KdmaAdapter是DMA適配器對象,可用于表示需要進(jìn)行DMA傳輸的設備資源。此對象對于Master設備和Slave設備都是適用的。驅動(dòng)中,此類(lèi)函數可在On Start Device中由成員函數Initialize初始化。
評論