From 289b0b777fd2f8d7dca5c990ef71f5baf74cfb90 Mon Sep 17 00:00:00 2001 From: hadaq Date: Fri, 20 Sep 2002 09:04:42 +0000 Subject: [PATCH] merged with wolgang-local, mt --- hadaq/hwtip.c | 123 +++++++++++++++++++++++++++++++++++++++++-------- hadaq/hwtrig.c | 38 +++++++++------ 2 files changed, 128 insertions(+), 33 deletions(-) diff --git a/hadaq/hwtip.c b/hadaq/hwtip.c index 3fa867b..84ad424 100644 --- a/hadaq/hwtip.c +++ b/hadaq/hwtip.c @@ -1,4 +1,4 @@ -static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtip.c,v 1.24 2002-05-27 21:22:15 hadaq Exp $"; +static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtip.c,v 1.25 2002-09-20 09:04:56 hadaq Exp $"; #include #include @@ -15,6 +15,11 @@ static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hada #include "hwtip.h" + +#define min(x,y) ( (x>y) ? y : x ) +#define max(x,y) ( (x>y) ? x : y ) + + static int ourVmeAccessOK; void sigbusHandler(int sig) @@ -23,7 +28,7 @@ void sigbusHandler(int sig) ourVmeAccessOK = 0; t->tv_sec = 0; - t->tv_nsec = 020000000; + t->tv_nsec = 20000000; nanosleep(t, NULL); } @@ -48,7 +53,7 @@ int conHwTip(HwTip * my, const char *name, const Param *param) } syslog(LOG_INFO, "conc cardbase %.8x", cardBase ); - my->lvme = malloc(sizeof(LVme)); + my->lvme = (LVme *)malloc(sizeof(LVme)); if (0 > conLVme(my->lvme, cardBase, 0x3000000UL, 0x09UL, 0, 0)) { syslog(LOG_ERR, "HwTip on %p not found", cardBase); return -1; @@ -79,7 +84,7 @@ void HwTip_requestBuffer(HwTip * my) #if 1 struct timespec tS, *t = &tS; t->tv_sec = 0; - t->tv_nsec = 020000000; + t->tv_nsec = 20000000; nanosleep(t, NULL); #endif } @@ -100,31 +105,109 @@ void HwTip_requestBuffer(HwTip * my) my->currAddr = my->fifo + 0x4; } -#define TIP_NODATASIZE 20 /* header + some tag word */ int HwTip_readSubEvt(HwTip * my, void *subEvt) { uint32_t *data = (uint32_t *) subEvt; - int lastAddr; - int currAddr = my->currAddr; - size_t size; + unsigned long currAddr = my->currAddr; + unsigned long header; + int size; + int statusWord, crateNumber = 0xff; + int foundCBLTTrailerFlag = 0; + int foundCBLTHeaderFlag = 0; + int errorFlag = 0; + unsigned long dataWord; + unsigned long tdcCounter = 0; + unsigned long tdcEventCounter, trigTag,evtC; + int arrayCounter = 0,i; + unsigned long tempArray[500]; + char str[200], buff[200]; + + header = LVme_getL(my->lvme, currAddr); + size = header & 0xfff; + if(size > 0xc00) { + syslog(LOG_ERR, "size is very large! size: %.8x ",size); + } - size = LVme_getL(my->lvme, currAddr); - lastAddr = currAddr + size; - my->currAddr = lastAddr; + my->currAddr += size<<2; - if (size > TIP_BUFSIZE) { - syslog(LOG_ERR, "found size: %.8x , address: %.8x, too long, fatal! ", size, currAddr); - return -1; + trigTag = ((header>>16) & 0xff); + if (size > (TIP_BUFSIZE >> 2)) { + syslog(LOG_ERR, "header: %.8x , address: %.8x, size too long! ",header,currAddr); + return (header & 0xfffff000) | 1; } - if( size <= TIP_NODATASIZE ) return 1; - /* copy one sub evt from RC to memory */ - *data++ = size; + while (--size) { + + /* *data++ = LVme_getL(my->lvme, currAddr+=4); */ + dataWord = LVme_getL(my->lvme, currAddr+=4); + *data++ = dataWord; + tempArray[arrayCounter++] = dataWord; + statusWord = ((dataWord>>24) & 0x7); + if( statusWord == 2 ) { + /* Header */ + tdcCounter++; + crateNumber = ((dataWord>>16) & 0xff); + if( foundCBLTHeaderFlag == 1) { + syslog(LOG_ERR, "header: %.8x, at least two headers came without a trailer, data: %.8x", + header, dataWord); + errorFlag = 1; + } + foundCBLTHeaderFlag = 1; + } + else if ( statusWord == 4 ) { + /* Trailer */ + tdcEventCounter = dataWord & 0xffffff; + foundCBLTTrailerFlag = 1; + if( foundCBLTTrailerFlag == 1 && foundCBLTHeaderFlag == 0) { + syslog(LOG_ERR, "header: %.8x, trailer came before header! data: %.8x", + header, dataWord); + errorFlag = 1; + } + + evtC = (tdcEventCounter &0xff); + /* if( (tdcEventCounter &0xff) != trigTag) { */ + if( (max(evtC, trigTag) - min(evtC, trigTag) >=2) && (max(evtC, trigTag) - min(evtC, trigTag) <= 0xfe )) { + syslog(LOG_ERR, "header: %.8x, crate: %d, tdc_num: %d, tag != EvtCounter, (%.8x,%.8x), dataWord: %.8x ", + header, crateNumber, tdcCounter, trigTag, tdcEventCounter, dataWord); + errorFlag = 1; + } + + foundCBLTTrailerFlag = 0; + foundCBLTHeaderFlag = 0; + } + else if (statusWord == 0) { + /* data word, nothing to do... */ + } + else { +#if 0 + syslog(LOG_ERR, "status word of tdc not 0,2 or 4, header: %.8x, data: %.8x", header, dataWord); + errorFlag = 1; +#endif + } - while ((currAddr+=4) < lastAddr) { - *data++ = LVme_getL(my->lvme, currAddr); + } + + if(errorFlag) { + str[0] = 0; + for(i=0;i < arrayCounter; i++) { + sprintf(buff, "%.8x ", tempArray[i]); + strcpy((char *) ((unsigned int)str + strlen(str)) , buff); + if( ((i+1)%4) == 0) { + syslog(LOG_ERR, str); + str[0] = 0; + } + } + if( (i%4)) { + syslog(LOG_ERR, str); + str[0] = 0; + } + + } + + return header; - return 0; } + + diff --git a/hadaq/hwtrig.c b/hadaq/hwtrig.c index a7ef3a6..1a1d8de 100644 --- a/hadaq/hwtrig.c +++ b/hadaq/hwtrig.c @@ -1,4 +1,4 @@ -static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtrig.c,v 6.29 2002-05-28 15:58:36 hadaq Exp $"; +static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtrig.c,v 6.30 2002-09-20 09:04:42 hadaq Exp $"; /* modified MU readout producing a dense pack of 16 Bit words. 15-March-2002, W. Koenig */ #define _POSIX_C_SOURCE 199309L @@ -130,7 +130,7 @@ void deleteHardware(Hardware *my) void Hardware_waitForTrigger(Hardware *my, void *partEvt) { - + /* * check if MU is ready */ @@ -143,7 +143,7 @@ void Hardware_waitForTrigger(Hardware *my, void *partEvt) events are processed. This is recommended, because it is very "expensive" to read from an Sharc Register in the Matching Unit. */ - + if(my->evtCount == my->old_evtCount) { while ((my->old_evtCount = LVme_getL(my->lvme0, MU_EVT_COUNT)) == my->evtCount) { /* wait for some time for not disturbing the DSP */ @@ -173,7 +173,7 @@ void Hardware_waitForTrigger(Hardware *my, void *partEvt) /* wait for some time for not disturbing the DSP */ struct timespec tS, *t = &tS; t->tv_sec = 0; - t->tv_nsec = 10000000; + t->tv_nsec = 20000000UL; nanosleep(t, NULL); } HwTip_getEndOfData(my->tip); @@ -222,10 +222,13 @@ int readoutTrig(Hardware *my, void *subEvt) void Hardware_readout(Hardware *my, void *partEvt) { - void *subEvt = SubEvt_data(partEvt); + void * subEvt = SubEvt_data(partEvt); + void * subEvtStart; static unsigned long trigNr = 0; uint8_t trigTag; int trigCode; + int header; + uint32_t * subEvtInfo; int i; SubEvt_setDecoding(partEvt, SubEvtDecoding_SubEvts); @@ -245,23 +248,32 @@ void Hardware_readout(Hardware *my, void *partEvt) * read out CONC */ + subEvtStart = subEvt; + subEvt = SubEvt_data(subEvtStart); + SubEvt_setDecoding(subEvtStart, SubEvtDecoding_32bitData); + SubEvt_setId(subEvtStart, 0x19c); + SubEvt_setTrigNr(subEvtStart, trigTag); + + /* leave space for an info word */ + subEvtInfo = (uint32_t *)subEvt; + ++(uint32_t *)subEvt; for (i = 0; i < NCRATES; i++) { - if( HwTip_readSubEvt(my->tip, subEvt)==0) { - if (trigTag != (SubEvt_trigNr(subEvt) & 0xff)) { - SubEvt_setId(subEvt, SubEvt_id(subEvt) | 0x80000000UL); + header=HwTip_readSubEvt(my->tip, subEvt); + if (trigTag != ((header>>16) & 0xff)) { + SubEvt_setId(subEvtStart, SubEvt_id(subEvtStart) | 0x80000000UL); SubEvt_setId(partEvt, SubEvt_id(partEvt) | 0x80000000UL); syslog(LOG_ERR, "(%s)Trigger tag mismatch: (crate: %d) 0x%08x (MU) != 0x%08x", - my->tip->name, i, trigTag, SubEvt_trigNr(subEvt)); + my->tip->name, i, trigTag, (header>>16) & 0xff); } - subEvt = SubEvt_next(partEvt, subEvt); - } + (uint32_t *)subEvt += (header & 0xfff)-1; } - + *subEvtInfo = header>>16; + SubEvt_setSize(subEvtStart, (uint32_t)subEvt - (uint32_t)subEvtStart); #endif - SubEvt_setSize(partEvt, (char *)subEvt - (char *)partEvt); + SubEvt_setSize(partEvt,(((uint32_t)subEvt+4) & 0xfffffff8) - (uint32_t)partEvt); SubEvt_setTrigNr(partEvt, (trigNr << 8) | trigTag); trigNr++; -- 2.43.0