From ed22efdd9159b4dd0e2a67b1b135a27fd3daa1b6 Mon Sep 17 00:00:00 2001 From: hades Date: Sat, 27 May 2000 16:14:09 +0000 Subject: [PATCH] Should work, produces (probably) double words in consec. accesses --- hadaq/hwtip.c | 224 +++++++++++++++++++++++++++++--------------------- 1 file changed, 130 insertions(+), 94 deletions(-) diff --git a/hadaq/hwtip.c b/hadaq/hwtip.c index d7782f3..fc34e99 100644 --- a/hadaq/hwtip.c +++ b/hadaq/hwtip.c @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -13,8 +14,30 @@ #include "tof_defs.h" #include "hwtip.h" +static int ourVmeAccessOK; -static int bankRequested(HwTip *my) { +void sigbusHandler(int sig) +{ + struct timespec tS, *t = &tS; + + ourVmeAccessOK = 0; + t->tv_sec = 0; + t->tv_nsec = 020000000; + nanosleep(t, NULL); +} + +static LVme_L berrGetL(LVme * my, unsigned long offset) +{ + LVme_L retVal; + do { + ourVmeAccessOK = 1; + retVal = LVme_getL(my, offset); + } while (!ourVmeAccessOK); + return retVal; +} + +static int bankRequested(HwTip * my) +{ UInt2 val; val = my->bankRequested; @@ -22,127 +45,140 @@ static int bankRequested(HwTip *my) { } #if 0 -static int bankConfirmed(HwTip *my) { +static int bankConfirmed(HwTip * my) +{ UInt2 val; val = -1; return val; } + #endif -static int endOfData(HwTip *my) { - return LVme_getL(my->lvme, my->fifo) + my->fifo; +static int endOfData(HwTip * my) +{ + return my->pipeSize + my->fifo; } int conHwTip(HwTip * my, const char *name, const Param *param) { - unsigned long cardBase; - int i; - - assert(my != NULL); - - strcpy(my->name, name); - - cardBase = Param_getVal(param, my->name, "cardbase"); - my->lvme = allocMem(sizeof(LVme)); - if (0 > conLVme(my->lvme, cardBase, 0x10000000UL, 0x09UL, 0, 0)) { - msglog(LOG_ERR, "HwTip on %p not found\n", cardBase); - return -1; - } - my->currAddr = 0xffffffff; /* start at the end */ - my->bankRequested = 1; /* of the empty bank */ - my->pipeFull = 2; - my->daqRq = 1; - my->daqGr = 13; - my->fifo = LVL2_PIPE2_BASE; - - return 0; + unsigned long cardBase; + int i; + + assert(my != NULL); + + signal(SIGBUS, sigbusHandler); + strcpy(my->name, name); + + cardBase = Param_getVal(param, my->name, "cardbase"); + my->lvme = allocMem(sizeof(LVme)); + if (0 > conLVme(my->lvme, cardBase, 0x2000000UL, 0x09UL, 0, 0)) { + msglog(LOG_ERR, "HwTip on %p not found\n", cardBase); + return -1; + } + my->currAddr = 0xffffffff; /* start at the end */ + my->bankRequested = 1; /* of the empty bank */ + my->pipeFull = 2; + my->daqRq = 1; + my->daqGr = 13; + my->fifo = LVL2_PIPE2_BASE; + + return 0; } void desHwTip(HwTip * my) { - desLVme(my->lvme); + desLVme(my->lvme); + signal(SIGBUS, SIG_DFL); } -void HwTip_requestBuffer(HwTip *my) { +void HwTip_requestBuffer(HwTip * my) +{ - do { - LVme_clrBitL(my->lvme, EXT_DAQ, my->daqRq); - } while(LVme_tstBitL(my->lvme, EXT_DAQ, my->daqRq)); + LVme_clrBitL(my->lvme, EXT_DAQ, my->daqRq); - while (LVme_tstBitL(my->lvme, EXT_STATUS, my->daqGr)) { + while (LVme_tstBitL(my->lvme, EXT_STATUS, my->daqGr)) { #if 1 - struct timespec tS, *t = &tS; - t->tv_sec = 0; - t->tv_nsec = 020000000; - nanosleep(t, NULL); + struct timespec tS, *t = &tS; + t->tv_sec = 0; + t->tv_nsec = 020000000; + nanosleep(t, NULL); #endif - } - if (my->bankRequested == 0) { - my->bankRequested = 1; - my->pipeFull = 2; - my->daqRq = 1; - my->daqGr = 13; - my->fifo = LVL2_PIPE2_BASE; - } else { - my->bankRequested = 0; - my->pipeFull = 1; - my->daqRq = 0; - my->daqGr = 12; - my->fifo =LVL2_PIPE1_BASE; - } - msglog(LOG_DEBUG, "wait for data\n"); - while (!LVme_tstBitL(my->lvme, EXT_STATUS, my->pipeFull)) { + } + if (my->bankRequested == 0) { + my->bankRequested = 1; + my->pipeFull = 2; + my->daqRq = 1; + my->daqGr = 13; + my->fifo = LVL2_PIPE2_BASE; + } else { + my->bankRequested = 0; + my->pipeFull = 1; + my->daqRq = 0; + my->daqGr = 12; + my->fifo = LVL2_PIPE1_BASE; + } + msglog(LOG_DEBUG, "wait for data\n"); + while (!LVme_tstBitL(my->lvme, EXT_STATUS, my->pipeFull)) { #if 1 - struct timespec tS, *t = &tS; - t->tv_sec = 0; - t->tv_nsec = 020000000; - nanosleep(t, NULL); + struct timespec tS, *t = &tS; + t->tv_sec = 0; + t->tv_nsec = 020000000; + nanosleep(t, NULL); #endif - } - msglog(LOG_DEBUG, "data available\n"); - do { - LVme_setBitL(my->lvme, EXT_DAQ, my->daqRq); - } while(!LVme_tstBitL(my->lvme, EXT_DAQ, my->daqRq)); + } + msglog(LOG_DEBUG, "data available\n"); + LVme_setBitL(my->lvme, EXT_DAQ, my->daqRq); - my->currAddr = my->fifo + 0x8; -} +#if 0 + { + int i; + unsigned size; + + size = berrGetL(my->lvme, my->fifo); + msglog(LOG_DEBUG, "fifo size: 0x%08x\n", size); + for (i = 0; i < size; i += 4) { + msglog(LOG_DEBUG, "fifo data: 0x%08x\n", berrGetL(my->lvme, my->fifo + i)); + } + } +#endif -int HwTip_isBusy(HwTip *my) { - return !LVme_tstBitL(my->lvme, EXT_STATUS, my->daqGr); + my->currAddr = my->fifo + 0x8; + my->pipeSize = berrGetL(my->lvme, my->fifo); } -int HwTip_isEmpty(HwTip *my) { - return my->currAddr >= endOfData(my); +int HwTip_isBusy(HwTip * my) +{ + return !LVme_tstBitL(my->lvme, EXT_STATUS, my->daqGr); } -int HwTip_readSubEvt(HwTip *my, void *subEvt) { - UInt4 *data = (UInt4 *)subEvt; - int firstAddr; - size_t size; - UInt1 trigTag; - - do { - size = LVme_getL(my->lvme, my->currAddr); - } while (size == 0xffffffff); - - /* copy one sub evt from RC to memory */ - for (firstAddr = my->currAddr; my->currAddr - firstAddr < size; my->currAddr += 4) { - do { - *data = LVme_getL(my->lvme, my->currAddr); - } while (*data == 0xffffffff); - data++; - } - - trigTag = SubEvt_trigNr(subEvt) & 0xff; - - /* normal extension of trigger tag */ - SubEvt_setTrigNr(subEvt, my->trigNr << 8 | trigTag); - my->trigNr++; - - return 0; +int HwTip_isEmpty(HwTip * my) +{ + return my->currAddr >= endOfData(my); } - - - +int HwTip_readSubEvt(HwTip * my, void *subEvt) +{ + UInt4 *data = (UInt4 *) subEvt; + int firstAddr; + size_t size; + UInt1 trigTag; + + size = berrGetL(my->lvme, my->currAddr); + msglog(LOG_DEBUG, "size: 0x%08x\n", size); + if (size > 0x60) { + msglog(LOG_ERR, "size too large: 0x%08x on 0x%08x\n", size, my->currAddr); + } + /* copy one sub evt from RC to memory */ + for (firstAddr = my->currAddr; my->currAddr - firstAddr < size; my->currAddr += 4) { + *data++ = berrGetL(my->lvme, my->currAddr); + } + + trigTag = SubEvt_trigNr(subEvt) & 0xff; + + /* normal extension of trigger tag */ + SubEvt_setTrigNr(subEvt, my->trigNr << 8 | trigTag); + my->trigNr++; + + return 0; +} -- 2.43.0