#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;
}
#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;
+}