vxWorks设备驱动开发指南(1)_第1页
vxWorks设备驱动开发指南(1)_第2页
vxWorks设备驱动开发指南(1)_第3页
vxWorks设备驱动开发指南(1)_第4页
vxWorks设备驱动开发指南(1)_第5页
已阅读5页,还剩101页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、vxWroks 6.8设备驱动开发指南写具体类设备驱动3 DMA驱动 3.1简介本章描述了 DMA驱动。3.2概要有些硬件设计包括一个通用DMA引擎.处理來口 DMA的访问,或到外部设备,或 从内存到内存。这些DMA引擎通常集成在片上CPU系统中。DMA驱动类为系统中其它 设备提供DMA引擎服务的一套标准方法。提供的vxbDmaLib库提供用于DMA引擎。这个DMA库提供的函数是 vxbDmaChanAlloc()和 vxbDmaChanFree()。3.3 VxBus驱动方法由vxbDmaLib库提供的函数充分使用三个VxBus驱动方法:vxbDmaResourceGet()vxbDmaRe

2、sourceRe!ease()vxbDmaResDedicatedGet()DMA驱动通过这些方法的关联函数提供对它们服务的访问。3.3.1 vxbDmaResourceGet()vxbDmaResourceGet()方法用于DMA库來分配一个DMA驱动管理的设备上的 DMA通道。原型如下:STATUS vxbDmaResourceGet(VXB_DEVICE_ID plnstrVXB_DEVICE_ID pReqDevrVXB_DMA_REQUE ST * pReq)这个原型,plnst指DAM设备木身,pReqDev指请求一个DMA通道的设备,和pReq 是一个指针,指向一个结构,描述DM

3、A通道的期望的屈性。VXB_DMA_REQUEST 结构定义在:zw5/a/D/vxworks-6jc/target/src/hwif7h/util/vxbDmaDriverLib.h结构定义如下:typedef struct vxbDmaRequestVXB_DEVICE_ID instance; /* DMA requestor device id */UTNT32 minQueueDepth; / minimum queue depthrequested /UINT32 flags; / flags used during DMAallocation /VXB_DMA_RESOURCE_

4、ID pChan; / DMA channel id */void pDedicatedChanlnfo; / dedicated channelinformation /)VXB_DMA_REQUEST;这个结构很大程度上对应传递给vxbDmaChanAlloc()的参数。DMA设备驱动正常选择 一个基于minQueueDepth和flags DMA通道,并返回指向通道的指针pChan。设备驱动调 用DMA驱动的通道分配代码一无论通过和函数一可以有选择的传递一个执行一个结 构的指针,这个指针包括具体于期望DMA通道的信息,专有于请求者。DMA驱动可以充 分使用这个信息來设置一个专有的DMA通

5、道。3.3.2 vxbDmaResourceRelease()vxbDmaResourceRelease()方法用于DMA库來释放DMA驱动管理的设备上的 DMA通道。原型如下:STATUS vxbDmaResourceRelease)(VXB_DEVICE_ID plnstrVXB_DMA_RESOURCE_ID pChan)大参数情况下,驱动的仅有要求是禅放具体的分配给设备的DMA通道,由pChan标 识,plnst指向DMA设备的VxBus设备ID。3.3.3 vxbDmaResDedicatedGet()DMA库使用vxbDmaResDedicatedGet()方法來分配一个DMA方法

6、专属于调用 方法的具体设备。这个方法的功能和(vxbDmaRewurceGetK )类似。然而,制约于硬件限制 或其他限制,你可能想使用这个设备來保证具体设备分配给具体通道。如这通过检査设备 名关联的设备实例,由pReqDev标识,來完成,或检査使用的成员传递pReq的 pDedicatedChanlnfo m息。原型如 F:STATUS (vxbDmaResDedicatedGet)(VXB_DEVICE_ID pReqDev,VXB_DMA_REQUE ST * pReq3.4头文件DMA驱动必须包含如下头文件:include include /h/util/vxbDmaDriverLib

7、.h其他驱动想使用vxbDmaLib可能需要包含如下: include 这些驱动也可能需要包含具体DMA驱动的头文件,为了使用专用的通道功能。3.5 BSP配置DMA驱动通常BSP不缶要什么配迓信息。参考KrJForfcs Device Driver Developers Guide (Vol. 1): Device Driver Fundamentals e3.6可用的工具函数DMA驱动不需要什么具体类工具函数。3.7初始化DMA设备驱动的初始化通常是具体于设备的。初始化应该在VxBus初始化阶段2前 或期间完成,所以其他设备驱动可以在初始化阶段3使用vxbDmaLib库。3.8 DMA系统

8、结构和函数前面部分描述的函数和方法充分使用V?CB_DMA_RESOLRCEJD來标识一个具体的 DMA通道。这个标识是一个指向vxbDmaResource结构的指针,定义如下:struct vxbDmaResourcestruct vxbDroaFunes dmaFunes;/* structure holding dmafunction pointers */void pDmaChan;/* channel specific data-used by DMAdriver */VXB_DEVICE_ID dmalnst; dma engine instance ID /);这个结构的dmaF

