PCI9052接口芯片的配置及驅(qū)動程序開發(fā)
如果把PC機作為控制系統(tǒng)的操作平臺,PCI總線作為一種先進的高性能32/64位局部總線正迅速取代原來的ISA總線的主導(dǎo)地位,以用于高速外設(shè),并成為微型計算機系統(tǒng)的主流系統(tǒng),因而也成為工程開發(fā)人員用于工業(yè)控制的首選。為了縮短開發(fā)周期,一般都采用專用的接口器件。本文就是采用PLX公司的PCI9052來把PCI總線上的操作轉(zhuǎn)換為對局部總線的操作,同時通過雙口RAM實現(xiàn)和下位機的存儲轉(zhuǎn)接。針對一般PCI總線開發(fā)時由于軟硬件分離使開發(fā)的軟硬件不能很好結(jié)合的現(xiàn)象,本文結(jié)合實例介紹了應(yīng)用程序并給出了如何通過DriverSTudio開發(fā)的PCI設(shè)備驅(qū)動程序來訪問PCI設(shè)備卡硬件資源的具體程序。
1 PCI的配置空間及其配置
PCI總線支持存儲器地址空間、I/O地址空間和配置空間等三個物理空間。其中,配置空間是PCI總線所特有的一個空間,PCI總線能實現(xiàn)即插即用的功能,正是通過它特有的配置空間來實現(xiàn)的。PCI配置空間的大小為256字節(jié),分為頭標區(qū)和設(shè)備有關(guān)區(qū)。直接影響設(shè)備特性的配置寄存器在頭標區(qū),其他部分則因設(shè)備而異。PCI總線的配置空間通常與PCI接口芯片相關(guān)。該配置空間包括一系列的PCI配置寄存器。本文采用的PCI9052芯片的配置寄存器分為PCI配置寄存器和局部配置寄存器,二者都可以由PCI總線和串行EEPROM訪問。
在PCI配置寄存器中的設(shè)備ID、制造商ID、版本號、首區(qū)類代碼、類別代碼、指令寄存器和狀態(tài)寄存器等寄存器在所有的PCI設(shè)備中都必須實現(xiàn),具體設(shè)置可參考文獻[1]。通常情況下,操作系統(tǒng)可使用這些寄存器的內(nèi)容來決定該PCI設(shè)備的加載其驅(qū)動程序。
PCI總線最重要的功能之一是通過基地址寄存器和局部配置寄存器在地址空間重定位PCI設(shè)備。系統(tǒng)上電時,通過上層應(yīng)用軟件能判斷系統(tǒng)中存在那些設(shè)備,并建立協(xié)調(diào)的地址映射。所以,基地址寄存器和局部配置寄存器是實現(xiàn)驅(qū)動程序的關(guān)鍵。
PCI配置寄存器提供有6個基地址寄存器(BASE0~BASE5)這些基地址都是系統(tǒng)中的物理地址,其中BASE0和BASE1是用來訪問局部配置寄存器的基地址,BASE0是映射到內(nèi)存的基地址,BASE1是映射到I/O的基地址,可用于通過內(nèi)存和I/O來訪問局部配置寄存器。這兩個基地址可固定用于PCI9052芯片的寄存器操作。
通過BASE2~BASE5四個空間最多可以訪問局部端所接的4個芯片,實現(xiàn)4個局部地址空間(局部空間0~3)的PCI總線訪問。PCI總線對局部端所接芯片的局部地址映射是通過4個寄存器組(PCI基地址寄存器,局部范圍寄存器,局部基地址寄存器,局部總線區(qū)域描述符)來實現(xiàn)的。這個組定義了每個空間以及相應(yīng)局部空間的特性。它們將局部端的芯片通過局部端地址(在局部配置寄存器中設(shè)置)翻譯成PCI總線地址,也就是將本地的芯片映射到系統(tǒng)的內(nèi)存或I/O口。而片選信號寄存器則是用來選定這些局部端所接的芯片的。這樣,用程序操作這一段內(nèi)存(或I/O)實際上就是對本地芯片的操作。其映射關(guān)系如圖1所示。這些寄存器的內(nèi)容必須在芯片復(fù)位時通過串行E2PROM進行加載,而正確配置E2PROM的內(nèi)容則是使用PCI9052的關(guān)鍵。
本設(shè)計選取LAS0(Local Address Space 0)來訪問局部端的雙口RAM芯片中的2 KB尋址空間,與其有關(guān)的寄存器有四個:LAS0范圍寄存器、LAS0局部基址寄存器、LAS0局部總線區(qū)域描述符和片選0基址寄存器。LAS0范圍寄存器規(guī)定了地址空間的大小。由于需要2 KB的內(nèi)存空間,而計算機預(yù)留了32 KB空間(即8000H),所以其寄存器值為0xFFFF8000H,而類型則是不可預(yù)取的;LAS0局部基地址寄存器定義了設(shè)備卡資源上所占用的基地址,它的最終目的是將這個基地址重新映射到PCI地址空間。由于基地址必須是32KB的整數(shù)倍,因此,為方便起見,可以將基地址定為00000000H,又由于位0為空間使能位,所以,寄存器的值為00000001H;LAS0局部總線區(qū)域描述符用來定義地址空間0的具體工作特性。
該總線采用16位總線寬度,工作方式定義為不使能突發(fā)和不預(yù)取,因此,該寄存器的數(shù)值初步確定為4043A1C0H,最終的值則需要不斷測試才能確定;片選0基址寄存器使用PCI9052的CS0#作為雙口RAM的片選信號,CS0#片選信號的起始地址和地址范圍由片選0基址寄存器設(shè)置,局部總線的容量是2 KB,第11位為1,基地址是該范圍的16倍,一般將倍數(shù)放置在范圍位之后,所以寄存器值設(shè)置為0xO008401。當從局部空間0基址開始的2 KB空間范圍落在CS0基地址寄存器所設(shè)置的范圍內(nèi),CS0端有效,這種方式可減少地址譯碼得到的片選邏輯。
用PLX9052可將PCI總線上的操作轉(zhuǎn)換為對局部總線的操作,即通過LAD0~LAD7、RD、WR、CS等對局部端芯片訪問。如果系統(tǒng)分配給本卡的存儲空間為FFFF0000H~FFFF7FFFFH。那么,當系統(tǒng)通過PCI總線訪問這個區(qū)域時,PLX9052就會應(yīng)答,并將其轉(zhuǎn)換為局部地址0x0000H~0x07FFH,另外,PLX9052自身也有一些內(nèi)部寄存器,它們被自動映射到另一片內(nèi)存區(qū)域,可通過PCI總線直接訪問。
PCI9052提供了兩種類型的中斷源(硬件中斷和軟件中斷)。中斷可通過PCI9052中斷控制/狀態(tài)寄存器來(INTCSR)允許和禁止。PCI9052通過2個局部中斷引腳來實現(xiàn)硬件中斷,它們支持邊緣和電平觸發(fā)中斷,可以通過對INTCSR寄存器的編程來實現(xiàn)局部中斷,然后產(chǎn)生PCI中斷(INTA),并生成PCI中斷INTA#方式。PCI9052可以軟件方式產(chǎn)生中斷,設(shè)計時只需要將INTCSR寄存器的軟件中斷位設(shè)置為1即可。
2 驅(qū)動程序的開發(fā)
在開發(fā)PCI板卡功能驅(qū)動程序之前,首先要明白所需的PCI硬件資源,并針對設(shè)備卡的硬件資源來處理PCI設(shè)備的內(nèi)存、端口的讀寫,以及中斷處理,從而實現(xiàn)PCI設(shè)備功能。
評論