《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 设计应用 > 基于IHA架构的PCI中断应用
基于IHA架构的PCI中断应用
谢 磊,曾光裕,白 燕
解放军信息工程大学 信息工程学院计算机科学与技术系,河南 郑州450002
摘要: 从硬件角度介绍了基于IHA的高性能PC机中断结构、PCI中断映射原理和PLX9052中断管理,并基于PLX9052扩展卡,给出了中断方式下结合系统中断原理的驱动程序设计要点。
Abstract:
Key words :

摘   要: 從硬件角度介紹了基于IHA的高性能PC機(jī)中斷結(jié)構(gòu)、PCI中斷映射原理和PLX9052中斷管理,并基于PLX9052擴(kuò)展卡,給出了中斷方式下結(jié)合系統(tǒng)中斷原理的驅(qū)動(dòng)程序設(shè)計(jì)要點(diǎn)。
關(guān)鍵詞: PCI總線  IHA  PLX9052  中斷  驅(qū)動(dòng)程序 

  PCI總線是一種高性能地址數(shù)據(jù)復(fù)用的局部總線,可同時(shí)支持多組外圍設(shè)備,并獨(dú)立于處理器,是當(dāng)今PC系統(tǒng)的主流總線。但由于PCI總線協(xié)議較為復(fù)雜,在PCI擴(kuò)展卡的開發(fā)過程中,一般應(yīng)采用專用的PCI接口芯片。常見的PCI接口芯片有AMCC公司的S59XX系列和PLX公司的PLX905X系列等。其中PLX9052(以下簡稱9052)是PCI總線從模式接口芯片,可方便地實(shí)現(xiàn)ISA擴(kuò)展板直接向PCI擴(kuò)展板的轉(zhuǎn)換,因而在應(yīng)用開發(fā)中使用廣泛。
  在計(jì)算機(jī)應(yīng)用開發(fā)中,常常使用中斷作為CPU和外設(shè)間交換數(shù)據(jù)的方式。但由于PCI總線具有即插即用特性,即PCI設(shè)備的存儲(chǔ)器空間、I/O空間以及中斷等資源都是在系統(tǒng)上電時(shí)通過自動(dòng)配置機(jī)制動(dòng)態(tài)分配的,使得CPU訪問擴(kuò)展卡的機(jī)制與非即插即用系統(tǒng)有較大的區(qū)別,尤其是中斷機(jī)制比較復(fù)雜。
  在中斷方式下,計(jì)算機(jī)系統(tǒng)中通常有4個(gè)實(shí)際的中斷可供PCI總線使用,多個(gè)PCI擴(kuò)展卡可以共享或獨(dú)享這4個(gè)PIRQ[A:D]#?;?052接口芯片設(shè)計(jì)的PCI擴(kuò)展卡的中斷過程如圖1所示。其本地中斷請(qǐng)求能被CPU響應(yīng)的過程可簡化為以下4個(gè)步驟。


  (1)若9052本地中斷源LINTi[2:1]有效,且9052內(nèi)部中斷使能,則9052的中斷輸出信號(hào)INTA#有效,從而提出PCI總線中斷請(qǐng)求。
  (2)系統(tǒng)上電后,自動(dòng)配置機(jī)制已給每個(gè)使用中斷方式的PCI設(shè)備分配中斷資源(即完成了對(duì)系統(tǒng)中斷控制器的IRQi映射),并將該信息寫入到9052的配置空間中。
  (3)若IRQi上的中斷請(qǐng)求未被屏蔽且級(jí)別足夠高,則該中斷可以通過系統(tǒng)中斷控制器向CPU提交請(qǐng)求。
  (4)若CPU當(dāng)前開中斷,則響應(yīng)中斷,進(jìn)入中斷服務(wù)例程。
  因此,用戶若要實(shí)現(xiàn)PCI擴(kuò)展卡的中斷功能,除了應(yīng)了解高檔PC機(jī)的中斷結(jié)構(gòu)外,還要了解PCI接口芯片的配置空間及中斷機(jī)制。本文首先介紹了基于IHA(Intel Hub Architecture)架構(gòu)的高檔PC機(jī)的中斷結(jié)構(gòu)、9052接口芯片的配置空間和中斷機(jī)制,在此基礎(chǔ)上給出了中斷處理驅(qū)動(dòng)程序編程要點(diǎn)。
