⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vic068vme.c

📁 IXP425的BSP代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    return(retVal);    }/******************************************************************************** sysIntEnable - enable a bus interrupt level** This routine unmasks the VMEbus interrupt specified by <sysVMEIntNo>.  The* interrupt is presented to the processor as a value between INT0 and INT2 as * specified by the local variable <sysIPLNo>, which is computed internally by* this routine.** RETURNS: OK, or ERROR if <sysVMEIntNo> is greater than SYS_MAX_VME_INTS* or <sysIPLNo> is greater than 0x02.** SEE ALSO: sysIntDisable()*/STATUS sysIntEnable    (    int 	sysVMEIntNo		/* VME interrupt request number */    )    {    UINT32 	sysIplNo;    /* need to test for system defined constants in config.h  */    switch (sysVMEIntNo)	{	case INT_LVL_MBOX:	    sysIplNo = INT_LVL_MBOX - 1;	    break;	case INT_LVL_ENP:	    sysIplNo = INT_LVL_ENP - 1;	    break;	case INT_LVL_EX:	    sysIplNo = INT_LVL_EX - 1;	    break;        default:	    sysIplNo = DEFAULT_IPL;	}    if (sysVMEIntNo > SYS_MAX_VME_INTS || sysIplNo > 0x02)	return (ERROR);    sysIplNo = 1 << sysIplNo;    *(VIC_VICR1 + (sysVMEIntNo - 1) * 4) = sysIplNo;    *VIC_VIICR &= 0x7f;		/* enable global interrupt */    vxIMRSet (sysIplNo);    return (OK);    }/******************************************************************************** sysIntDisable - disable a bus interrupt level** This routine disables the VMEbus interrupt specified by <sysVMEIntNo>.  The* interrupt is presented to the processor as a value between * INT0 and INT2.  If the local variable <sysIPLNo>--computed internally in this* routine--is 0x00, sysIntDisable() cannot disable VMEbus * interrupts.** RETURNS: OK, or ERROR if <sysVMEIntNo> is greater than SYS_MAX_VME_INTS* or <sysIPLNo> is greater than 0x02.** SEE ALSO: sysIntEnable()*/STATUS sysIntDisable    (    int 	sysVMEIntNo		/* VME interrupt request number */    )    {    UINT32 	sysIplNo;    /* need to test for system defined constants in config.h  */    switch (sysVMEIntNo)	{	case INT_LVL_MBOX:	    sysIplNo = INT_LVL_MBOX - 1;	    break;	case INT_LVL_ENP:	    sysIplNo = INT_LVL_ENP - 1;	    break;	case INT_LVL_EX:	    sysIplNo = INT_LVL_EX - 1;	    break;        default:	    sysIplNo = DEFAULT_IPL;	}    sysIplNo = 1 << sysIplNo;    if (sysVMEIntNo > SYS_MAX_VME_INTS || sysIplNo > 0x04 ||	(*(VIC_VICR1 + (sysVMEIntNo - 1) * 4) & 0x07) != sysIplNo)	{	return (ERROR);	}    if (sysVMEIntNo != 0x00)        *(VIC_VICR1 + (sysVMEIntNo - 1) * 4) = 0x80 | sysIplNo;    return (OK);    }/******************************************************************************** sysBusIntAck - acknowledge a bus interrupt** This routine acknowledges a specified VMEbus interrupt level.** When an interrupt is presented to the 80960CA on XINT0 - XINT2, the vector* must be read to remove the interrupt request.  This routine returns the* vector for the specific interrupt priority level (IPL) line, which is read* from the interrupter interrupt control register on the VIC chip.** RETURNS: The VMEbus interrupt vector level.** SEE ALSO: sysBusIntGen()*/int sysBusIntAck    (    int	sysIntLvl		/* interrupt level to acknowledge */    )    {    return ((int) sysVMEIntAck ((((UINT32) * (VIC_VICR1 + (sysIntLvl - 1) * 4)				 & 0x07) >> 0x01)));    }/******************************************************************************** sysVMEIntAck - acknowledge a VMEbus interrupt** This routine acknowledges the VMEbus interrupt by interrupt level and IPL* number.** RETURNS: The VMEbus interrupt vector.** NOMANUAL*/UINT8 sysVMEIntAck    (    UINT32 sysIPLNo	/* IPL number on VIC chip */    )    {    UINT8 retVal;	/* status/id to be returned */    INT32 delay;	/* tmp val for delay */    switch(sysIPLNo)	{	case 0x00:	    retVal = *VIC_IACK_IPL0;	    break;	case 0x01:	    retVal = *VIC_IACK_IPL1;	    break;	case 0x02:	    retVal = *VIC_IACK_IPL2;	    break;	default:	    retVal = -1;	}    for (delay = 0; delay < 16; ++delay)	;    vxIPNDClear (1 << sysIPLNo);	/* clear pending bit in IPND reg */    return ((UINT8)retVal);    }/******************************************************************************** sysVicInit - initialize the registers in the vic chip** This initializes the VIC chip. Some of the defines are located in vic068.h* and some are in vic.h. This function is meant to be called from sysHwInit* only.** RETURNS: N/A*/LOCAL void sysVicInit (void)    {    *VIC_VIICR  = VIC_VIICR_INIT;     /* disable bus interrupt */    *VIC_ICMICR = VIC_ICMS_INIT;      /* disable mailbox interrupts */    *VIC_ICGICR = VIC_ICGS_INIT;      /* disable mailbox interrupts */    *VIC_ARCR   = ARCR_VBRL_BR3;      /* bus request level 3 */        /* set the VME and local time outs */        *VIC_TTR    = TTR_VTO_64 | TTR_LTO_64;        *VIC_RCR    = RCR_RWD;            /* release when done */    *VIC_ICR6   = ICR6_HALT_IRESET;   /* VMEbus HALT or IRESET asserted 6 */    *VIC_ICR7   = ICR7_SYSFAIL_INH;   /* turn off sysFail */        /* local bus timeout: 32us and VME: 64us */        *VIC_LBTR   = LBTR_PASL_10 | LBTR_PASH_3;        *VIC_ICSR   = 0x0;                  /* clear the mailbox switches */    *VIC_ICR    = VIC_ICONR_AS_STRETCH; /* stretch Address Strobe */    *VIC_SS1CR0 = 0x10;         /* A32 D32 */    *VIC_SS0CR0 = 0x14;		/* A24 D32 */    *VIC_SS1CR1 = 0x00;    *VIC_SS0CR1 = 0x00;    *VIC_ICR6   = 0x40;    *VIC_ICR7   = 0x80;    }/******************************************************************************** sysVicDump - dump the registers in the vic chip** This is the big endian version of vicDump. This was necessary because* vic068.h uses macro's instead of structures to define the vic interface.* Sprintf these to RAM, unless pointer is null.** RETURNS: Updated pointer if where is not NULL, otherwise NULL.** NOMANUAL*/int sysVicDump    (    char * where    )    {#define	VIC        ((struct vicChip *) VIC_BASE_ADRS)    FAST vicChip * vic = VIC;    if (where == NULL)	{        printf("\nvmeIntIntCntrl=%02x",vic->vmeIntIntCntrl.reg);	printf("\nvmeIntCntrl[1]=%02x",vic->vmeIntCntrl[0].reg);	printf("\tvmeIntCntrl[2]=%02x",vic->vmeIntCntrl[1].reg);	printf("\tvmeIntCntrl[3]=%02x",vic->vmeIntCntrl[2].reg);	printf("\nvmeIntCntrl[4]=%02x",vic->vmeIntCntrl[3].reg);	printf("\tvmeIntCntrl[5]=%02x",vic->vmeIntCntrl[4].reg);	printf("\tvmeIntCntrl[6]=%02x",vic->vmeIntCntrl[5].reg);	printf("\nvmeIntCntrl[7]=%02x",vic->vmeIntCntrl[6].reg);	printf("\tdmaIntCntrl=%02x",vic->dmaIntCntrl.reg);	printf("\nlocIntCntrl[1]=%02x",vic->locIntCntrl[0].reg);	printf("\tlocIntCntrl[2]=%02x",vic->locIntCntrl[1].reg);	printf("\tlocIntCntrl[3]=%02x",vic->locIntCntrl[2].reg);	printf("\nlocIntCntrl[4]=%02x",vic->locIntCntrl[3].reg);	printf("\tlocIntCntrl[5]=%02x",vic->locIntCntrl[4].reg);	printf("\tlocIntCntrl[6]=%02x",vic->locIntCntrl[5].reg);	printf("\nlocIntCntrl[7]=%02x",vic->locIntCntrl[6].reg);	printf("\nicgsIntCntrl=%02x",vic->icgsIntCntrl.reg);	printf("\ticmsIntCntrl=%02x",vic->icmsIntCntrl.reg);	printf("\terrIntCntrl=%02x",vic->errIntCntrl.reg);	printf("\ticgsVecBase=%02x",vic->icgsVecBase.reg);	printf("\nicmsVecBase=%02x",vic->icmsVecBase.reg);	printf("\tlocVecBase=%02x",vic->locVecBase.reg);	printf("\nerrVecBase=%02x",vic->errVecBase.reg);	printf("\ticSwitch=%02x",vic->icSwitch.reg);	printf("\nicr[0]=%02x",vic->icr[0].reg);	printf("\ticr[1]=%02x",vic->icr[1].reg);	printf("\ticr[2]=%02x",vic->icr[2].reg);	printf("\ticr[3]=%02x",vic->icr[3].reg);	printf("\nicr[4]=%02x",vic->icr[4].reg);	printf("\ticr[5]=%02x",vic->icr[5].reg);	printf("\ticr[6]=%02x",vic->icr[6].reg);	printf("\ticr[7]=%02x",vic->icr[7].reg);	printf("\nvmeIntReqStat=%02x",vic->vmeIntReqStat.reg);	printf("\nvmeIntVec[1]=%02x",vic->vmeIntVec[0].reg);	printf("\tvmeIntVec[2]=%02x",vic->vmeIntVec[1].reg);	printf("\tvmeIntVec[3]=%02x",vic->vmeIntVec[2].reg);	printf("\nvmeIntVec[4]=%02x",vic->vmeIntVec[3].reg);	printf("\tvmeIntVec[5]=%02x",vic->vmeIntVec[4].reg);	printf("\tvmeIntVec[6]=%02x",vic->vmeIntVec[5].reg);	printf("\nvmeIntVec[7]=%02x",vic->vmeIntVec[6].reg);	printf("\ttranTimeOut=%02x",vic->tranTimeOut.reg);	printf("\tlocBusTiming=%02x",vic->locBusTiming.reg);	printf("\nvmeConfig0=%02x",vic->vmeConfig0.reg);	printf("\tvmeConfig1=%02x",vic->vmeConfig1.reg);	printf("\tarbReqConfig=%02x",vic->arbReqConfig.reg);	printf("\naddModSrc=%02x",vic->addModSrc.reg);	printf("\tberrStat=%02x",vic->berrStat.reg);	printf("\tdmaStat=%02x",vic->dmaStat.reg);	printf("\nslvSel0Cntrl0=%02x",vic->slvSel0Cntrl0.reg);	printf("\tslvSel0Cntrl1=%02x",vic->slvSel0Cntrl1.reg);	printf("\tslvSel1Cntrl0=%02x",vic->slvSel1Cntrl0.reg);	printf("\nslvSel1Cntrl1=%02x",vic->slvSel1Cntrl1.reg);	printf("\trelCntrl=%02x",vic->relCntrl.reg);	printf("\tblkTranCntrl=%02x",vic->blkTranCntrl.reg);	printf("\nblkTranLen0=%02x",vic->blkTranLen0.reg);	printf("\tblkTranLen1=%02x",vic->blkTranLen1.reg);	printf("\tsysReset=%02x",vic->sysReset.reg);		printf("\n");	}    else	{	where += sprintf(where," vmeIntIntCntrl=%02x",vic->vmeIntIntCntrl.reg);	where += sprintf(where," vmeIntCntrl[1]=%02x",vic->vmeIntCntrl[0].reg);	where += sprintf(where," vmeIntCntrl[2]=%02x",vic->vmeIntCntrl[1].reg);	where += sprintf(where," vmeIntCntrl[3]=%02x",vic->vmeIntCntrl[2].reg);	where += sprintf(where," vmeIntCntrl[4]=%02x",vic->vmeIntCntrl[3].reg);	where += sprintf(where," vmeIntCntrl[5]=%02x",vic->vmeIntCntrl[4].reg);	where += sprintf(where," vmeIntCntrl[6]=%02x",vic->vmeIntCntrl[5].reg);	where += sprintf(where," vmeIntCntrl[7]=%02x",vic->vmeIntCntrl[6].reg);	where += sprintf(where," dmaIntCntrl=%02x",vic->dmaIntCntrl.reg);	where += sprintf(where," locIntCntrl[1]=%02x",vic->locIntCntrl[0].reg);	where += sprintf(where," locIntCntrl[2]=%02x",vic->locIntCntrl[1].reg);	where += sprintf(where," locIntCntrl[3]=%02x",vic->locIntCntrl[2].reg);	where += sprintf(where," locIntCntrl[4]=%02x",vic->locIntCntrl[3].reg);	where += sprintf(where," locIntCntrl[5]=%02x",vic->locIntCntrl[4].reg);	where += sprintf(where," locIntCntrl[6]=%02x",vic->locIntCntrl[5].reg);	where += sprintf(where," locIntCntrl[7]=%02x",vic->locIntCntrl[6].reg);	where += sprintf(where," icgsIntCntrl=%02x",vic->icgsIntCntrl.reg);	where += sprintf(where," icmsIntCntrl=%02x",vic->icmsIntCntrl.reg);	where += sprintf(where," errIntCntrl=%02x",vic->errIntCntrl.reg);	where += sprintf(where," icgsVecBase=%02x",vic->icgsVecBase.reg);	where += sprintf(where," icmsVecBase=%02x",vic->icmsVecBase.reg);	where += sprintf(where," locVecBase=%02x",vic->locVecBase.reg);	where += sprintf(where," errVecBase=%02x",vic->errVecBase.reg);	where += sprintf(where," icSwitch=%02x",vic->icSwitch.reg);	where += sprintf(where," icr[0]=%02x",vic->icr[0].reg);	where += sprintf(where," icr[1]=%02x",vic->icr[1].reg);	where += sprintf(where," icr[2]=%02x",vic->icr[2].reg);	where += sprintf(where," icr[3]=%02x",vic->icr[3].reg);	where += sprintf(where," icr[4]=%02x",vic->icr[4].reg);	where += sprintf(where," icr[5]=%02x",vic->icr[5].reg);	where += sprintf(where," icr[6]=%02x",vic->icr[6].reg);	where += sprintf(where," icr[7]=%02x",vic->icr[7].reg);	where += sprintf(where," vmeIntReqStat=%02x",vic->vmeIntReqStat.reg);	where += sprintf(where," vmeIntVec[1]=%02x",vic->vmeIntVec[0].reg);	where += sprintf(where," vmeIntVec[2]=%02x",vic->vmeIntVec[1].reg);	where += sprintf(where," vmeIntVec[3]=%02x",vic->vmeIntVec[2].reg);	where += sprintf(where," vmeIntVec[4]=%02x",vic->vmeIntVec[3].reg);	where += sprintf(where," vmeIntVec[5]=%02x",vic->vmeIntVec[4].reg);	where += sprintf(where," vmeIntVec[6]=%02x",vic->vmeIntVec[5].reg);	where += sprintf(where," vmeIntVec[7]=%02x",vic->vmeIntVec[6].reg);	where += sprintf(where," tranTimeOut=%02x",vic->tranTimeOut.reg);	where += sprintf(where," locBusTiming=%02x",vic->locBusTiming.reg);	where += sprintf(where," vmeConfig0=%02x",vic->vmeConfig0.reg);	where += sprintf(where," vmeConfig1=%02x",vic->vmeConfig1.reg);	where += sprintf(where," arbReqConfig=%02x",vic->arbReqConfig.reg);	where += sprintf(where," addModSrc=%02x",vic->addModSrc.reg);	where += sprintf(where," berrStat=%02x",vic->berrStat.reg);	where += sprintf(where," dmaStat=%02x",vic->dmaStat.reg);	where += sprintf(where," slvSel0Cntrl0=%02x",vic->slvSel0Cntrl0.reg);	where += sprintf(where," slvSel0Cntrl1=%02x",vic->slvSel0Cntrl1.reg);	where += sprintf(where," slvSel1Cntrl0=%02x",vic->slvSel1Cntrl0.reg);	where += sprintf(where," slvSel1Cntrl1=%02x",vic->slvSel1Cntrl1.reg);	where += sprintf(where," relCntrl=%02x",vic->relCntrl.reg);	where += sprintf(where," blkTranCntrl=%02x",vic->blkTranCntrl.reg);	where += sprintf(where," blkTranLen0=%02x",vic->blkTranLen0.reg);	where += sprintf(where," blkTranLen1=%02x",vic->blkTranLen1.reg);	where += sprintf(where," sysReset=%02x",vic->sysReset.reg);	}    return ((int) where);    }/******************************************************************************** sysMailboxTblDump - dump the mailbox table contents** RETURNS: N/A** NOMANUAL*/void sysMailboxTblDump (void)    {    int ix;    for (ix = 0; ix < VIC_MAILBOX_TOTAL; ix++)        printf ("routine: %#x  arg: %#x connected: %#x\n",	    (int) mailTab[ix].sysMailboxRoutine,	    mailTab[ix].sysMailboxArg,	    mailTab[ix].sysMailboxConnected);    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -