基于PCI总线的中断机制研究
摘 要:PCI总线具有即插即用(PnP,plug and play)的特性,这使得CPU访问扩展卡的机制与非即插即用系统有较大的不同,尤其是中断机制比较复杂。本文详细介绍了高性能PC机的中断结构和PLX9052的中断机制,并以9052为接口芯片设计的PCI扩展卡为例,讨论了用中断方式和CPU交换数据的程序设计要点,旨在从底层全面了解基于PCI总线的中断处理机制,为设计与实现PCI扩展卡的中断功能提供理论依据和编程指导。
关键词:PCI总线;PLX9052;即插即用(PnP);中断
1 概述
高性能PC机一般以PCI总线为系统总线。由于PCI总线协议较为复杂,因此在开发PCI扩展卡时常采用专用的PCI接口芯片。常见的PCI接口芯片有AMCC公司的S59XX系列和PLX公司的PLX905X系列,其中PLX9052(文中称为9052)使用广泛。
在应用开发中,常常使用中断作为CPU和外设间交换数据的方式。但由于PCI总线具有即插即用特性,即PCI设备的存储器空间、I/O空间以及中断等资源都是自动配置的,使得CPU访问扩展卡的机制与非即插即用系统有较大的不同,尤其是中断机制比较复杂。
基于9052接口芯片设计的PCI扩展卡若以硬件中断方式和CPU进行数据交换,则其过程可概括为以下四个步骤,参见图1。
① 若连接到9052本地中断输入引脚LINTi[2:1]的外部中断源有效,且9052内部中断使能,则9052的中断输出信号INTA#有效,从而产生PCI中断请求。
② 上电时,初始化软件根据资源使用情况已自动将PCI中断引接到系统中断控制器的某一个中断引脚(IRQi)上,并将该信息写入了9052的配置空间中。用户可通过其配置空间来获取该配置信息。
③ 若IRQi上的中断请求未被屏蔽且级别足够高,则该中断可以通过系统中断控制器向CPU提交请求。
④ 若CPU当前开中断,则响应中断,进入中断服务例程进行数据交换。
因此,用户若要实现PCI扩展卡的中断功能,则不仅需了解高性能PC机的中断结构,还需了解PCI接口芯片的配置空间及中断机制。本文首先介绍高性能PC机的中断结构、9052的配置空间和中断机制,然后给出以中断方式实现CPU和PCI扩展卡间数据交换的程序设计要点。
2 高性能PC机的中断结构[1]
芯片组是主板的灵魂。有些主板的芯片组由北桥和南桥组成。高性能的南桥芯片除涵盖常规南桥功能外,还具有为微机系统服务的I/O接口,如中断控制器、DMA控制器等。为此,本文也称南桥为SIO(System I/O)。不同南桥芯片其集成的中断控制逻辑复杂程度不同、功能也有所扩展,但为保持兼容性,其最低两级的中断控制器仍与原PC/AT微机一致。
2.1 SIO中断控制器
图1所示的"系统中断控制器"即是集成于SIO内部进行中断管理的I/O接口,文中称为SIO中断控制器,其最低两级的结构见图2。每片82C59支持8个中断源,主片的IR2与从片的INTR相连,两片共支持15个可屏蔽中断源,其中,主片的输入源编号为IRQ0~IRQ7,从片的输入源编号为IRQ8~IRQ15。
外部中断源向82C59提出请求后,经片内的判优逻辑判优,若该请求具有当前最优的中断级别,该片就会通过其INTR引脚向上提中断请求。CPU收到请求且当前开中断,则响应中断,进入用户的中断服务例程。
集成在SIO内的两个82C59仍具有原82C59的所有寄存器,各寄存器的功能及格式均保持不变,但SIO中断控制器中82C59的许多可选功能已固定,不能通过程序改写。
2.2 PCI中断如何纳入系统的中断结构
PCI总线上有4条中断请求信号线:INTA#、INTB#、INTC#和INTD#,均为漏极开路且低电平有效(相应的IRQi应编程为电平触发方式)。单功能PCI设备只能使用一条中断线且为INTA#,多功能PCI设备可以按PCI规范的要求使用其它中断线。SIO可将4个PCI中断输入到SIO中,并在上电初始化时根据资源使用情况分别将它们引接到合适的中断源上。这样,PCI中断就可以通过系统的可屏蔽中断请求向CPU提出。
3 PLX9052的配置空间和中断机制
3.1 PCI设备的配置空间[1]
每个PCI设备都有一个配置空间,其每一项称为配置寄存器,每个PCI设备的配置空间都包括头标区。头标区中前16个字节的定义对所有PCI设备都是相同的,位于0Eh处的配置寄存器给出了头标类型,01h 用于主桥,00h 用于其它PCI设备。00h类型头标区的布局见图3。
配置空间是PCI设备的硬件与PCI设备的初始化软件及错误处理软件之间的信息交换区。有了这个信息交换区,PCI设备可以向软件反映其状态和要求,软件可以对PCI设备进行辩识、配置和控制。上电时初始化软件首先读出配置空间中的相关内容,以确定是否已安装PCI扩展卡以及扩展卡所需的I/O空间和MEM空间等信息,然后根据系统的资源状况自动为其配置I/O空间和MEM空间的基地址、扩展卡占用的中断号等参数。当CPU要访问扩展卡上的存储器地址或I/O端口地址时,只需从配置空间中获取相应的基地址再加上地址偏移量即可。
3.2 PLX9052的配置空间[2]
由于9052头标类型字段已硬编码为0,则其头标区布局与图3所示同。头标区偏移3Ch处为中断线寄存器,其值由系统上电时自动配置,表明9052的中断引脚INTA#连到了系统中断控制器的哪个输入上。通过查询该寄存器,即可了解系统分配给PCI扩展卡的中断号。偏移3Dh处为中断引脚寄存器,其值表明PCI设备使用了哪一个中断引脚,对应关系为:1-INTA#、2-INTB#、3-INTC#、4- INTD#。由于9052是单功能设备,所以它只支持INTA#一个中断,只有当该寄存器的值设置为1时,初始化软件才会将INTA#引接到系统中断控制器的某个IRQi上。
9052还有一个本地配置空间,用于对9052进行配置和管理。9052头标区中的基地址寄存器0/1已固定用于以存储器或I/O方式映射9052的本地配置空间。PCI主设备(如CPU)可通过基地址寄存器0/1中的基地址加上本地配置寄存器的偏移来读取或修改相应的本地配置寄存器。
本地配置空间中偏移地址为4Ch的寄存器为中断控制/状态寄存器INTCSR,用于控制9052的中断和提供相关状态信息。
3.3 PLX9052的中断机制[2]
9052的INTCSR格式如图4所示,除保留位和LINTi状态位为只读外,其余位均为读/写位。
· LINTi使能位:"1"允许LINTi中断,否则禁止。
· LINTi有效电平位:当采用电平触发方式时,该位为"1"表示本地中断输入LINTi高电平有效,否则低电平有效。
· LINTi状态位:"1"表示中断源LINTi有效,否则无效。
· PCI中断使能位:"1"允许9052产生PCI中断,否则禁止。
· 软件中断位:当PCI中断使能位为"1"时,对本位写"1"将产生PCI中断。
· LINTi触发方式位:"1"表示上升沿触发,"0"表示电平触发。缺省为电平触发方式。
· LINTi边沿触发中断清除位:当LINTi以边沿触发方式产生PCI中断时,可通过对本位写"1"予以清除。
· ISA模式使能位(只能通过串行E2PROM加载):置"1"允许ISA模式,否则禁止。
由上可知, 9052提供了两种类型的中断源:①硬中断源。本地中断输入引脚LINTi[2:1]有效且未被禁止时产生;②软中断源。通过设置INTCSR中的软件中断位产生。只有在任意一个中断源有效且PCI中断使能的条件下,才能产生PCI中断。
4 中断处理流程及编程要点[3]
在Win9x环境下通常需要通过设备驱动程序来访问硬件资源,VtoolsD是常用的第三方VxD设备驱动程序开发工具。下面以VC++6.0为开发环境,结合VtoolsD工具及本文所讨论的中断机制来介绍中断处理程序的开发要点。
4.1 主程序编写要点
在主程序中要完成中断的初始化工作,其流程见图5。在编程中需注意下述几点:
① 获取配置资源
在系统初始化期间若发现新设备,则Win9x会发出PnP_NEW _DEVNODE消息,此时VxD就可以利用CONFIGMG_Register_Device_Driver和CONFIGMG_Get_Alloc_Log_Conf等函数来获取PCI设备的配置资源,并将配置信息放入一个类型为CMCONFIG的结构config中。
② 设置中断向量
从config中可获得系统为9052配置的中断号IRQ,据之保存原中断向量,然后设置中断向量使其指向用户中断服务例程,以便CPU响应中断时自动进入用户的中断处理子程序。
VtoolsD提供了VsharedHardwareInt类来实现硬件中断处理,用户从中派生出Mic_IOINT类,其中成员函数OnSharedHardwareInt是用户的中断处理子程序。
③ 允许9052中断
允许9052产生中断可通过编程9052的INTCSR寄存器来实现。假设应用系统利用9052 LINTi2的上升沿来产生中断,则代码如下:
④ 开放中断屏蔽寄存器的相应位
外部中断事件未受82C59的屏蔽且有足够高的优先级时,才能向CPU发出中断请求,所以在CPU开中断之前必须去除82C59对应中断的屏蔽。这可用VSharedHardwareInt类中的physicalUnmask()函数实现。
4.2 子程序编写要点
中断处理子程序的流程如图6所示。在编写中断处理子程序时,要注意下述两点:
① 清9052中断
因PCI中断是电平检测的,则当它得到响应后应及时撤消其请求,以免引起不应该有的第二次中断,这可通过对INTCS的位11写1来实现。代码如下:
② 清PC机相应中断标志
中断返回前,或进入中断子程序后允许动态改变中断的优先级,则要向82C59发中断结束命令以清除PC机的相应中断标志位。若中断来自主片,则只对主片发结束命令,若来自从片,则要向主片和从片分别发结束命令。这可用VSharedHardwareInt类中的sendPhysicalEOI()函数实现。
5 结束语
本文从计算机硬件和软件相结合的角度深入系统地介绍了基于PCI总线的中断处理机制,并给出了中断处理程序的开发要点,对计算机硬件或软件开发人员可提供较大帮助。
参考文献
1 马鸣锦,赵秋霞,曾光裕.高性能个人计算机硬件结构及接口[M].北京:国防工业出版社,2001.
2 PLX Technology,Inc. PCI9052 Data Book Version 2.0[EB/OL]. http://www.plxtech.com./ September 2001.
3 [美]Jon Bates,Tim Tompkins著,石祥生译. Visual C++6使用指南[M].北京:电子工业出版社,1999.
关键词:PCI总线;PLX9052;即插即用(PnP);中断
1 概述
高性能PC机一般以PCI总线为系统总线。由于PCI总线协议较为复杂,因此在开发PCI扩展卡时常采用专用的PCI接口芯片。常见的PCI接口芯片有AMCC公司的S59XX系列和PLX公司的PLX905X系列,其中PLX9052(文中称为9052)使用广泛。
在应用开发中,常常使用中断作为CPU和外设间交换数据的方式。但由于PCI总线具有即插即用特性,即PCI设备的存储器空间、I/O空间以及中断等资源都是自动配置的,使得CPU访问扩展卡的机制与非即插即用系统有较大的不同,尤其是中断机制比较复杂。
基于9052接口芯片设计的PCI扩展卡若以硬件中断方式和CPU进行数据交换,则其过程可概括为以下四个步骤,参见图1。
① 若连接到9052本地中断输入引脚LINTi[2:1]的外部中断源有效,且9052内部中断使能,则9052的中断输出信号INTA#有效,从而产生PCI中断请求。
② 上电时,初始化软件根据资源使用情况已自动将PCI中断引接到系统中断控制器的某一个中断引脚(IRQi)上,并将该信息写入了9052的配置空间中。用户可通过其配置空间来获取该配置信息。
③ 若IRQi上的中断请求未被屏蔽且级别足够高,则该中断可以通过系统中断控制器向CPU提交请求。
④ 若CPU当前开中断,则响应中断,进入中断服务例程进行数据交换。
因此,用户若要实现PCI扩展卡的中断功能,则不仅需了解高性能PC机的中断结构,还需了解PCI接口芯片的配置空间及中断机制。本文首先介绍高性能PC机的中断结构、9052的配置空间和中断机制,然后给出以中断方式实现CPU和PCI扩展卡间数据交换的程序设计要点。
2 高性能PC机的中断结构[1]
芯片组是主板的灵魂。有些主板的芯片组由北桥和南桥组成。高性能的南桥芯片除涵盖常规南桥功能外,还具有为微机系统服务的I/O接口,如中断控制器、DMA控制器等。为此,本文也称南桥为SIO(System I/O)。不同南桥芯片其集成的中断控制逻辑复杂程度不同、功能也有所扩展,但为保持兼容性,其最低两级的中断控制器仍与原PC/AT微机一致。
2.1 SIO中断控制器
图1所示的"系统中断控制器"即是集成于SIO内部进行中断管理的I/O接口,文中称为SIO中断控制器,其最低两级的结构见图2。每片82C59支持8个中断源,主片的IR2与从片的INTR相连,两片共支持15个可屏蔽中断源,其中,主片的输入源编号为IRQ0~IRQ7,从片的输入源编号为IRQ8~IRQ15。
外部中断源向82C59提出请求后,经片内的判优逻辑判优,若该请求具有当前最优的中断级别,该片就会通过其INTR引脚向上提中断请求。CPU收到请求且当前开中断,则响应中断,进入用户的中断服务例程。
集成在SIO内的两个82C59仍具有原82C59的所有寄存器,各寄存器的功能及格式均保持不变,但SIO中断控制器中82C59的许多可选功能已固定,不能通过程序改写。
2.2 PCI中断如何纳入系统的中断结构
PCI总线上有4条中断请求信号线:INTA#、INTB#、INTC#和INTD#,均为漏极开路且低电平有效(相应的IRQi应编程为电平触发方式)。单功能PCI设备只能使用一条中断线且为INTA#,多功能PCI设备可以按PCI规范的要求使用其它中断线。SIO可将4个PCI中断输入到SIO中,并在上电初始化时根据资源使用情况分别将它们引接到合适的中断源上。这样,PCI中断就可以通过系统的可屏蔽中断请求向CPU提出。
3 PLX9052的配置空间和中断机制
3.1 PCI设备的配置空间[1]
每个PCI设备都有一个配置空间,其每一项称为配置寄存器,每个PCI设备的配置空间都包括头标区。头标区中前16个字节的定义对所有PCI设备都是相同的,位于0Eh处的配置寄存器给出了头标类型,01h 用于主桥,00h 用于其它PCI设备。00h类型头标区的布局见图3。
配置空间是PCI设备的硬件与PCI设备的初始化软件及错误处理软件之间的信息交换区。有了这个信息交换区,PCI设备可以向软件反映其状态和要求,软件可以对PCI设备进行辩识、配置和控制。上电时初始化软件首先读出配置空间中的相关内容,以确定是否已安装PCI扩展卡以及扩展卡所需的I/O空间和MEM空间等信息,然后根据系统的资源状况自动为其配置I/O空间和MEM空间的基地址、扩展卡占用的中断号等参数。当CPU要访问扩展卡上的存储器地址或I/O端口地址时,只需从配置空间中获取相应的基地址再加上地址偏移量即可。
3.2 PLX9052的配置空间[2]
由于9052头标类型字段已硬编码为0,则其头标区布局与图3所示同。头标区偏移3Ch处为中断线寄存器,其值由系统上电时自动配置,表明9052的中断引脚INTA#连到了系统中断控制器的哪个输入上。通过查询该寄存器,即可了解系统分配给PCI扩展卡的中断号。偏移3Dh处为中断引脚寄存器,其值表明PCI设备使用了哪一个中断引脚,对应关系为:1-INTA#、2-INTB#、3-INTC#、4- INTD#。由于9052是单功能设备,所以它只支持INTA#一个中断,只有当该寄存器的值设置为1时,初始化软件才会将INTA#引接到系统中断控制器的某个IRQi上。
9052还有一个本地配置空间,用于对9052进行配置和管理。9052头标区中的基地址寄存器0/1已固定用于以存储器或I/O方式映射9052的本地配置空间。PCI主设备(如CPU)可通过基地址寄存器0/1中的基地址加上本地配置寄存器的偏移来读取或修改相应的本地配置寄存器。
本地配置空间中偏移地址为4Ch的寄存器为中断控制/状态寄存器INTCSR,用于控制9052的中断和提供相关状态信息。
3.3 PLX9052的中断机制[2]
9052的INTCSR格式如图4所示,除保留位和LINTi状态位为只读外,其余位均为读/写位。
· LINTi使能位:"1"允许LINTi中断,否则禁止。
· LINTi有效电平位:当采用电平触发方式时,该位为"1"表示本地中断输入LINTi高电平有效,否则低电平有效。
· LINTi状态位:"1"表示中断源LINTi有效,否则无效。
· PCI中断使能位:"1"允许9052产生PCI中断,否则禁止。
· 软件中断位:当PCI中断使能位为"1"时,对本位写"1"将产生PCI中断。
· LINTi触发方式位:"1"表示上升沿触发,"0"表示电平触发。缺省为电平触发方式。
· LINTi边沿触发中断清除位:当LINTi以边沿触发方式产生PCI中断时,可通过对本位写"1"予以清除。
· ISA模式使能位(只能通过串行E2PROM加载):置"1"允许ISA模式,否则禁止。
由上可知, 9052提供了两种类型的中断源:①硬中断源。本地中断输入引脚LINTi[2:1]有效且未被禁止时产生;②软中断源。通过设置INTCSR中的软件中断位产生。只有在任意一个中断源有效且PCI中断使能的条件下,才能产生PCI中断。
4 中断处理流程及编程要点[3]
在Win9x环境下通常需要通过设备驱动程序来访问硬件资源,VtoolsD是常用的第三方VxD设备驱动程序开发工具。下面以VC++6.0为开发环境,结合VtoolsD工具及本文所讨论的中断机制来介绍中断处理程序的开发要点。
4.1 主程序编写要点
图5 中断处理主程序流程
在主程序中要完成中断的初始化工作,其流程见图5。在编程中需注意下述几点:
① 获取配置资源
在系统初始化期间若发现新设备,则Win9x会发出PnP_NEW _DEVNODE消息,此时VxD就可以利用CONFIGMG_Register_Device_Driver和CONFIGMG_Get_Alloc_Log_Conf等函数来获取PCI设备的配置资源,并将配置信息放入一个类型为CMCONFIG的结构config中。
② 设置中断向量
从config中可获得系统为9052配置的中断号IRQ,据之保存原中断向量,然后设置中断向量使其指向用户中断服务例程,以便CPU响应中断时自动进入用户的中断处理子程序。
VtoolsD提供了VsharedHardwareInt类来实现硬件中断处理,用户从中派生出Mic_IOINT类,其中成员函数OnSharedHardwareInt是用户的中断处理子程序。
③ 允许9052中断
允许9052产生中断可通过编程9052的INTCSR寄存器来实现。假设应用系统利用9052 LINTi2的上升沿来产生中断,则代码如下:
④ 开放中断屏蔽寄存器的相应位
外部中断事件未受82C59的屏蔽且有足够高的优先级时,才能向CPU发出中断请求,所以在CPU开中断之前必须去除82C59对应中断的屏蔽。这可用VSharedHardwareInt类中的physicalUnmask()函数实现。
4.2 子程序编写要点
中断处理子程序的流程如图6所示。在编写中断处理子程序时,要注意下述两点:
① 清9052中断
因PCI中断是电平检测的,则当它得到响应后应及时撤消其请求,以免引起不应该有的第二次中断,这可通过对INTCS的位11写1来实现。代码如下:
② 清PC机相应中断标志
中断返回前,或进入中断子程序后允许动态改变中断的优先级,则要向82C59发中断结束命令以清除PC机的相应中断标志位。若中断来自主片,则只对主片发结束命令,若来自从片,则要向主片和从片分别发结束命令。这可用VSharedHardwareInt类中的sendPhysicalEOI()函数实现。
5 结束语
本文从计算机硬件和软件相结合的角度深入系统地介绍了基于PCI总线的中断处理机制,并给出了中断处理程序的开发要点,对计算机硬件或软件开发人员可提供较大帮助。
参考文献
1 马鸣锦,赵秋霞,曾光裕.高性能个人计算机硬件结构及接口[M].北京:国防工业出版社,2001.
2 PLX Technology,Inc. PCI9052 Data Book Version 2.0[EB/OL]. http://www.plxtech.com./ September 2001.
3 [美]Jon Bates,Tim Tompkins著,石祥生译. Visual C++6使用指南[M].北京:电子工业出版社,1999.