4.1 介绍
这一章具体描述了中断控制器驱动。
4.2 概要
这一章提供了关于中断标识,中断职责,中断控制器配置,动态向量指派,和VxBus模式中断控制器驱动相关的多处理器系统。这一章描述了这些基本的主题。章节剩余部分详细描述了中断控制器VxBus驱动模型。
在VxBus框架中,中断控制器硬件关联可以使用一个VxBus驱动实现。
注:当用于VxWorks SMP产品时,风河强烈推荐使用VxBus驱动模型实现中断控制器驱动。
中断控制器驱动是最难创建、调试和维护的设备驱动。当编写一个VxBus中断控制器驱动时,风河推荐首先要理解VxWorks Device Driver Developer's Guide, Volume 1,其次检测风河提供的中断控制器驱动模型,找到一个合适的驱动作为开发模型。
注:OpenPIC中断控制器驱动,vxbEpicIntCtlr.c,和PowerPC 具体CPU中断控制器驱动,通常使用vxbPpcIntCtlr.c模块作为中断控制器驱动的开发模型。然而,因为这些驱动要考虑前向兼容,可能包含目前情况下不需要的代码。这种情况下,你可以创建一个全新的中断控制器驱动来简化驱动代码。 中断标识
在VxBus上下文中,一个中断对应具体的实体,如产生中断的设备。也就是说,在VxBus中,所有的中断通过VxBus设备和一个中断索引标识。这个唯一标识了系统中产生中断中断设备的每一个中断源。
从一个中断控制器的角度上看,你也必须参考中断到来时那个输入引脚产生的中断,这指interrupt input。
中断标识的详细讨论在4.12 Internal Representation of Interrupt Inputs讨论。 中断控制器驱动职责
中断控制器驱动负责维护中断路由信息,管理中断输入特征,如触发类型(边缘触发还是电平触发),触发值(高有效,低有效),和中断源的其它功能。
中断控制器驱动也负责针对每一个中断输入维护ISRs,和管理传递给每一个ISR的参数。vxbIntCtlrLib库提供协助管理ISR连接的函数。这个库尝试用不同的最有效方式调度ISR。当连接一个单一ISR,ISR直接调度。当连接多个ISRs,vxbIntCtlrLib创建一个中断处理链,当对应中断产生时调用。
当任何驱动调用vxbIntConnect( )时,系统中的每一个中断控制器被给予一个要求中断的机会。一旦中断响应,中断控制器负责管理硬件要求的中断,直接通到调用和vxbIntEnable( ), vxbIntDisable( ),完成。这些调用映射中断控制器方法。
更详细讨论,参考4.3 VxBus Driver Methods。 中断控制器配置
很多CPUs有能力直接连接多个中断源到CPU,而有些CPUs只能连接一个中断源到CPU,任何中断管理必须由一个外部中断控制器设备处理。有些CPU具体以消息方式在独立的总线的产生信号,因此不需要连接多个中断到CPU。一些外部中断控制器也提供这个功能来和CPU分离。VxBus中断控制器驱动支持所有这些配置。
中断控制器也有一个连接层次,一些中断控制器的输入连接到其它中断控制器的输出
上。
更详细讨论参考4.8 Interrupt Controller Topologies and Hierarchies, p.51。 动态向量
一些硬件考虑中断标识的动态指派。独立的总线类型,如PCI,可能要定义针对处理动态向量的具体总线机制。对于一个PCI总线,这包括MSI和MSI-X。甚至没有任何具体总线动态向量指派,个别设备也会针对软件提供一种机制,写一个向量到一个设备寄存器,当设备产生中断时使用。现在比较流行的硬件,当一个中断控制器作为其他设备的相同多功能芯片一部分时出现。这种情况下,位于相同设备上时钟设备作为中断控制器和硬件要求你写一个时钟芯片上的寄存器,包括中断控制器设备上的中断输入号。
一些VxBus中断控制器驱动针对这些情况处理动态向量指派。 更详细的讨论参考4.11 Managing Dynamic Interrupt Vectors, p.55。 中断控制器驱动和多处理器
这些和多处理器相关的功能范围被中断控制器驱动处理。这包含具体于一个CPU的中断指派,产生和内部处理器中断管理(IPIs)。
更多信息参考4.13 Multiprocessor Issues with VxWorks SMP。
4.3 VxBus驱动方法
有三组驱动方法和中断控制器驱动有关。第一组要求基本中断控制器功能。第二组处理动态向量指派。最后一组处理多处理器相关的问题。
4.3.1 基本方法
本部分列出的这个方法要求基本的中断控制器功能。 vxbIntCtlrConnect}( )
func{vxbIntCtlrConnect}( )函数针对指定中断配置了硬件,并关联提供的函数和参数到
合适的中断输入。
{vxbIntCtlrDisconnect}( )
func{vxbIntCtlrDisconnect}( )函数断开来自中断输入的具体的ISR和参数,若没有和其
它ISR共享,则禁用中断输入。
{vxbIntCtlrEnable}( )
func{vxbIntCtlrEnable}( )函数使能中断输入和使能标识具体ISR。
{vxbIntCtlrDisable}( )
func{vxbIntCtlrDisable}( )函数标识具体ISR为禁用。若没有对应相同的中断输入没有其
它使能的ISRs,函数禁用输入。
4.3.2 动态向量方法
本部分列出的方法用于动态向量指派。 vxbIntDynaVecConnect}( )
{vxbIntDynaVecConnect}( )方法允许一个驱动请求调用的设备可以指派多个中断使用,
且每个中断一个具体的ISR、参数。
当调用时,func{vxbIntDynaVecConnect}( )函数导致中断向量被指派给请求的设备,并连接具体的ISRs和参数。
动态向量指派目前要求驱动调用一个具体的函数指派动态向量,或BSP配置使用动态
向量。更多信息,参考4.5 BSP Configuration。
4.3.3 多处理器方法
本部分列出的方法用于多处理器系统。 {vxbIntCtlrIntReroute}( )
func{vxbIntCtlrIntReroute}( )函数重新路由一个具体的中断,从目前路由的CPU,到destCpu参数指定的CPU。
中断由设备指明,参数中指示索引。连接的相同输入上的所有中断被重新路由。 {vxbIntCtlrCpuReroute}( )
func{vxbIntCtlrCpuReroute}( )函数从目前路由的CPU重新路由中断,到destCpu参数
指定的CPU。
当{vxbIntCtlrIntReroute}( )具体于一个单独中断输入时,{vxbIntCtlrCpuReroute}( )函数路由所有为一个不同的CPU作为一个块的CPU配置的所有中断。也就是说,若BSP配置4个中断输入作为路由到CPU1,使用CPU路由表hwconf.c,之后func{vxbIntCtlrCpuReroute}( )函数的一个单独调用必须重新路由这个四个中断。
{vxIpiControlGet}( ) 内部处理器中断(IPIs)在多处理器系统中用于不同目的。函数返回指向一个结构VXIPI_CTRL_INIT的指针,包含管理IPIs的信息。
更多信息,参考4.13.2 Interprocessor Interrupts。
4.4 头文件
VxBus中断控制器驱动由两个头文件。 vxbIntrCtlr.h
vxbIntrCtlr.h文件包含从BSP中获取需要的中断路由信息。
#include
vxbIntCtlrLib.h
当使用vxbIntCtlrLib函数时,中断控制器驱动包含文件vxbIntCtlrLib.h,强烈推荐。这个头文件位于:installDir/vxworks-6.x/target/src/hwif/intCtlr
因此,风河中断控制器驱动简化: #include \
当一个第三方中断控制器驱动发布时,驱动应该位于如下目录:
installDir/vxworks-6.x/target/3rdparty/vendor/driver
为了包含vxbIntCtlrLib.h文件,这个目录下的makefile应为修改-I$(TGT_DIR)/src/hwif/intCtlr,增加到宏EXTRA_INCLUDE。
EXTRA_INCLUDE=-I$(TGT_DIR)/h -I$(TGT_DIR)/src/hwif/intCtlr
这个修改运行第三方中断控制器驱动使用尖括号包含头文件: #include
4.5 BSP配置
几乎所有中断控制器的设备寄存器都逻辑位于处理器总线上。针对这个原因,几乎所有的中断控制器驱动需要hwconf.c文件。中断控制器驱动需要标准的hwconf.c入口。然而,中断控制器驱动也要求额外的入口来描述中断程序和配置。本章剩余部分讨论额外需求。
在hwconf.c中用一系列表格描述中断。对于当下中断控制器驱动需要的任一个表,一个资源入口包含一个指向表头的指针和一个资源入口包含表大小,包含在中断控制器资源表中。
在hwconf.c表包括:
.一个中断程序表,input,列出了要连接到具体中断控制器中断输入上的设备。 .一个优先级表,priority,列出了个别中断输入的非默认优先级。
.一个动态向量表,dynamicInterrupt或dynamicInterruptTable,列出了要求动态向量指派的设备。
.一个CPU函数表,cpuRoute,路由到处理器的设备,除了多处理器系统中的bootstrap处理器。
.一个连接路由表,crossBar,针对每一个到中断控制器的中断源的输入引脚到输入引脚函数。
你可以想用其它的表。可以有,但风河不推荐。
4.5.1 中断输入表
中断输入信息从BSP hwconf.c文件表中获取。输入信息由结构intrCtlrInputs表表示,定义在如下文件中:
installDir/vxworks.6.x/target/h/hwif/vxbus/vxbIntrCtlr.h
而开发驱动时,你不需要了解hwconf.c信息,你需要了解如下信息来测试你的驱动。
struct intrCtlrInputs {
int inputPin; char * drvName; int drvUnit;