1  基于IHA架構(gòu)的PC中斷結(jié)構(gòu)[1][2][3]
  自i810芯片組以后推出的i8xx系列芯片組的設(shè)計(jì)中,Intel公司放棄了傳統(tǒng)的“南北橋”概念,轉(zhuǎn)而引入了IHA架構(gòu)新概念。主要是把PCI控制部分從北橋中剝離出來,原北橋被稱為MCH(Memory Controller Hub)的芯片代替。而ICH(I/O Controller Hub)除了完成傳統(tǒng)的南橋芯片所負(fù)責(zé)的管理中斷和DMA通道等功能外,還負(fù)責(zé)PCI控制。ICH鏈接了PC機(jī)的大部分接口,如圖2所示。MCH主要提供前端總線(Front Side Bus,F(xiàn)SB),負(fù)責(zé)連接處理器,同時(shí)包括內(nèi)存控制器和AGP接口。MCH與ICH之間采用IHA總線連接,遵循Hub-link協(xié)議,可提供高達(dá)266MBps的數(shù)據(jù)傳輸寬帶。

1.1 系統(tǒng)中斷控制器
  系統(tǒng)中斷控制器集成在ICH中,包括可屏蔽中斷和非屏蔽中斷邏輯,如圖3所示。ICH中斷接口一般支持2種中斷模式:PIC(Programmable Interrupt Controller)和APIC(Advanced Programmable Interrupt Controller)。

  在PIC中斷模式下:
  (1)ICH內(nèi)部配備有一個(gè)與ISA兼容的中斷控制器。外設(shè)發(fā)出的中斷請(qǐng)求經(jīng)由中斷控制器后在MCH中斷傳送機(jī)制的支持下最終提交給CPU處理。這是單處理器PC機(jī)中的標(biāo)準(zhǔn)中斷控制器。而APIC模式則可以支持更多的中斷,并且還能在多個(gè)處理器之間分發(fā)中斷。APIC由Local APIC、I/O APIC和APIC總線3個(gè)部分組成。Local APIC集成在處理器中,I/O APIC模塊則位于ICH中。在APIC模式下,來自與I/O APIC相連的外設(shè)中斷請(qǐng)求必須經(jīng)由APIC總線以中斷消息的形式傳遞到某個(gè)處理器的Local APIC,最終提交給CPU處理。
  (2)標(biāo)準(zhǔn)中斷控制器兼容早期PC機(jī)的中斷系統(tǒng),由2片82C59級(jí)聯(lián)而成,能處理15個(gè)ISA中斷請(qǐng)求。2個(gè)級(jí)聯(lián)82C59的結(jié)構(gòu)如圖4所示,其中主82C59為中斷控制器1,從82C59為中斷控制器2。主82C59的IR2與從82C59的INTR相連,其中斷請(qǐng)求編號(hào)為IRQ0~I(xiàn)RQ7。從82C59的中斷請(qǐng)求編號(hào)為IRQ8~I(xiàn)RQ15。


  (3)當(dāng)外部中斷源IRQi有效(邊沿觸發(fā)方式下為上升沿,電平觸發(fā)方式下為高電平)時(shí),82C59中IRR寄存器的相應(yīng)位置1。如果IMR寄存器對(duì)應(yīng)位沒有屏蔽,則經(jīng)中斷優(yōu)先級(jí)裁決器PR判優(yōu);若該中斷請(qǐng)求具有當(dāng)前最高的中斷級(jí)別,PIC就會(huì)發(fā)出有效的INTR信號(hào)。若該片為從片,則使主片的IR2有效,向主片發(fā)中斷請(qǐng)求;若該片為主片,則向CPU發(fā)中斷請(qǐng)求INTR信號(hào)。處理器接收到INTR信號(hào)后,在IF標(biāo)志為1(開中斷)時(shí),響應(yīng)中斷,進(jìn)入用戶的中斷服務(wù)例程。
