int drvIndex; };
一个在设备资源列表中指向输入表开始的指针,资源名为input:,类型为HCF_RES_ADDR。表大小用HCF_RES_INT类型的名inputTableSize表示。
当你的驱动初始化ISR时,vxbIntCtlrLib自动读这张表。
每个关联到终点输入上的设备中断输出都在这张表中列出。如下例子,修改 hpcNet8641 BSP,宏被扩展来表示数字值。其它变化用于演示目的。
多个中断源可能真的一个单一的中断输入。在这个例子中,注明PCI slot0中断输出3(int-D)连接到相同的中断控制器输入引脚,22,作为PCI Express中断输出。使用如下表示:
{ 22, \{ 22, \
表中列出的输入引脚的次序是无关的。在这个例子中,输入的次序已经被重新安排,以至于每个中断源的输出都被分组。这意味着展现在例子中的输入引脚排序已经被输入引脚排序。这两个中断不会在相同配置上产生。然而,若产生在相同的配置上,他们会出现在相同的镜像中,没有其他副作用。
4.5.2 动态向量表
系统中存在几种动态向量表(参考4.11 Managing Dynamic Interrupt Vectors)包括具体总线动态向量,如PCI总线类型上的消息信号中断(MSIs),如定制动态向量支持包含一个中断控制器设备的多功能芯片。创建的系统的支持动态向量表功能的中断控制器驱动必须支持动态向量。
通常,有两种方法配制一个系统执行动态向量指派。你的设备驱动的第一个方法是调用一个特别的函数来安装动态向量。若你需要安装多个ISRs到动态向量,你必须使用这个接口。这个选项通过一个特别的驱动方法来处理,用于支持动态向量分配。
BSP提供的第二种方法。这种情况下,驱动需要理解实现过程。中断输入被配置到hwconf.c文件中的input表中,指明一个设备名,一个设备单元号,和一个设备中断输出。使用VXB_INTR_DYNAMIC作为输入引脚表示这是一个动态向量指派。
如,为了指明PCI网络设备yn0 输出0,应用使用一个动态产生向量,表中如下行,
用input资源指定。
{ VXB_INTR_DYNAMIC, \
任何中断源数可以用VXB_INTR_DYNAMIC作为一个输入引脚指明。当ISR连接时,每一个中断源必须有一个动态向量指派。
4.5.3 CPU路由表
某些情况下,中断控制器驱动期望被用于多处理器环境下,中断控制器硬件可以路由中断输入到处理器除了bootstap处理器。这样环境下,BSP必须配置路由中断输入到额外处理器。如下讨论集中在可选的VxWorks SMP产品,但是可能应用到不对称多处理器环境下。
路由中断输入到非默认CPUs通过中断控制器资源列表来配置。因为中断控制器仅可以路由输入,所有在相同输入上的中断源必须路由在相同的时间路由到相同的CPU上,中断输入由中断输入引脚号标识,非正常中断识别机制包括VXB_DEVICE_ID和中断输出。使用的结构intCtlrCpu,定义如下:
installDir/vxworks-6.x/target/h/hwif/vxbus/vxbIntrCtlr.h
结构定义如下:
/*
* intrCtlrCpu is used on SMP systems only. It indicates * which CPU the interrupt controller should route the * input pin to */
struct intrCtlrCpu {
int inputPin; int cpuNum; };
注明:如上结构,cpuNum是逻辑CPU索引。
如下是一个来自hpcNet8641 BSP的CPU中断路由表的例子,使用左边的宏澄清。可以作为最小左右系统配置和性能的例子配置,不具备最佳中断性能。
struct intrCtlrCpu epicCpu[] = { { EPIC_TSEC3ERR_INT_VEC, 1 }, { EPIC_TSEC1ERR_INT_VEC, 1 }, { EPIC_TSEC4ERR_INT_VEC, 1 }, { EPIC_TSEC2ERR_INT_VEC, 1 } };
4.5.4 中断优先级
VxBus中断控制器设计过程中,每个中断输入都被指派一个优先级。这一部分描述的这个表用于在中断控制器上指派中断优先级到具体的中断输入。中断优先级更多信息和在中断控制器驱动中发挥的作用,参考4.9 Interrupt Priority, p.52。
和其它中断输入配置一样,中断如是的优先级在中断资源表中作为一个表格配置,入口名priority为来指向表中第一个元素,入口名priorityTableSize来表示优先级表的大小。intrCtlrPriority类型表,定义:
nstallDir/vxworks-6.x/target/h/hwif/vxbus/vxbIntrCtlr.h
表定义如下:
/*
* intrCtlrPriority is used to set the priority of
* a specified input pin on an interrupt controller */
struct intrCtlrPriority {
int inputPin; int priority; };
15默认值不需要指明,但是所有其他的值需要。如下四EPIC中断控制器优先级指派例子,用于hpcNet8641 BSP。
struct intrCtlrPriority epicPriority[] = { { EPIC_DUART2_INT_VEC, 100 }, { EPIC_DUART_INT_VEC, 100 } };
4.5.5 交差路由表
对于交差中断控制器,这是一个额外的结构定义,可以保持输入引脚,并校正输出引脚。若没有指定,每个输入引脚被指派到默认输出,输出为0表示中断控制器驱动文档中没有说明。不会路由一个单一输入引脚到多个输出引脚。这会导致不可预知的结果。
表中元素类型为intrCtlrXBar,定义:
installDir/vxworks-6.x/target/h/hwif/vxbus/vxbIntrCtlr.h
表定义如下:
struct intrCtlrXBar {
int inputPin; int outputPin; };
如下是来自cav_cn3xxx_mipsi64r2sf BSP中hwconf.c文件中的例子。此BSP中断控制器有两个输出,被路由到CPU的硬件中断输入的引脚2或引脚3.
const struct intrCtlrXBar mipsCavIntCtlrXBar[] = {
/* inputPin, outputPin*/ { 15, 2 }, /* eth / pkt */ { 55, 2 }, /* timer 3 */ { 54, 2 }, /* timer 2 */ { 53, 2 }, /* timer 1 */ { 52, 2 }, /* timer 0 */ { 32, 3 }, /* mail boxes */ { 33, 2 },
{ 34, 2 }, /* uart 0 */ { 35, 2 }, /* uart 1 */ { 36, 2 }, { 37, 2 }, { 38, 2 }, { 39, 2 }, { 56, 2 },
};
4.6 现有的工具函数
针对中断控制器驱动有一系列工具函数。这些函数在vxbIntCtlrLib库中。工具函数可以划分为4类:正常操作下用于路由,展示函数,特殊目的的函数通常不用于中断控制器驱动,可调用宏用于中断控制器驱动。
正常情况下用于路由的函数:
■?
intCtlrHwConfGet( ) intCtlrISRAdd( ) intCtlrISRDisable( ) intCtlrISREnable( ) intCtlrISRRemove( ) intCtlrPinFind( ) intCtlrTableArgGet( ) intCtlrTableFlagsGet( ) intCtlrTableIsrGet( )
■?
■?
■?
■?
■?
■?
■?
■?
展示函数为:
■?
intCtlrHwConfShow( )
特别目的函数为:
■?
intCtlrTableCreate( ) intCtlrTableFlagsSet( ) intCtlrTableUserSet( )
■?
■?
可调用宏为:
■?
VXB_INTCTLR_ISR_CALL( )
VXB_INTCTLR_PINENTRY_ENABLED( ) VXB_INTCTLR_PINENTRY_ALLOCATED( )
■?
■?
这些函数在如下部分详细描述。原型,参考个人函数的API参考或如下文件中的前向声明:
installDir/vxworks-6.x/target/src/hwif/intCtlr/vxbIntCtlrLib.h
4.6.1 intCtlrHwConfGet( )
intCtlrHwConfGet( )读BSP hwconf.c文件中列出的中断控制器资源。根据表中指针读表中中断输入描述,中断输入优先级,输入引脚目的CPU(对于SMP系统)和CPU配置。当中断输入描述后,isrHandle被更新用于反映目前的输入。isrHandle也包含输入的信息。关于isrHandle的更多信息,参考4.12 Internal Representation of Interrupt Inputs, p.57。这个路由只应该调用一次,在初始化函数第一阶段,后续不会调用。
4.6.2 intCtlrISRAdd( )
当一个服务驱动连接一个ISR到它的中断时,intCtlrISRAdd( )被调用。启动这个过程,服务驱动调用vxbIntConnect( )或vxbDynaIntConnect( )。最终,中断控制器驱动的连接函数被调用。在连接函数中,中断控制器驱动必须关注任何必须的中断控制器硬件管理,调用intCtlrISRAdd( ) to来更新isrHandle,并安装服务驱动的ISR。
4.6.3 intCtlrISRDisable( )
当一个服务驱动禁用它的ISR时,调用intCtlrISRDisable( )。中断控制器驱动必须保持中断输入使能,若任何服务设备ISR使能时,若连接到中断输入上的所有ISRs被禁用后,
仅禁用当前输入。中断控制器禁用函数必须调用这个函数来禁用isrHandle中的ISR和保存返回值。若返回值为TRUE,输入上的所有ISRs被禁用,且中断控制器可以禁用中断输入。
4.6.4 intCtlrISREnable( )
当一个服务驱动使能自身ISR时,intCtlrISREnable( )被调用。这个函数更新isrHandle,导致当中断输入上产生中断时,指定ISR被调用。
4.6.5 intCtlrISRRemove( )
intCtlrISRRemove( )函数从isrHandle中移除指定的ISR。
4.6.6 intCtlrPinFind( )
intCtlrPinFind( )用于查找指定服务设备中断连接的中断输入。中断输入可以之后用于其它isrHandle的一个参数支持函数。这个函数通常在需要中断输入号时,每个函数开始调用一次,如连接、断开、使能、禁用一个ISR的函数。
4.6.7 intCtlrTableArgGet( )
intCtlrTableArgGet( ) 针对当下中断输入获取ISR的参数。大多数中断控制器驱动不需要调用这个函数。然而,若驱动需要执行一些行为,如移动整个中断从一个地方到另外一个地方时,可以调用。
4.6.8 intCtlrTableFlagsGet( )
intCtlrTableFlagsGet( )获取当下中断输入的标志。大多数中断控制器驱动不需要调用这个函数。
4.6.9 intCtlrTableIsrGet( )
intCtlrTableIsrGet( )获取当下中断输入ISR函数指针。intCtlrTableIsrGet( )返回的值是一个函数指针,包含三个值中的其中一个:intCtlrStrayISR(),intCtlrChainISR( ),或一个用户ISR。大多数中断控制器驱动不需要调用这个函数。
4.6.10 intCtlrHwConfShow( )
intCtlrHwConfShow( )打印了isrHandle的内容。然而,若展示函数没有包含在系统配置中,不会产生输出。
至于所有的VxBus使能设备驱动,每个中断控制器驱动可以声明{busDevShow}( )驱动方法。若驱动被配置为这个功能,func{busDevShow}( )函数调用intCtlrHwConfShow( )来提供isrHandle相关的输出。
4.6.11 intCtlrTableCreate( )
intCtlrTableCreate( )保证指定中断输入的表入口存在。大多数驱动不需要调用这个函数。
4.6.12 intCtlrTableFlagsSet( )
intCtlrTableFlagsSet( )设置指定中断输入表中isrHandle的flags变量。Flags域是一个无符号整形。用于vxbIntCtlrLib.c中的大多数flags都是为了以后使用。然而,中断控制器驱动中已经存在的两位可以用于任何目的。是VXB_INTCTLR_SPECIFIC_1和VXB_INTCTLR_SPECIFIC_2。
4.1.13 intCtlrTableUserSet( )
intCtlrTableUserSet( )填充一个指定中断输入的isrHandle中的一个表入口。这个函数填充和连接到中断输入上的和设备相关的指定信息。这个函数在vxbIntCtlrLib函数中调用。大多数中断控制器驱动不需要调用这个函数。
4.6.14 VXB_INTCTLR_ISR_CALL( )
VXB_INTCTLR_ISR_CALL( )宏正确调用连接到指定中断输入上的ISRs。若只有一个ISR
连接到中断输入,这个宏调用ISR。若有几个ISRs连接到中断输入,宏变量链表,轮流调用每一个ISR。