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

摘   要: 从硬件角度介绍了基于IHA的高性能PC机中断结构、PCI中断映射原理和PLX9052中断管理,并基于PLX9052扩展卡,给出了中断方式下结合系统中断原理的驱动程序设计要点。
关键词: PCI总线  IHA  PLX9052  中断  驱动程序 

  PCI总线是一种高性能地址数据复用的局部总线,可同时支持多组外围设备,并独立于处理器,是当今PC系统的主流总线。但由于PCI总线协议较为复杂,在PCI扩展卡的开发过程中,一般应采用专用的PCI接口芯片。常见的PCI接口芯片有AMCC公司的S59XX系列和PLX公司的PLX905X系列等。其中PLX9052(以下简称9052)是PCI总线从模式接口芯片,可方便地实现ISA扩展板直接向PCI扩展板的转换,因而在应用开发中使用广泛。
  在计算机应用开发中,常常使用中断作为CPU和外设间交换数据的方式。但由于PCI总线具有即插即用特性,即PCI设备的存储器空间、I/O空间以及中断等资源都是在系统上电时通过自动配置机制动态分配的,使得CPU访问扩展卡的机制与非即插即用系统有较大的区别,尤其是中断机制比较复杂。
  在中断方式下,计算机系统中通常有4个实际的中断可供PCI总线使用,多个PCI扩展卡可以共享或独享这4个PIRQ[A:D]#。基于9052接口芯片设计的PCI扩展卡的中断过程如图1所示。其本地中断请求能被CPU响应的过程可简化为以下4个步骤。


  (1)若9052本地中断源LINTi[2:1]有效,且9052内部中断使能,则9052的中断输出信号INTA#有效,从而提出PCI总线中断请求。
  (2)系统上电后,自动配置机制已给每个使用中断方式的PCI设备分配中断资源(即完成了对系统中断控制器的IRQi映射),并将该信息写入到9052的配置空间中。
  (3)若IRQi上的中断请求未被屏蔽且级别足够高,则该中断可以通过系统中断控制器向CPU提交请求。
  (4)若CPU当前开中断,则响应中断,进入中断服务例程。
  因此,用户若要实现PCI扩展卡的中断功能,除了应了解高档PC机的中断结构外,还要了解PCI接口芯片的配置空间及中断机制。本文首先介绍了基于IHA(Intel Hub Architecture)架构的高档PC机的中断结构、9052接口芯片的配置空间和中断机制,在此基础上给出了中断处理驱动程序编程要点。
1  基于IHA架构的PC中断结构[1][2][3]
  自i810芯片组以后推出的i8xx系列芯片组的设计中,Intel公司放弃了传统的“南北桥”概念,转而引入了IHA架构新概念。主要是把PCI控制部分从北桥中剥离出来,原北桥被称为MCH(Memory Controller Hub)的芯片代替。而ICH(I/O Controller Hub)除了完成传统的南桥芯片所负责的管理中断和DMA通道等功能外,还负责PCI控制。ICH链接了PC机的大部分接口,如图2所示。MCH主要提供前端总线(Front Side Bus,FSB),负责连接处理器,同时包括内存控制器和AGP接口。MCH与ICH之间采用IHA总线连接,遵循Hub-link协议,可提供高达266MBps的数据传输宽带。

