my3: added function to change the gain + some functions for my3 flags added

This commit is contained in:
bergamaschi 2021-02-26 18:02:48 +01:00
parent 63259ec5c8
commit 7955426682
3 changed files with 247 additions and 5 deletions

View File

@ -110,6 +110,190 @@ patternParameters *setChipStatusRegister(int csr) {
} }
patternParameters *setInterpolation(int mask) {
int csr;
if (mask)
csr=chipStatusRegister|(1<< CSR_interp);
else
csr=chipStatusRegister & ~(1<< CSR_interp);
return setChipStatusRegister(csr);
}
patternParameters *setPumpProbe(int mask) {
int csr;
if (mask)
csr=chipStatusRegister|(1<< CSR_pumprobe);
else
csr=chipStatusRegister & ~(1<< CSR_pumprobe);
return setChipStatusRegister(csr);
}
patternParameters *setDigitalPulsing(int mask) {
int csr;
if (mask)
csr=chipStatusRegister|(1<< CSR_dpulse);
else
csr=chipStatusRegister & ~(1<< CSR_dpulse);
return setChipStatusRegister(csr);
}
patternParameters *setAnalogPulsing(int mask){
int csr;
if (mask)
csr=chipStatusRegister|(1<< CSR_apulse);
else
csr=chipStatusRegister & ~(1<< CSR_apulse);
return setChipStatusRegister(csr);
}
patternParameters *setNegativePolarity(int mask){
int csr;
if (mask)
csr=chipStatusRegister|(1<< CSR_invpol);
else
csr=chipStatusRegister & ~(1<< CSR_invpol);
return setChipStatusRegister(csr);
}
int setGainPreamp(int pgain, int *csr) {
switch (pgain) {
case Cp_0:
case Cp_15:
*csr=(*csr)&~(1<<CSR_C10pre);
break;
case Cp_10:
case Cp_45:
*csr=(*csr)|(1<<CSR_C10pre);
break;
default:
LOG(logERROR, ("Bad preamp gain"));
return 1;
}
switch (pgain) {
case Cp_0:
case Cp_10:
*csr=(*csr)&~(1<<CSR_C15pre);
break;
case Cp_15:
case Cp_45:
*csr=(*csr)|(1<<CSR_C15pre);
break;
default:
LOG(logERROR, ("Bad preamp gain"));
return 1;
}
return 0;
}
int setGainShaper(int shgain, int *csr){
switch (shgain) {
case Csh_0:
case Csh_30:
case Csh_50:
case Csh_80:
*csr=(*csr)&~(1<<CSR_C15sh);
break;
case Csh_15:
case Csh_45:
case Csh_65:
case Csh_95:
*csr=(*csr)|(1<<CSR_C15sh);
break;
default:
LOG(logERROR, ("Bad shaper gain"));
return 1;
}
switch (shgain) {
case Csh_0:
case Csh_15:
case Csh_50:
case Csh_65:
*csr=(*csr)&~(1<<CSR_C30sh);
break;
case Csh_30:
case Csh_45:
case Csh_80:
case Csh_95:
*csr=(*csr)|(1<<CSR_C30sh);
break;
default:
LOG(logERROR, ("Bad shaper gain"));
return 1;
}
switch (shgain) {
case Csh_0:
case Csh_15:
case Csh_30:
case Csh_45:
*csr=(*csr)&~(1<<CSR_C50sh);
break;
case Csh_80:
case Csh_50:
case Csh_65:
case Csh_95:
*csr=(*csr)|(1<<CSR_C50sh);
break;
default:
LOG(logERROR, ("Bad shaper gain"));
return 1;
}
return 0;
}
int setGainAC(int acgain, int *csr){
switch (acgain) {
case Cac_450:
*csr=(*csr)&~(1<<CSR_C225ACsh);
break;
case Cac225:
*csr=(*csr)|(1<<CSR_C225ACsh);
break;
default:
LOG(logERROR, ("Bad ac gain"));
return 1;
}
return 0;
}
patternParameters *setChipGain(int pgain, int shgain, int acgain){
int csr=chipStatusRegister;
if (setGainPreamp(pgain,&csr))
return NULL;
if (setGainShaper(shgain,&csr))
return NULL;
if (setGainAC(acgain,&csr))
return NULL;
return setChipStatusRegister(csr);
}
patternParameters *setChannelRegisterChip(int ichip, int *mask, int *trimbits) { patternParameters *setChannelRegisterChip(int ichip, int *mask, int *trimbits) {
patternParameters *pat = malloc(sizeof(patternParameters)); patternParameters *pat = malloc(sizeof(patternParameters));

View File

@ -48,12 +48,25 @@
#define CSR_default (1<<CSR_C10pre )|(1<< CSR_C30sh) #define CSR_default (1<<CSR_C10pre )|(1<< CSR_C30sh)
enum {Cp_0, Cp_10, Cp_15, Cp_45};
enum {Csh_0,Csh_15,Csh_30,Csh_45,Csh_50,Csh_65,Csh_80,Csh_95};
enum {Cac225, Cac_450};
#define default_gain
int setBit(int ibit, int patword); int setBit(int ibit, int patword);
int clearBit(int ibit, int patword); int clearBit(int ibit, int patword);
patternParameters *setChipStatusRegister(int csr); patternParameters *setChipStatusRegister(int csr);
patternParameters *setChannelRegisterChip(int ichip, int *mask, int *trimbits); patternParameters *setChannelRegisterChip(int ichip, int *mask, int *trimbits);
patternParameters *setInterpolation(int mask);
patternParameters *setPumpProbe(int mask);
patternParameters *setDigitalPulsing(int mask);
patternParameters *setAnalogPulsing(int mask);
patternParameters *setNegativePolarity(int mask);
patternParameters *setChipGain(int pgain, int shgain, int acgain);
int setGainAC(int shgain, int *csr);
int setGainShaper(int shgain, int *csr);
int setGainPreamp(int pgain, int *csr);
#endif #endif

View File

@ -1145,8 +1145,6 @@ int setModule(sls_detector_module myMod, char *mess) {
} }
int setTrimbits(int *trimbits) { int setTrimbits(int *trimbits) {
// remember previous run clock // remember previous run clock
uint32_t prevRunClk = clkDivider[SYSTEM_C0]; uint32_t prevRunClk = clkDivider[SYSTEM_C0];
patternParameters *pat=NULL; patternParameters *pat=NULL;
@ -1177,7 +1175,6 @@ int setTrimbits(int *trimbits) {
} }
LOG(logINFO, ("All trimbits have been loaded\n")); LOG(logINFO, ("All trimbits have been loaded\n"));
} }
trimmingPrint = logINFO; trimmingPrint = logINFO;
// set back to previous clock // set back to previous clock
if (setClockDivider(SYSTEM_C0, prevRunClk) == FAIL) { if (setClockDivider(SYSTEM_C0, prevRunClk) == FAIL) {
@ -1188,7 +1185,6 @@ int setTrimbits(int *trimbits) {
if (error != 0) { if (error != 0) {
return FAIL; return FAIL;
} }
return OK; return OK;
} }
@ -2664,3 +2660,52 @@ int getNumberOfChips() { return NCHIP; }
int getNumberOfDACs() { return NDAC; } int getNumberOfDACs() { return NDAC; }
int getNumberOfChannelsPerChip() { return NCHAN; } int getNumberOfChannelsPerChip() { return NCHAN; }
int setGain(int gain) {
// remember previous run clock
uint32_t prevRunClk = clkDivider[SYSTEM_C0];
patternParameters *pat=NULL;
int error=0;
// set to trimming clock
if (setClockDivider(SYSTEM_C0, DEFAULT_TRIMMING_RUN_CLKDIV) == FAIL) {
LOG(logERROR,
("Could not start trimming. Could not set to trimming clock\n"));
return FAIL;
}
/////////////////////////////////////////////////////////////////
int pgain=Cp_10;
int shgain=Csh_30;
int acgain=Cac_450;
/*
acgain=gain%2;
gain/=2;
shgain=gain%8;
gain/=8;
pgain=gain
*/
pat=setChipGain(pgain, shgain, acgain);
if (pat) {
error|=loadPattern(pat);
if (error==0)
startPattern();
free(pat);
} else
error=1;
/////////////////////////////////////////////////////////////////
if (error == 0) {
LOG(logINFO, ("The gain has been changed\n"));
}
trimmingPrint = logINFO;
// set back to previous clock
if (setClockDivider(SYSTEM_C0, prevRunClk) == FAIL) {
LOG(logERROR, ("Could not set to previous run clock after trimming\n"));
return FAIL;
}
if (error != 0) {
return FAIL;
}
return OK;
}