9、uncs成员包含用于不同DMA操作的函数指针。设备驱动可以通过 VXB_DMA_RESOLRCE_ID标识访问这些函数,调用vxbDmaChanAlioc()函数返回给他们。 这些函数指针应用被DMA驱动填允。依据传递给vxbDmaChanAIloc(筒数的flags参数. vxbDmaLib可能初始化读写函数。vxbDmaFuncs结构定义在vxbDmaLib.h中,包含指向如 下部分描述的函数指针。3.8.1 (*dmaRead)()(*dmaRead)()顺序从设备的缓存或寄存器中读数据到系统内存缓存。控制器立即返 回给调用者,若传输依据入队,则返回0K,或DMA设备队列满,则返回 ER

10、RORo pDmaComplete和pArg可用以指明一个回调函数,当传输完成时。STATUS (-draaRead)VXB_DMA_RESOURCE_ID dmaChan, char srcr char transferSizerint unitsize,UINT32 flags,pVXB_DMA_COMPLETE_FN pDmaComplete,void * pArg);3&2 (*dmaRcadAndWait)()(*dmaReadAndWait)( )fii(*dmaRead)(除了控制器指定传输完成才返回。STATUS (dmaReadAndWait)(VXB_DM

11、A_RESOURCE_ID dmaChan,char src,char dest,int * pTransferSizerint unitsize,UINT32 flags);3.8.3 (*dmaWriteX)(*dmaWrite)()从设备上缓存或寄存器排序一个写操作到系统内存缓存。控制器立即返回给调用者,若正常入队,则返回0K:若DMA设备队列慢,则返回ERRORoo pDmaComplete和pArg可用以指明一个回调函数,当传输完成时。STATUS (-draaWrite)(VXB_DMA_RESOURCE_ID dmaChan,char srcchar dest,int trans

12、ferSizexint unitsize,UINT32 flags,pVXB_DMA_COMPLETE_FN pDmaComplete,void pArg);3.8.4 (*dmaWriteAndWait)()(*dmaWriteAndWait)( )Ri(*dmaWriteX)-除了除了控制器指定传输完成才返回。STATUS (-dmaWriteAndWait)(VXB_DMA_RESOURCE_ID dmaChan,char * src,char destrint * pTransferSize,int unitSize#UINT32 flags3.8.5 (*dmaCancel)()(*

13、dmaCancel)()取消当前正在工作通道的一个读或写操作。防止通道上产生任何其 它1/0操作,直到一个新的读或写操作入队。STATUS (-dmaCancel)(VXB_DMA_RESOURCE_ID dmaChan);3.8.6 (*dmaPause)()(*dmaPause)()暂停正在传输的DMA通道。暂停一个通道允许调用者安全操作任何 当下DMA描述符或和通道关联的缓存结构,无须完全取消DMA操作。一个暂停的通道 可以通过(*dmaResumeX )恢复。STATUS CdmaPause)(VXB_DMA_RESOURCE_ID dmaChan);3.8.7 (*dmaResume

14、)()恢复一个已经暂停的DMA通道,或处于idle状态的DMA通道。STATUS CdmaResume)(VXB_DMA_RESOURCE_I D dmaChan);3.8.8 (*dmaStatus)()返回具体DMA通道状态。有效返回值是DMA_NOT_USED. DMAJDLE. DMA_RUNNING, or DMA_PAUSEDoint CdmaStatus)(VXB_DMA_RESOURCE_I D cknaChan);3.9调试因为DMA驱动可以在整个VxWorks系统完全初始化时测试,DMA驱动的调试通常 比较简单。当调试DMA驱动时,VxWorks的完全调试功能,和传统的调试