1.1 系统中断控制器
  系统中断控制器集成在ICH中,包括可屏蔽中断和非屏蔽中断逻辑,如图3所示。ICH中断接口一般支持2种中断模式:PIC(Programmable Interrupt Controller)和APIC(Advanced Programmable Interrupt Controller)。

  在PIC中断模式下:
  (1)ICH内部配备有一个与ISA兼容的中断控制器。外设发出的中断请求经由中断控制器后在MCH中断传送机制的支持下最终提交给CPU处理。这是单处理器PC机中的标准中断控制器。而APIC模式则可以支持更多的中断,并且还能在多个处理器之间分发中断。APIC由Local APIC、I/O APIC和APIC总线3个部分组成。Local APIC集成在处理器中,I/O APIC模块则位于ICH中。在APIC模式下,来自与I/O APIC相连的外设中断请求必须经由APIC总线以中断消息的形式传递到某个处理器的Local APIC,最终提交给CPU处理。
  (2)标准中断控制器兼容早期PC机的中断系统,由2片82C59级联而成,能处理15个ISA中断请求。2个级联82C59的结构如图4所示,其中主82C59为中断控制器1,从82C59为中断控制器2。主82C59的IR2与从82C59的INTR相连,其中断请求编号为IRQ0~IRQ7。从82C59的中断请求编号为IRQ8~IRQ15。


  (3)当外部中断源IRQi有效(边沿触发方式下为上升沿,电平触发方式下为高电平)时,82C59中IRR寄存器的相应位置1。如果IMR寄存器对应位没有屏蔽,则经中断优先级裁决器PR判优;若该中断请求具有当前最高的中断级别,PIC就会发出有效的INTR信号。若该片为从片,则使主片的IR2有效,向主片发中断请求;若该片为主片,则向CPU发中断请求INTR信号。处理器接收到INTR信号后,在IF标志为1(开中断)时,响应中断,进入用户的中断服务例程。
