From d07873ee395498d07f87da99cf9d553ff98a967b Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 22 Nov 2019 11:29:24 +0100 Subject: [PATCH] mythen3 and gotthard2: wait request not needed, reset to be implemented --- .../gotthard2DetectorServer/RegisterDefs.h | 10 --- .../slsDetectorFunctionList.c | 12 ++- .../mythen3DetectorServer/RegisterDefs.h | 9 --- .../bin/mythen3DetectorServer_developer | Bin 163676 -> 163596 bytes .../slsDetectorFunctionList.c | 12 ++- .../include/ALTERA_PLL_CYCLONE10.h | 17 ++--- .../src/ALTERA_PLL_CYCLONE10.c | 69 ++++-------------- slsSupportLib/include/versionAPI.h | 2 +- 8 files changed, 29 insertions(+), 102 deletions(-) diff --git a/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h b/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h index 5314c6a87..3d20bd3d2 100644 --- a/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h +++ b/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h @@ -28,11 +28,6 @@ #define READOUT_PLL_RESET_OFST (0) #define READOUT_PLL_RESET_MSK (0x00000001 << READOUT_PLL_RESET_OFST) -#define READOUT_PLL_WAIT_REG (0x2 * REG_OFFSET + BASE_READOUT_PLL) //TODO - -#define READOUT_PLL_WAIT_OFST (0) -#define READOUT_PLL_WAIT_MSK (0x00000001 << READOUT_PLL_WAIT_OFST) - /* System PLL registers --------------------------------------------------*/ @@ -41,11 +36,6 @@ #define SYSTEM_PLL_RESET_OFST (0) #define SYSTEM_PLL_RESET_MSK (0x00000001 << SYSTEM_PLL_RESET_OFST) -#define SYSTEM_PLL_WAIT_REG (0x2 * REG_OFFSET + BASE_SYSTEM_PLL) //TODO - -#define SYSTEM_PLL_WAIT_OFST (0) -#define SYSTEM_PLL_WAIT_MSK (0x00000001 << SYSTEM_PLL_WAIT_OFST) - /* Control registers --------------------------------------------------*/ diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c index 821c8a0c4..cc80016bf 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c @@ -371,7 +371,7 @@ void setupDetector() { #ifndef VIRTUAL // pll defines - ALTERA_PLL_C10_SetDefines(REG_OFFSET, BASE_READOUT_PLL, BASE_SYSTEM_PLL, READOUT_PLL_RESET_REG, SYSTEM_PLL_RESET_REG, READOUT_PLL_RESET_MSK, SYSTEM_PLL_RESET_MSK, READOUT_PLL_WAIT_REG, SYSTEM_PLL_WAIT_REG, READOUT_PLL_WAIT_MSK, SYSTEM_PLL_WAIT_MSK, READOUT_PLL_VCO_FREQ_HZ, SYSTEM_PLL_VCO_FREQ_HZ); + ALTERA_PLL_C10_SetDefines(REG_OFFSET, BASE_READOUT_PLL, BASE_SYSTEM_PLL, READOUT_PLL_RESET_REG, SYSTEM_PLL_RESET_REG, READOUT_PLL_RESET_MSK, SYSTEM_PLL_RESET_MSK, READOUT_PLL_VCO_FREQ_HZ, SYSTEM_PLL_VCO_FREQ_HZ); ALTERA_PLL_C10_ResetPLL(READOUT_PLL); ALTERA_PLL_C10_ResetPLL(SYSTEM_PLL); // hv @@ -1028,14 +1028,12 @@ int setPhase(enum CLKINDEX ind, int val, int degrees) { relativePhase *= -1; direction = 0; } - FILE_LOG(logDEBUG1, ("\tConfiguring Phase: [phase:%d (0x%x), direction:%d]\n", relativePhase, relativePhase, direction)); - int pllIndex = ind >= SYSTEM_C0 ? SYSTEM_PLL : READOUT_PLL; int clkIndex = ind >= SYSTEM_C0 ? ind - SYSTEM_C0 : ind; - int ret = ALTERA_PLL_C10_SetPhaseShift(pllIndex, clkIndex, relativePhase, direction); + ALTERA_PLL_C10_SetPhaseShift(pllIndex, clkIndex, relativePhase, direction); clkPhase[ind] = valShift; - return ret; + return OK; } int getPhase(enum CLKINDEX ind, int degrees) { @@ -1139,7 +1137,7 @@ int setClockDivider(enum CLKINDEX ind, int val) { // Calculate and set output frequency int pllIndex = ind >= SYSTEM_C0 ? SYSTEM_PLL : READOUT_PLL; int clkIndex = ind >= SYSTEM_C0 ? ind - SYSTEM_C0 : ind; - int ret = ALTERA_PLL_C10_SetOuputFrequency (pllIndex, clkIndex, newfreq); + ALTERA_PLL_C10_SetOuputFrequency (pllIndex, clkIndex, newfreq); clkFrequency[ind] = newfreq; FILE_LOG(logINFO, ("\t%s clock (%d) divider set to %d (%d Hz)\n", clock_names[ind], ind, val, clkFrequency[ind])); @@ -1162,7 +1160,7 @@ int setClockDivider(enum CLKINDEX ind, int val) { setPhase(i, oldPhases[i], 1); } } - return ret; + return OK; } int getClockDivider(enum CLKINDEX ind) { diff --git a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h index e66033aee..f7a6f7ab9 100644 --- a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h +++ b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h @@ -38,11 +38,6 @@ #define READOUT_PLL_RESET_OFST (0) #define READOUT_PLL_RESET_MSK (0x00000001 << READOUT_PLL_RESET_OFST) -#define READOUT_PLL_WAIT_REG (0x2 * REG_OFFSET + BASE_READOUT_PLL) //TODO - -#define READOUT_PLL_WAIT_OFST (0) -#define READOUT_PLL_WAIT_MSK (0x00000001 << READOUT_PLL_WAIT_OFST) - /* System PLL registers --------------------------------------------------*/ @@ -51,10 +46,6 @@ #define SYSTEM_PLL_RESET_OFST (0) #define SYSTEM_PLL_RESET_MSK (0x00000001 << SYSTEM_PLL_RESET_OFST) -#define SYSTEM_PLL_WAIT_REG (0x2 * REG_OFFSET + BASE_SYSTEM_PLL) //TODO - -#define SYSTEM_PLL_WAIT_OFST (0) -#define SYSTEM_PLL_WAIT_MSK (0x00000001 << SYSTEM_PLL_WAIT_OFST) /* Control registers --------------------------------------------------*/ diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index 6266e24915aba6d9524551596d97c7b12978f5c9..4b2052a6026226eefc8d5a5406b33e5315cdc094 100755 GIT binary patch delta 45348 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 wN94AQ`IR;^m`cbwF}a1X)%HrL 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 QINNcmD0EjIpD9-RKcM)~$N&HU diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c index a404a9780..ac94aaed7 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c @@ -351,7 +351,7 @@ void setupDetector() { #ifndef VIRTUAL // pll defines - ALTERA_PLL_C10_SetDefines(REG_OFFSET, BASE_READOUT_PLL, BASE_SYSTEM_PLL, READOUT_PLL_RESET_REG, SYSTEM_PLL_RESET_REG, READOUT_PLL_RESET_MSK, SYSTEM_PLL_RESET_MSK, READOUT_PLL_WAIT_REG, SYSTEM_PLL_WAIT_REG, READOUT_PLL_WAIT_MSK, SYSTEM_PLL_WAIT_MSK, READOUT_PLL_VCO_FREQ_HZ, SYSTEM_PLL_VCO_FREQ_HZ); + ALTERA_PLL_C10_SetDefines(REG_OFFSET, BASE_READOUT_PLL, BASE_SYSTEM_PLL, READOUT_PLL_RESET_REG, SYSTEM_PLL_RESET_REG, READOUT_PLL_RESET_MSK, SYSTEM_PLL_RESET_MSK, READOUT_PLL_VCO_FREQ_HZ, SYSTEM_PLL_VCO_FREQ_HZ); ALTERA_PLL_C10_ResetPLL(READOUT_PLL); ALTERA_PLL_C10_ResetPLL(SYSTEM_PLL); // hv @@ -1054,14 +1054,12 @@ int setPhase(enum CLKINDEX ind, int val, int degrees) { relativePhase *= -1; direction = 0; } - FILE_LOG(logDEBUG1, ("\tConfiguring Phase: [phase:%d (0x%x), direction:%d]\n", relativePhase, relativePhase, direction)); - int pllIndex = ind >= SYSTEM_C0 ? SYSTEM_PLL : READOUT_PLL; int clkIndex = ind >= SYSTEM_C0 ? ind - SYSTEM_C0 : ind; - int ret = ALTERA_PLL_C10_SetPhaseShift(pllIndex, clkIndex, relativePhase, direction); + ALTERA_PLL_C10_SetPhaseShift(pllIndex, clkIndex, relativePhase, direction); clkPhase[ind] = valShift; - return ret; + return OK; } int getPhase(enum CLKINDEX ind, int degrees) { @@ -1165,7 +1163,7 @@ int setClockDivider(enum CLKINDEX ind, int val) { // Calculate and set output frequency int pllIndex = ind >= SYSTEM_C0 ? SYSTEM_PLL : READOUT_PLL; int clkIndex = ind >= SYSTEM_C0 ? ind - SYSTEM_C0 : ind; - int ret = ALTERA_PLL_C10_SetOuputFrequency (pllIndex, clkIndex, newfreq); + ALTERA_PLL_C10_SetOuputFrequency (pllIndex, clkIndex, newfreq); clkFrequency[ind] = newfreq; FILE_LOG(logINFO, ("\t%s clock (%d) divider set to %d (%d Hz)\n", clock_names[ind], ind, val, clkFrequency[ind])); @@ -1187,7 +1185,7 @@ int setClockDivider(enum CLKINDEX ind, int val) { setPhase(i, oldPhases[i], 1); } } - return ret; + return OK; } int getClockDivider(enum CLKINDEX ind) { diff --git a/slsDetectorServers/slsDetectorServer/include/ALTERA_PLL_CYCLONE10.h b/slsDetectorServers/slsDetectorServer/include/ALTERA_PLL_CYCLONE10.h index 2fe6c3a0c..b47d3f080 100755 --- a/slsDetectorServers/slsDetectorServer/include/ALTERA_PLL_CYCLONE10.h +++ b/slsDetectorServers/slsDetectorServer/include/ALTERA_PLL_CYCLONE10.h @@ -11,14 +11,10 @@ * @param resetreg1 reset register of pll 1 * @param resetmsk reset mask of pll 0 * @param resetms1 reset mask of pll 1 - * @param waitreg0 wait register of pll 0 - * @param waitreg1 wait register of pll 1 - * @param waitmsk0 wait mask of pll 0 - * @param waitmsk1 wait mask of pll 1 * @param vcofreq0 vco frequency of pll 0 * @param vcofreq1 vco frequency of pll 1 */ -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, uint32_t waitreg0, uint32_t waitreg1, uint32_t waitmsk0, uint32_t waitmsk1, int vcofreq0, int vcofreq1); +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); /** * Get Max Clock Divider @@ -39,11 +35,10 @@ int ALTERA_PLL_C10_GetVCOFrequency(int pllIndex); int ALTERA_PLL_C10_GetMaxPhaseShiftStepsofVCO(); /** - * Start reconfiguration and wait till its complete + * Start reconfiguration * @param pllIndex pll index - * @returns FAIL if wait request signal took too long to deassert, else OK */ -int ALTERA_PLL_C10_Reconfigure(int pllIndex); +void ALTERA_PLL_C10_Reconfigure(int pllIndex); /** * Reset pll @@ -57,16 +52,14 @@ void ALTERA_PLL_C10_ResetPLL (int pllIndex); * @param clkIndex clock index * @param phase phase shift * @param pos 1 if up down direction of shift is positive, else 0 - * @returns OK or FAIL or reconfigure */ -int ALTERA_PLL_C10_SetPhaseShift(int pllIndex, int clkIndex, int phase, int pos); +void ALTERA_PLL_C10_SetPhaseShift(int pllIndex, int clkIndex, int phase, int pos); /** * Calculate and write output frequency * @param pllIndex pll index * @param clkIndex clock index * @param value frequency in Hz to set to - * @returns OK or FAIL of reconfigure */ -int ALTERA_PLL_C10_SetOuputFrequency (int pllIndex, int clkIndex, int value); +void ALTERA_PLL_C10_SetOuputFrequency (int pllIndex, int clkIndex, int value); diff --git a/slsDetectorServers/slsDetectorServer/src/ALTERA_PLL_CYCLONE10.c b/slsDetectorServers/slsDetectorServer/src/ALTERA_PLL_CYCLONE10.c index 8325f4e79..ba1149c4a 100755 --- a/slsDetectorServers/slsDetectorServer/src/ALTERA_PLL_CYCLONE10.c +++ b/slsDetectorServers/slsDetectorServer/src/ALTERA_PLL_CYCLONE10.c @@ -41,7 +41,7 @@ #define ALTERA_PLL_C10_SHIFT_UP_DOWN_POS_VAL ((0x1 << ALTERA_PLL_C10_SHIFT_UP_DOWN_OFST) & ALTERA_PLL_C10_SHIFT_UP_DOWN_MSK) #define ALTERA_PLL_C10_PHASE_SHIFT_STEP_OF_VCO (8) -#define ALTERA_PLL_C10_WAIT_TIME_US (10 * 1000) +#define ALTERA_PLL_C10_WAIT_TIME_US (1 * 1000) // 1 ms int ALTERA_PLL_C10_Reg_offset = 0x0; @@ -49,11 +49,9 @@ 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_Msk[2] = {0x0, 0x0}; -uint32_t ALTERA_PLL_C10_Wait_Reg[2] = {0x0, 0x0}; -uint32_t ALTERA_PLL_C10_Wait_Msk[2] = {0x0, 0x0}; 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, uint32_t waitreg0, uint32_t waitreg1, uint32_t waitmsk0, uint32_t waitmsk1, int vcofreq0, int vcofreq1) { +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) { ALTERA_PLL_C10_Reg_offset = regofst; ALTERA_PLL_C10_BaseAddress[0] = baseaddr0; ALTERA_PLL_C10_BaseAddress[1] = baseaddr1; @@ -61,10 +59,6 @@ void ALTERA_PLL_C10_SetDefines(int regofst, uint32_t baseaddr0, uint32_t baseadd ALTERA_PLL_C10_Reset_Reg[1] = resetreg1; ALTERA_PLL_C10_Reset_Msk[0] = resetmsk0; ALTERA_PLL_C10_Reset_Msk[1] = resetmsk1; - ALTERA_PLL_C10_Wait_Reg[0] = waitreg0; - ALTERA_PLL_C10_Wait_Reg[1] = waitreg1; - ALTERA_PLL_C10_Wait_Msk[0] = waitmsk0; - ALTERA_PLL_C10_Wait_Msk[1] = waitmsk1; ALTERA_PLL_C10_VCO_FREQ[0] = vcofreq0; ALTERA_PLL_C10_VCO_FREQ[1] = vcofreq1; } @@ -81,63 +75,32 @@ int ALTERA_PLL_C10_GetMaxPhaseShiftStepsofVCO() { return ALTERA_PLL_C10_PHASE_SHIFT_STEP_OF_VCO; } -int ALTERA_PLL_C10_Reconfigure(int pllIndex) { +void ALTERA_PLL_C10_Reconfigure(int pllIndex) { FILE_LOG(logINFO, ("\tReconfiguring PLL %d\n", pllIndex)); - //uint32_t waitreg = ALTERA_PLL_C10_Wait_Reg[pllIndex]; - //uint32_t waitmsk = ALTERA_PLL_C10_Wait_Msk[pllIndex]; // write anything to base address to start reconfiguring FILE_LOG(logDEBUG1, ("\tWriting 1 to base address 0x%x to start reconfiguring\n", ALTERA_PLL_C10_BaseAddress[pllIndex])); bus_w_csp1(ALTERA_PLL_C10_BaseAddress[pllIndex], 0x1); - - // wait for write operation to be completed by polling wait request bit - int ret = OK; - - FILE_LOG(logDEBUG1, ("\tWaiting a second (instead of wait request bit in fw)\n")); - usleep(1 * 1000 * 1000); - - /* TODO wait reg and wait mask to be done in firware, so wait instead (above) - int counter = 0; - while (bus_r_csp1(waitreg) & waitmsk) { - usleep(ALTERA_PLL_C10_WAIT_TIME_US); - ++counter; - if (counter >= 100) { - FILE_LOG(logERROR, ("Waited for the pll wait request for 1 s. Not waiting anymore.")); - ret = FAIL; - break; - } - } - FILE_LOG(logINFO, ("\tReconfiguring PLL %d done with %s\n", pllIndex, ret == FAIL ? "failure" : "success")); - */ - FILE_LOG(logDEBUG1, ("\tWaiting done\n")); - return ret; + usleep(ALTERA_PLL_C10_WAIT_TIME_US); } void ALTERA_PLL_C10_ResetPLL (int pllIndex) { - FILE_LOG(logINFO, ("Resetting PLL %d\n", pllIndex)); - //uint32_t resetreg = ALTERA_PLL_C10_Reset_Reg[pllIndex]; - //uint32_t resetmsk = ALTERA_PLL_C10_Reset_Msk[pllIndex]; + uint32_t resetreg = ALTERA_PLL_C10_Reset_Reg[pllIndex]; + uint32_t resetmsk = ALTERA_PLL_C10_Reset_Msk[pllIndex]; - FILE_LOG(logERROR, ("Reset not implemented yet!\n")); - /* TODO reset reg and reset mask to be done in firware, so wait instead (above) + FILE_LOG(logINFO, ("Resetting PLL %d\n", pllIndex)); bus_w_csp1(resetreg, bus_r_csp1(resetreg) | resetmsk); - usleep(ALTERA_PLL_C10_WAIT_TIME_US); //FIXME - bus_w_csp1(resetreg, bus_r_csp1(resetreg) & ~resetmsk);//FIXME - */ + usleep(ALTERA_PLL_C10_WAIT_TIME_US); } -int ALTERA_PLL_C10_SetPhaseShift(int pllIndex, int clkIndex, int phase, int pos) { - FILE_LOG(logINFO, ("\tC%d: Writing PLL %d Phase Shift [phase:%d, pos:%d]\n", clkIndex, pllIndex, phase, pos)); - FILE_LOG(logDEBUG1, ("\tBase address: 0x%x phasebasereg:0x%x\n", ALTERA_PLL_C10_BaseAddress[pllIndex], ALTERA_PLL_C10_PHASE_SHIFT_BASE_REG)); +void ALTERA_PLL_C10_SetPhaseShift(int pllIndex, int clkIndex, int phase, int pos) { + FILE_LOG(logINFO, ("\tC%d: Writing PLL %d Phase Shift [phase:%d, pos dir:%d]\n", clkIndex, pllIndex, phase, pos)); uint32_t addr = ALTERA_PLL_C10_BaseAddress[pllIndex] + (ALTERA_PLL_C10_PHASE_SHIFT_BASE_REG + (int)clkIndex) * ALTERA_PLL_C10_Reg_offset; - - int maxshifts = ALTERA_PLL_C10_MAX_SHIFTS_PER_OPERATION; // only 7 shifts at a time - int ret = OK; while (phase > 0) { int phaseToDo = (phase > maxshifts) ? maxshifts : phase; uint32_t value = (((phaseToDo << ALTERA_PLL_C10_SHIFT_NUM_SHIFTS_OFST) & ALTERA_PLL_C10_SHIFT_NUM_SHIFTS_MSK) | @@ -145,17 +108,13 @@ int ALTERA_PLL_C10_SetPhaseShift(int pllIndex, int clkIndex, int phase, int pos) FILE_LOG(logDEBUG1, ("\t[addr:0x%x, phaseTodo:%d phaseleft:%d phase word:0x%08x]\n", addr, phaseToDo, phase, value)); bus_w_csp1(addr, value); - if (ALTERA_PLL_C10_Reconfigure(pllIndex) == FAIL) { - ret = FAIL; - } - + ALTERA_PLL_C10_Reconfigure(pllIndex); phase -= phaseToDo; } - return ret; } -int ALTERA_PLL_C10_SetOuputFrequency (int pllIndex, int clkIndex, int value) { +void ALTERA_PLL_C10_SetOuputFrequency (int pllIndex, int clkIndex, int value) { int pllVCOFreqHz = ALTERA_PLL_C10_VCO_FREQ[pllIndex]; FILE_LOG(logDEBUG1, ("\tC%d: Setting output frequency for pll %d to %d (pllvcofreq: %dHz)\n", clkIndex, pllIndex, value, pllVCOFreqHz)); @@ -184,12 +143,10 @@ int ALTERA_PLL_C10_SetOuputFrequency (int pllIndex, int clkIndex, int value) { // write frequency bus_w_csp1(addr, val); - int ret = ALTERA_PLL_C10_Reconfigure(pllIndex); + ALTERA_PLL_C10_Reconfigure(pllIndex); // reset required to keep the phase relationships ALTERA_PLL_C10_ResetPLL (pllIndex); - - return ret; } diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index d2f718692..80135081a 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -7,6 +7,6 @@ #define APIGOTTHARD 0x191111 #define APIJUNGFRAU 0x191111 #define APIEIGER 0x191111 -#define APIMYTHEN3 0x191121 #define APIGOTTHARD2 0x191121 #define APICTB 0x191121 +#define APIMYTHEN3 0x191122