int ipmIntConnect ( int carrier, int slot, int vecNum, void (*routine)(int parameter), int parameter ) { if (carrier < 0 || carrier >= carriers.number || slot < 0 || vecNum < 0 || vecNum > 0xff) { return S_IPAC_badAddress; } /* If the carrier driver doesn't provide a suitable routine... */ if (carriers.info[carrier].driver->intConnect == NULL) { #ifdef vxWorks /* We know casting int <--> void* works */ return devConnectInterrupt(intVME, vecNum, (void (*)(void *))routine, (void *)parameter); #else struct intData *pisr = (struct intData *) mallocMustSucceed( sizeof(struct intData), "ipmIntConnect"); pisr->routine = routine; pisr->parameter = parameter; return devConnectInterrupt(intVME, vecNum, intShim, (void *)pisr); #endif } return carriers.info[carrier].driver->intConnect( carriers.info[carrier].cPrivate, slot, vecNum, routine, parameter); }
/************************************************** * scalerISRSetup() ***************************************************/ STATIC int scalerISRSetup(int card) { long status; volatile char *addr; int intLevel; Debug(5, "scalerISRSetup: Entry, card #%d\n", card); if ((card+1) > scaler_total_cards) return(ERROR); addr = scaler_state[card]->localAddr; status = devConnectInterrupt(intVME, vsc_InterruptVector + card, (void *) &scalerISR, (void *) card); if (!RTN_SUCCESS(status)) { errPrintf(status, __FILE__, __LINE__, "Can't connect to vector %ld\n", vsc_InterruptVector + card); return (ERROR); } /* get interrupt level from hardware, and enable that level in EPICS */ intLevel = readReg16(addr,IRQ_LEVEL_ENABLE_OFFSET) & 5 /*3*/; Debug(5, "scalerISRSetup: Interrupt level %d\n", intLevel); status = devEnableInterruptLevel(intVME, intLevel); if (!RTN_SUCCESS(status)) { errPrintf(status, __FILE__, __LINE__, "Can't enable enterrupt level %d\n", intLevel); return (ERROR); } /* Write interrupt vector to hardware */ writeReg16(addr,IRQ_VECTOR_OFFSET,(unsigned short) (vsc_InterruptVector + card)); Debug(5, "scalerISRSetup: Exit, card #%d\n", card); return (OK); }
int ni1014Config(char *portNameA,char *portNameB, int base, int vector, int level, int priority, int noAutoConnect) { niport *pniportArray[2] = {0,0}; int size; int indPort,nports; long status; if(nloopsPerMicrosecond==0) initAuxmrWait(); nports = (portNameB==0 || strlen(portNameB)==0) ? 1 : 2; for(indPort=0; indPort<nports; indPort++) { niport *pniport; size = sizeof(niport); size += (indPort==0) ? strlen(portNameA) : strlen(portNameB); size += 1; pniport = callocMustSucceed(size,sizeof(char),"ni1014Config"); pniportArray[indPort] = pniport; pniport->portName = (char *)(pniport+1); strcpy(pniport->portName,((indPort==0) ? portNameA : portNameB)); pniport->base = base; pniport->vector = vector; pniport->level = level; pniport->eos = -1; pniport->waitForInterrupt = epicsEventMustCreate(epicsEventEmpty); callbackSetCallback(srqCallback,&pniport->callback); callbackSetUser(pniport,&pniport->callback); status = devRegisterAddress("drvNi1014", atVMEA16, pniport->base, PORT_REGISTER_SIZE/2,(volatile void **)&pniport->registers); if(status) { printf("%s ni1014Config devRegisterAddress failed\n",pniport->portName); return(-1); } /* attach the interrupt handler routines */ status = devConnectInterrupt(intVME,pniport->vector, ni1014,(void *)pniport); if(status) { errMessage(status,"ni1014: devConnectInterrupt"); return -1; } status = devConnectInterrupt(intVME,pniport->vector+1, ni1014Err,(void *)pniport); if(status) { errMessage(status,"ni1014: devConnectInterrupt"); return -1; } status = devEnableInterruptLevel(intVME,pniport->level); if(status) { errMessage(status,"ni1014: devEnableInterruptLevel"); return -1; } pniport->isPortA = (indPort==0) ? 1 : 0; pniport->asynGpibPvt = pasynGpib->registerPort(pniport->portName, ASYN_MULTIDEVICE|ASYN_CANBLOCK, !noAutoConnect,&gpibPort,pniport,priority,0); base = base + PORT_REGISTER_SIZE; vector += 2; } return 0; }