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