This commit is contained in:
2021-06-18 19:38:47 +02:00
parent a8c0049f88
commit 665a3be6d8
9 changed files with 761 additions and 1353 deletions

View File

@ -17,6 +17,7 @@ add_executable(ctbDetectorServer_virtual
../slsDetectorServer/src/MAX1932.c
../slsDetectorServer/src/programFpgaBlackfin.c
../slsDetectorServer/src/sharedMemory.c
../slsDetectorServer/src/loadPattern.c
)
include_directories(

View File

@ -13,7 +13,7 @@ DESTDIR ?= bin
INSTMODE = 0777
SRCS = slsDetectorFunctionList.c
SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)communication_funcs_UDP.c $(main_src)UDPPacketHeaderGenerator.c $(main_src)AD7689.c $(main_src)AD9257.c $(main_src)ALTERA_PLL.c $(main_src)I2C.c $(main_src)INA226.c $(main_src)LTC2620.c $(main_src)MAX1932.c $(main_src)programFpgaBlackfin.c $(main_src)/sharedMemory.c
SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)communication_funcs_UDP.c $(main_src)UDPPacketHeaderGenerator.c $(main_src)AD7689.c $(main_src)AD9257.c $(main_src)ALTERA_PLL.c $(main_src)I2C.c $(main_src)INA226.c $(main_src)LTC2620.c $(main_src)MAX1932.c $(main_src)programFpgaBlackfin.c $(main_src)/sharedMemory.c $(main_src)/loadPattern.c
OBJS = $(SRCS:.c=.o)

View File

