-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwrace.c,v 6.17 2002-04-19 19:12:11 hadaq Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwrace.c,v 6.18 2002-10-08 16:04:20 hadaq Exp $";
#define _POSIX_C_SOURCE 199309L
#include "rc.h"
#include "hwrace.h"
-#define RCPAGESIZE 256
-
-static int bankRequested(HwRace *my)
-{
- return my->bankRequested;
-}
-
-static int bankConfirmed(HwRace *my)
-{
- return Rc_bankConfirmed(my->rc);
-}
-
-static int endOfData(HwRace *my)
-{
- return Rc_getPages(my->rc) * RCPAGESIZE;
-}
int conHwRace(HwRace *my, const char *name, const Param *param)
{
syslog(LOG_ERR, "%s:%d:%s", __FILE__, __LINE__, strerror(errno));
return -1;
}
+ my->currAddr = 0x7fffffff;
+ my->endOfData = 0;
- my->bankRequested = Rc_bankRequested(my->rc);
return 0;
}
{
my->currAddr = 0;
- my->bankRequested = my->bankRequested == 1 ? 0 : 1;
Rc_setSwrq(my->rc);
Rc_clrSwrq(my->rc);
}
-int HwRace_isBusy(HwRace *my)
-{
- int br, bc;
-
- br = bankRequested(my);
- bc = bankConfirmed(my);
-
- return br != bc;
-}
-
-int HwRace_isEmpty(HwRace *my)
-{
- return my->currAddr >= endOfData(my);
-}
-#define MAXRACELENGTH 99997 /* in bytes */
+#define RACE_NODATASIZE 0x10
int HwRace_readSubEvt(HwRace *my, void *subEvt)
{
- uint32_t *data = (uint32_t *) subEvt;
+ uint32_t * data = (uint32_t *) subEvt;
int lastAddr;
int currAddr;
int size;
currAddr = my->currAddr;
size = Rc_readMem(my->rc, currAddr);
- lastAddr = currAddr + size;
-#if 1
- if (size > MAXRACELENGTH ) {
- *data++ = 16;
- currAddr+=4;
- *data++ = Rc_readMem(my->rc, currAddr);
- currAddr+=4;
- *data++ = Rc_readMem(my->rc, currAddr) | 0x80000000UL;
- currAddr+=4;
- *data++ = Rc_readMem(my->rc, currAddr) |(size<<16);
- } else {
- *data++ = size;
- /* copy one sub evt from RC to memory */
- while ((currAddr+=4) < lastAddr) {
- *data++ = Rc_readMem(my->rc, currAddr);
- }
- }
-#endif
- /* align currAddr to next page */
+ lastAddr = my->currAddr + size;
+
+ /* align my->currAddr to next page */
if ((lastAddr & 0xff) != 0) {
- my->currAddr = (lastAddr / RCPAGESIZE + 1) * RCPAGESIZE;
+ my->currAddr = ((lastAddr >> RCPAGEBITSHIFT) + 1)<< RCPAGEBITSHIFT;
} else {
my->currAddr = lastAddr;
}
+ if (size <= RACE_NODATASIZE) return 0;
+
+ /* copy one sub evt from RC to memory */
+ *data++ = size;
+ while ((currAddr+=4) < lastAddr) {
+ *data++ = Rc_readMem(my->rc, currAddr);
+ }
+
#ifndef NDEBUG
syslog(LOG_DEBUG, "subEvt: %s", SubEvt_2charP(subEvt));
#endif
- return 0;
+ return size;
}
-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwrich.c,v 6.22 2002-04-19 19:11:01 hadaq Exp $";
-
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwrich.c,v 6.23 2002-10-08 16:04:20 hadaq Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
size_t maxSubEvtSize;
HwRace *race[NRACES];
LInt *lInt[NRACES];
- LVme *dtu;
};
#include "hardware.h"
}
my->lInt[i] = malloc(sizeof(LInt));
conLInt(my->lInt[i], 100 + i);
-
- }
- my->dtu = malloc(sizeof(LVme));
- if(0 > conLVme(my->dtu, 0x44100000, 0x10000, 0x09, 0x3c, 1)) {
- syslog(LOG_DEBUG,"Rich DTU not found");
- return -1;
}
desParam(param);
desHwRace(my->race[i]);
free(my->race[i]);
}
- desLVme(my->dtu);
- free(my->dtu);
-
free(my);
}
{
int i;
- LVme_setL(my->dtu,0x00 ,0x22); /* dtu busy on */
for (i = 0; i < NRACES; i++) {
if (HwRace_isEmpty(my->race[i])) {
HwRace_requestBuffer(my->race[i]);
#endif
}
}
- LVme_setL(my->dtu,0x00 ,0x02); /* dtu busy off */
+
for (i = 0; i < NRACES; i++) {
- if(HwRace_BufIsRequested(my->race[i])) {
+ if(HwRace_isBufRequested(my->race[i])) {
LInt_wait(my->lInt[i]);
+ HwRace_getEndOfData(my->race[i]);
#ifndef NDEBUG
syslog(LOG_DEBUG, "%d irq received", i);
#endif
void *subEvt = SubEvt_data(partEvt);
static uint32_t trigNr = 0;
uint32_t trigTag;
+ int firstRace;
+ int size;
/* init partial event, necessary for SubEvt_next() */
SubEvt_setDecoding(partEvt, SubEvtDecoding_SubEvts);
SubEvt_setId(partEvt, 0);
/* read all races, check for common trigger tag */
- LVme_setL(my->dtu,0x00 ,0x22); /* dtu busy on */
+ firstRace = -1;
for (i = 0; i < NRACES; i++) {
- HwRace_readSubEvt(my->race[i], subEvt);
- if (i == 0) {
+ if((size=HwRace_readSubEvt(my->race[i], subEvt)) > 0) {
+ if (firstRace < 0) {
trigTag = SubEvt_trigNr(subEvt) & 0xff;
- } else {
+ firstRace = i;
+ } else {
if (trigTag != (SubEvt_trigNr(subEvt) & 0xff)) {
SubEvt_setId(subEvt, SubEvt_id(subEvt) | 0x80000000UL);
SubEvt_setId(partEvt, SubEvt_id(partEvt) | 0x80000000UL);
- syslog(LOG_ERR, "(%s)Trigger tag mismatch: 0x%08x != 0x%08x",
- my->race[i]->name,trigTag, SubEvt_trigNr(subEvt));
+ syslog(LOG_ERR, "(%s)Trigger tag mismatch: 0x%08x (%d) != 0x%08x",
+ my->race[i]->name,trigTag,firstRace,SubEvt_trigNr(subEvt));
}
+ }
+ /* this does 64 bit alignment, should be replaced by a function */
+ (char *)subEvt += (size+4) & 0xffffff8;
}
- subEvt = SubEvt_next(partEvt, subEvt);
}
- LVme_setL(my->dtu,0x00 ,0x02); /* dtu busy off */
SubEvt_setTrigNr(partEvt, trigNr << 8 | trigTag);
SubEvt_setSize(partEvt, (char *)subEvt - (char *)partEvt);
- trigNr++;
+ trigNr++;
assert(SubEvt_size(partEvt) <= my->maxSubEvtSize);
#ifndef NDEBUG