15、手段一样,如 logMsg( ),比较有效。DMA驱动的唯一负责因素是不能再一个真空环境下测试。因为 DMA驱动是提供给系统其他设备的一个服务,必须用另外一个驱动测试。针对调试目的, 可以编写一个测试驱动,调用vxbDmaLib库,分配一个DMA通道,并初始化模拟传输。通用调试信息,参考VxlVorks Device Driver Developers Guide (Vol. 1): Development Strategies e4中断控制器驱动 4.1介绍这一章具体描述了中断控制器驱动。4.2概要这一章提供了关于中断标识,中断职责,中断控制器配邊,动态向虽指派,和VxBus 模式中断控制器

16、驱动相关的参处理器系统。这一章描述了这些基本的主题。章节剰余部分 详细描述了中断控制器VxBus驱动模型。在VxBus框架中,中断控制器硬件关联可以使用一个VxBus驱动实现。注:当用于VxWorks SMP产品时,风河强烈推荐便用VxBus驱动模型实现中断控制 器驱动。中断控制器驱动是最难创建、调试和维护的设备驱动。当编写一个VxBus中断控制器 驱动时,风河推荐首先要理解VxlVorks Device Driver Developers Guide. Volume 1.其次检测风 河提供的中断控制器驱动模型,找到一个合适的驱动作为开发模型。注:OpcnPIC中断控制器驱动,vxbEpicI

17、ntCtlr.c.和PowerPC具体CPU中断控制器驱动,通常使用vxbPpclntCtlr.c模块作为中断控制器驱动的开发模型。然而,因为这些驱动 要考虑前向兼容,可能包含目前情况下不需要的代码。这种情况下,你可以创建一个全新 的中断控制器驱动來简化驱动代码。中斷标识在VxBus下文中.一个中断对应具体的实体,如产生中断的设备。也就是说,在 VxBus中,所有的中断通过VxBus设备和一个中断索引标识。这个唯一标识了系统中产生 中断中断设备的每一个中断源。从一个中断控制器的角度上看,你也必须参考中断到來时那个输入引脚产生的中断, 这指 interrupt input o中断标识的详细讨论在

18、4.12 Internal Representation of Interrupt力回讨论。中斷控制器驱动职责中断控制器驱动负责维护中断路由信息,管理中断输入特征,如触发类型(边缘触发 还是电平触发),触发值(高有效,低有效),和中断源的其它功能。中断控制器驱动也负责针对每一个中断输入维护ISRs,和管理传递给每一个ISR的参 数。vxblntCtlrLib库提供协助管理ISR连接的函数。这个库尝试用不同的最有效方式调度 ISR当连接一个单一 ISR, ISR直接调度。当连接多个ISRs. vxblntCtlrLib创建一个中断 处理链,当对应中断产生时调用。当任何驱动调用vxblntConn

19、ect()时,系统中的每一个中断控制器被给予一个要求中断 的机会。一旦中断响应,中断控制器负责管理硬件要求的中断,直接通到调用和 vxbIntEnable( ), vxbIntDisab!e(),完成。这些调用映射中断控制器方法。更详细讨论,参考 4.3 VxBus Driver Methods。中斷控制器配置很多CPUs有能力直接连接多个中断源到CPU,而有些CPUs只能连接一个中断源到 CPU,任何中断管理必须由一个外部中断控制器设备处理。有些CPU具体以消息方式在独 立的总线的产生佶号,因此不需要连接多个中断到CPU。一些外部中断控制器也提供这个 功能來和CPU分离。VxBus中断控制器

20、驱动支持所有这些配置。中断控制器也有一个连接层次,一些中断控制器的输入连接到其它中断控制器的输出 上。更详细讨论参考4.8 Interrupt Controller Topologies and Hierarchies, p.5l。动态向一些硬件考虑中断标识的动态指派。独立的总线类型,如PCI,可能要定义针对处理 动态向虽的具体总线机制。对于一个PC1总线,这包括MSI和MS1-XO甚至没有任何具体 总线动态向呈指派,个别设备也会针对软件提供一种机制,写一个向虽到一个设备寄存器, 当设备产生中断时使用。现在比较流行的硬件,当一个中断控制器作为其他设备的相同多 功能芯片一部分时出现。这种情况下,

21、位于相同设备上时钟设备作为中断控制器和硬件要 求你写一个时钟芯片上的寄存器,包括中断控制器设备上的中断输入号。一些VxBus中断控制器驱动针对这些情况处理动态向虽指派。更详细的讨论参考4-/ Managing Dynamic Interrupt Vectors, p.55。中斷控制器驱动和多处理黔这些和多处理器相关的功能范围被中断控制器驱动处理。这包含具体于一个CPU的中 断指派,产生和内部处理器中断管理(IPIsk更多(fi 息参考4J3 Multiprocessor Issues with Vx Works SMPO4.3 VxBus驱动方法有三组驱动方法和中断控制器驱动有关。第一组要求基

22、本中断控制器功能。第二组处 理动态向虽指派。虽后一组处理多处理器相关的问题。4.3.1基本壮本部分列出的这个方法要求基本的中断控制器功能。vxblntCtlrConnect()funcvxbIntCtlrConnect()函数针对指定中断配迓了硬件,并关联提供的函数和参数到 合适的中断输入。local status funcfvxbintctlrconnect)1VXB_DEVICE_IDplntctlr,/*interrupt controller vxbus device per */VXB_DEVICE_IDpinst,/*interrupt source vxbus device pt

23、r */incindx,/*device interrupt index /void(*plsr)(void * pArg), /routine to be called /void *pftrg,/*parameter to be passed to routine */int *pinputPin/*found input pin for specified)device */vxblntCtlrDisconnect()funcvxbIntCtlrDisconnect()函数断开來门中断输入的具体的ISR和参数,若没有和其 它ISR共享,则禁用中断输入。local status func

24、xocbincctlrDisconnGct(vxb_device_id pintcclr,/* interrupt controller vxbusdevice ptr */VXB_DEVICE_ID plnst,/*interrupt source VXBusdevice ptr */intindx,/*device interrupt index/void(*plsr)(void * pArg), /*roucin to be called */void *pArg/*parameter to be passedto routine */)vxblntCtlrEnable()funcvxb

25、IntCtlrEnable()函数使能中断输入和使能标识具体ISR。LOCAL STATUS func vxbmtctIrEnableVXB_DEVICELIDpmcctlr,/* interrupt controller vxbusdevice ptr */VXB_DEVICE_IDplnst,/* interrupt source vxbusdevice ptr */int void void *indx,/* device interrupt index */(*plsr(void * pArg), /* roucine to be called */ pArg/* parameter

26、to be passedto routine */)vxblntCtlrDisable()funcvxbIntCtirDisab!e()函数标识具体ISR为禁用。若没有对应相同的中断输入没有 其它便能的ISRs,函数禁用输入。local status funcvxbintctlrDisablG(vxb_device_id pintctlr,/* interrupt controller vxbusdevice ptr */VXB_DEVICE_ID plnsc,/*interrupt source VXBusdevice ptr */intindx,/*dovicG intorrupt ind

27、ex */void(*plsr)(void * pArg), /*routine to be called /void *pArg/*parameter to be passedto routine */)4.3.2动态向量方法木部分列出的方法用于动态向虽指派。vxblntDynaVecConnect()vxblntDynaVecConnect()方法允许一个驱动请求调用的设备可以指派多个中断使用, 且每个中断一个具体的ISR、参数。当调用时,funcvxblntDynaVecConnect()函数导致中断向呈被指派给请求的设备,并 连接具体的ISRs和参数。LOCAL STATUS func

28、vxblntpynaVecConnect (VXB_DEVICELIDpintctlr,vxb_devicelidpins t,int veccount,struct vxblntDynaVeclnfo* dynavec动态向虽指派目前要求驱动调用一个具体的函数指派动态向呈,或BSP配置使用动态 向虽。更多信息,参考4.5 BSP Configuration.4.3.3多处理器方法本部分列出的方法用于多处理器系统。vxblntCtl rl ntReroute()funcvxblntCtlrlntReroute()函数重新路由一个具体的中断,从目前路由的CPU,到 destCpu参数指定的CPU

29、.LOCAL STATUS funcvxblntCtlrlntReroute)(VXB_DEVICEIDplnst,intindex,cpuset_tdesccpu)中断由设备指明,参数中指示索引。连接的相同输入上的所有中断被重新路由。vxblntCtlrCpuReroute()funcvxbIntCtlrCpuReroute()函数从目前路由的CPU重新路由中断.到destCpu参数 指定的CPU。local status funcvxbintctlrcpuReroute)(VXB_DEVICE_IDplnst,void *destCpu)当vxbIntCtlrIntReroute()具体于