1.2 PCI中断映射
  PCI中断映射包括2个层面,即PIRQ[A:D]#与PCI设备INTA#之间的映射以及PIRQ[A:D]#与系统中断控制器IRQi之间的映射。
  (1)PCI总线上的中断请求信号均为低电平有效而且是漏极开路,因此可以供多个PCI设备共享。单功能PCI设备只能使用1条中断线且为PIRQ[A]#,多功能PCI设备可以按规范要求使用其他中断线。
  (2)在PIC模式下,系统允许对ICH中的PIRQx路由控制寄存器(Route Control Register,偏移为60h~63h)编程以完成PCI中断映射。这样,不仅可将每个PCI中断请求信号(PIRQ[A:D]#)经由内部路径指定映射到11个ISA兼容中断(IRQ[3:7、9:12、14、15])中的任意一个上去,而且多个PIRQx#可映射到同一个IRQi上。对于未使用的PCI中断,也可编程路由控制寄存器以禁止IRQi中断映射。
  但要注意:PIRQx#均为低电平有效,所以相应的IRQi应被编程为电平触发方式。在PIC模式下,通过对ICH中2个I/O寄存器ELCR(端口地址为04D0~04D1h)编程,可独立设置每个IRQi(IRQ[3:7、9:12、14、15])的触发方式。
  然而,在电平触发方式下, IRQi输入应为高电平有效,所以PIRQx#信号必须经过ICH内部逻辑切换后,才能送到PIC中断控制器中。这样,原本兼容ISA的高有效中断请求则不能进入ICH向PIC中断控制器发出正确的中断请求。相反,低有效的非ISA中断请求则可以和PIRQx#共享中断。
  一般情况下,主板制造厂商已缺省地设置了PIRQx路由控制寄存器。因此,在用户定制的PCI中断设备中可以不必考虑PIRQx#和IRQi的映射问题。
2  9052中断机制
2.1 PCI设备配置空间[4]
  每个PCI设备至少都有一个配置空间。配置空间是PCI设备的硬件与PCI设备的初始化软件及错误处理软件之间的信息交换区。有了这个信息交换区,PCI设备可以向软件反映其状态和要求,软件也可以对PCI设备进行辨识、配置和控制。配置空间一般应包括64字节的头标区和192字节的设备关联区,其中的每一项称为配置寄存器。每个PCI设备的配置空间都包括头标区,其中的寄存器布局和格式也大致相同。因为特定功能所需设置的专用寄存器只能放在设备关联区,因此设备关联区是否存在以及寄存器的设置与布局则完全取决于具体PCI设备的需求。
  头标区中前16个字节的定义对所有PCI设备都是相同的,而其余的字节则根据设备功能类别的不同有着不同的布局。位于0Eh处的配置寄存器给出了头标类型(目前只规定了00h和01h 2种类型):01h 用于主桥,00h 用于其他的PCI设备。00h类型头标区的布局如图5所示。

2.2 9052配置空间[5]
  9052配置空间中只有1个00h型的头标区,没有设备关联区。头标区偏移3Dh处为中断引脚寄存器,其值表明该PCI设备使用了哪一个PCI中断引脚,其对应关系为:1- PIRQ[A]#、2-PIRQ[B]#、3-PIRQ[C]#、4-PIRQ[D]#。由于9052是单功能设备,所以它只支持PIRQ[A]#一个中断。也就是说,在设计PCI板卡时,须将9052的INTA#引脚接至PCI总线的PIRQ[A]#信号上。因此,该寄存器的值或为0(不使用中断),或为1(使用PIRQ[A]#)。只有当该寄存器的值设置为1时,ICH才会将PIRQ[A]#映射到PIC中断控制器的某个IRQi上。头标区偏移3Ch处为中断线寄存器,其值由系统上电时自动配置,并表明了9052对应中断PIRQ[A]#具体映射到了PIC中断控制器的哪一个IRQi上。通过查询该寄存器,即可了解系统分配给PCI扩展卡的中断类型号。
  9052还有一个本地配置空间,主要用于对9052进行配置和管理,并保存一些与主机交互所必需的信息。9052配置空间头标区中的基地址寄存器0已固定用于以存储器方式映射9052的本地配置空间,而基地址寄存器1已固定用于以I/O方式映射9052的本地配置空间。CPU可以通过9052配置空间头标区的基地址寄存器0或1中的基地址加上本地配置寄存器的偏移地址来读取或修改9052的相应本地配置寄存器。
2.3 9052中断机制
  9052本地配置空间中偏移地址为4Ch的寄存器为一个32位宽度的中断控制/状态寄存器INTCSR,用于控制9052的中断和提供相关的状态信息。中断控制/状态寄存器INTCSR的格式如表1所示。其中:

  (1)LINTi使能位:“1”允许LINTi中断,否则禁止。
  (2)LINTi有效电平位:当采用电平触发方式时,该位为“1”表示本地中断输入LINTi高电平有效,为“0”表示低电平有效。
  (3)LINTi状态位:“1”表示中断源LINTi有效,否则无效。
  (4)PCI中断使能位:“1”允许9052产生PCI中断,即当本地中断事件发生或设置了软件中断位时,9052通过INTA#向PCI总线发出中断请求;为“0”时禁止。
  (5)软件中断位:当PCI中断使能位为“1”时,对本位写“1”将产生PCI中断。
  (6)LINTi触发方式位:“1”表示上升沿触发(锁存),“0”表示电平触发。缺省为电平触发方式。
  (7)LINTi边沿触发中断清除位:当LINTi以边沿触发方式产生PCI中断时,可通过对本位写“1”予以清除。
  (8)ISA模式使能位:置“1”允许ISA模式,否则禁止,且只能通过串行E2PROM加载。
  由上可知,9052提供了2种类型的中断源:①硬中断源。本地中断输入引脚LINTi[2:1]有效且未被禁止(LINTi使能位为1)时产生。②软中断源。通过设置INTCSR中的软件中断位产生。只有在任意一个中断源有效且PCI中断使能(位6为1)的条件下,才能产生PCI中断(INTA#)。采用电平触发方式且高电平有效时的9052中断源示意图如图6所示。

  通过编程9052本地配置空间中INTCSR的相应位,可以允许或禁止某个外部中断源、设置中断的触发方式等。若应用系统使用LINTi 2产生中断并采用边沿触发方式,则应将INTCSR的位3、6、9置1,位7、11清0。
3  PnP系统中断处理驱动程序编程要点
  在PnP系统中,标准总线驱动程序能够自动监测设备的添加和删除,并根据设备标识符装入最合适的设备驱动程序。同时系统通过一定的策略为每个设备分配最合适的各种资源,然后通过Start Device PnP消息告诉特定设备驱动程序,最后由设备驱动程序开始与设备进行通信[6]。
  下面将以VC++6.0为开发环境,结合DriverWorks[7]驱动程序开发工具,给出在Window2000系统中的9052设备中断处理驱动程序(WDM驱动模式)的编程要点。
3.1 设备资源获取
  根据本文第2部分的描述,基于9052中断设备的设备驱动程序需要访问9052的配置空间以获取设备的中断号,同时还需设置9052 INTCSR寄存器。
  在DriverWorks工具生成的WDM驱动程序框架中,操作系统发出的Start Device PnP消息会触发IRP_MN_START_DEVICE事件,设备驱动程序通过执行OnStartDevice函数来处理该IRP包。
在OnStartDevice函数中,通过使用PCM_RESOURCE_LIST和KResourceAssignment二类对象可获取设备的硬件资源。如获取中断号的操作如下:
  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);
  进而可以通过如下语句将9052中断设置为边沿触发方式:
  temp=m_IoPort.ind(0x4c)|0x300;
  m_IoPortRange0.outd(0x4c,temp);
3.2 WDM中绑定中断服务例程
  当在DriverWorks向导中添加一个名为Irq的IRQ资源时,在相应设备类中就会声明一个KInterrupt对象m_Irq。在WDM中,对m_Irq初始化的同时可以实现对中断服务例程Isr_Irq的绑定。
  m_Irq.InitializeAndConnect(pResListTranslated,LinkTo(Isr_Irq),
     this
  );
3.3 中断服务例程
  由于PCI设备共享中断,因此在编写中断服务例程时,需要查询是否是本设备中断。具体例程(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]状态
  temp=m_IoPort.ind(Offset_9052)&mask_int_9052;
  if (temp==0)
  {
         //表明不是本设备产生的中断
      return FALSE;
  }
       //清除LINTi[2:1]边沿触发中断清除位
  temp=m_IoPort.ind(Offset_9052)|clear_int_9052;
  m_IoPortRange0.outd(Offset_9052,temp);
       //下面添加具体的中断处理程序
       //表明是本设备产生的中断
  return TRUE;
  }
  应注意:由于在Windows2000中,位于操作系统底层的中断处理程序运行在较高的级别上,它会屏蔽掉其他与它同级或级别较低的中断,所以要尽量减少中断处理程序运行的时间,因此不能处理过多任务。