1.2 PCI中斷映射
  PCI中斷映射包括2個(gè)層面,即PIRQ[A:D]#與PCI設(shè)備INTA#之間的映射以及PIRQ[A:D]#與系統(tǒng)中斷控制器IRQi之間的映射。
  (1)PCI總線上的中斷請(qǐng)求信號(hào)均為低電平有效而且是漏極開路,因此可以供多個(gè)PCI設(shè)備共享。單功能PCI設(shè)備只能使用1條中斷線且為PIRQ[A]#,多功能PCI設(shè)備可以按規(guī)范要求使用其他中斷線。
  (2)在PIC模式下,系統(tǒng)允許對(duì)ICH中的PIRQx路由控制寄存器(Route Control Register,偏移為60h~63h)編程以完成PCI中斷映射。這樣,不僅可將每個(gè)PCI中斷請(qǐng)求信號(hào)(PIRQ[A:D]#)經(jīng)由內(nèi)部路徑指定映射到11個(gè)ISA兼容中斷(IRQ[3:7、9:12、14、15])中的任意一個(gè)上去,而且多個(gè)PIRQx#可映射到同一個(gè)IRQi上。對(duì)于未使用的PCI中斷,也可編程路由控制寄存器以禁止IRQi中斷映射。
  但要注意:PIRQx#均為低電平有效,所以相應(yīng)的IRQi應(yīng)被編程為電平觸發(fā)方式。在PIC模式下,通過對(duì)ICH中2個(gè)I/O寄存器ELCR(端口地址為04D0~04D1h)編程,可獨(dú)立設(shè)置每個(gè)IRQi(IRQ[3:7、9:12、14、15])的觸發(fā)方式。
  然而,在電平觸發(fā)方式下, IRQi輸入應(yīng)為高電平有效,所以PIRQx#信號(hào)必須經(jīng)過ICH內(nèi)部邏輯切換后,才能送到PIC中斷控制器中。這樣,原本兼容ISA的高有效中斷請(qǐng)求則不能進(jìn)入ICH向PIC中斷控制器發(fā)出正確的中斷請(qǐng)求。相反,低有效的非ISA中斷請(qǐng)求則可以和PIRQx#共享中斷。
  一般情況下,主板制造廠商已缺省地設(shè)置了PIRQx路由控制寄存器。因此,在用戶定制的PCI中斷設(shè)備中可以不必考慮PIRQx#和IRQi的映射問題。
2  9052中斷機(jī)制
2.1 PCI設(shè)備配置空間[4]
  每個(gè)PCI設(shè)備至少都有一個(gè)配置空間。配置空間是PCI設(shè)備的硬件與PCI設(shè)備的初始化軟件及錯(cuò)誤處理軟件之間的信息交換區(qū)。有了這個(gè)信息交換區(qū),PCI設(shè)備可以向軟件反映其狀態(tài)和要求,軟件也可以對(duì)PCI設(shè)備進(jìn)行辨識(shí)、配置和控制。配置空間一般應(yīng)包括64字節(jié)的頭標(biāo)區(qū)和192字節(jié)的設(shè)備關(guān)聯(lián)區(qū),其中的每一項(xiàng)稱為配置寄存器。每個(gè)PCI設(shè)備的配置空間都包括頭標(biāo)區(qū),其中的寄存器布局和格式也大致相同。因?yàn)樘囟üδ芩柙O(shè)置的專用寄存器只能放在設(shè)備關(guān)聯(lián)區(qū),因此設(shè)備關(guān)聯(lián)區(qū)是否存在以及寄存器的設(shè)置與布局則完全取決于具體PCI設(shè)備的需求。
  頭標(biāo)區(qū)中前16個(gè)字節(jié)的定義對(duì)所有PCI設(shè)備都是相同的,而其余的字節(jié)則根據(jù)設(shè)備功能類別的不同有著不同的布局。位于0Eh處的配置寄存器給出了頭標(biāo)類型(目前只規(guī)定了00h和01h 2種類型):01h 用于主橋,00h 用于其他的PCI設(shè)備。00h類型頭標(biāo)區(qū)的布局如圖5所示。

