Пример #1
0
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);
}
Пример #2
0
/**************************************************
* 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);
}
Пример #3
0
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;
}