mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-23 10:07:59 +02:00
wip
This commit is contained in:
@ -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(
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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() {
|
||||
|
Reference in New Issue
Block a user