mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-19 00:07:13 +02:00
wip
This commit is contained in:
@ -7,218 +7,29 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifndef MYTHEN3D
|
||||
extern uint64_t writePatternIOControl(uint64_t word);
|
||||
#else
|
||||
extern enum TLogLevel trimmingPrint;
|
||||
extern uint64_t readPatternWord(int addr);
|
||||
#endif
|
||||
extern uint64_t writePatternWord(int addr, uint64_t word);
|
||||
extern int setPatternWaitAddress(int level, int addr);
|
||||
extern uint64_t setPatternWaitTime(int level, uint64_t t);
|
||||
extern void setPatternLoop(int level, int *startAddr, int *stopAddr,
|
||||
int *nLoop);
|
||||
|
||||
int pattern_writeWord(char *message, uint32_t addr, uint64_t word) {
|
||||
// vaiidate input
|
||||
if ((int32_t)addr < 0 || addr >= MAX_PATTERN_LENGTH) {
|
||||
sprintf(message,
|
||||
"Cannot set pattern word. Addr must be between 0 and 0x%x.\n",
|
||||
MAX_PATTERN_LENGTH);
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
writePatternWord(addr, word);
|
||||
|
||||
// validate result
|
||||
int ret = OK;
|
||||
// cannot validate for moench, ctb ( same as executing pattern word)
|
||||
#ifdef MYTHEN3D
|
||||
uint64_t retval = readPatternWord(addr);
|
||||
LOG(logDEBUG1, ("Pattern word (addr:0x%x) retval: 0x%llx\n", addr,
|
||||
(long long int)retval));
|
||||
char mode[128];
|
||||
memset(mode, 0, sizeof(mode));
|
||||
sprintf(mode, "set pattern word for addr 0x%x", addr);
|
||||
validate64(&ret, message, word, retval, "set pattern word", HEX);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifndef MYTHEN3D
|
||||
int pattern_writeIOControl(char *message, uint64_t arg) {
|
||||
uint64_t retval = writePatternIOControl(arg);
|
||||
LOG(logDEBUG1,
|
||||
("Pattern IO Control retval: 0x%llx\n", (long long int)retval));
|
||||
|
||||
// validate result
|
||||
int ret = OK;
|
||||
validate64(&ret, message, arg, retval, "set pattern IO Control", HEX);
|
||||
return ret;
|
||||
}
|
||||
extern enum TLogLevel trimmingPrint;
|
||||
#endif
|
||||
|
||||
int pattern_setLoopLimits(char *message, uint32_t startAddr,
|
||||
uint32_t stopAddr) {
|
||||
// vaiidate input
|
||||
if ((int32_t)startAddr < 0 || startAddr >= MAX_PATTERN_LENGTH ||
|
||||
(int32_t)stopAddr < 0 || stopAddr >= MAX_PATTERN_LENGTH) {
|
||||
sprintf(message,
|
||||
"Cannot set patlimits from default "
|
||||
"pattern file. Addr must be between 0 and 0x%x.\n",
|
||||
MAX_PATTERN_LENGTH);
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
|
||||
#ifdef VIRTUAL
|
||||
uint64_t virtual_pattern[MAX_PATTERN_LENGTH];
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int numLoops = -1;
|
||||
int r_startAddr = startAddr, r_stopAddr = stopAddr;
|
||||
setPatternLoop(-1, &r_startAddr, &r_stopAddr, &numLoops);
|
||||
|
||||
// validate result
|
||||
int ret = OK;
|
||||
// start addr
|
||||
validate(&ret, message, startAddr, r_startAddr,
|
||||
"set pattern Limits start addr", HEX);
|
||||
if (ret == FAIL) {
|
||||
return FAIL;
|
||||
}
|
||||
// stop addr
|
||||
validate(&ret, message, stopAddr, r_stopAddr,
|
||||
"set pattern Limits stop addr", HEX);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int pattern_setLoopAddresses(char *message, int level, uint32_t startAddr,
|
||||
uint32_t stopAddr) {
|
||||
// vaiidate input
|
||||
if (level < 0 || level > 2) {
|
||||
sprintf(message,
|
||||
"Cannot set patloop. Level must be between 0 and 2.\n");
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
if ((int32_t)startAddr < 0 || startAddr >= MAX_PATTERN_LENGTH ||
|
||||
(int32_t)stopAddr < 0 || stopAddr >= MAX_PATTERN_LENGTH) {
|
||||
sprintf(message,
|
||||
"Cannot set patloop (level: %d). Addr must be between 0 and "
|
||||
"0x%x.\n",
|
||||
level, MAX_PATTERN_LENGTH);
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
int numLoops = -1;
|
||||
int r_startAddr = startAddr, r_stopAddr = stopAddr;
|
||||
setPatternLoop(level, &r_startAddr, &r_stopAddr, &numLoops);
|
||||
|
||||
// validate result
|
||||
int ret = OK;
|
||||
char mode[128];
|
||||
// start addr
|
||||
memset(mode, 0, sizeof(mode));
|
||||
sprintf(mode, "set pattern Loop %d start addr", level);
|
||||
validate(&ret, message, startAddr, r_startAddr, mode, HEX);
|
||||
if (ret == FAIL) {
|
||||
return FAIL;
|
||||
}
|
||||
// stop addr
|
||||
memset(mode, 0, sizeof(mode));
|
||||
sprintf(mode, "set pattern Loop %d stop addr", level);
|
||||
validate(&ret, message, stopAddr, r_stopAddr, mode, HEX);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int pattern_setLoopCycles(char *message, int level, int numLoops) {
|
||||
// vaiidate input
|
||||
if (level < 0 || level > 2) {
|
||||
sprintf(message,
|
||||
"Cannot set patnloop. Level must be between 0 and 2.\n");
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
if (numLoops < 0) {
|
||||
sprintf(message,
|
||||
"Cannot set patnloop. Iterations must be between > 0.\n");
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
int startAddr = -1;
|
||||
int stopAddr = -1;
|
||||
int r_numLoops = numLoops;
|
||||
setPatternLoop(level, &startAddr, &stopAddr, &r_numLoops);
|
||||
|
||||
// validate result
|
||||
int ret = OK;
|
||||
char mode[128];
|
||||
memset(mode, 0, sizeof(mode));
|
||||
sprintf(mode, "set pattern Loop %d num loops", level);
|
||||
validate(&ret, message, numLoops, r_numLoops, mode, DEC);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int pattern_setWaitAddresses(char *message, int level, uint32_t addr) {
|
||||
// validate input
|
||||
if (level < 0 || level > 2) {
|
||||
sprintf(message,
|
||||
"Cannot set patwait address. Level must be between 0 and 2.\n");
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
if ((int32_t)addr < 0 || addr >= MAX_PATTERN_LENGTH) {
|
||||
sprintf(message,
|
||||
"Cannot set patwait address (level: %d). Addr must be between "
|
||||
"0 and 0x%x.\n",
|
||||
level, MAX_PATTERN_LENGTH);
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
uint32_t retval = setPatternWaitAddress(level, addr);
|
||||
LOG(logDEBUG1,
|
||||
("Pattern wait address (level:%d) retval: 0x%x\n", level, retval));
|
||||
|
||||
// validate result
|
||||
int ret = OK;
|
||||
char mode[128];
|
||||
memset(mode, 0, sizeof(mode));
|
||||
sprintf(mode, "set pattern Loop %d wait address", level);
|
||||
validate(&ret, message, addr, retval, mode, HEX);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int pattern_setWaitTime(char *message, int level, uint64_t waittime) {
|
||||
// validate input
|
||||
if (level < 0 || level > 2) {
|
||||
sprintf(message,
|
||||
"Cannot set patwaittime. Level must be between 0 and 2.\n");
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
uint64_t retval = setPatternWaitTime(level, waittime);
|
||||
LOG(logDEBUG1, ("Pattern wait time (level:%d) retval: %d\n", level,
|
||||
(long long int)retval));
|
||||
|
||||
// validate result
|
||||
int ret = OK;
|
||||
char mode[128];
|
||||
memset(mode, 0, sizeof(mode));
|
||||
sprintf(mode, "set pattern Loop %d wait time", level);
|
||||
validate64(&ret, message, waittime, retval, mode, DEC);
|
||||
return ret;
|
||||
}
|
||||
extern void bus_w(u_int32_t offset, u_int32_t data);
|
||||
extern u_int32_t bus_r(u_int32_t offset);
|
||||
extern int64_t get64BitReg(int aLSB, int aMSB);
|
||||
extern int64_t set64BitReg(int64_t value, int aLSB, int aMSB);
|
||||
|
||||
int loadPattern(char *message, enum TLogLevel printLevel,
|
||||
patternParameters *pat) {
|
||||
LOG(logINFOBLUE, ("Loading Pattern\n"));
|
||||
LOG(logINFOBLUE, ("Loading Pattern from structure\n"));
|
||||
int ret = OK;
|
||||
#ifdef MYTHEN3D
|
||||
trimmingPrint = printLevel;
|
||||
#endif
|
||||
|
||||
// words
|
||||
for (int i = 0; i < MAX_PATTERN_LENGTH; ++i) {
|
||||
if ((i % 10 == 0) && pat->word[i] != 0) {
|
||||
LOG(logDEBUG5, ("Setting Pattern Word (addr:0x%x, word:0x%llx)\n",
|
||||
@ -229,11 +40,13 @@ int loadPattern(char *message, enum TLogLevel printLevel,
|
||||
break;
|
||||
}
|
||||
}
|
||||
// iocontrol
|
||||
#ifndef MYTHEN3D
|
||||
if (ret == OK) {
|
||||
ret = pattern_writeIOControl(message, pat->ioctrl);
|
||||
}
|
||||
#endif
|
||||
// limits
|
||||
if (ret == OK) {
|
||||
ret = pattern_setLoopLimits(message, pat->limits[0], pat->limits[1]);
|
||||
}
|
||||
@ -272,6 +85,67 @@ int loadPattern(char *message, enum TLogLevel printLevel,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int getPattern(char *message, patternParameters *pat) {
|
||||
LOG(logINFO, ("Getting Pattern into structure\n"));
|
||||
|
||||
int ret = OK;
|
||||
uint64_t retval64 = 0;
|
||||
int retval1 = -1, retval2 = -1;
|
||||
// words
|
||||
for (int i = 0; i < MAX_PATTERN_LENGTH; ++i) {
|
||||
ret = pattern_readWord(message, i, &retval64);
|
||||
if (ret == FAIL) {
|
||||
break;
|
||||
}
|
||||
pat->word[i] = retval64;
|
||||
}
|
||||
// iocontrol
|
||||
#ifndef MYTHEN3D
|
||||
if (ret == OK) {
|
||||
pattern_readIOControl();
|
||||
}
|
||||
#endif
|
||||
// limits
|
||||
if (ret == OK) {
|
||||
pattern_getLoopLimits(&retval1, &retval2);
|
||||
pat->limits[0] = retval1;
|
||||
pat->limits[1] = retval2;
|
||||
}
|
||||
if (ret == OK) {
|
||||
for (int i = 0; i <= 2; ++i) {
|
||||
// loop addr
|
||||
ret = pattern_getLoopAddresses(message, i, &retval1, &retval2);
|
||||
if (ret == FAIL) {
|
||||
break;
|
||||
}
|
||||
pat->loop[i * 2 + 0] = retval1;
|
||||
pat->loop[i * 2 + 1] = retval2;
|
||||
|
||||
// num loops
|
||||
ret = pattern_getLoopCycles(message, i, &retval1);
|
||||
if (ret == FAIL) {
|
||||
break;
|
||||
}
|
||||
pat->nloop[i] = retval1;
|
||||
|
||||
// wait addr
|
||||
ret = pattern_getWaitAddresses(message, i, &retval1);
|
||||
if (ret == FAIL) {
|
||||
break;
|
||||
}
|
||||
pat->wait[i] = retval1;
|
||||
|
||||
// wait time
|
||||
ret = pattern_getWaitTime(message, i, &retval64);
|
||||
if (ret == FAIL) {
|
||||
break;
|
||||
}
|
||||
pat->waittime[i] = retval64;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int loadPatternFile(char *patFname, char *errMessage) {
|
||||
char fname[128];
|
||||
if (getAbsPath(fname, 128, patFname) == FAIL) {
|
||||
@ -340,7 +214,7 @@ int loadPatternFile(char *patFname, char *errMessage) {
|
||||
|
||||
// patword
|
||||
if (!strncmp(line, "patword", strlen("patword"))) {
|
||||
uint32_t addr = 0;
|
||||
int addr = 0;
|
||||
uint64_t word = 0;
|
||||
|
||||
// cannot scan values
|
||||
@ -381,8 +255,8 @@ int loadPatternFile(char *patFname, char *errMessage) {
|
||||
|
||||
// patlimits
|
||||
if (!strncmp(line, "patlimits", strlen("patlimits"))) {
|
||||
uint32_t startAddr = 0;
|
||||
uint32_t stopAddr = 0;
|
||||
int startAddr = 0;
|
||||
int stopAddr = 0;
|
||||
|
||||
// cannot scan values
|
||||
if (sscanf(line, "%s 0x%x 0x%x", command, &startAddr, &stopAddr) !=
|
||||
@ -411,8 +285,8 @@ int loadPatternFile(char *patFname, char *errMessage) {
|
||||
level = 2;
|
||||
}
|
||||
|
||||
uint32_t startAddr = 0;
|
||||
uint32_t stopAddr = 0;
|
||||
int startAddr = 0;
|
||||
int stopAddr = 0;
|
||||
// cannot scan values
|
||||
if (sscanf(line, "%s 0x%x 0x%x", command, &startAddr, &stopAddr) !=
|
||||
3) {
|
||||
@ -468,7 +342,7 @@ int loadPatternFile(char *patFname, char *errMessage) {
|
||||
level = 2;
|
||||
}
|
||||
|
||||
uint32_t addr = 0;
|
||||
int addr = 0;
|
||||
// cannot scan values
|
||||
if (sscanf(line, "%s 0x%x", command, &addr) != 2) {
|
||||
sprintf(temp, "Could not scan patwait%d arguments.\n", level);
|
||||
@ -525,4 +399,574 @@ int loadPatternFile(char *patFname, char *errMessage) {
|
||||
|
||||
LOG(logINFOBLUE, ("Successfully read default pattern file\n"));
|
||||
return OK;
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
|
||||
#ifdef VIRTUAL
|
||||
void initializePatternWord() {
|
||||
memset(virtual_pattern, 0, sizeof(virtual_pattern));
|
||||
}
|
||||
#endif
|
||||
|
||||
uint64_t pattern_readIOControl() {
|
||||
return get64BitReg(PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG);
|
||||
}
|
||||
|
||||
int pattern_writeIOControl(char *message, uint64_t arg) {
|
||||
writePatternIOControl(arg);
|
||||
|
||||
// validate result
|
||||
uint64_t retval = pattern_readIOControl();
|
||||
LOG(logDEBUG1,
|
||||
("Pattern IO Control retval: 0x%llx\n", (long long int)retval));
|
||||
int ret = OK;
|
||||
validate64(&ret, message, arg, retval, "set pattern IO Control", HEX);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void writePatternIOControl(uint64_t word) {
|
||||
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);
|
||||
}
|
||||
#endif
|
||||
|
||||
int pattern_readWord(char *message, int addr, uint64_t *word) {
|
||||
// validate input
|
||||
if (addr < 0 || addr >= MAX_PATTERN_LENGTH) {
|
||||
sprintf(message,
|
||||
"Cannot read pattern word. Addr must be between 0 and 0x%x.\n",
|
||||
MAX_PATTERN_LENGTH);
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
*word = readPatternWord(addr);
|
||||
return OK;
|
||||
}
|
||||
|
||||
uint64_t readPatternWord(int addr) {
|
||||
#ifdef MYTHEN3D
|
||||
LOG(logDEBUG1, (" Reading Pattern Word (addr:0x%x)\n", addr));
|
||||
// the first word in RAM as base plus the offset of the word to write (addr)
|
||||
uint32_t reg_lsb = PATTERN_STEP0_LSB_REG + addr * REG_OFFSET * 2;
|
||||
uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr * REG_OFFSET * 2;
|
||||
return get64BitReg(reg_lsb, reg_msb);
|
||||
#else
|
||||
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
|
||||
#ifndef VIRTUAL
|
||||
return get64BitReg(PATTERN_OUT_LSB_REG, PATTERN_OUT_MSB_REG);
|
||||
#else
|
||||
return virtual_pattern[addr];
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
int pattern_writeWord(char *message, int addr, uint64_t word) {
|
||||
// validate input
|
||||
if (addr < 0 || addr >= MAX_PATTERN_LENGTH) {
|
||||
sprintf(message,
|
||||
"Cannot set pattern word. Addr must be between 0 and 0x%x.\n",
|
||||
MAX_PATTERN_LENGTH);
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
writePatternWord(addr, word);
|
||||
|
||||
// validate result
|
||||
int ret = OK;
|
||||
// cannot validate for moench, ctb ( same as executing pattern word)
|
||||
#ifdef MYTHEN3D
|
||||
uint64_t retval = readPatternWord(addr);
|
||||
LOG(logDEBUG1, ("Pattern word (addr:0x%x) retval: 0x%llx\n", addr,
|
||||
(long long int)retval));
|
||||
char mode[128];
|
||||
memset(mode, 0, sizeof(mode));
|
||||
sprintf(mode, "set pattern word for addr 0x%x", addr);
|
||||
validate64(&ret, message, word, retval, "set pattern word", HEX);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
void writePatternWord(int addr, uint64_t word) {
|
||||
LOG(logDEBUG1, ("Setting Pattern Word (addr:0x%x, word:0x%llx)\n", addr,
|
||||
(long long int)word));
|
||||
|
||||
#ifndef MYTHEN3D
|
||||
uint32_t reg = PATTERN_CNTRL_REG;
|
||||
|
||||
// write word
|
||||
set64BitReg(word, 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
|
||||
// mythen
|
||||
#else
|
||||
// the first word in RAM as base plus the offset of the word to write (addr)
|
||||
uint32_t reg_lsb = PATTERN_STEP0_LSB_REG + addr * REG_OFFSET * 2;
|
||||
uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr * REG_OFFSET * 2;
|
||||
set64BitReg(word, reg_lsb, reg_msb);
|
||||
#endif
|
||||
}
|
||||
|
||||
int pattern_getWaitAddresses(char *message, int level, int *addr) {
|
||||
// validate input
|
||||
if (level < 0 || level > 2) {
|
||||
sprintf(message,
|
||||
"Cannot get patwait address. Level must be between 0 and 2.\n");
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
*addr = getPatternWaitAddress(level);
|
||||
return OK;
|
||||
}
|
||||
|
||||
int getPatternWaitAddress(int level) {
|
||||
switch (level) {
|
||||
case 0:
|
||||
return ((bus_r(PATTERN_WAIT_0_ADDR_REG) & PATTERN_WAIT_0_ADDR_MSK) >>
|
||||
PATTERN_WAIT_0_ADDR_OFST);
|
||||
case 1:
|
||||
return ((bus_r(PATTERN_WAIT_1_ADDR_REG) & PATTERN_WAIT_1_ADDR_MSK) >>
|
||||
PATTERN_WAIT_1_ADDR_OFST);
|
||||
case 2:
|
||||
return ((bus_r(PATTERN_WAIT_2_ADDR_REG) & PATTERN_WAIT_2_ADDR_MSK) >>
|
||||
PATTERN_WAIT_2_ADDR_OFST);
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
int pattern_setWaitAddresses(char *message, int level, int addr) {
|
||||
// validate input
|
||||
if (level < 0 || level > 2) {
|
||||
sprintf(message,
|
||||
"Cannot set patwait address. Level must be between 0 and 2.\n");
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
if (addr < 0 || addr >= MAX_PATTERN_LENGTH) {
|
||||
sprintf(message,
|
||||
"Cannot set patwait address (level: %d). Addr must be between "
|
||||
"0 and 0x%x.\n",
|
||||
level, MAX_PATTERN_LENGTH);
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
setPatternWaitAddress(level, addr);
|
||||
|
||||
// validate result
|
||||
int retval = getPatternWaitAddress(level);
|
||||
LOG(logDEBUG1,
|
||||
("Pattern wait address (level:%d) retval: 0x%x\n", level, retval));
|
||||
int ret = OK;
|
||||
char mode[128];
|
||||
memset(mode, 0, sizeof(mode));
|
||||
sprintf(mode, "set pattern Loop %d wait address", level);
|
||||
validate(&ret, message, addr, retval, mode, HEX);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void setPatternWaitAddress(int level, int addr) {
|
||||
#ifdef MYTHEN3D
|
||||
LOG(trimmingPrint,
|
||||
#else
|
||||
LOG(logINFO,
|
||||
#endif
|
||||
("Setting Pattern Wait Address (level:%d, addr:0x%x)\n", level, addr));
|
||||
switch (level) {
|
||||
case 0:
|
||||
bus_w(PATTERN_WAIT_0_ADDR_REG,
|
||||
((addr << PATTERN_WAIT_0_ADDR_OFST) & PATTERN_WAIT_0_ADDR_MSK));
|
||||
break;
|
||||
case 1:
|
||||
bus_w(PATTERN_WAIT_1_ADDR_REG,
|
||||
((addr << PATTERN_WAIT_1_ADDR_OFST) & PATTERN_WAIT_1_ADDR_MSK));
|
||||
break;
|
||||
case 2:
|
||||
bus_w(PATTERN_WAIT_2_ADDR_REG,
|
||||
((addr << PATTERN_WAIT_2_ADDR_OFST) & PATTERN_WAIT_2_ADDR_MSK));
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int pattern_getWaitTime(char *message, int level, uint64_t *waittime) {
|
||||
// validate input
|
||||
if (level < 0 || level > 2) {
|
||||
sprintf(message,
|
||||
"Cannot get patwaittime. Level must be between 0 and 2.\n");
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
*waittime = getPatternWaitTime(level);
|
||||
return OK;
|
||||
}
|
||||
|
||||
uint64_t getPatternWaitTime(int level) {
|
||||
switch (level) {
|
||||
case 0:
|
||||
return get64BitReg(PATTERN_WAIT_TIMER_0_LSB_REG,
|
||||
PATTERN_WAIT_TIMER_0_MSB_REG);
|
||||
case 1:
|
||||
return get64BitReg(PATTERN_WAIT_TIMER_1_LSB_REG,
|
||||
PATTERN_WAIT_TIMER_1_MSB_REG);
|
||||
case 2:
|
||||
return get64BitReg(PATTERN_WAIT_TIMER_2_LSB_REG,
|
||||
PATTERN_WAIT_TIMER_2_MSB_REG);
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
int pattern_setWaitTime(char *message, int level, uint64_t waittime) {
|
||||
// validate input
|
||||
if (level < 0 || level > 2) {
|
||||
sprintf(message,
|
||||
"Cannot set patwaittime. Level must be between 0 and 2.\n");
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
setPatternWaitTime(level, waittime);
|
||||
|
||||
// validate result
|
||||
uint64_t retval = getPatternWaitTime(level);
|
||||
LOG(logDEBUG1, ("Pattern wait time (level:%d) retval: %d\n", level,
|
||||
(long long int)retval));
|
||||
int ret = OK;
|
||||
char mode[128];
|
||||
memset(mode, 0, sizeof(mode));
|
||||
sprintf(mode, "set pattern Loop %d wait time", level);
|
||||
validate64(&ret, message, waittime, retval, mode, DEC);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void setPatternWaitTime(int level, uint64_t t) {
|
||||
#ifdef MYTHEN3D
|
||||
LOG(trimmingPrint,
|
||||
#else
|
||||
LOG(logINFO,
|
||||
#endif
|
||||
("Setting Pattern Wait Time (level:%d) :%lld\n", level,
|
||||
(long long int)t));
|
||||
switch (level) {
|
||||
case 0:
|
||||
set64BitReg(t, PATTERN_WAIT_TIMER_0_LSB_REG,
|
||||
PATTERN_WAIT_TIMER_0_MSB_REG);
|
||||
break;
|
||||
case 1:
|
||||
set64BitReg(t, PATTERN_WAIT_TIMER_1_LSB_REG,
|
||||
PATTERN_WAIT_TIMER_1_MSB_REG);
|
||||
break;
|
||||
case 2:
|
||||
set64BitReg(t, PATTERN_WAIT_TIMER_2_LSB_REG,
|
||||
PATTERN_WAIT_TIMER_2_MSB_REG);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int pattern_getLoopCycles(char *message, int level, int *numLoops) {
|
||||
// validate input
|
||||
if (level < 0 || level > 2) {
|
||||
sprintf(message,
|
||||
"Cannot get patnloop. Level must be between 0 and 2.\n");
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
*numLoops = getPatternLoopCycles(level);
|
||||
return OK;
|
||||
}
|
||||
|
||||
int getPatternLoopCycles(int level) {
|
||||
switch (level) {
|
||||
case 0:
|
||||
return bus_r(PATTERN_LOOP_0_ITERATION_REG);
|
||||
case 1:
|
||||
return bus_r(PATTERN_LOOP_1_ITERATION_REG);
|
||||
case 2:
|
||||
return bus_r(PATTERN_LOOP_2_ITERATION_REG);
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
int pattern_setLoopCycles(char *message, int level, int numLoops) {
|
||||
// validate input
|
||||
if (level < 0 || level > 2) {
|
||||
sprintf(message,
|
||||
"Cannot set patnloop. Level must be between 0 and 2.\n");
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
if (numLoops < 0) {
|
||||
sprintf(message,
|
||||
"Cannot set patnloop. Iterations must be between > 0.\n");
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
setPatternLoopCycles(level, numLoops);
|
||||
|
||||
// validate result
|
||||
int retval = getPatternLoopCycles(level);
|
||||
int ret = OK;
|
||||
char mode[128];
|
||||
memset(mode, 0, sizeof(mode));
|
||||
sprintf(mode, "set pattern Loop %d num loops", level);
|
||||
validate(&ret, message, numLoops, retval, mode, DEC);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void setPatternLoopCycles(int level, int nLoop) {
|
||||
#ifdef MYTHEN3D
|
||||
LOG(trimmingPrint,
|
||||
#else
|
||||
LOG(logINFO,
|
||||
#endif
|
||||
("Setting Pattern Loop Cycles(level:%d, nLoop:%d)\n", level, nLoop));
|
||||
switch (level) {
|
||||
case 0:
|
||||
bus_w(PATTERN_LOOP_0_ITERATION_REG, nLoop);
|
||||
break;
|
||||
case 1:
|
||||
bus_w(PATTERN_LOOP_1_ITERATION_REG, nLoop);
|
||||
break;
|
||||
case 2:
|
||||
bus_w(PATTERN_LOOP_2_ITERATION_REG, nLoop);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void pattern_getLoopLimits(int *startAddr, int *stopAddr) {
|
||||
*startAddr = ((bus_r(PATTERN_LIMIT_REG) & PATTERN_LIMIT_STRT_MSK) >>
|
||||
PATTERN_LIMIT_STRT_OFST);
|
||||
*stopAddr = ((bus_r(PATTERN_LIMIT_REG) & PATTERN_LIMIT_STP_MSK) >>
|
||||
PATTERN_LIMIT_STP_OFST);
|
||||
}
|
||||
|
||||
int pattern_setLoopLimits(char *message, int startAddr, int stopAddr) {
|
||||
// validate input
|
||||
if (startAddr < 0 || startAddr >= MAX_PATTERN_LENGTH || stopAddr < 0 ||
|
||||
stopAddr >= MAX_PATTERN_LENGTH) {
|
||||
sprintf(message,
|
||||
"Cannot set patlimits from default "
|
||||
"pattern file. Addr must be between 0 and 0x%x.\n",
|
||||
MAX_PATTERN_LENGTH);
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
setPatternLoopLimits(startAddr, stopAddr);
|
||||
|
||||
// validate result
|
||||
int r_startAddr = -1, r_stopAddr = -1;
|
||||
pattern_getLoopLimits(&r_startAddr, &r_stopAddr);
|
||||
int ret = OK;
|
||||
// start addr
|
||||
validate(&ret, message, startAddr, r_startAddr,
|
||||
"set pattern Limits start addr", HEX);
|
||||
if (ret == FAIL) {
|
||||
return FAIL;
|
||||
}
|
||||
// stop addr
|
||||
validate(&ret, message, stopAddr, r_stopAddr,
|
||||
"set pattern Limits stop addr", HEX);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void setPatternLoopLimits(int startAddr, int stopAddr) {
|
||||
#ifdef MYTHEN3D
|
||||
LOG(trimmingPrint,
|
||||
#else
|
||||
LOG(logINFO,
|
||||
#endif
|
||||
("Setting Pattern Loop Limits(startaddr:0x%x, stopaddr:0x%x)\n",
|
||||
startAddr, stopAddr));
|
||||
bus_w(PATTERN_LIMIT_REG,
|
||||
((startAddr << PATTERN_LIMIT_STRT_OFST) & PATTERN_LIMIT_STRT_MSK) |
|
||||
((stopAddr << PATTERN_LIMIT_STP_OFST) & PATTERN_LIMIT_STP_MSK));
|
||||
}
|
||||
|
||||
int pattern_getLoopAddresses(char *message, int level, int *startAddr,
|
||||
int *stopAddr) {
|
||||
// validate input
|
||||
if (level < 0 || level > 2) {
|
||||
sprintf(
|
||||
message,
|
||||
"Cannot get patloop addresses. Level must be between 0 and 2.\n");
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
getPatternLoopAddresses(level, startAddr, stopAddr);
|
||||
return OK;
|
||||
}
|
||||
|
||||
void getPatternLoopAddresses(int level, int *startAddr, int *stopAddr) {
|
||||
switch (level) {
|
||||
case 0:
|
||||
*startAddr =
|
||||
((bus_r(PATTERN_LOOP_0_ADDR_REG) & PATTERN_LOOP_0_ADDR_STRT_MSK) >>
|
||||
PATTERN_LOOP_0_ADDR_STRT_OFST);
|
||||
*stopAddr =
|
||||
((bus_r(PATTERN_LOOP_0_ADDR_REG) & PATTERN_LOOP_0_ADDR_STP_MSK) >>
|
||||
PATTERN_LOOP_0_ADDR_STP_OFST);
|
||||
break;
|
||||
case 1:
|
||||
*startAddr =
|
||||
((bus_r(PATTERN_LOOP_1_ADDR_REG) & PATTERN_LOOP_1_ADDR_STRT_MSK) >>
|
||||
PATTERN_LOOP_1_ADDR_STRT_OFST);
|
||||
*stopAddr =
|
||||
((bus_r(PATTERN_LOOP_1_ADDR_REG) & PATTERN_LOOP_1_ADDR_STP_MSK) >>
|
||||
PATTERN_LOOP_1_ADDR_STP_OFST);
|
||||
break;
|
||||
case 2:
|
||||
*startAddr =
|
||||
((bus_r(PATTERN_LOOP_2_ADDR_REG) & PATTERN_LOOP_2_ADDR_STRT_MSK) >>
|
||||
PATTERN_LOOP_2_ADDR_STRT_OFST);
|
||||
*stopAddr =
|
||||
((bus_r(PATTERN_LOOP_2_ADDR_REG) & PATTERN_LOOP_2_ADDR_STP_MSK) >>
|
||||
PATTERN_LOOP_2_ADDR_STP_OFST);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int pattern_setLoopAddresses(char *message, int level, int startAddr,
|
||||
int stopAddr) {
|
||||
// validate input
|
||||
if (level < 0 || level > 2) {
|
||||
sprintf(
|
||||
message,
|
||||
"Cannot set patloop addresses. Level must be between 0 and 2.\n");
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
if ((int32_t)startAddr < 0 || startAddr >= MAX_PATTERN_LENGTH ||
|
||||
(int32_t)stopAddr < 0 || stopAddr >= MAX_PATTERN_LENGTH) {
|
||||
sprintf(message,
|
||||
"Cannot set patloop addresses (level: %d). Addr must be "
|
||||
"between 0 and "
|
||||
"0x%x.\n",
|
||||
level, MAX_PATTERN_LENGTH);
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
setPatternLoopAddresses(level, startAddr, stopAddr);
|
||||
|
||||
// validate result
|
||||
int r_startAddr = -1, r_stopAddr = -1;
|
||||
getPatternLoopAddresses(level, &r_startAddr, &r_stopAddr);
|
||||
int ret = OK;
|
||||
char mode[128];
|
||||
// start addr
|
||||
memset(mode, 0, sizeof(mode));
|
||||
sprintf(mode, "set pattern Loop %d start addr", level);
|
||||
validate(&ret, message, startAddr, r_startAddr, mode, HEX);
|
||||
if (ret == FAIL) {
|
||||
return FAIL;
|
||||
}
|
||||
// stop addr
|
||||
memset(mode, 0, sizeof(mode));
|
||||
sprintf(mode, "set pattern Loop %d stop addr", level);
|
||||
validate(&ret, message, stopAddr, r_stopAddr, mode, HEX);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void setPatternLoopAddresses(int level, int startAddr, int stopAddr) {
|
||||
#ifdef MYTHEN3D
|
||||
LOG(trimmingPrint,
|
||||
#else
|
||||
LOG(logINFO,
|
||||
#endif
|
||||
("Setting Pattern Loop Address (level:%d, startaddr:0x%x, "
|
||||
"stopaddr:0x%x)\n",
|
||||
level, startAddr, stopAddr));
|
||||
switch (level) {
|
||||
case 0:
|
||||
bus_w(PATTERN_LOOP_0_ADDR_REG,
|
||||
((startAddr << PATTERN_LOOP_0_ADDR_STRT_OFST) &
|
||||
PATTERN_LOOP_0_ADDR_STRT_MSK) |
|
||||
((stopAddr << PATTERN_LOOP_0_ADDR_STP_OFST) &
|
||||
PATTERN_LOOP_0_ADDR_STP_MSK));
|
||||
break;
|
||||
case 1:
|
||||
bus_w(PATTERN_LOOP_1_ADDR_REG,
|
||||
((startAddr << PATTERN_LOOP_1_ADDR_STRT_OFST) &
|
||||
PATTERN_LOOP_1_ADDR_STRT_MSK) |
|
||||
((stopAddr << PATTERN_LOOP_1_ADDR_STP_OFST) &
|
||||
PATTERN_LOOP_1_ADDR_STP_MSK));
|
||||
break;
|
||||
case 2:
|
||||
bus_w(PATTERN_LOOP_2_ADDR_REG,
|
||||
((startAddr << PATTERN_LOOP_2_ADDR_STRT_OFST) &
|
||||
PATTERN_LOOP_2_ADDR_STRT_MSK) |
|
||||
((stopAddr << PATTERN_LOOP_2_ADDR_STP_OFST) &
|
||||
PATTERN_LOOP_2_ADDR_STP_MSK));
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void setPatternMask(uint64_t mask) {
|
||||
LOG(logINFO, ("Setting pattern mask to 0x%llx\n", 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) {
|
||||
LOG(logINFO, ("Setting pattern bit mask to 0x%llx\n", mask));
|
||||
set64BitReg(mask, PATTERN_SET_LSB_REG, PATTERN_SET_MSB_REG);
|
||||
}
|
||||
|
||||
uint64_t getPatternBitMask() {
|
||||
return get64BitReg(PATTERN_SET_LSB_REG, PATTERN_SET_MSB_REG);
|
||||
}
|
||||
|
||||
#ifdef MYTHEN3D
|
||||
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"));
|
||||
}
|
||||
#endif
|
Reference in New Issue
Block a user