30、一个单独中断输入时,(vxbIntCtlrCpuReroute()换数 路由所有为一个不同的CPU作为一个块的CPU配置的所有中断。也就是说,若BSP配迓 4个中断输入作为路由到CPU!,使用CPU路由表hwconf.c,之后 funcvxbIntCtlrCpuReroute()曲数的一个单独调用必须重新路由这个四个中断。vxlpiControlGet()内部处理器中断(IPIs)在多处理器系统中用于不同目的。函数返回指向一个结构 VXIPI_CTRL_INIT的指针,包含管理IPIs的信息。LOCAL VXIPI_CTRL_INIT * funcvxipicontrolGet(VXB_DEV

31、ICE_ID plnst,void * pArg)更多信息,参考 4.13.2 Interprocessor Interruptse4.4头文件VxBus中断控制器驱动由两个头文件。vxblntrCtlr.hvxblntrCtlr.h文件包含从BSP中获取需要的中断路由信息。 include vxblntCtlrLib.h当使用vxblntCtlrLib函数时,中断控制器驱动包含文件vxblntCtirLib.h,强烈推荐。这个头文件位于:/M.v/a/Dzr/vxworks-6v/target/src/hwif7intCtlr因此,风河中断控制器驱动简化:include MvxbIntCtl

32、rLibh“当一个第三方中断控制器驱动发布时,驱动应该位于如下目录:加皿7D/v wo r ks-6 j/ta rget/3 rd p arty/ivndor/d川er为了包含vxblntCtlrLib.h文件,这个目录下的makefile应为修改-I$(TGT_DIR) /src/hwif/intCtlr,增加到宏 EXTRAJNCLUDEoEXTRA_INCLUDE1$(TGT_DIR)/h(TGT_DIR)/sre/hwif/intCtlr这个修改运行第三方中断控制器驱动使用尖括号包含头文件:include 4.5 BSP配置儿乎所有中断控制器的设备寄存器都逻辑位于处理器总线上。针对这个

33、原因,儿乎所 有的中断控制器驱动需要hwconf.c文件。中断控制器驱动需要标准的hwconfx入口。然而, 中断控制器驱动也要求额外的入口來描述中断程序和配置。本章剩余部分讨论额外需求。在hwconf.c中用一系列表格描述中断。对于当下中断控制器驱动需要的任一个表,一 个资源入口包含一个指向表头的指针和一个资源入口包含表大小,包含在中断控制器资源 表中。在hwconf.c表包括:.一个中断程序表,input,列出了要连接到具体中断控制器中断输入上的设备。一个优先级表,priority,列出了个别中断输入的非默认优先级。.一个动态向St表,dynamiclnterrupt 或 dynamicI

34、nterruptTable,列岀 了要求动态向址 指派的设备。一个CPU函数表,cpuRoute,路由到处理器的设备,除了慕处理器系统中的 bootstrap 处理器。一个连接路由表,crossBar.针对每一个到中断控制器的中断源的输入引脚到输入引 脚函数。你可以想用其它的表。可以有,但风河不推荐。4.5.1中斷输入表中断输入伫息从BSP hwconf.c文件表中获取。输入信息由结构intrCtlrlnputs表表示, 定义在如下文件中:zn5m/D/r/vxworks.6a7target/h/hwif/vxbus/vxbIntrCtlr.h而开发驱动时,你不需要了解hwconf.c佶息,你

35、需要了解如下信息來测试你的驱动。/* intrCtlrlnputs structure is used co associate a device with* the interrupt controller to which the devices interrupt* output is connected. Note that nultiple devices can be* connected to a single iiqxit pin; therefore, mulciple* intrCtlrlnputs table entries can be present for a si

36、ngle* input pin. Also not that scoe input pins nay not be* connected, vhich may leave holes in the table, where no* entry is present for a specific input pin.*/struct intrCtlrlnputs int inputPin; char drvName; int drvUnit;int drvlndex;一个在设备资源列表中指向输入表开始的指针,资源名为input:,类型为 HCF_RES_ADDRO 表大小用 HCF_RESJNT

37、 类型的名 inputTableSize 表示。当你也驱动初始化SR时,vxblntCtlrLib 口动读这张表。每个关联到终点输入上的设备中断输出都在这张表中列岀。如下例子,修改 hpcNet8641 BSP,宏被扩展來表示数字值。其它变化用于演示目的。struct多个中断源可能真的一个单一的中断输入。在这个例子中,注明PCI S1O10中断输出 3(intD)连接到相同的中断控制器输入引脚,22,作为PCI Express中断输出。使用如下表示: 22, pciSlot, 0, 3 , 22, pciexpress, 0, 0 ),表中列出的输入引脚的次序是无关的。在这个例子中,输入的次序

