基于PCI9054的DMA和突發(fā)數(shù)據(jù)傳輸實現(xiàn)
引言
隨著ISA總線逐步被淘汰,基于PCI總線的擴展板越來越被廣泛地應用于各種高速、大數(shù)據(jù)量的處理系統(tǒng)中。盡管有許多供應商提供了各種通用的PCI總線擴展板,但在較多應用場合,用戶還必須自行設計能滿足自己特殊需求的PCI擴展板,這就不可避免地會遇到PCI總線接口問題。對于絕大多數(shù)用戶而言,選擇專用PCI接口芯片進行PCI接口設計是必然的選擇。PCI9054是PLX公司推出的一種32位33MHz的PCI總線主控I/O加速器。它采用多種先進技術,使復雜的PCI接口應用設計變得相對簡單。該芯片是目前主流的PCI接口芯片之一。
1 PCI9054的工作模式及DMA處理機制
PCI是外圍設備互連(PeripheralComponentInterconnect)的簡稱,它是一種通用總線接口標準。PCI提供了一組完整的總線接口規(guī)范、電氣特性和行為規(guī)約,通過該規(guī)范,計算機系統(tǒng)中的外圍設備能夠?qū)崿F(xiàn)結構化、可控化的連接以及正確地進行交互。PCI設備上有三種地址空間:I/O空間、存儲空間和配置空間。其中配置空間的信息主要包括設備識別號、供應商代碼號、Local總線三個空間的大小以及三個空間的基址等。
在計算機啟動時,系統(tǒng)將根據(jù)配置信息分配系統(tǒng)資源。CPU可以訪問PCI設備上的所有地址空間,其中I/O空間和存儲空間提供給設備驅(qū)動程序使用,而配置空間則由操作系統(tǒng)內(nèi)核中的PCI初始化代碼使用。PCI總線接口因其傳輸速度快、即插即用、自動配置的優(yōu)點而成為實現(xiàn)數(shù)據(jù)采集設備到主機之間接口的首選。
PCI9054是PLX公司生產(chǎn)的PCI總線接口控制器芯片,符合PCIV2.2規(guī)范,32位,工作頻率為33MHz,擁有兩個獨立的DMA通道,傳輸速率達132MB/s。PCI9054提供有PCI總線、EEPROM、LOCAL總線三個接口,其中LOCAL總線有三種工作模式:M模式、C模式和J模式,可通過模式選擇控制引腳MODE[1:0]進行控制。當MODE[1:0]為“11”時,PCI9054工作在M模式;當MODE[1:0]為"00"時,PCI9054工作在C模式;當MODE[1:0]為“01”時,PCI9054工作在J模式;當MODE[1:0]為“10”時,保留工作狀態(tài)。M模式可與Motorola公司的MPC850或MPC860系列高性能微處理器進行無縫連接;C模式可與Inteli960系列高性能微處理器進行無縫連接;J模式地址和數(shù)據(jù)線可以復用,但應用很復雜,不過在一些特殊的應用場合,利用J模式可以和TI公司6000系列DSP的HPI口進行接口,其控制邏輯將比其它模式簡單得多。
在實際的數(shù)據(jù)采集時,LOCAL總線接口一般設置為C模式。PCI9054芯片在PCI總線和LO-CAL總線之間有三種直接的數(shù)據(jù)傳輸模式,其中,在PCIInitiator模式,LOCAL總線主設備可通過PCI9054訪問PCI總線存儲空間和I/O空間;在PCITarget模式,PCI總線主設備可通過PCI9054訪問LOCAL總線存儲空間和I/O空間;而在DMA方式,PCI9054作為兩總線的主設備,可實現(xiàn)PCI總線存儲空間與LOCAL總線存儲空間之間的數(shù)據(jù)傳輸。
在PCI9054中,DMA傳輸主要用于PCI總線與LOCAL總線間的數(shù)據(jù)傳輸,此時,PCI9054將接管兩總線的控制權,可進行兩個方向的數(shù)據(jù)傳輸。和DMA操作相關的寄存器包括:DMA模式寄存器(DMAMODE)、PCI基地址寄存器(DMAPADR)、LOCAL基地址寄存器(DMALADR),傳輸大小寄存器(DMASIZ)和描述符指針寄存器(DMADPR)o
通過這些寄存器的操作,就可以實現(xiàn)PCI到LOCAL或LOCAL到PCI的DMA數(shù)據(jù)傳輸。但是,這只是在硬件上的實現(xiàn),而要在Windows操作系統(tǒng)上進行操作,還必須具有相應的驅(qū)動程序支持。
2 DMA方式數(shù)據(jù)傳輸
雖然DriverWorks已設計好了程序框架,但其流程較為復雜。下面簡要介紹如何編寫DMA的WDM驅(qū)動程序。DriverWorks提供了三個類:kd--maAdapter、KDmaTransfer和KCommonDmaBuffer類,可用于實現(xiàn)DMA操作。其中,KDmaTransfer類用來管理和操縱DMA傳送,它能夠管理所有類型的DMA傳送操作;KDmaAdapter類用于建立一個DMA適配器,以說明DMA通道的特性,描述DMA傳送類型。例如,是總線主設備DMA還是系統(tǒng)DMA?如果是系統(tǒng)DMA,還有使用哪個DMA通道,DMA通道的寬度是8b還是16b等?而Kcom-monDmaBuffer類用于申請系統(tǒng)提供的公用緩沖區(qū)。利用上述幾個類來編寫DMA驅(qū)動程序的步驟如下:
(1) 創(chuàng)建一個KDmaAdapter類的實例,并且正確地描述要進行的DMA信息。
(2) 決定驅(qū)動程序使用的內(nèi)存類型是“Packet”還是“CommonBuffer”。DMA傳送可以使用Com-monBuffer暫時存放所要傳送的數(shù)據(jù)。CommonBuffer是由系統(tǒng)預先分配的一塊物理地址連續(xù)的內(nèi)存區(qū)域,處理器和設備都能對它進行訪問。Kcom-monDmaBuffer類可對CommonBuffer進行描述。另外一種方法是使用MDL(MemoryDescriptorList)描述的內(nèi)存區(qū)域來作為DMA傳送數(shù)據(jù)的源與目標,這種方法被稱為"PacketDMA”;
(3) 創(chuàng)建—KDmaTransfer類的實例,并使用成員函數(shù)Initiate給實例加入一個回調(diào)函數(shù)(callbackfunction)。
(4) 編寫上面所說的回調(diào)函數(shù)。當一次DMA傳送由于硬件設備的限制或由于緩沖區(qū)容量大小的限制而不得不分成多段傳送時,回調(diào)函數(shù)將會被多次調(diào)用。它首先通知設備開始進行傳送,然后立即返回,而并不是等待傳送結束再返回。
(5) 編寫代碼來處理分段傳送結束。驅(qū)動程序應能判定何時DMA傳送的一個分段傳送結束。驅(qū)動程序必須調(diào)用成員函數(shù)Continue來通知傳送對象當前分段已傳送完畢,如果整個DMA傳送還未完成,它會設置下一次傳送,并調(diào)用回調(diào)函數(shù)。DMA數(shù)據(jù)傳輸?shù)某绦蛄鞒虉D如圖1所示。
3 DMA和突發(fā)數(shù)據(jù)傳輸
在《PCI9054-DataBook》中,每種工作模式都將DMA和突發(fā)數(shù)據(jù)傳輸?shù)臅r序圖放在一起,這并不意味著DMA和突發(fā)數(shù)據(jù)傳輸是等同的,這是兩個不同的概念。事實上,既可利用一周期的總線操作,也可以利用DMA方式進行數(shù)據(jù)傳輸。
DMA和突發(fā)數(shù)據(jù)傳輸?shù)淖饔貌煌?。PCI9054中有兩個DMA通道,可以獨立工作,互不干擾。釆用DMA方式傳輸數(shù)據(jù)可以節(jié)省CPU資源;而采用突發(fā)方式傳輸數(shù)據(jù)可以提高數(shù)據(jù)的傳輸率,充分發(fā)揮PCI總線數(shù)據(jù)傳輸速率高的優(yōu)點。因此,在高速大容量數(shù)據(jù)傳輸和處理系統(tǒng)中,將DMA和突發(fā)數(shù)據(jù)傳輸方式結合在一起是比較理想的,這樣一方面可以充分發(fā)揮PCI總線的性能,另一方面,也可以用節(jié)省出的CPU資源對數(shù)據(jù)處理算法進行優(yōu)化。用狀態(tài)機實現(xiàn)該控制邏輯是比較理想的-PCI9054在C模式下,釆用單一周期和突發(fā)相結合的總線訪問狀態(tài)轉(zhuǎn)換程序流程圖如圖2所示。
用該狀態(tài)轉(zhuǎn)換圖設計出的邏輯電路,既可滿足單一周期總線訪問的需要,又可以滿足突發(fā)方式傳輸數(shù)據(jù)的需要,因而具有很大的實用價值。使用DMA和突發(fā)方式相結合進行數(shù)據(jù)傳輸時,其驅(qū)動程序應作如下設置:
(1) 調(diào)用驅(qū)動程序中相應的API函數(shù),找到PC機的物理地址;
(2) 在設備驅(qū)動程序中使能突發(fā)寄存器;
(3) 在設備驅(qū)動程序中使能總線位寬寄存器;
(4) 在設備驅(qū)動程序中使能相應的寄存器,指明DMA傳輸?shù)姆较蚴荘CI—LOCAL還是LOCAL
—PCI;
(5) 在設備驅(qū)動程序中指明本次DMA傳輸需要傳輸?shù)淖止?jié)數(shù)。
完成上述設置后,即可在突發(fā)方式下進行DMA傳輸,否則,DMA傳輸就會失敗。
4 結論
計算機接口技術的變化主要是由以前的以基本接口設計為中心轉(zhuǎn)變?yōu)橐訮CI總線相關技術為中心。在8/16位的系統(tǒng)環(huán)境下,硬件擴展卡的設計主要是面向ISA總線,所有的可用資源都是固定不變的;在編程方面是直來直去,并沒有什么保護措施。而在32位系統(tǒng)環(huán)境下,所有的資源都是動態(tài)分配的,而且在設計擴展卡時,并不是直接與系統(tǒng)打交道,而是要經(jīng)過多次的邏輯轉(zhuǎn)換。對于軟件的設計,也需要編寫32位程序,并且需要經(jīng)過不同層次的軟件設計。
DMA通信高度依賴操作系統(tǒng)、硬件特性和資源。在實現(xiàn)DMA通信的過程中,其項目要求、DMA本身的特點、操作系統(tǒng)提供的支持、具體硬件特性以及系統(tǒng)資源之間是相互作用的。DMA環(huán)境的建立過程,就是各部分相互協(xié)調(diào)、互為支持的過程。DMA編程必須充分了解控制芯片所提供的手段和限制,這些手段和限制是實現(xiàn)DMA的基礎。實現(xiàn)DMA通信,需要處理的主要問題有:DMA緩沖區(qū)的物理連續(xù)問題、PCI設備檢測和初始化問題、緩沖區(qū)的大小問題、PCI設備信息的收集問題等。