M3defaultpattern (#227)

* default pattern for m3 and moench including Python bindings

Co-authored-by: Erik Frojdh <erik.frojdh@gmail.com>
This commit is contained in:
Dhanya Thattil
2020-12-09 13:28:39 +01:00
committed by GitHub
parent 85bc37f04d
commit a62e068a9a
22 changed files with 159 additions and 62 deletions

View File

@ -56,21 +56,35 @@
int ALTERA_PLL_C10_Reg_offset = 0x0;
const int ALTERA_PLL_C10_NUM = 2;
uint32_t ALTERA_PLL_C10_BaseAddress[2] = {0x0, 0x0};
uint32_t ALTERA_PLL_C10_Reset_Reg[2] = {0x0, 0x0};
uint32_t ALTERA_PLL_C10_Reset_Reg = 0x0;
uint32_t ALTERA_PLL_C10_Reset_Msk[2] = {0x0, 0x0};
#ifdef MYTHEN3D
uint32_t ALTERA_PLL_C10_Locked_Status_Reg = 0x0;
uint32_t ALTERA_PLL_C10_Locked_Status_Msk[2] = {0x0, 0x0};
#endif
int ALTERA_PLL_C10_VCO_FREQ[2] = {0, 0};
void ALTERA_PLL_C10_SetDefines(int regofst, uint32_t baseaddr0,
uint32_t baseaddr1, uint32_t resetreg0,
uint32_t resetreg1, uint32_t resetmsk0,
uint32_t resetmsk1, int vcofreq0, int vcofreq1) {
uint32_t baseaddr1, uint32_t resetreg,
uint32_t resetmsk0, uint32_t resetmsk1,
#ifdef MYTHEN3D
uint32_t statusreg, uint32_t statusmsk0,
uint32_t statusmsk1,
#endif
int vcofreq0, int vcofreq1) {
ALTERA_PLL_C10_Reg_offset = regofst;
ALTERA_PLL_C10_BaseAddress[0] = baseaddr0;
ALTERA_PLL_C10_BaseAddress[1] = baseaddr1;
ALTERA_PLL_C10_Reset_Reg[0] = resetreg0;
ALTERA_PLL_C10_Reset_Reg[1] = resetreg1;
ALTERA_PLL_C10_Reset_Reg = resetreg;
ALTERA_PLL_C10_Reset_Msk[0] = resetmsk0;
ALTERA_PLL_C10_Reset_Msk[1] = resetmsk1;
// pll locked status reg and msk only used for m3 now
#ifdef MYTHEN3D
ALTERA_PLL_C10_Locked_Status_Reg = statusreg;
ALTERA_PLL_C10_Locked_Status_Msk[0] = statusmsk0;
ALTERA_PLL_C10_Locked_Status_Msk[1] = statusmsk1;
#endif
ALTERA_PLL_C10_VCO_FREQ[0] = vcofreq0;
ALTERA_PLL_C10_VCO_FREQ[1] = vcofreq1;
}
@ -98,12 +112,24 @@ void ALTERA_PLL_C10_Reconfigure(int pllIndex) {
}
void ALTERA_PLL_C10_ResetPLL(int pllIndex) {
uint32_t resetreg = ALTERA_PLL_C10_Reset_Reg[pllIndex];
uint32_t resetreg = ALTERA_PLL_C10_Reset_Reg;
uint32_t resetmsk = ALTERA_PLL_C10_Reset_Msk[pllIndex];
LOG(logINFO, ("Resetting PLL %d\n", pllIndex));
bus_w_csp1(resetreg, bus_r_csp1(resetreg) | resetmsk);
usleep(ALTERA_PLL_C10_WAIT_TIME_US);
#ifndef VIRTUAL
#ifdef MYTHEN3D
uint32_t statusreg = ALTERA_PLL_C10_Locked_Status_Reg;
uint32_t statusmsk = ALTERA_PLL_C10_Locked_Status_Msk[pllIndex];
// wait for pll locked bit to go high
while (!(bus_r(statusreg) & statusmsk)) {
usleep(ALTERA_PLL_C10_WAIT_TIME_US);
LOG(logWARNING, ("Still waiting for PLL %d recovery\n", pllIndex));
}
LOG(logINFO, ("Reset success for PLL %d\n", pllIndex));
#endif
#endif
}
void ALTERA_PLL_C10_SetPhaseShift(int pllIndex, int clkIndex, int phase,

View File

@ -8,7 +8,6 @@
#include <string.h>
extern char initErrorMessage[MAX_STR_LENGTH];
extern int initError;
#ifndef MYTHEN3D
extern uint64_t writePatternIOControl(uint64_t word);
@ -19,11 +18,7 @@ extern uint64_t setPatternWaitTime(int level, uint64_t t);
extern void setPatternLoop(int level, int *startAddr, int *stopAddr,
int *nLoop);
int loadDefaultPattern(char *patFname) {
if (initError == FAIL) {
return initError;
}
int loadDefaultPattern(char *patFname, char *errMessage) {
char fname[128];
if (getAbsPath(fname, 128, patFname) == FAIL) {
return FAIL;
@ -32,10 +27,8 @@ int loadDefaultPattern(char *patFname) {
// open config file
FILE *fd = fopen(fname, "r");
if (fd == NULL) {
sprintf(initErrorMessage, "Could not open pattern file [%s].\n",
patFname);
initError = FAIL;
LOG(logERROR, ("%s\n\n", initErrorMessage));
sprintf(errMessage, "Could not open pattern file [%s].\n", patFname);
LOG(logERROR, ("%s\n\n", errMessage));
return FAIL;
}
LOG(logINFOBLUE, ("Reading default pattern file %s\n", patFname));
@ -100,7 +93,7 @@ int loadDefaultPattern(char *patFname) {
#else
if (sscanf(line, "%s 0x%x 0x%llx", command, &addr, &word) != 3) {
#endif
sprintf(initErrorMessage,
sprintf(errMessage,
"Could not scan patword arguments from default "
"pattern file. Line:[%s].\n",
line);
@ -123,7 +116,7 @@ int loadDefaultPattern(char *patFname) {
#else
if (sscanf(line, "%s 0x%llx", command, &arg) != 2) {
#endif
sprintf(initErrorMessage,
sprintf(errMessage,
"Could not scan patioctrl arguments from default "
"pattern file. Line:[%s].\n",
line);
@ -144,7 +137,7 @@ int loadDefaultPattern(char *patFname) {
// cannot scan values
if (sscanf(line, "%s 0x%x 0x%x", command, &startAddr, &stopAddr) !=
3) {
sprintf(initErrorMessage,
sprintf(errMessage,
"Could not scan patlimits arguments from default "
"pattern file. Line:[%s].\n",
line);
@ -177,7 +170,7 @@ int loadDefaultPattern(char *patFname) {
// cannot scan values
if (sscanf(line, "%s 0x%x 0x%x", command, &startAddr, &stopAddr) !=
3) {
sprintf(initErrorMessage,
sprintf(errMessage,
"Could not scan patloop%d arguments from default "
"pattern file. Line:[%s].\n",
level, line);
@ -208,7 +201,7 @@ int loadDefaultPattern(char *patFname) {
int numLoops = -1;
// cannot scan values
if (sscanf(line, "%s %d", command, &numLoops) != 2) {
sprintf(initErrorMessage,
sprintf(errMessage,
"Could not scan patnloop%d arguments from default "
"pattern file. Line:[%s].\n",
level, line);
@ -238,7 +231,7 @@ int loadDefaultPattern(char *patFname) {
uint32_t addr = 0;
// cannot scan values
if (sscanf(line, "%s 0x%x", command, &addr) != 2) {
sprintf(initErrorMessage,
sprintf(errMessage,
"Could not scan patwait%d arguments from default "
"pattern file. Line:[%s].\n",
level, line);
@ -273,7 +266,7 @@ int loadDefaultPattern(char *patFname) {
#else
if (sscanf(line, "%s %lld", command, &waittime) != 2) {
#endif
sprintf(initErrorMessage,
sprintf(errMessage,
"Could not scan patwaittime%d arguments from default "
"pattern file. Line:[%s].\n",
level, line);
@ -289,13 +282,12 @@ int loadDefaultPattern(char *patFname) {
}
fclose(fd);
if (strlen(initErrorMessage)) {
initError = FAIL;
LOG(logERROR, ("%s\n\n", initErrorMessage));
} else {
LOG(logINFOBLUE, ("Successfully read default pattern file\n"));
if (strlen(errMessage)) {
LOG(logERROR, ("%s\n\n", errMessage));
return FAIL;
}
return initError;
LOG(logINFOBLUE, ("Successfully read default pattern file\n"));
return OK;
}
int default_writePatternWord(char *line, uint32_t addr, uint64_t word) {

View File

@ -366,6 +366,7 @@ void function_table() {
flist[F_SET_DEFAULT_DACS] = &set_default_dacs;
flist[F_IS_VIRTUAL] = &is_virtual;
flist[F_GET_PATTERN] = &get_pattern;
flist[F_LOAD_DEFAULT_PATTERN] = &load_default_pattern;
// check
if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) {
@ -8297,3 +8298,20 @@ int is_virtual(int file_des) {
LOG(logDEBUG1, ("is virtual retval: %d\n", retval));
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
}
int load_default_pattern(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
#if !defined(MYTHEN3D) && !defined(MOENCHD)
functionNotImplemented();
#else
if (Server_VerifyLock() == OK) {
ret = loadDefaultPattern(DEFAULT_PATTERN_FILE, mess);
if (ret == FAIL) {
LOG(logERROR, (mess));
}
}
#endif
return Server_SendResult(file_des, INT32, NULL, 0);
}