merge fix

This commit is contained in:
2021-06-08 12:29:33 +02:00
65 changed files with 554 additions and 467 deletions

View File

@ -109,6 +109,9 @@
#define SYSTEM_STATUS_R_PLL_LCKD_MSK (0x00000001 << SYSTEM_STATUS_R_PLL_LCKD_OFST)
#define SYSTEM_STATUS_RDO_PLL_LCKD_OFST (2)
#define SYSTEM_STATUS_RDO_PLL_LCKD_MSK (0x00000001 << SYSTEM_STATUS_RDO_PLL_LCKD_OFST)
#define SYSTEM_STATUS_SLV_BRD_DTCT_OFST (31)
#define SYSTEM_STATUS_SLV_BRD_DTCT_MSK (0x00000001 << SYSTEM_STATUS_SLV_BRD_DTCT_OFST)
/* Config RW regiseter */
#define CONFIG_REG (0x20 * REG_OFFSET + BASE_CONTROL)

View File

@ -5,8 +5,8 @@
#include "RegisterDefs.h"
#include "clogger.h"
#include "common.h"
#include "mythen3.h"
#include "loadPattern.h"
#include "mythen3.h"
#include "sharedMemory.h"
#include "sls/versionAPI.h"
#ifdef VIRTUAL
@ -21,7 +21,6 @@
#include <time.h>
#endif
// Global variable from slsDetectorServer_funcs
extern int debugflag;
extern int updateFlag;
@ -47,7 +46,7 @@ enum detectorSettings thisSettings;
sls_detector_module *detectorModules = NULL;
int *detectorChans = NULL;
int *detectorDacs = NULL;
int *channelMask=NULL;
int *channelMask = NULL;
int32_t clkPhase[NUM_CLOCKS] = {};
uint32_t clkDivider[NUM_CLOCKS] = {};
@ -379,7 +378,6 @@ void allocateDetectorStructureMemory() {
memset(channelMask, 0, NCHIP * NCHAN * sizeof(char));
detectorDacs = malloc(NDAC * sizeof(int));
LOG(logDEBUG1,
("modules from 0x%x to 0x%x\n", detectorModules, detectorModules));
LOG(logDEBUG1, ("chans from 0x%x to 0x%x\n", detectorChans, detectorChans));
@ -519,7 +517,7 @@ void setupDetector() {
powerChip(1);
if (!initError) {
setChipStatusRegister(CSR_default);
setChipStatusRegister(CSR_default);
}
setAllTrimbits(DEFAULT_TRIMBIT_VALUE);
@ -935,11 +933,17 @@ void setCounterMask(uint32_t arg) {
}
LOG(logINFO, ("\tUpdating Vth dacs\n"));
enum DACINDEX vthdacs[] = {M_VTH1, M_VTH2, M_VTH3};
for (int i = 0; i < NCOUNTERS; ++i) {
// if change in enable
if ((arg & (1 << i)) ^ (oldmask & (1 << i))) {
// will disable if counter disabled
setDAC(VTH1, vthEnabledVals[i], 0);
// disable, disable value
int value = DEFAULT_COUNTER_DISABLED_VTH_VAL;
// enable, set saved values
if (arg & (1 << i)) {
value = vthEnabledVals[i];
}
setGeneralDAC(vthdacs[i], value, 0);
}
}
}
@ -1057,7 +1061,7 @@ int64_t getMeasurementTime() {
/* parameters - module, speed, readout */
int setDACS(int* dacs){
int setDACS(int *dacs) {
for (int i = 0; i < NDAC; ++i) {
if (dacs[i] != -1) {
setDAC((enum DACINDEX)i, dacs[i], 0);
@ -1074,17 +1078,16 @@ int setDACS(int* dacs){
return OK;
}
int setModule(sls_detector_module myMod, char *mess) {
LOG(logINFO, ("Setting module\n"));
if (setChipStatusRegister(myMod.reg)){
if (setChipStatusRegister(myMod.reg)) {
sprintf(mess, "Could not CSR from module\n");
LOG(logERROR, (mess));
return FAIL;
}
if (setDACS(myMod.dacs)){
if (setDACS(myMod.dacs)) {
sprintf(mess, "Could not set dacs\n");
LOG(logERROR, (mess));
return FAIL;
@ -1093,7 +1096,7 @@ int setModule(sls_detector_module myMod, char *mess) {
for (int i = 0; i < NCOUNTERS; ++i) {
if (myMod.eV[i] >= 0) {
setThresholdEnergy(i, myMod.eV[i]);
}else{
} else {
setThresholdEnergy(i, -1);
}
}
@ -1114,6 +1117,7 @@ int setModule(sls_detector_module myMod, char *mess) {
}
int setTrimbits(int *trimbits) {
LOG(logINFOBLUE, ("Setting trimbits\n"));
// remember previous run clock
uint32_t prevRunClk = clkDivider[SYSTEM_C0];
patternParameters *pat = NULL;
@ -1130,7 +1134,7 @@ int setTrimbits(int *trimbits) {
pat = setChannelRegisterChip(ichip, channelMask,
trimbits); // change here!!!
if (pat) {
error |= loadPattern(pat);
error |= loadPattern(logDEBUG5, pat);
if (error == 0)
startPattern();
free(pat);
@ -1263,45 +1267,52 @@ void setThresholdEnergy(int counterIndex, int eV) {
/* parameters - dac, hv */
void setDAC(enum DACINDEX ind, int val, int mV) {
// invalid value
if (val < 0) {
return;
}
if (ind == M_VTHRESHOLD) {
LOG(logINFO,
("Setting Threshold voltages to %d %s\n", val, (mV ? "mv" : "")));
setDAC(M_VTH1, val, mV);
setDAC(M_VTH2, val, mV);
setDAC(M_VTH3, val, mV);
// out of scope, NDAC + 1 for vthreshold
if ((int)ind > NDAC + 1) {
LOG(logERROR, ("Unknown dac index %d\n", ind));
return;
}
char *dac_names[] = {DAC_NAMES};
// remember vthx values and set 2800 if counter disabled
uint32_t counters = getCounterMask();
int vthdacs[] = {M_VTH1, M_VTH2, M_VTH3};
for (int i = 0; i < NCOUNTERS; ++i) {
if (vthdacs[i] == (int)ind) {
// remember enabled values for vthx
if (val != DEFAULT_COUNTER_DISABLED_VTH_VAL) {
int vthval = val;
if (mV) {
if (LTC2620_D_VoltageToDac(val, &vthval) == FAIL) {
return;
// threshold dacs (remember value, vthreshold: skip disabled)
if (ind == M_VTHRESHOLD || ind == M_VTH1 || ind == M_VTH2 ||
ind == M_VTH3) {
char *dac_names[] = {DAC_NAMES};
int vthdacs[] = {M_VTH1, M_VTH2, M_VTH3};
uint32_t counters = getCounterMask();
for (int i = 0; i < NCOUNTERS; ++i) {
if ((int)ind == vthdacs[i] || ind == M_VTHRESHOLD) {
int dacval = val;
// if not disabled value, remember value
if (dacval != DEFAULT_COUNTER_DISABLED_VTH_VAL) {
// convert mv to dac
if (mV) {
if (LTC2620_D_VoltageToDac(val, &dacval) == FAIL) {
return;
}
}
vthEnabledVals[i] = dacval;
LOG(logINFO,
("Remembering %s [%d]\n", dac_names[ind], dacval));
}
vthEnabledVals[i] = vthval;
LOG(logINFO, ("Remembering %s [%d]\n", dac_names[ind], vthval));
}
// set vthx to disable val, if counter disabled
if (!(counters & (1 << i))) {
LOG(logINFO, ("Disabling %s\n", dac_names[ind]));
val = DEFAULT_COUNTER_DISABLED_VTH_VAL;
mV = 0;
// if vthreshold,skip for disabled counters
if ((ind == M_VTHRESHOLD) && (!(counters & (1 << i)))) {
continue;
}
setGeneralDAC(vthdacs[i], val, mV);
}
}
return;
}
setGeneralDAC(ind, val, mV);
}
void setGeneralDAC(enum DACINDEX ind, int val, int mV) {
char *dac_names[] = {DAC_NAMES};
LOG(logDEBUG1, ("Setting dac[%d - %s]: %d %s \n", (int)ind, dac_names[ind],
val, (mV ? "mV" : "dac units")));
int dacval = val;
@ -1329,20 +1340,29 @@ void setDAC(enum DACINDEX ind, int val, int mV) {
int getDAC(enum DACINDEX ind, int mV) {
if (ind == M_VTHRESHOLD) {
int ret[NCOUNTERS] = {0};
ret[0] = getDAC(M_VTH1, mV);
ret[1] = getDAC(M_VTH2, mV);
ret[2] = getDAC(M_VTH3, mV);
if ((ret[0] == ret[1]) && (ret[1] == ret[2])) {
LOG(logINFO, ("\tvthreshold match\n"));
return ret[0];
} else {
LOG(logERROR, ("\tvthreshold mismatch vth1:%d vth2:%d "
"vth3:%d\n",
ret[0], ret[1], ret[2]));
return -1;
int ret = -1, ret1 = -1;
// get only for enabled counters
uint32_t counters = getCounterMask();
int vthdacs[] = {M_VTH1, M_VTH2, M_VTH3};
for (int i = 0; i < NCOUNTERS; ++i) {
if (counters & (1 << i)) {
ret1 = getDAC(vthdacs[i], mV);
// first enabled counter
if (ret == -1) {
ret = ret1;
}
// different values for enabled counters
else if (ret1 != ret) {
return -1;
}
}
}
if (ret == -1) {
LOG(logERROR, ("\tvthreshold mismatch (of enabled counters)\n"));
} else {
LOG(logINFO, ("\tvthreshold match %d\n", ret));
}
return ret;
}
if (!mV) {
@ -1373,13 +1393,14 @@ int setHighVoltage(int val) {
return highvoltage;
}
int isMaster(){
return !(bus_r(0x18) >> 31);
int isMaster() {
return !((bus_r(SYSTEM_STATUS_REG) & SYSTEM_STATUS_SLV_BRD_DTCT_MSK) >>
SYSTEM_STATUS_SLV_BRD_DTCT_OFST);
}
/* parameters - timing */
void setTiming(enum timingMode arg) {
if (!isMaster() && arg == AUTO_TIMING)
arg = TRIGGER_EXPOSURE;
@ -2643,7 +2664,7 @@ int setChipStatusRegister(int csr) {
pat = setChipStatusRegisterPattern(csr);
if (pat) {
error |= loadPattern(pat);
error |= loadPattern(logDEBUG5, pat);
if (!error)
startPattern();
free(pat);
@ -2663,7 +2684,7 @@ int setChipStatusRegister(int csr) {
return OK;
}
int setGainCaps(int caps){
int setGainCaps(int caps) {
// Update only gain caps, leave the rest of the CSR unchanged
int csr = getChipStatusRegister();
csr &= ~GAIN_MASK;
@ -2674,8 +2695,8 @@ int setGainCaps(int caps){
return setChipStatusRegister(csr);
}
int getGainCaps(){
int getGainCaps() {
int csr = getChipStatusRegister();
int caps = csrToGainCaps(csr);
return caps;
return caps;
}

View File

@ -1,6 +1,7 @@
#ifndef LOADPATTERN_H
#define LOADPATTERN_H
#include "Pattern.h"
#include "clogger.h"
int loadPattern(patternParameters *pat);
int loadPattern(enum TLogLevel printLevel, patternParameters *pat);
#endif

View File

@ -25,7 +25,7 @@
#include "blackfin.h"
#endif
#if defined(MYTHEN3D)
#ifdef MYTHEN3D
#include "mythen3.h"
#endif
@ -289,8 +289,6 @@ int64_t getMeasurementTime();
int setModule(sls_detector_module myMod, char *mess);
#endif
#ifdef MYTHEN3D
int setBit(int ibit, int patword);
int clearBit(int ibit, int patword);
int setTrimbits(int *trimbits);
int setAllTrimbits(int val);
int getAllTrimbits();
@ -319,6 +317,9 @@ int setOnChipDAC(enum ONCHIP_DACINDEX ind, int chipIndex, int val);
int getOnChipDAC(enum ONCHIP_DACINDEX ind, int chipIndex);
#endif
void setDAC(enum DACINDEX ind, int val, int mV);
#ifdef MYTHEN3D
void setGeneralDAC(enum DACINDEX ind, int val, int mV);
#endif
int getDAC(enum DACINDEX ind, int mV);
int getMaxDacSteps();
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)

View File

@ -1,7 +1,7 @@
#include "readDefaultPattern.h"
#include "loadPattern.h"
#include "clogger.h"
#include "common.h"
#include "readDefaultPattern.h"
#include "sls/ansi.h"
#include "sls/sls_detector_defs.h"
#include "slsDetectorServer_defs.h"
@ -14,6 +14,7 @@
#include <unistd.h>
extern char initErrorMessage[MAX_STR_LENGTH];
extern enum TLogLevel trimmingPrint;
#ifndef MYTHEN3D
extern uint64_t writePatternIOControl(uint64_t word);
@ -24,82 +25,83 @@ extern uint64_t setPatternWaitTime(int level, uint64_t t);
extern void setPatternLoop(int level, int *startAddr, int *stopAddr,
int *nLoop);
int loadPattern(patternParameters *pat) {
int loadPattern(enum TLogLevel printLevel, patternParameters *pat) {
LOG(logINFOBLUE, ("Loading Pattern\n"));
int ret = OK;
trimmingPrint = printLevel;
int ret=OK;
for (int i = 0; i < MAX_PATTERN_LENGTH; ++i) {
if ((i % 10 == 0) && pat->word[i] != 0) {
LOG(logINFO, ("Setting Pattern Word (addr:0x%x, word:0x%llx)\n",
i, (long long int)pat->word[i]));
}
writePatternWord(i, pat->word[i]);
}
#ifndef MYTHEN3D
if (ret == OK) {
uint64_t retval64 = writePatternIOControl(pat->ioctrl);
//validate64(pat->ioctrl, retval64, "set pattern IO Control", HEX);
}
#endif
if (ret == OK) {
int numLoops = -1;
int retval0 = pat->limits[0];
int retval1 = pat->limits[1];
setPatternLoop(-1, &retval0, &retval1, &numLoops);
//validate(pat->limits[0], retval0,
// "set pattern Limits start address", HEX);
//validate(pat->limits[1], retval1,
// "set pattern Limits start address", HEX);
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",
i, (long long int)pat->word[i]));
}
uint64_t retval64;
if (ret == OK) {
for (int i = 0; i <= 2; ++i) {
char msg[128];
int retval0 = -1, retval1 = -1, numLoops = -1;
writePatternWord(i, pat->word[i]);
}
#ifndef MYTHEN3D
if (ret == OK) {
uint64_t retval64 = writePatternIOControl(pat->ioctrl);
// validate64(pat->ioctrl, retval64, "set pattern IO Control", HEX);
}
#endif
if (ret == OK) {
int numLoops = -1;
int retval0 = pat->limits[0];
int retval1 = pat->limits[1];
setPatternLoop(-1, &retval0, &retval1, &numLoops);
// validate(pat->limits[0], retval0,
// "set pattern Limits start address", HEX);
// validate(pat->limits[1], retval1,
// "set pattern Limits start address", HEX);
}
uint64_t retval64;
if (ret == OK) {
for (int i = 0; i <= 2; ++i) {
char msg[128];
int retval0 = -1, retval1 = -1, numLoops = -1;
// patloop
retval0 = pat->loop[i * 2 + 0];
retval1 = pat->loop[i * 2 + 1];
numLoops = pat->nloop[i];
setPatternLoop(i, &retval0, &retval1, &numLoops);
memset(msg, 0, sizeof(msg));
sprintf(msg, "set pattern Loop %d start address", i);
//validate(pat->loop[i * 2 + 0], retval0, msg, HEX);
if (ret == FAIL) {
break;
}
memset(msg, 0, sizeof(msg));
sprintf(msg, "set pattern Loop %d stop address", i);
//validate(pat->loop[i * 2 + 1], retval1, msg, HEX);
if (ret == FAIL) {
break;
}
memset(msg, 0, sizeof(msg));
sprintf(msg, "set pattern Loop %d num loops", i);
//validate(pat->nloop[i], numLoops, msg, HEX);
if (ret == FAIL) {
break;
}
// patwait
memset(msg, 0, sizeof(msg));
sprintf(msg, "set pattern Loop %d wait address", i);
retval0 = setPatternWaitAddress(i, pat->wait[i]);
//validate(pat->wait[i], retval0, msg, HEX);
if (ret == FAIL) {
break;
}
// patloop
retval0 = pat->loop[i * 2 + 0];
retval1 = pat->loop[i * 2 + 1];
numLoops = pat->nloop[i];
setPatternLoop(i, &retval0, &retval1, &numLoops);
memset(msg, 0, sizeof(msg));
sprintf(msg, "set pattern Loop %d start address", i);
// validate(pat->loop[i * 2 + 0], retval0, msg, HEX);
if (ret == FAIL) {
break;
}
memset(msg, 0, sizeof(msg));
sprintf(msg, "set pattern Loop %d stop address", i);
// validate(pat->loop[i * 2 + 1], retval1, msg, HEX);
if (ret == FAIL) {
break;
}
memset(msg, 0, sizeof(msg));
sprintf(msg, "set pattern Loop %d num loops", i);
// validate(pat->nloop[i], numLoops, msg, HEX);
if (ret == FAIL) {
break;
}
// patwait
memset(msg, 0, sizeof(msg));
sprintf(msg, "set pattern Loop %d wait address", i);
retval0 = setPatternWaitAddress(i, pat->wait[i]);
// validate(pat->wait[i], retval0, msg, HEX);
if (ret == FAIL) {
break;
}
// patwaittime
memset(msg, 0, sizeof(msg));
sprintf(msg, "set pattern Loop %d wait time", i);
retval64 = setPatternWaitTime(i, pat->waittime[i]);
//validate64(pat->waittime[i], retval64, msg, HEX);
if (retval64 == FAIL) {
break;
}
}
}
return ret;
// patwaittime
memset(msg, 0, sizeof(msg));
sprintf(msg, "set pattern Loop %d wait time", i);
retval64 = setPatternWaitTime(i, pat->waittime[i]);
// validate64(pat->waittime[i], retval64, msg, HEX);
if (retval64 == FAIL) {
break;
}
}
}
trimmingPrint = logINFO;
return ret;
}

View File

@ -1238,8 +1238,8 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) {
ret = OK;
} else {
ret = FAIL;
sprintf(mess, "Setting dac %d : wrote %d but read %d\n",
serverDacIndex, val, retval);
sprintf(mess, "Setting dac %d : wrote %d but read %d\n",
serverDacIndex, val, retval);
LOG(logERROR, (mess));
}
}