2.2 9052配置空間[5]
  9052配置空間中只有1個(gè)00h型的頭標(biāo)區(qū),沒有設(shè)備關(guān)聯(lián)區(qū)。頭標(biāo)區(qū)偏移3Dh處為中斷引腳寄存器,其值表明該P(yáng)CI設(shè)備使用了哪一個(gè)PCI中斷引腳,其對(duì)應(yīng)關(guān)系為:1- PIRQ[A]#、2-PIRQ[B]#、3-PIRQ[C]#、4-PIRQ[D]#。由于9052是單功能設(shè)備,所以它只支持PIRQ[A]#一個(gè)中斷。也就是說,在設(shè)計(jì)PCI板卡時(shí),須將9052的INTA#引腳接至PCI總線的PIRQ[A]#信號(hào)上。因此,該寄存器的值或?yàn)?(不使用中斷),或?yàn)?(使用PIRQ[A]#)。只有當(dāng)該寄存器的值設(shè)置為1時(shí),ICH才會(huì)將PIRQ[A]#映射到PIC中斷控制器的某個(gè)IRQi上。頭標(biāo)區(qū)偏移3Ch處為中斷線寄存器,其值由系統(tǒng)上電時(shí)自動(dòng)配置,并表明了9052對(duì)應(yīng)中斷PIRQ[A]#具體映射到了PIC中斷控制器的哪一個(gè)IRQi上。通過查詢?cè)摷拇嫫?,即可了解系統(tǒng)分配給PCI擴(kuò)展卡的中斷類型號(hào)。
  9052還有一個(gè)本地配置空間,主要用于對(duì)9052進(jìn)行配置和管理,并保存一些與主機(jī)交互所必需的信息。9052配置空間頭標(biāo)區(qū)中的基地址寄存器0已固定用于以存儲(chǔ)器方式映射9052的本地配置空間,而基地址寄存器1已固定用于以I/O方式映射9052的本地配置空間。CPU可以通過9052配置空間頭標(biāo)區(qū)的基地址寄存器0或1中的基地址加上本地配置寄存器的偏移地址來讀取或修改9052的相應(yīng)本地配置寄存器。
