|
|
|
@ -23,7 +23,7 @@
|
|
|
|
|
// Global variable from slsDetectorServer_funcs
|
|
|
|
|
extern int debugflag;
|
|
|
|
|
extern int dataBytes;
|
|
|
|
|
extern uint16_t *ramValues;
|
|
|
|
|
extern char* ramValues;
|
|
|
|
|
|
|
|
|
|
int firmware_compatibility = OK;
|
|
|
|
|
int firmware_check_done = 0;
|
|
|
|
@ -576,6 +576,7 @@ int allocateRAM() {
|
|
|
|
|
"Probably cause: Memory Leak.\n"));
|
|
|
|
|
return FAIL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FILE_LOG(logINFO, ("\tRAM allocated to %d bytes\n", dataBytes));
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
@ -1501,7 +1502,7 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t
|
|
|
|
|
return OK;
|
|
|
|
|
#endif
|
|
|
|
|
FILE_LOG(logINFOBLUE, ("Configuring MAC\n"));
|
|
|
|
|
uint32_t sourceport = DEFAULT_TX_UDP_PORT;
|
|
|
|
|
/*uint32_t sourceport = DEFAULT_TX_UDP_PORT;
|
|
|
|
|
|
|
|
|
|
FILE_LOG(logINFO, ("\tSource IP : %d.%d.%d.%d \t\t(0x%08x)\n",
|
|
|
|
|
(sourceip>>24)&0xff,(sourceip>>16)&0xff,(sourceip>>8)&0xff,(sourceip)&0xff, sourceip));
|
|
|
|
@ -1559,9 +1560,9 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t
|
|
|
|
|
|
|
|
|
|
cleanFifos();//FIXME: resetPerpheral() for ctb?
|
|
|
|
|
resetPeripheral();
|
|
|
|
|
usleep(WAIT_TIME_CONFIGURE_MAC); /* todo maybe without */
|
|
|
|
|
usleep(WAIT_TIME_CONFIGURE_MAC); // todo maybe without
|
|
|
|
|
sendUDP(1);
|
|
|
|
|
|
|
|
|
|
*/sendUDP(0);
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1710,7 +1711,7 @@ uint64_t writePatternIOControl(uint64_t word) {
|
|
|
|
|
set64BitReg(word, PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG);
|
|
|
|
|
}
|
|
|
|
|
uint64_t retval = get64BitReg(PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG);
|
|
|
|
|
FILE_LOG(logDEBUG1, ("I/O Control: 0x%llx\n", (long long int) retval));
|
|
|
|
|
FILE_LOG(logDEBUG1, (" I/O Control: 0x%llx\n", (long long int) retval));
|
|
|
|
|
return retval;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1720,7 +1721,7 @@ uint64_t writePatternClkControl(uint64_t word) {
|
|
|
|
|
set64BitReg(word, PATTERN_IO_CLK_CNTRL_LSB_REG, PATTERN_IO_CLK_CNTRL_MSB_REG);
|
|
|
|
|
}
|
|
|
|
|
uint64_t retval = get64BitReg(PATTERN_IO_CLK_CNTRL_LSB_REG, PATTERN_IO_CLK_CNTRL_MSB_REG);
|
|
|
|
|
FILE_LOG(logDEBUG1, ("Clock Control: 0x%llx\n", (long long int) retval));
|
|
|
|
|
FILE_LOG(logDEBUG1, (" Clock Control: 0x%llx\n", (long long int) retval));
|
|
|
|
|
return retval;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1732,7 +1733,7 @@ uint64_t readPatternWord(int addr) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FILE_LOG(logDEBUG1, ("Reading Pattern - Word (addr:0x%x)\n", addr));
|
|
|
|
|
FILE_LOG(logDEBUG1, (" Reading Pattern - Word (addr:0x%x)\n", addr));
|
|
|
|
|
uint32_t reg = PATTERN_CNTRL_REG;
|
|
|
|
|
|
|
|
|
|
// overwrite with only addr
|
|
|
|
@ -1746,7 +1747,7 @@ uint64_t readPatternWord(int addr) {
|
|
|
|
|
|
|
|
|
|
// read value
|
|
|
|
|
uint64_t retval = get64BitReg(PATTERN_OUT_LSB_REG, PATTERN_OUT_MSB_REG);
|
|
|
|
|
FILE_LOG(logDEBUG1, ("Word(addr:0x%x): 0x%llx\n", addr, (long long int) retval));
|
|
|
|
|
FILE_LOG(logDEBUG1, (" Word(addr:0x%x): 0x%llx\n", addr, (long long int) retval));
|
|
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
|
}
|
|
|
|
@ -1768,7 +1769,7 @@ uint64_t writePatternWord(int addr, uint64_t word) {
|
|
|
|
|
|
|
|
|
|
// write word
|
|
|
|
|
set64BitReg(word, PATTERN_IN_LSB_REG, PATTERN_IN_MSB_REG);
|
|
|
|
|
FILE_LOG(logDEBUG1, ("Wrote word. PatternIn Reg: 0x%llx\n", get64BitReg(PATTERN_IN_LSB_REG, PATTERN_IN_MSB_REG)));
|
|
|
|
|
FILE_LOG(logDEBUG1, (" Wrote word. PatternIn Reg: 0x%llx\n", get64BitReg(PATTERN_IN_LSB_REG, PATTERN_IN_MSB_REG)));
|
|
|
|
|
|
|
|
|
|
// overwrite with only addr
|
|
|
|
|
bus_w(reg, ((addr << PATTERN_CNTRL_ADDR_OFST) & PATTERN_CNTRL_ADDR_MSK));
|
|
|
|
@ -1785,9 +1786,9 @@ uint64_t writePatternWord(int addr, uint64_t word) {
|
|
|
|
|
int setPatternWaitAddress(int level, int addr) {
|
|
|
|
|
|
|
|
|
|
// error (handled in tcp)
|
|
|
|
|
if (addr >= (MAX_PATTERN_LENGTH + 1)) {
|
|
|
|
|
if (addr >= MAX_PATTERN_LENGTH) {
|
|
|
|
|
FILE_LOG(logERROR, ("Cannot set Pattern - Wait Address. Invalid addr 0x%x. "
|
|
|
|
|
"Should be within 0x%x\n", addr, MAX_PATTERN_LENGTH + 1));
|
|
|
|
|
"Should be within 0x%x\n", addr, MAX_PATTERN_LENGTH));
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1825,7 +1826,7 @@ int setPatternWaitAddress(int level, int addr) {
|
|
|
|
|
|
|
|
|
|
// get
|
|
|
|
|
uint32_t regval = bus_r((reg & mask) >> offset);
|
|
|
|
|
FILE_LOG(logDEBUG1, ("Wait Address (level:%d, addr:0x%x)\n", level, regval));
|
|
|
|
|
FILE_LOG(logDEBUG1, (" Wait Address (level:%d, addr:0x%x)\n", level, regval));
|
|
|
|
|
return regval;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1860,7 +1861,7 @@ uint64_t setPatternWaitTime(int level, uint64_t t) {
|
|
|
|
|
|
|
|
|
|
// get
|
|
|
|
|
uint64_t regval = get64BitReg(regl, regm);
|
|
|
|
|
FILE_LOG(logDEBUG1, ("Wait Time (level:%d, t:%lld)\n", level, (long long int)regval));
|
|
|
|
|
FILE_LOG(logDEBUG1, (" Wait Time (level:%d, t:%lld)\n", level, (long long int)regval));
|
|
|
|
|
return regval;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1868,16 +1869,16 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) {
|
|
|
|
|
|
|
|
|
|
// level 0-2, addr upto patternlength + 1 (checked at tcp)
|
|
|
|
|
if ((level != -1) &&
|
|
|
|
|
(*startAddr >= 0 || *stopAddr > (MAX_PATTERN_LENGTH + 1))) {
|
|
|
|
|
(*startAddr > MAX_PATTERN_LENGTH || *stopAddr > MAX_PATTERN_LENGTH)) {
|
|
|
|
|
FILE_LOG(logERROR, ("Cannot set Pattern (Pattern Loop, level:%d, startaddr:0x%x, stopaddr:0x%x). "
|
|
|
|
|
"Addr must be less than 0x%x\n",
|
|
|
|
|
level, *startAddr, *stopAddr, MAX_PATTERN_LENGTH + 1));
|
|
|
|
|
level, *startAddr, *stopAddr, MAX_PATTERN_LENGTH));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//level -1, addr upto patternlength (checked at tcp)
|
|
|
|
|
else if ((level == -1) &&
|
|
|
|
|
(*startAddr >= 0 || *stopAddr > MAX_PATTERN_LENGTH)) {
|
|
|
|
|
FILE_LOG(logERROR, ("Cannot set Pattern (Pattern Loop, complete pattern, stopaddr:0x%x). "
|
|
|
|
|
(*startAddr > MAX_PATTERN_LENGTH || *stopAddr > MAX_PATTERN_LENGTH)) {
|
|
|
|
|
FILE_LOG(logERROR, ("Cannot set Pattern (Pattern Loop, complete pattern, startaddr:0x%x, stopaddr:0x%x). "
|
|
|
|
|
"Addr must be less than 0x%x\n",
|
|
|
|
|
*startAddr, *stopAddr, MAX_PATTERN_LENGTH));
|
|
|
|
|
}
|
|
|
|
@ -1918,6 +1919,10 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) {
|
|
|
|
|
// complete pattern
|
|
|
|
|
addr = PATTERN_LIMIT_REG;
|
|
|
|
|
nLoopReg = -1;
|
|
|
|
|
startOffset = PATTERN_LIMIT_STRT_OFST;
|
|
|
|
|
startMask = PATTERN_LIMIT_STRT_MSK;
|
|
|
|
|
stopOffset = PATTERN_LIMIT_STP_OFST;
|
|
|
|
|
stopMask = PATTERN_LIMIT_STP_MSK;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
// already checked at tcp interface
|
|
|
|
@ -1933,28 +1938,31 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) {
|
|
|
|
|
// set iteration
|
|
|
|
|
if (*nLoop >= 0) {
|
|
|
|
|
FILE_LOG(logINFO, ("Setting Pattern - Pattern Loop (level:%d, nLoop:%d)\n",
|
|
|
|
|
level, nLoop));
|
|
|
|
|
level, *nLoop));
|
|
|
|
|
bus_w(nLoopReg, *nLoop);
|
|
|
|
|
}
|
|
|
|
|
*nLoop = bus_r(nLoopReg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// set start and stop addr
|
|
|
|
|
if (*startAddr == -1) {
|
|
|
|
|
*startAddr = ((bus_r(addr) >> startOffset) & startMask);
|
|
|
|
|
FILE_LOG(logINFO, ("Setting Pattern - Pattern Loop Start Address (level:%d, startAddr:0x%x was -1)\n",
|
|
|
|
|
level, *startAddr));
|
|
|
|
|
}
|
|
|
|
|
if (*stopAddr == -1) {
|
|
|
|
|
*stopAddr = ((bus_r(addr) >> stopOffset) & stopMask);
|
|
|
|
|
FILE_LOG(logINFO, ("Setting Pattern - Pattern Loop Stop Address (level:%d, stopAddr:0x%x, was -1)\n",
|
|
|
|
|
level, *stopAddr));
|
|
|
|
|
// set
|
|
|
|
|
if (*startAddr != -1 && *stopAddr != -1) {
|
|
|
|
|
// writing start and stop addr
|
|
|
|
|
FILE_LOG(logINFO, ("Setting Pattern - Pattern Loop (level:%d, startaddr:0x%x, stopaddr:0x%x)\n",
|
|
|
|
|
level, *startAddr, *stopAddr));
|
|
|
|
|
bus_w(addr, ((*startAddr << startOffset) & startMask) | ((*stopAddr << stopOffset) & stopMask));
|
|
|
|
|
FILE_LOG(logDEBUG1, ("Addr:0x%x, val:0x%x\n", addr, bus_r(addr)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// writing start and stop addr
|
|
|
|
|
FILE_LOG(logINFO, ("Setting Pattern - Pattern Loop (level:%d, startaddr:0x%x, stopaddr:0x%x)\n",
|
|
|
|
|
level, *startAddr, *stopAddr));
|
|
|
|
|
bus_w(addr, ((*startAddr << startOffset) & startMask) | ((*stopAddr << stopOffset) & stopMask));
|
|
|
|
|
// get
|
|
|
|
|
else {
|
|
|
|
|
*startAddr = ((bus_r(addr) & startMask) >> startOffset);
|
|
|
|
|
FILE_LOG(logDEBUG1, ("Getting Pattern - Pattern Loop Start Address (level:%d, Read startAddr:0x%x)\n",
|
|
|
|
|
level, *startAddr));
|
|
|
|
|
|
|
|
|
|
*stopAddr = ((bus_r(addr) & stopMask) >> stopOffset);
|
|
|
|
|
FILE_LOG(logDEBUG1, ("Getting Pattern - Pattern Loop Stop Address (level:%d, Read stopAddr:0x%x)\n",
|
|
|
|
|
level, *stopAddr));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1977,9 +1985,6 @@ int startStateMachine(){
|
|
|
|
|
cleanFifos();
|
|
|
|
|
unsetFifoReadStrobes(); // FIXME: unnecessary to write bus_w(dumm, 0) as it is 0 in the beginnig and the strobes are always unset if set
|
|
|
|
|
|
|
|
|
|
// point the data pointer to the starting position of data
|
|
|
|
|
now_ptr = (char*)ramValues;
|
|
|
|
|
|
|
|
|
|
//start state machine
|
|
|
|
|
bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STRT_ACQSTN_MSK | CONTROL_STRT_EXPSR_MSK);
|
|
|
|
|
bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_STRT_ACQSTN_MSK & ~CONTROL_STRT_EXPSR_MSK);
|
|
|
|
@ -2070,10 +2075,10 @@ enum runStatus getRunStatus(){
|
|
|
|
|
return TRANSMITTING;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (retval & STATUS_ALL_FF_EMPTY_MSK) {
|
|
|
|
|
/*if (retval & STATUS_ALL_FF_EMPTY_MSK) {
|
|
|
|
|
FILE_LOG(logINFOBLUE, ("Status: Transmitting (All fifo empty)\n"));
|
|
|
|
|
return TRANSMITTING;
|
|
|
|
|
}
|
|
|
|
|
}*/
|
|
|
|
|
|
|
|
|
|
if (! (retval & STATUS_IDLE_MSK)) {
|
|
|
|
|
FILE_LOG(logINFOBLUE, ("Status: Idle\n"));
|
|
|
|
@ -2095,7 +2100,6 @@ void readFrame(int *ret, char *mess) {
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
#endif
|
|
|
|
|
// wait for status to be done
|
|
|
|
|
while(runBusy()){
|
|
|
|
|
usleep(500); // random
|
|
|
|
|
}
|
|
|
|
@ -2116,7 +2120,12 @@ void unsetFifoReadStrobes() {
|
|
|
|
|
bus_w(DUMMY_REG, bus_r(DUMMY_REG) & (~DUMMY_ANLG_FIFO_RD_STRBE_MSK) & (~DUMMY_DGTL_FIFO_RD_STRBE_MSK));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void readSample() {
|
|
|
|
|
void readSample(int ns) {
|
|
|
|
|
if (!(ns%1000)) {
|
|
|
|
|
FILE_LOG(logDEBUG2, ("Reading sample ns:%d (out of %d), fifodinstatus:0x%x\n",
|
|
|
|
|
ns, nSamples,
|
|
|
|
|
bus_r(FIFO_DIN_STATUS_REG)));
|
|
|
|
|
}
|
|
|
|
|
uint32_t addr = DUMMY_REG;
|
|
|
|
|
uint32_t fifoAddr = FIFO_DATA_REG;
|
|
|
|
|
|
|
|
|
@ -2157,7 +2166,6 @@ void readSample() {
|
|
|
|
|
|
|
|
|
|
// read digital output
|
|
|
|
|
if (digitalEnable) {
|
|
|
|
|
|
|
|
|
|
// read strobe to digital fifo
|
|
|
|
|
bus_w(addr, bus_r(addr) | DUMMY_DGTL_FIFO_RD_STRBE_MSK);
|
|
|
|
|
bus_w(addr, bus_r(addr) & (~DUMMY_DGTL_FIFO_RD_STRBE_MSK));
|
|
|
|
@ -2171,6 +2179,10 @@ void readSample() {
|
|
|
|
|
// only called for first sample
|
|
|
|
|
int checkDataPresent() {
|
|
|
|
|
uint32_t dataPresent = bus_r(LOOK_AT_ME_REG);
|
|
|
|
|
FILE_LOG(logDEBUG2, ("LookatMe:0x%x, status:0x%x\t, fifodinstatus:0x%x\n",
|
|
|
|
|
dataPresent,
|
|
|
|
|
bus_r(STATUS_REG),
|
|
|
|
|
bus_r(FIFO_DIN_STATUS_REG)));
|
|
|
|
|
// as long as fifo empty (keep checking)
|
|
|
|
|
while (!dataPresent) {
|
|
|
|
|
// acquisition done
|
|
|
|
@ -2179,8 +2191,8 @@ int checkDataPresent() {
|
|
|
|
|
dataPresent = bus_r(LOOK_AT_ME_REG);
|
|
|
|
|
// still no data
|
|
|
|
|
if (!dataPresent) {
|
|
|
|
|
FILE_LOG(logERROR, ("Acquisition Finished (State: 0x%08x), "
|
|
|
|
|
"but no frame found (Look_at_me: 0x%08x).\n", dataPresent));
|
|
|
|
|
FILE_LOG(logINFO, ("Acquisition Finished (State: 0x%08x), "
|
|
|
|
|
"no frame found .\n", bus_r(STATUS_REG)));
|
|
|
|
|
return FAIL;
|
|
|
|
|
}
|
|
|
|
|
// got data, exit
|
|
|
|
@ -2191,19 +2203,23 @@ int checkDataPresent() {
|
|
|
|
|
// check if fifo empty again
|
|
|
|
|
dataPresent = bus_r(LOOK_AT_ME_REG);
|
|
|
|
|
}
|
|
|
|
|
FILE_LOG(logDEBUG2, ("Got data, Lookatme:0x%x\n", dataPresent));
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int readFrameFromFifo() {
|
|
|
|
|
int ns = 0;
|
|
|
|
|
int ns = 0;
|
|
|
|
|
// point the data pointer to the starting position of data
|
|
|
|
|
now_ptr = ramValues;
|
|
|
|
|
|
|
|
|
|
// no data for this frame
|
|
|
|
|
if (checkDataPresent(ns) == FAIL) {
|
|
|
|
|
if (checkDataPresent() == FAIL) {
|
|
|
|
|
return FAIL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// read Sample
|
|
|
|
|
while(ns < nSamples) {
|
|
|
|
|
// chceck if no data in fifo, return ns?//FIXME: ask Anna
|
|
|
|
|
readSample(ns);
|
|
|
|
|
ns++;
|
|
|
|
|
}
|
|
|
|
@ -2217,7 +2233,7 @@ uint32_t runBusy() {
|
|
|
|
|
return virtual_status;
|
|
|
|
|
#endif
|
|
|
|
|
uint32_t s = (bus_r(STATUS_REG) & STATUS_RN_BSY_MSK);
|
|
|
|
|
FILE_LOG(logDEBUG1, ("Status Register: %08x\n", s));
|
|
|
|
|
//FILE_LOG(logDEBUG1, ("Status Register: %08x\n", s));
|
|
|
|
|
return s;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|