]> jspc29.x-matter.uni-frankfurt.de Git - daqdata.git/commitdiff
Should work, produces (probably) double words in consec. accesses
authorhades <hades>
Sat, 27 May 2000 16:14:09 +0000 (16:14 +0000)
committerhades <hades>
Sat, 27 May 2000 16:14:09 +0000 (16:14 +0000)
hadaq/hwtip.c

index d7782f35401a0b8be5e550dbc25e59e45cf7f5f8..fc34e9956dc06981a44025c2602edfd164b28aa2 100644 (file)
@@ -1,5 +1,6 @@
 #include <assert.h>
 #include <string.h>
+#include <signal.h>
 
 #include <sys/time.h>
 #include <hadesstd.h>
 #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;
+}