不过,操作系统内核提供了一种延迟调用(DPC)机制来解决这个问题。即PCI设备产生中断,触发操作系统内核调用中断处理例程,在中断处理例程中调用中断延迟例程DPC,在中断延迟例程中执行具体的数据传输任务。
4  结束语
  在最新支持PCI Express总线的Alderwood(i925X)[8]和Grantsdale(i915)[9]系列芯片组中,Intel提出了一种新的接口——直接媒体接口(Direct Media Interface,DMI),用来取代Intel Hub-Link总线连接MCU和ICH。DMI实际上是基于PCI-Express总线,因此具有PCI-E总线的优势。DMI实现了上行与下行各1GBps的数据传输率,这一高速接口集成了高级优先服务,允许并发通信和真正的同步传输。而且DMI的基本功能对于软件是完全透明的,因此早期的软件也可以正常操作。然而新的芯片组搭载的ICH6/ICH6R芯片,其突破性的改进甚至比MCU芯片的进步还要激进,它正式宣告传统的PCI总线已经走到了历史尽头,其落后的带宽限制和共享一个中断的弊端让它在面对周边硬件发展时相形见绌。
  虽然如此,ICH6/ICH6R支持的中断原理并没有实质性改变。因此对于常规应用来讲,本文从计算机硬件和软件相结合的角度介绍的基于PCI总线的中断处理机制并未过时,仍可用于指导未来基于PCI-E总线的中断开发。
参考文献
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设备驱动程序开发指南.北京:机械工业出版社,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

此内容为AET网站原创,未经授权禁止转载。