38、已经被重新安排, 以至于每个中断源的输出都被分组。这慈味着展现在例子中的输入引脚排序已经被输入引 脚排序。这两个中断不会在相同配置上产生。然而,若产生在相同的配迓上,他们会出现 在相同的镜像中,没有其他副作用。4.5.2动态向量表系统中存在儿种动态向虽:表(参考4.11 Managing Dynamic Interrupt Vectors)包括具体 总线动态向址,如PC】总线类型上的消息信号中断(MSIs),如定制动态向虽支持包含一 个中断控制器设备的多功能芯片。创建的系统的支持动态向址表功能的中断控制器驱动必 须支持动态向虽。通常,有两种方法配制一个系统执行动态向星指派。你的设备驱动的第一个

39、方法是调 用一个特别的函数來安装动态向虽。若你需要安装多个ISRs到动态向虽,你必须使用这个 接LU这个选项通过一个特别的驱动方法來处理.用于支持动态向呈分配。BSP提供的第二种方法。这种情况下,驱动需要理解实现过程。中断输入破配置到 hwconfc文件中的input表中.指明一个设备名,一个设备单元号,和一个设备中断输岀。 使用VXB INTR DYNAMIC作为输入引脚表示这是一个动态向虽指派。如,为了指明PCI网络设备ynO输出0,应用使用一个动态产生向:B,表中如下行, 用input资源指定。 VXB_INTR_DYNAMIC, yn, 0, 0 ),任何中断源数可以用VXB_INTR

40、_DYNAMIC作为一个输入引脚指明。当ISR连接时, 每一个中断源必须有一个动态向虽指派。4.5.3 CPU路由表某些情况下,中断控制器驱动期望被用于多处理器环境下,中断控制器硬件可以路由 中断输入到处理器除了 bootstap处理器。这样环境下,BSP必须配置路由中断输入到额外 处理器。如下讨论集中在可选的VxWorks SMP产品,但是可能应用到不对称多处理器环 境下。路由中断输入到非默认CPUs通过中断控制器资源列表來配置。因为中断控制器仅可 以路由输入,所有在相同输入上的中断源必须路由在相同的时间路由到相同的CPU上,中 断输入由中断输入引脚号标识,非正常中断识别机制包括VXB.DE

41、VICE.ID和中断输出。使 用的结构intCtlrCpu.定义如下:/W5ra/Dzr/vxworks-6j:/target/h/hwif7vxbus/vxbIntrCtlr.h结构定义如下:* intrCtlrCpu is used on SMP systems only. It indicates“ which CPU the interrupt controller should route the* input pin toVstruct intrCtlrCpuint inputPin;int cpuNum;);注明:如上结构,cpuNum是逻辑CPU索引。如下是一个来口 hpcNe

42、t8641 BSP的CPU中断路由表的例子,使用左边的宏澄清。可 以作为垠小左右系统配置和性能的例子配置.不具备最佳中断性能。struct intrCtlrCpu epicCpu) EPTC_TSEC3ERR_:NT_VEC, 1 , EPTU_TSEC1ERR_INT_VEG 1 , EPIC_TSEC4ERR_INT_VECZ 1 , EPIC_TSEC2ERR_INT_VEC# 1 ;4.5.4中斷优先级VxBus中断控制器设计过程中,每个中断输入都被指派一个优先级。这一部分描述的 这个表用于在中断控制器上指派中断优先级到具体的中断输入。中断优先级更多信息和在 中断控制器驱动中发挥的作用