2.3 9052中斷機(jī)制
  9052本地配置空間中偏移地址為4Ch的寄存器為一個(gè)32位寬度的中斷控制/狀態(tài)寄存器INTCSR,用于控制9052的中斷和提供相關(guān)的狀態(tài)信息。中斷控制/狀態(tài)寄存器INTCSR的格式如表1所示。其中:

  (1)LINTi使能位:“1”允許LINTi中斷,否則禁止。
  (2)LINTi有效電平位:當(dāng)采用電平觸發(fā)方式時(shí),該位為“1”表示本地中斷輸入LINTi高電平有效,為“0”表示低電平有效。
  (3)LINTi狀態(tài)位:“1”表示中斷源LINTi有效,否則無效。
  (4)PCI中斷使能位:“1”允許9052產(chǎn)生PCI中斷,即當(dāng)本地中斷事件發(fā)生或設(shè)置了軟件中斷位時(shí),9052通過INTA#向PCI總線發(fā)出中斷請(qǐng)求;為“0”時(shí)禁止。
  (5)軟件中斷位:當(dāng)PCI中斷使能位為“1”時(shí),對(duì)本位寫“1”將產(chǎn)生PCI中斷。
  (6)LINTi觸發(fā)方式位:“1”表示上升沿觸發(fā)(鎖存),“0”表示電平觸發(fā)。缺省為電平觸發(fā)方式。
  (7)LINTi邊沿觸發(fā)中斷清除位:當(dāng)LINTi以邊沿觸發(fā)方式產(chǎn)生PCI中斷時(shí),可通過對(duì)本位寫“1”予以清除。
  (8)ISA模式使能位:置“1”允許ISA模式,否則禁止,且只能通過串行E2PROM加載。
  由上可知,9052提供了2種類型的中斷源:①硬中斷源。本地中斷輸入引腳LINTi[2:1]有效且未被禁止(LINTi使能位為1)時(shí)產(chǎn)生。②軟中斷源。通過設(shè)置INTCSR中的軟件中斷位產(chǎn)生。只有在任意一個(gè)中斷源有效且PCI中斷使能(位6為1)的條件下,才能產(chǎn)生PCI中斷(INTA#)。采用電平觸發(fā)方式且高電平有效時(shí)的9052中斷源示意圖如圖6所示。

  通過編程9052本地配置空間中INTCSR的相應(yīng)位,可以允許或禁止某個(gè)外部中斷源、設(shè)置中斷的觸發(fā)方式等。若應(yīng)用系統(tǒng)使用LINTi 2產(chǎn)生中斷并采用邊沿觸發(fā)方式,則應(yīng)將INTCSR的位3、6、9置1,位7、11清0。
3  PnP系統(tǒng)中斷處理驅(qū)動(dòng)程序編程要點(diǎn)
  在PnP系統(tǒng)中,標(biāo)準(zhǔn)總線驅(qū)動(dòng)程序能夠自動(dòng)監(jiān)測設(shè)備的添加和刪除,并根據(jù)設(shè)備標(biāo)識(shí)符裝入最合適的設(shè)備驅(qū)動(dòng)程序。同時(shí)系統(tǒng)通過一定的策略為每個(gè)設(shè)備分配最合適的各種資源,然后通過Start Device PnP消息告訴特定設(shè)備驅(qū)動(dòng)程序,最后由設(shè)備驅(qū)動(dòng)程序開始與設(shè)備進(jìn)行通信[6]。
  下面將以VC++6.0為開發(fā)環(huán)境,結(jié)合DriverWorks[7]驅(qū)動(dòng)程序開發(fā)工具,給出在Window2000系統(tǒng)中的9052設(shè)備中斷處理驅(qū)動(dòng)程序(WDM驅(qū)動(dòng)模式)的編程要點(diǎn)。
3.1 設(shè)備資源獲取
  根據(jù)本文第2部分的描述,基于9052中斷設(shè)備的設(shè)備驅(qū)動(dòng)程序需要訪問9052的配置空間以獲取設(shè)備的中斷號(hào),同時(shí)還需設(shè)置9052 INTCSR寄存器。
  在DriverWorks工具生成的WDM驅(qū)動(dòng)程序框架中,操作系統(tǒng)發(fā)出的Start Device PnP消息會(huì)觸發(fā)IRP_MN_START_DEVICE事件,設(shè)備驅(qū)動(dòng)程序通過執(zhí)行OnStartDevice函數(shù)來處理該IRP包。
在OnStartDevice函數(shù)中,通過使用PCM_RESOURCE_LIST和KResourceAssignment二類對(duì)象可獲取設(shè)備的硬件資源。如獲取中斷號(hào)的操作如下:
  PCM_RESOURCE_LIST pResListRaw= I.AllocatedResources( );
  KResourceAssignment AssignedIRQ (pResListRaw,CmResourceTypeInterrupt,0);
  IRQ=AssignedIRQ.Vector( );
  類似地,還可以獲取9052本地配置空間的基地址指針m_IoPort:
  PCM_RESOURCE_LIST pResListTranslated=I.TranslatedResources( );
  m_IoPort.Initialize(pResListTranslated,pResListRaw,0);
  進(jìn)而可以通過如下語句將9052中斷設(shè)置為邊沿觸發(fā)方式:
  temp=m_IoPort.ind(0x4c)|0x300;
  m_IoPortRange0.outd(0x4c,temp);
3.2 WDM中綁定中斷服務(wù)例程
  當(dāng)在DriverWorks向?qū)е刑砑右粋€(gè)名為Irq的IRQ資源時(shí),在相應(yīng)設(shè)備類中就會(huì)聲明一個(gè)KInterrupt對(duì)象m_Irq。在WDM中,對(duì)m_Irq初始化的同時(shí)可以實(shí)現(xiàn)對(duì)中斷服務(wù)例程Isr_Irq的綁定。
  m_Irq.InitializeAndConnect(pResListTranslated,LinkTo(Isr_Irq),
     this
  );
