PCI总线是一种不依附于某个具体处理器的局部总线。从结构上看,PCI是在CPU和原来的系统总线之间插入的总线,具体由一个桥接电路实现对这一层的管理,并实现上下之间的接口以协调数据的传送。管理器提供了信号缓冲,使之能支持10种外设,并能在高时钟频率下保持高性能。PCI总线也支持总线主控技术,允许智能设备在需要时取得总线控制权,以加速数据传送。PCI是Peripheral Component Interconnect(外设部件互连标准)的缩写,它是目前个人电脑中使用为广泛的接口,几乎所有的主板产品上都带有这种插槽。PCI插槽也是主板带有多数量的插槽类型,在目前流行的台式机主板上,ATX结构的主板一般带有5~6个PCI插槽,而小一点的MATX主板也都带有2~3个PCI插槽,可见其应用的广泛性。
在计算机应用开发中,常常使用中断作为CPU和外设间交换数据的方式。但由于PCI总线具有即插即用特性,即PCI设备的存储器空间、I/O空间以及中断等资源都是在系统上电时通过自动配置机制动态分配的,使得CPU访问扩展卡的机制与非即插即用系统有较大的区别。中央处理器(英文Central Processing Unit,CPU)是一台计算机的运算和控制。CPU、内部存储器和输入/输出设备是电子计算机三大部件。电脑中所有操作都由CPU负责读取指令,对指令译码并执行指令的部件。其功能主要是解释计算机指令以及处理计算机软件中的数据。所谓的计算机的可编程性主要是指对CPU的编程。 CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。差不多所有的CPU的运作原理可分为四个阶段:提取(Fetch)、解码(Decode)、执行(Execute)和写回(Writeback)。
在中断方式下,计算机系统中通常有4个实际的中断可供PCI总线使用,多个PCI扩展卡可以共享或独享这4个PIRQ[A:D]#。基于9052接口芯片设计的PCI扩展卡的中断过程。其本地中断请求能被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中断结构
自i810芯片组以后推出的i8xx系列芯片组的设计中,Intel公司放弃了传统的“南北桥”概念,转而引入了IHA架构新概念。主要是把PCI控制部分从北桥中剥离出来,原北桥被称为MCH(Memory Controller Hub)的芯片代替。而ICH(I/O Controller Hub)除了完成传统的南桥芯片所负责的管理中断和DMA通道等功能外,还负责PCI控制。ICH链接了PC机的大部分接口。前端总线——Front Side Bus(FSB),是将CPU连接到北桥芯片的总线。选购主板和CPU时,要注意两者搭配问题,一般来说,前端总线是由CPU决定的,如果主板不支持CPU所需要的前端总线,系统就无法工作。也就是说,需要主板和CPU都支持某个前端总线,系统才能工作,只不过一个CPU默认的前端总线是的,因此看一个系统的前端总线主要看CPU就可以。前端总线是处理器与主板北桥芯片或内存控制集线器之间的数据通道,其频率高低直接影响CPU访问内存的速度。
1.1 系统中断控制器
系统中断控制器集成在ICH中,包括可屏蔽中断和非屏蔽中断逻辑。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个部分组成。
(2)标准中断控制器兼容早期PC机的中断系统,由2片82C59级联而成,能处理15个ISA中断请求。2个级联82C59的结构,其中主82C59为中断控制器1,从82C59为中断控制器。82C59的IR2与从82C59的INTR相连,其中断请求编号为IRQ0~IRQ7。
(3)当外部中断源IRQi有效(边沿触发方式下为上升沿,电平触发方式下为高电平)时,82C59中IRR寄存器的相应位置1。如果IMR寄存器对应位没有屏蔽,则经中断优先级裁决器PR判优;若该中断请求具有当前的中断级别,PIC就会发出有效的INTR信号。若该片为从片,则使主片的IR2有效,向主片发中断请求;若该片为主片,则向CPU发中断请求INTR信号。
1.2 PCI中断映射
PCI是一种由英特尔(Intel)公司1991年推出的用于定义局部总线的标准。此标准允许在计算机内安装多达10个遵从PCI标准的扩展卡。早提出的PCI总线工作在33MHz频率之下,传输带宽达到133MB/s(33MHz * 32bit/s),基本上满足了当时处理器的发展需要。随着对更高性能的要求,后来又提出把PCI 总线的频率提升到66MHz,传输带宽能达到266MB/s。1993年又提出了64bit的PCI总线,称为PCI-X,目前广泛采用的是32-bit、33MHz或者32-bit、66MHz的PCI 总线,64bit的PCI-X插槽更多是应用于服务器产品。从结构上看,PCI是在CPU和原来的系统总线之间插入的总线,具体由一个桥接电路实现对这一层的管理,并实现上下之间的接口以协调数据的传送。
(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中断控制器中。
一般情况下,主板制造厂商已缺省地设置了PIRQx路由控制寄存器。因此,在用户定制的PCI中断设备中可以不必考虑PIRQx#和IRQi的映射问题。
2 9052中断机制
2.1 PCI设备配置空间
每个PCI设备至少都有一个配置空间。配置空间是PCI设备的硬件与PCI设备的初始化软件及错误处理软件之间的信息交换区。有了这个信息交换区,PCI设备可以向软件反映其状态和要求,软件也可以对PCI设备进行辨识、配置和控制。配置空间一般应包括64字节的头标区和192字节的设备关联区,其中的每一项称为配置寄存器。
头标区中前16个字节的定义对所有PCI设备都是相同的,而其余的字节则根据设备功能类别的不同有着不同的布局。位于0Eh处的配置寄存器给出了头标类型:01h 用于主桥,00h 用于其他的PCI设备。
2.2 9052配置空间
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上。
9052还有一个本地配置空间,主要用于对9052进行配置和管理,并保存一些与主机交互所必需的信息。9052配置空间头标区中的基地址寄存器0已固定用于以存储器方式映射9052的本地配置空间,而基地址寄存器1已固定用于以I/O方式映射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中断源示意。
通过编程9052本地配置空间中INTCSR的相应位,可以允许或禁止某个外部中断源、设置中断的触发方式等。若应用系统使用LINTi 2产生中断并采用边沿触发方式,则应将INTCSR的位3、6、9置1,位7、11清0。
3 PnP系统中断处理驱动程序编程要点
在PnP系统中,标准总线驱动程序能够自动监测设备的添加和删除,并根据设备标识符装入合适的设备驱动程序。同时系统通过一定的策略为每个设备分配合适的各种资源,然后通过Start Device PnP消息告诉特定设备驱动程序,由设备驱动程序开始与设备进行通信。
下面将以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的数据传输率,这一高速接口集成了优先服务,允许并发通信和真正的同步传输。实际的实现远比说起来要复杂。在PCI板卡中,有一组寄存器,叫"配置空间"(Configuration Space),用来存放基地址与内存地址,以及中断等信息。
虽然如此,ICH6/ICH6R支持的中断原理并没有实质性改变。本文从计算机硬件和软件相结合的角度介绍的基于PCI总线的中断处理机制并未过时,仍可用于指导未来基于PCI-E总线的中断开发。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。