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

@ -1748,273 +1748,6 @@ int enableTenGigabitEthernet(int val) {
return oneG ? 0 : 1;
}
/* pattern */
void startPattern() {
LOG(logINFOBLUE, ("Starting Pattern\n"));
bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STRT_PATTERN_MSK);
usleep(1);
while (bus_r(PAT_STATUS_REG) & PAT_STATUS_RUN_BUSY_MSK) {
usleep(1);
}
LOG(logINFOBLUE, ("Pattern done\n"));
}
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(logDEBUG1, (" Reading Pattern Word (addr:0x%x)\n", addr));
uint32_t reg_lsb =
PATTERN_STEP0_LSB_REG +
addr * REG_OFFSET * 2; // the first word in RAM as base plus the
// offset of the word to write (addr)
uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr * REG_OFFSET * 2;
// read value
uint64_t retval = get64BitReg(reg_lsb, reg_msb);
LOG(logDEBUG1,
(" Word(addr:0x%x) retval: 0x%llx\n", addr, (long long int)retval));
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));
// write word
uint32_t reg_lsb =
PATTERN_STEP0_LSB_REG +
addr * REG_OFFSET * 2; // the first word in RAM as base plus the
// offset of the word to write (addr)
uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr * REG_OFFSET * 2;
set64BitReg(word, reg_lsb, reg_msb);
LOG(logDEBUG1, (" Wrote word. PatternIn Reg: 0x%llx\n",
get64BitReg(reg_lsb, reg_msb)));
return readPatternWord(addr);
}
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(trimmingPrint,
("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(trimmingPrint, ("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));
*startAddr = -1;
*stopAddr = -1;
*nLoop = -1;
return;
}
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(trimmingPrint,
("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(trimmingPrint, ("Setting Pattern Loop (level:%d, startaddr:0x%x, "
"stopaddr:0x%x)\n",
level, *startAddr, *stopAddr));
bus_w(addr, ((*startAddr << startOffset) & startMask) |
((*stopAddr << stopOffset) & stopMask));
}
*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));
}
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);
}
int checkDetectorType() {
#ifdef VIRTUAL
return OK;