📄 vic068vme.c
字号:
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 + -