43、,参考4.9 Internipt Priority, p.52。和其它中断输入配置一样,中断如是的优先级在中断资源表中作为一个表格配置,入 口名priority为來指向表中第一个元素,入口.名priorityTableSize來表示优先级表的大小。 intrCtlrPrioritj-类型表,定义:/w/a/Dw/vxworks-6v/target/h/hwif7vxbus/vxblntrCtlr.h表定义如下:/* intrCtlrPriority is used to set the priority of a specified input pin on an interrupt cont

44、rollerstruct intrCtlrPriorityint inputPin;int priority;;15默认值不需要指明,但是所有英他的值需要。如下四EPIC中断控制器优先级指派 例子,用于 hpcNet8641 BSP。struct intrCtlrPriority epicPriority() ( EPIC_DUART2_INT_VEC/ 100 , EPIC_DUART_INT_VEC, 100 ;4.5.5交差路由表对于交差中断控制器,这是一个额外的结构定义,可以保持输入引脚,并校正输出引 脚。若没有指定,每个输入引脚被指派到以认输出,输出为0表示中断控制器驱动文档中 没有

45、说明。不会路由一个单一输入引脚到多个输出引脚。这会导致不可预知的结果。表中元素类型为intrCtlrXBar,定义:/w5/a/D/r/vxworks-6a7target/h/hwif/vxbus/vxbIntrCtlr.h表定义如下:struct intrCtlrXBarint inputPin;int outputPin;;如卜是來fl cav-cn3xxx_mipsi64r2sf BSP中hwconf.c文件中的例f o此BSP中断控制 器有两个输出,被虬由到cFu的硬件中断输入的引脚2或引脚3.const struct intrCtlrXBar mipsCavIntCtlrXBar(

46、/* inputPin, outputPin*/ 15,2 ), eth / pkt */ 55,2 ), /* timer 3 */ 54,2 ), /* timer 2 */ 53,2 )r /* timer 1 */ 52,2 )r /* timer 0 */ 32,3 ), /* mail boxes */ 33,2 )r 34,2 t /* uart 0 */ 35,2 ), /* uart 1 */ 36,2 )r 37,2 38,2 ), 39, 2 , 56, 2 ),4.6现有的工具函数针对中断控制器驱动有一系列工具函数。这些函数在vxblntCtlrLib库中。工具函数可

47、以划分为4类:正常操作下用于路由,展示函数,特殊目的的函数通常不用于中断控制器 驱动,可调用宏用于中断控制器驱动。正常情况下用于路由的函数:JntCtlrHwConfGet()-intCtlrISRAdd() JntCtlrISRDisable() JntCtlrISREnable() JntCtlrISRRemove() -intCtlrPinFind() JntCtlrTableArgGet() JntCtlrTableFlagsGet() JntCtlrTableIsrGet()展示函数为:JntCtlrHwConfShow()特别目的函数为:JntCtlrTabIeCreate()Jn

48、tCtlrTableFlagsSet() JntCtlrTabielIserSet()可调用宏为:-VXB_INTCTLR_ISR_CALL()-VXBJNTCTLR_PINENTRY_ENABLED() -VXB_INTCTLR_PINENTRY_ALLOCATED()这些函数在如下部分详细描述。原型,参考个人函数的API参考或如下文件中的前向 声明:z?.v/7/D/r/vxworks-6a7target/src/hwif7intCtlr/vxbIntCtlrLib.h4.6.1 intCtlrHwConfGet()intCtlrHwConfGet()读85戸hwconf.c文件中列出的中

49、断控制器资源。根据表中指针 读表中中断输入描述,中断输入优先级,输入引脚目的CPU (对于SMP系统)和CPU配 迓。当中断输入描述后,i$rHandle被更新用于反映I前的输入。isrHandle也包含输入的信 息。关于 isrHandle 的更多伫息,参考 4.12 Internal Representation of Interrupt Inputs, p.57。这 个路由只应该调用一次,在初始化函数第一阶段,后续不会调用。4.6.2 intCtlrISRAdd()当一个服务驱动连接一个ISR到它的中断时,intCtlrlSRAdd()被调用。启动这个过 程,服务驱动调用vxbIntCo

50、nnect()或vxbDynaIntConnect()。虽终,中断控制器驱动的连 接函数被调用。在连接函数中,中断控制器驱动必须关注任何必须的中断控制器硬件管理, 调用intCtlrISRAdd() to来更新isrHandle.并安装服务驱动的ISR。4.6.3 intCtlrISRDisabIe()当一个服务驱动禁用它的ISR时,调用intCtlrlSRDisable()。中断控制器驱动必须 保持中断输入使能,若任何服务设备ISR便能时,若连接到中断输入上的所有ISRs被禁用 后,仅禁用当前输入。中断控制器禁用函数必须调用这个函数來禁用isrHandle中的ISR 和保存返回值。若返回值为

51、TRUE,输入上的所有ISRs被禁用,且中断控制器可以禁用中 断输入。4.6.4 intCtlrISREnable()当一个服务驱动使能口身1SR时,intCtlrlSREnable( )彼调用。这个函数更新 isrHandle,导致当中断输入上产生中断时,指定ISR被调用。4.6.5 intCtirISRRemove()intCtlrlSRRemove()函数从 isrHandle 中移除指定的 ISR。4.6.6 intCtlrPinFind()intCtlrPinFind()用于査找指定服务设备中断连接的中断输入。中断输入可以之后用 于其它isrHandle的一个参数支持函数。这个函数通

52、常在蛊要中断输入号时,每个函数开始 调用一次,如连接、断开、使能、禁用一个ISR的函数。4.6.7 intCt!rTableArgGet()intCtlrTableArgGet()针对当下中断输入获取ISR的参数。大多数中断控制器驱动 不需要调用这个函数。然而,若驱动需要执行一些行为,如移动整个中断从一个地方到另 外一个地方时,可以调用。4.6.8 intCtlrTableFlagsGet()intCtlrTableFlagsGet()获取当下中断输入的标志。大参数中断控制器驱动不需要调 用这个函数。4.6.9 intCtlrTabieIsrGet()intCtlrTablelsrGet()获

53、取当下中断输入 1SR 函数指针。intCtlrTablelsrGet()返回 的值是一个函数指针,包含三个值中的其中一个:intCtlrStraylSRO,intCtlrChain!SR(). 或一个用户ISR。大多数中断控制器驱动不爲要调用这个函数。4.6.10 intCtlrHwConfShow()intCtlrHwConfShow()打印了 isrHandle的内容。然而,若展示函数没有包含在系统 配置中,不会产生输出。至于所有的VxBus使能设备驱动,每个中断控制器驱动可以声明busDevShowK )驱动 方法。若驱动被配置为这个功能.funcbusDevShow()函数调用int

54、CtlrHwConfShow()來提 供isrHandle相关的输出。4.6.11 intCtlrTableCreate()intCtlrTableCreate()保证指定中断输入的表入口存在。大多数驱动不需要调用这个 函数。4.6.12 intCtlrTableFlagsSet()intCtlrTableFlagsSet()设迓指定中断输入表中isrHandle的ilags变址。Flags域是 一个无符号整形。用于vxblntCtlrLib.c中的大多数flags都是为了以后使用。然而,中断控 制器驱动中已经存在的两位可以用于任何目的。是VXB_INTCTLR_SPECIFIC_1和 VXB

55、_INTCTLR_SPECI FIC_2。4.1.13 intCt!rTableUserSet()intCtlrTableUserSet()填充一个指定中断输入的isrHandle中的一个表入口。这个函 数填充和连接到中断输入上的和设备相关的指定倍息。这个函数在vxblntCtlrLib函数中调 用。大多数中断控制器驱动不需要调用这个函数。4.6.14 VXB_INTCTLR_ISR_CALL()V7CBJNTCTLR_ISR_CALL()宏正确调用连接到指定中断输入上的ISRs。若只有一个ISR 连接到中断输入,这个宏调用ISR。若有儿个ISRs连接到中断输入,宏变虽链表,轮流调 用每一个ISRo对于典型的中断控制器驱动,这个宏应该在中断控制器驱动的ISR回调中使用,当针 对口身中断输出调用vxblntConnect()时,中断控制器连接到上下中断控制器。对应特别处 理器体系结构的中断控制器驱动,这个宏应该拥有连接到具体体系结构中断关联代码中。4.6.15 VXB_INTCTLR_PINENTRY_ENABLED()VXBN TCTLR_PINENTRY_ENABLED()宏定义了是否顶层一个具体中断输入使 能。当中断是链路式的,每个1SR可以破独立便能或禁用。这个宏不检査独立ISRs,但是检 査顶层flag。大多数中断控制器驱动不需要

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论