3.3 中斷服務(wù)例程
  由于PCI設(shè)備共享中斷,因此在編寫中斷服務(wù)例程時(shí),需要查詢是否是本設(shè)備中斷。具體例程(Isr_Irq)如下:
  BOOLEAN InterDevice∷Isr_Irq(void)
  {
  #define mask_int_9052 0x00000024
  #define clear_int_9052 0x00000c00
  ULONG temp,Offset_9052=0x4c;
        //查詢LINTi[2:1]狀態(tài)
  temp=m_IoPort.ind(Offset_9052)&mask_int_9052;
  if (temp==0)
  {
         //表明不是本設(shè)備產(chǎn)生的中斷
      return FALSE;
  }
       //清除LINTi[2:1]邊沿觸發(fā)中斷清除位
  temp=m_IoPort.ind(Offset_9052)|clear_int_9052;
  m_IoPortRange0.outd(Offset_9052,temp);
       //下面添加具體的中斷處理程序
       //表明是本設(shè)備產(chǎn)生的中斷
  return TRUE;
  }
  應(yīng)注意:由于在Windows2000中,位于操作系統(tǒng)底層的中斷處理程序運(yùn)行在較高的級(jí)別上,它會(huì)屏蔽掉其他與它同級(jí)或級(jí)別較低的中斷,所以要盡量減少中斷處理程序運(yùn)行的時(shí)間,因此不能處理過多任務(wù)。
不過,操作系統(tǒng)內(nèi)核提供了一種延遲調(diào)用(DPC)機(jī)制來解決這個(gè)問題。即PCI設(shè)備產(chǎn)生中斷,觸發(fā)操作系統(tǒng)內(nèi)核調(diào)用中斷處理例程,在中斷處理例程中調(diào)用中斷延遲例程DPC,在中斷延遲例程中執(zhí)行具體的數(shù)據(jù)傳輸任務(wù)。
4  結(jié)束語
  在最新支持PCI Express總線的Alderwood(i925X)[8]和Grantsdale(i915)[9]系列芯片組中,Intel提出了一種新的接口——直接媒體接口(Direct Media Interface,DMI),用來取代Intel Hub-Link總線連接MCU和ICH。DMI實(shí)際上是基于PCI-Express總線,因此具有PCI-E總線的優(yōu)勢(shì)。DMI實(shí)現(xiàn)了上行與下行各1GBps的數(shù)據(jù)傳輸率,這一高速接口集成了高級(jí)優(yōu)先服務(wù),允許并發(fā)通信和真正的同步傳輸。而且DMI的基本功能對(duì)于軟件是完全透明的,因此早期的軟件也可以正常操作。然而新的芯片組搭載的ICH6/ICH6R芯片,其突破性的改進(jìn)甚至比MCU芯片的進(jìn)步還要激進(jìn),它正式宣告?zhèn)鹘y(tǒng)的PCI總線已經(jīng)走到了歷史盡頭,其落后的帶寬限制和共享一個(gè)中斷的弊端讓它在面對(duì)周邊硬件發(fā)展時(shí)相形見絀。
  雖然如此,ICH6/ICH6R支持的中斷原理并沒有實(shí)質(zhì)性改變。因此對(duì)于常規(guī)應(yīng)用來講,本文從計(jì)算機(jī)硬件和軟件相結(jié)合的角度介紹的基于PCI總線的中斷處理機(jī)制并未過時(shí),仍可用于指導(dǎo)未來基于PCI-E總線的中斷開發(fā)。
參考文獻(xiàn)
1   Intel公司.Intel82801AA(ICH) and Intel?誖82801AB (ICH0) I/O Controller Hub Datasheet.1999
2   Intel公司.Intel82801DB I/O Controller Hub 4 (ICH4).2002
3   Intel公司.IntelI/O Controller Hub 6(ICH6) Family Datasheet.2004
4   PLI Special Interest Group.PCI Local Bus Specification Revision 2.1.1998
5   PLX公司.PCI 9052 Data Book.2001
6   Cant C著,孫義等譯.Windows WDM設(shè)備驅(qū)動(dòng)程序開發(fā)指南.北京:機(jī)械工業(yè)出版社,2000
7   DriverWorks Source Code Examples.http://frontline.compuware.com/nashua/patches/source_driver_works.htm.2004
8   Intel公司.Intel925X Express Chipset Datasheet.2004
9   Intel公司.Intel915G/915GV/915P Express Chipset Datasheet.2004

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。

相關(guān)內(nèi)容