@ -11,6 +11,7 @@
#include "UDPPacketHeaderGenerator.h"
#include "common.h"
#include "communication_funcs_UDP.h"
#include "loadPattern.h"
#include <netinet/in.h>
#include <string.h>
@ -42,7 +43,6 @@ char initErrorMessage[MAX_STR_LENGTH];
#ifdef VIRTUAL
pthread_t pthread_virtual_tid;
uint64_t virtual_pattern[MAX_PATTERN_LENGTH];
int64_t virtual_currentFrameNumber = 2;
#endif
@ -478,7 +478,7 @@ void setupDetector() {
ndSamples = 1;
#ifdef VIRTUAL
sharedMemory_setStatus(IDLE);
memset(virtual_pattern, 0, sizeof(virtual_pattern));
initializePatternWord();
#endif
ALTERA_PLL_ResetPLLAndReconfiguration();
@ -969,7 +969,7 @@ int setExpTime(int64_t val) {
}
int64_t getExpTime() {
return setPatternWaitTime(0, -1) / (1E-3 * clkFrequency[RUN_CLK]);
return getPatternWaitTime(0) / (1E-3 * clkFrequency[RUN_CLK]);
}
int setPeriod(int64_t val) {
@ -1880,273 +1880,6 @@ int getPipeline(enum CLKINDEX ind) {
ADC_OFFSET_ADC_PPLN_OFST);
}
// patterns
uint64_t writePatternIOControl(uint64_t word) {
if ((int64_t)word != -1) {
LOG(logINFO,
("Setting Pattern I/O Control: 0x%llx\n", (long long int)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);
LOG(logDEBUG1, (" I/O Control retval: 0x%llx\n", (long long int)retval));
return retval;
}
uint64_t readPatternWord(int addr) {
// error (handled in tcp)
if (addr < 0 || addr >= MAX_PATTERN_LENGTH) {
LOG(logERROR, ("Cannot get Pattern - Word. Invalid addr 0x%x. "
"Should be between 0 and 0x%x\n",
addr, MAX_PATTERN_LENGTH));
return -1;
}
LOG(logINFORED, (" Reading (Executing) Pattern Word (addr:0x%x)\n", addr));
uint32_t reg = PATTERN_CNTRL_REG;
// overwrite with only addr
bus_w(reg, ((addr << PATTERN_CNTRL_ADDR_OFST) & PATTERN_CNTRL_ADDR_MSK));
// set read strobe
bus_w(reg, bus_r(reg) | PATTERN_CNTRL_RD_MSK);
// unset read strobe
bus_w(reg, bus_r(reg) & (~PATTERN_CNTRL_RD_MSK));
usleep(WAIT_TIME_PATTERN_READ);
// read value
uint64_t retval = get64BitReg(PATTERN_OUT_LSB_REG, PATTERN_OUT_MSB_REG);
LOG(logDEBUG1,
(" Word(addr:0x%x) retval: 0x%llx\n", addr, (long long int)retval));
#ifdef VIRTUAL
retval = virtual_pattern[addr];
#endif
return retval;
}
uint64_t writePatternWord(int addr, uint64_t word) {
// get
if ((int64_t)word == -1)
return readPatternWord(addr);
// error (handled in tcp)
if (addr < 0 || addr >= MAX_PATTERN_LENGTH) {
LOG(logERROR, ("Cannot set Pattern - Word. Invalid addr 0x%x. "
"Should be between 0 and 0x%x\n",
addr, MAX_PATTERN_LENGTH));
return -1;
}
LOG(logDEBUG1, ("Setting Pattern Word (addr:0x%x, word:0x%llx)\n", addr,
(long long int)word));
uint32_t reg = PATTERN_CNTRL_REG;
// write word
set64BitReg(word, PATTERN_IN_LSB_REG, PATTERN_IN_MSB_REG);
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));
// set write strobe
bus_w(reg, bus_r(reg) | PATTERN_CNTRL_WR_MSK);
// unset write strobe
bus_w(reg, bus_r(reg) & (~PATTERN_CNTRL_WR_MSK));
#ifdef VIRTUAL
virtual_pattern[addr] = word;
#endif
return word;
// return readPatternWord(addr); // will start executing the pattern
}
int setPatternWaitAddress(int level, int addr) {
// error (handled in tcp)
if (addr >= MAX_PATTERN_LENGTH) {
LOG(logERROR, ("Cannot set Pattern Wait Address. Invalid addr 0x%x. "
"Should be between 0 and 0x%x\n",
addr, MAX_PATTERN_LENGTH));
return -1;
}
uint32_t reg = 0;
uint32_t offset = 0;
uint32_t mask = 0;
switch (level) {
case 0:
reg = PATTERN_WAIT_0_ADDR_REG;
offset = PATTERN_WAIT_0_ADDR_OFST;
mask = PATTERN_WAIT_0_ADDR_MSK;
break;
case 1:
reg = PATTERN_WAIT_1_ADDR_REG;
offset = PATTERN_WAIT_1_ADDR_OFST;
mask = PATTERN_WAIT_1_ADDR_MSK;
break;
case 2:
reg = PATTERN_WAIT_2_ADDR_REG;
offset = PATTERN_WAIT_2_ADDR_OFST;
mask = PATTERN_WAIT_2_ADDR_MSK;
break;
default:
LOG(logERROR, ("Cannot set Pattern Wait Address. Invalid level 0x%x. "
"Should be between 0 and 2.\n",
level));
return -1;
}
// set
if (addr >= 0) {
LOG(logINFO, ("Setting Pattern Wait Address (level:%d, addr:0x%x)\n",
level, addr));
bus_w(reg, ((addr << offset) & mask));
}
// get
uint32_t regval = ((bus_r(reg) & mask) >> offset);
LOG(logDEBUG1,
(" Wait Address retval (level:%d, addr:0x%x)\n", level, regval));
return regval;
}
uint64_t setPatternWaitTime(int level, uint64_t t) {
uint32_t regl = 0;
uint32_t regm = 0;
switch (level) {
case 0:
regl = PATTERN_WAIT_TIMER_0_LSB_REG;
regm = PATTERN_WAIT_TIMER_0_MSB_REG;
break;
case 1:
regl = PATTERN_WAIT_TIMER_1_LSB_REG;
regm = PATTERN_WAIT_TIMER_1_MSB_REG;
break;
case 2:
regl = PATTERN_WAIT_TIMER_2_LSB_REG;
regm = PATTERN_WAIT_TIMER_2_MSB_REG;
break;
default:
LOG(logERROR, ("Cannot set Pattern Wait Time. Invalid level %d. "
"Should be between 0 and 2.\n",
level));
return -1;
}
// set
if ((int64_t)t >= 0) {
LOG(logINFO, ("Setting Pattern Wait Time (level:%d, t:%lld)\n", level,
(long long int)t));
set64BitReg(t, regl, regm);
}
// get
uint64_t regval = get64BitReg(regl, regm);
LOG(logDEBUG1, (" Wait Time retval (level:%d, t:%lld)\n", level,
(long long int)regval));
return regval;
}
void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) {
// (checked at tcp)
if (*startAddr >= MAX_PATTERN_LENGTH || *stopAddr >= MAX_PATTERN_LENGTH) {
LOG(logERROR, ("Cannot set Pattern Loop, Address (startaddr:0x%x, "
"stopaddr:0x%x) must be "
"less than 0x%x\n",
*startAddr, *stopAddr, MAX_PATTERN_LENGTH));
}
uint32_t addr = 0;
uint32_t nLoopReg = 0;
uint32_t startOffset = 0;
uint32_t startMask = 0;
uint32_t stopOffset = 0;
uint32_t stopMask = 0;
switch (level) {
case 0:
addr = PATTERN_LOOP_0_ADDR_REG;
nLoopReg = PATTERN_LOOP_0_ITERATION_REG;
startOffset = PATTERN_LOOP_0_ADDR_STRT_OFST;
startMask = PATTERN_LOOP_0_ADDR_STRT_MSK;
stopOffset = PATTERN_LOOP_0_ADDR_STP_OFST;
stopMask = PATTERN_LOOP_0_ADDR_STP_MSK;
break;
case 1:
addr = PATTERN_LOOP_1_ADDR_REG;
nLoopReg = PATTERN_LOOP_1_ITERATION_REG;
startOffset = PATTERN_LOOP_1_ADDR_STRT_OFST;
startMask = PATTERN_LOOP_1_ADDR_STRT_MSK;
stopOffset = PATTERN_LOOP_1_ADDR_STP_OFST;
stopMask = PATTERN_LOOP_1_ADDR_STP_MSK;
break;
case 2:
addr = PATTERN_LOOP_2_ADDR_REG;
nLoopReg = PATTERN_LOOP_2_ITERATION_REG;
startOffset = PATTERN_LOOP_2_ADDR_STRT_OFST;
startMask = PATTERN_LOOP_2_ADDR_STRT_MSK;
stopOffset = PATTERN_LOOP_2_ADDR_STP_OFST;
stopMask = PATTERN_LOOP_2_ADDR_STP_MSK;
break;
case -1:
// 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
LOG(logERROR, ("Cannot set Pattern loop. Invalid level %d. "
"Should be between -1 and 2.\n",
level));
*startAddr = 0;
*stopAddr = 0;
*nLoop = 0;
}
// set iterations
if (level >= 0) {
// set iteration
if (*nLoop >= 0) {
LOG(logINFO,
("Setting Pattern Loop (level:%d, nLoop:%d)\n", level, *nLoop));
bus_w(nLoopReg, *nLoop);
}
*nLoop = bus_r(nLoopReg);
}
// set
if (*startAddr >= 0 && *stopAddr >= 0) {
// writing start and stop addr
LOG(logINFO,
("Setting Pattern Loop (level:%d, startaddr:0x%x, stopaddr:0x%x)\n",
level, *startAddr, *stopAddr));
bus_w(addr, ((*startAddr << startOffset) & startMask) |
((*stopAddr << stopOffset) & stopMask));
LOG(logDEBUG1, ("Addr:0x%x, val:0x%x\n", addr, bus_r(addr)));
}
*startAddr = ((bus_r(addr) & startMask) >> startOffset);
LOG(logDEBUG1, ("Getting Pattern Loop Start Address (level:%d, Read "
"startAddr:0x%x)\n",
level, *startAddr));
*stopAddr = ((bus_r(addr) & stopMask) >> stopOffset);
LOG(logDEBUG1, ("Getting Pattern Loop Stop Address (level:%d, Read "
"stopAddr:0x%x)\n",
level, *stopAddr));
}
int setLEDEnable(int enable) {
uint32_t addr = CONFIG_REG;
@ -2189,22 +1922,6 @@ void setDigitalIODelay(uint64_t pinMask, int delay) {
bus_w(addr, bus_r(addr) & (~OUTPUT_DELAY_0_OTPT_TRGGR_MSK));
}
void setPatternMask(uint64_t mask) {
set64BitReg(mask, PATTERN_MASK_LSB_REG, PATTERN_MASK_MSB_REG);
}
uint64_t getPatternMask() {
return get64BitReg(PATTERN_MASK_LSB_REG, PATTERN_MASK_MSB_REG);
}
void setPatternBitMask(uint64_t mask) {
set64BitReg(mask, PATTERN_SET_LSB_REG, PATTERN_SET_MSB_REG);
}
uint64_t getPatternBitMask() {
return get64BitReg(PATTERN_SET_LSB_REG, PATTERN_SET_MSB_REG);
}
/* aquisition */
int startStateMachine() {