This commit is contained in:
2026-02-03 11:15:27 +01:00
parent 809d70a950
commit e3020446ca
17 changed files with 457 additions and 369 deletions

View File

@@ -568,7 +568,9 @@ void setupDetector() {
SPI_HV_SRL_DGTL_OTPT_MSK, SPI_HV_SRL_DGTL_OTPT_OFST,
HIGHVOLTAGE_MIN, HIGHVOLTAGE_MAX);
MAX1932_Disable();
setHighVoltage(DEFAULT_HIGH_VOLTAGE);
initError = setHighVoltage(DEFAULT_HIGH_VOLTAGE, initErrorMessage);
if (initError == FAIL)
return;
// power off voltage regulators
powerOff();
@@ -607,7 +609,9 @@ void setupDetector() {
INA226_CalibrateCurrentRegister(I2C_POWER_VB_DEVICE_ID);
INA226_CalibrateCurrentRegister(I2C_POWER_VC_DEVICE_ID);
INA226_CalibrateCurrentRegister(I2C_POWER_VD_DEVICE_ID);
setVchip(VCHIP_MIN_MV);
initError = setVchip(VCHIP_MIN_MV, initErrorMessage);
if (initError == FAIL)
return;
setADCInvertRegister(0); // depends on chip
@@ -1223,6 +1227,26 @@ int64_t getMeasurementTime() {
enum detectorSettings getSettings() { return UNDEFINED; }
/* parameters - dac, adc, hv */
int setADCVpp(int val, int mV, char* mess) {
if (AD9257_SetVrefVoltage(val, mV) == FAIL) {
sprintf(mess, "Could not set Adc Vpp. Please set a proper value\n");
LOG(logERROR, (mess));
return FAIL;
}
// cannot validate (just a variable and mv gives different values
return OK;
}
int getADCVpp(int mV, int* retval, char* mess) {
*retval = AD9257_GetVrefVoltage(mV);
if (*retval == -1) {
sprintf(mess, "Could not get Adc Vpp.\n");
LOG(logERROR, (mess));
return FAIL;
}
LOG(logDEBUG1, ("Adc Vpp retval: %d %s\n", *retval, (mV ? "mV" : "mode")));
return OK;
}
void setDAC(enum DACINDEX ind, int val, int mV) {
if (val < 0 && val != LTC2620_GetPowerDownValue())
@@ -1285,9 +1309,13 @@ int checkVLimitDacCompliant(int dac) {
int getVLimit() { return vLimit; }
void setVLimit(int l) {
if (l >= 0)
vLimit = l;
int setVLimit(int val, char* mess) {
if (val < 0) {
sprintf(mess, "Could not set vlimit. Invalid value %d\n", val);
LOG(logERROR, (mess));
return FAIL;
}
vLimit = val;
}
int isVchipValid(int val) {
@@ -1297,44 +1325,55 @@ int isVchipValid(int val) {
return 1;
}
int getVchip() {
int getVchip(int* retval, char* mess) {
*retval = -1;
// not set yet
if (dacValues[D_PWR_CHIP] == -1 ||
dacValues[D_PWR_CHIP] == LTC2620_GetPowerDownValue())
if (dacValues[D_PWR_CHIP] == -1) {
LOG(logWARNING, ("Retrieving Vchip that has not been set yet.\n"));
return dacValues[D_PWR_CHIP];
int voltage = -1;
}
if (dacValues[D_PWR_CHIP] == LTC2620_GetPowerDownValue()) {
return dacValues[D_PWR_CHIP];
}
// dac to voltage
ConvertToDifferentRange(LTC2620_GetMaxInput(), LTC2620_GetMinInput(),
VCHIP_MIN_MV, VCHIP_MAX_MV, dacValues[D_PWR_CHIP],
&voltage);
return voltage;
if (ConvertToDifferentRange(LTC2620_GetMaxInput(), LTC2620_GetMinInput(), VCHIP_MIN_MV, VCHIP_MAX_MV, dacValues[D_PWR_CHIP], retval) == FAIL) {
sprintf(mess, "Could not convert to voltage. Input value for vchip outside bounds.\n");
LOG(logERROR, (mess));
return FAIL;
}
LOG(logDEBUG1, ("Vchip: %d\n", retval));
return OK;
}
void setVchip(int val) {
// set vchip
if (val != -1) {
LOG(logINFOBLUE, ("Setting Vchip to %d mV\n", val));
int dacval = LTC2620_GetPowerDownValue();
// validate & convert it to dac
if (val != LTC2620_GetPowerDownValue()) {
// convert voltage to dac
if (ConvertToDifferentRange(
VCHIP_MIN_MV, VCHIP_MAX_MV, LTC2620_GetMaxInput(),
LTC2620_GetMinInput(), // min val is max V
val, &dacval) == FAIL) {
LOG(logERROR,
("\tVChip %d mV invalid. Is not between %d and %d mV\n",
val, VCHIP_MIN_MV, VCHIP_MAX_MV));
return;
}
}
LOG(logINFO, ("Setting Vchip (DAC %d): %d dac (%d mV)\n", D_PWR_CHIP,
dacval, val));
// set
setDAC(D_PWR_CHIP, dacval, 0);
int setVchip(int val, char* mess) {
if (val < 0) {
sprintf(mess, "Could not set vchip. Invalid value: %d\n");
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFOBLUE, ("Setting Vchip to %d mV\n", val));
// calculate dac value to set
int dacval = LTC2620_GetPowerDownValue();
if (val != LTC2620_GetPowerDownValue()) {
// convert voltage to dac
if (ConvertToDifferentRange(
VCHIP_MIN_MV, VCHIP_MAX_MV, LTC2620_GetMaxInput(),
LTC2620_GetMinInput(), // min val is max V
val, &dacval) == FAIL) {
sprintf(mess, "\tVChip %d mV invalid. Is not between %d and %d mV\n", val, VCHIP_MIN_MV, VCHIP_MAX_MV);
return FAIL;
}
}
LOG(logINFO, ("Setting Vchip (DAC %d): %d dac (%d mV)\n", D_PWR_CHIP,
dacval, val));
setDAC(D_PWR_CHIP, dacval, 0);
if (dacValues[D_PWR_CHIP] != dacval) {
sprintf(mess, "Could not set vchip. Set %d, got %d\n", val, dacvalues[D_PWR_CHIP]);
LOG(logERROR, (mess));
return FAIL;
}
return OK;
}
int getVChipToSet(enum DACINDEX ind, int val) {
@@ -1474,7 +1513,23 @@ int getPower(enum DACINDEX ind) {
return retval;
}
void setPower(enum DACINDEX ind, int val) {
int setPower(enum DACINDEX ind, int val, char* mess) {
serverdacindex
if (checkVLimitCompliant(val) == FAIL) {
sprintf(mess, "Could not set power. Power regulator %d exceeds voltage limit %d.\n", ind, getVLimit());
LOG(logERROR, (mess));
return FAIL;
}
if (!isPowerValid(ind, val)) {
sprintf(mess, "Could not set power. Power regulator %d should be between %d and %d mV\n", ind, (ind == D_PWR_IO ? VIO_MIN_MV : POWER_RGLTR_MIN), (VCHIP_MAX_MV - VCHIP_POWER_INCRMNT));
LOG(logERROR, (mess));
return FAIL;
}
setPower(ind, val);
int retval = getPower(ind);
validate(&ret, mess, val, retval, "set power regulator", DEC);
// validate index & get adc index
int adcIndex = getADCIndexFromDACIndex(ind);
if (adcIndex == -1) {
@@ -1516,11 +1571,15 @@ void setPower(enum DACINDEX ind, int val) {
setDAC(ind, LTC2620_GetPowerDownValue(), 0);
// set vchip
setVchip(vchip);
if (getVchip() != vchip) {
LOG(logERROR, ("Weird, Could not set vchip. Set %d, read %d\n.",
vchip, getVchip()));
return;
if (setVchip(vchip, mess) == FAIL)
return FAIL;
int retval = 0;
if (getVchip(&retval, mess) == FAIL)
return FAIL;
if (retval != vchip) {
sprintf(logERROR, "Could not get vchip. Set %d, read %d\n.", vchip, retval);
LOG(logERROR, (mess));
return FAIL;
}
//(power off is anyway done with power enable)
@@ -1720,26 +1779,34 @@ int getSlowADCTemperature() {
return tempValue;
}
int setHighVoltage(int val) {
// setting hv
if (val >= 0) {
LOG(logINFO, ("Setting High voltage: %d V\n", val));
uint32_t addr = POWER_REG;
// switch to external high voltage
bus_w(addr, bus_r(addr) & (~POWER_HV_INTERNAL_SLCT_MSK));
MAX1932_Set(&val);
// switch on internal high voltage, if set
if (val > 0)
bus_w(addr, bus_r(addr) | POWER_HV_INTERNAL_SLCT_MSK);
highvoltage = val;
int setHighVoltage(int val, char* mess) {
if (val < 0) {
sprintf(mess, "Could not set high voltage. Invalid value:%d\n", val);
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFO, ("Setting High voltage: %d V", val));
uint32_t addr = POWER_REG;
// switch to external high voltage
bus_w(addr, bus_r(addr) & (~POWER_HV_INTERNAL_SLCT_MSK));
MAX1932_Set(&val);
// switch on internal high voltage, if set
if (val > 0)
bus_w(addr, bus_r(addr) | POWER_HV_INTERNAL_SLCT_MSK);
highvoltage = val;
return OK;
}
int getHighVoltage(int *retval, char* mess) {
LOG(logDEBUG1, ("High Voltage: %d\n", retval));
return highvoltage;
}
/* parameters - timing, extsig */
void setTiming(enum timingMode arg) {

View File

@@ -123,6 +123,8 @@ enum detectorSettings getSettings();
// parameters - threshold
// parameters - dac, adc, hv
int setADCVpp(int val, int mV, char* mess);
int getADCVpp(int mV, int* retval, char* mess);
void setDAC(enum DACINDEX ind, int val, int mV);
int getDAC(enum DACINDEX ind, int mV);
@@ -131,23 +133,24 @@ int dacToVoltage(int dac);
int checkVLimitCompliant(int mV);
int checkVLimitDacCompliant(int dac);
int getVLimit();
void setVLimit(int l);
int setVLimit(int val, char* mess);
int isVchipValid(int val);
int getVchip();
void setVchip(int val);
int getVchip(int* retval, char* mess);
int setVchip(int val, char* mess);
int getVChipToSet(enum DACINDEX ind, int val);
int getDACIndexFromADCIndex(enum ADCINDEX ind);
int getADCIndexFromDACIndex(enum DACINDEX ind);
int isPowerValid(enum DACINDEX ind, int val);
int getPower();
void setPower(enum DACINDEX ind, int val);
int getPower(int* retval, char* mess);
int setPower(enum DACINDEX ind, int val, char* mess);
void powerOff();
int getADC(enum ADCINDEX ind);
int getSlowADC(int ichan);
int getSlowADCTemperature();
int setHighVoltage(int val);
int setHighVoltage(int val, char* mess);
int getHighVoltage(int *retval, char* mess);
// parameters - timing, extsig

View File

@@ -836,7 +836,10 @@ void setupDetector() {
Feb_Control_SetInTestModeVariable(DEFAULT_TEST_MODE);
sharedMemory_unlockLocalLink();
#endif
setHighVoltage(DEFAULT_HIGH_VOLTAGE);
initError = setHighVoltage(DEFAULT_HIGH_VOLTAGE, initErrorMessage);
if (initError == FAIL)
return;
#ifndef VIRTUAL
sharedMemory_lockLocalLink();
if (!Feb_Control_CheckSetup()) {
@@ -1563,60 +1566,76 @@ int getADC(enum ADCINDEX ind) {
#endif
}
int setHighVoltage(int val) {
int getHighVoltage(int* retval, char* mess) {
if (!master) {
LOG(logDEBUG1, ("High Voltage: %d\n", SLAVE_HIGH_VOLTAGE_READ_VAL));
*retval = SLAVE_HIGH_VOLTAGE_READ_VAL;
return OK;
}
// master
#ifdef VIRTUAL
if (master) {
// set
if (val != -1) {
LOG(logINFO, ("Setting High voltage: %d V\n", val));
eiger_theo_highvoltage = val;
}
return eiger_theo_highvoltage;
}
return SLAVE_HIGH_VOLTAGE_READ_VAL;
LOG(logDEBUG1, ("High Voltage: %d\n", eiger_theo_highvoltage));
*retval = eiger_theo_highvoltage;
return OK;
#else
if (master) {
// set
if (val != -1) {
eiger_theo_highvoltage = val;
sharedMemory_lockLocalLink();
int ret = Feb_Control_SetHighVoltage(val);
sharedMemory_unlockLocalLink();
if (!ret) // could not set
return -2;
else if (ret == -1) // outside range
return -1;
}
// get
sharedMemory_lockLocalLink();
if (!Feb_Control_GetHighVoltage(&eiger_highvoltage)) {
LOG(logERROR, ("Could not read high voltage\n"));
sharedMemory_unlockLocalLink();
return -3;
}
// need to read the file twice to get the proper value
if (!Feb_Control_GetHighVoltage(&eiger_highvoltage)) {
LOG(logERROR, ("Could not read high voltage\n"));
sharedMemory_unlockLocalLink();
return -3;
}
// get
sharedMemory_lockLocalLink();
if (!Feb_Control_GetHighVoltage(&eiger_highvoltage)) {
LOG(logERROR, ("Could not read high voltage\n"));
sharedMemory_unlockLocalLink();
strcpy(mess, "Getting high voltage failed. Serial/i2c communication failed.\n");
LOG(logERROR, (mess));
return FAIL;
}
// need to read the file twice to get the proper value
if (!Feb_Control_GetHighVoltage(&eiger_highvoltage)) {
LOG(logERROR, ("Could not read high voltage\n"));
sharedMemory_unlockLocalLink();
strcpy(mess, "Getting high voltage failed. Serial/i2c communication failed.\n");
LOG(logERROR, (mess));
return FAIL;
}
sharedMemory_unlockLocalLink();
// tolerance of 5
if (abs(eiger_theo_highvoltage - eiger_highvoltage) >
HIGH_VOLTAGE_TOLERANCE) {
LOG(logINFO,
("High voltage still ramping: %d\n", eiger_highvoltage));
return eiger_highvoltage;
}
return eiger_theo_highvoltage;
// tolerance of 5
if (abs(eiger_theo_highvoltage - eiger_highvoltage) >
HIGH_VOLTAGE_TOLERANCE) {
LOG(logINFO,
("High voltage still ramping: %d\n", eiger_highvoltage));
*retval = eiger_highvoltage;
LOG(logDEBUG1, ("High Voltage: %d\n", eiger_highvoltage));
return OK;
}
*retval = eiger_theo_highvoltage;
LOG(logDEBUG1, ("High Voltage: %d\n", eiger_theo_highvoltage));
return OK;
#endif
}
int setHighVoltage(int val, char* mess) {
#ifdef VIRTUAL
LOG(logINFO, ("Setting High voltage: %d V\n", val));
eiger_theo_highvoltage = val;
#else
eiger_theo_highvoltage = val;
sharedMemory_lockLocalLink();
int ret = Feb_Control_SetHighVoltage(val);
sharedMemory_unlockLocalLink();
if (ret == 0) {
strcpy(mess, "Setting high voltage failed. Serial/i2c communication failed.\n");
LOG(logERROR, (mess));
return FAIL;
}
if (ret == -1) {
sprintf(mess, "Setting high voltage failed. Invalid input %d. The range is from 0 to 200 V.\n", val);
LOG(logERROR, (mess));
return FAIL;
}
return SLAVE_HIGH_VOLTAGE_READ_VAL;
// cannot validate using get
#endif
}

View File

@@ -128,7 +128,8 @@ int getDAC(enum DACINDEX ind, int mV);
int getMaxDacSteps();
int getADC(enum ADCINDEX ind);
int setHighVoltage(int val);
int setHighVoltage(int val, char* mess);
int getHighVoltage(int* retval, char* mess);
// parameters - timing, extsig
int setMaster(enum MASTERINDEX m);

View File

@@ -479,10 +479,8 @@ void setupDetector() {
setTimingSource(DEFAULT_TIMING_SOURCE);
// Default values
initError = setHighVoltage(DEFAULT_HIGH_VOLTAGE);
initError = setHighVoltage(DEFAULT_HIGH_VOLTAGE, initErrorMessage);
if (initError == FAIL) {
sprintf(initErrorMessage, "Could not set high voltage to %d\n",
DEFAULT_HIGH_VOLTAGE);
return;
}
@@ -1575,9 +1573,12 @@ int getADC(enum ADCINDEX ind, int *value) {
return OK;
}
int setHighVoltage(int val) {
if (val > HV_SOFT_MAX_VOLTAGE) {
LOG(logERROR, ("Invalid high voltage: %d V\n", val));
int setHighVoltage(int val, char* mess) {
// validate input value
if (val < 0 || val > HV_SOFT_MAX_VOLTAGE) {
sprintf(mess, "Invalid Voltage. Valid range (0 - %d)\n",
HV_SOFT_MAX_VOLTAGE);
LOG(logERROR, (mess));
return FAIL;
}
@@ -1589,7 +1590,7 @@ int setHighVoltage(int val) {
// at startup (initCheck not done: to not wait 10s assuming hv = 0
// otherwise as below, always check current hv to wait 10s if powering off
if (initCheckDone) {
if (getHighVoltage(&prevHighVoltage) == FAIL) {
if (getHighVoltage(&prevHighVoltage, mess) == FAIL) {
LOG(logERROR, ("Could not get current high voltage to determine if "
"%d s wait is required\n",
waitTime));
@@ -1597,21 +1598,36 @@ int setHighVoltage(int val) {
}
}
int ret = DAC6571_Set(val);
if (DAC6571_Set(val, mess) == FAIL)
return FAIL;
// only when powering off (from non zero value), wait 10s
if (ret == OK) {
if (prevHighVoltage > 0 && val == 0) {
LOG(logINFO,
("\tSwitching off high voltage requires %d s...\n", waitTime));
sleep(waitTime);
LOG(logINFO, ("\tAssuming high voltage switched off\n"));
}
if (prevHighVoltage > 0 && val == 0) {
LOG(logINFO,
("\tSwitching off high voltage requires %d s...\n", waitTime));
sleep(waitTime);
LOG(logINFO, ("\tAssuming high voltage switched off\n"));
}
return ret;
// validate get
int retval = 0;
if (getHighVoltage(&retval, mess) == FAIL)
return FAIL;
if (val != retval) {
sprintf(mess, "Could not set high voltage. Set %d, but got %d\n", val, retval);
LOG(logERROR, (mess));
return FAIL;
}
return OK;
}
int getHighVoltage(int *retval) { return DAC6571_Get(retval); }
int getHighVoltage(int *retval, char* mess) {
int ret = DAC6571_Get(retval, mess);
LOG(logDEBUG1, ("High Voltage: %d\n", retval));
return ret;
}
/* parameters - timing */

View File

@@ -120,8 +120,8 @@ int getDAC(enum DACINDEX ind, int mV);
int getMaxDacSteps();
int getADC(enum ADCINDEX ind, int *value);
int setHighVoltage(int val);
int getHighVoltage(int *retval);
int setHighVoltage(int val, char* mess);
int getHighVoltage(int *retval, char* mess);
// parameters - timing, extsig
int setMaster(enum MASTERINDEX m);

View File

@@ -488,7 +488,9 @@ void setupDetector() {
SPI_HV_SRL_DGTL_OTPT_MSK, SPI_HV_SRL_DGTL_OTPT_OFST,
HIGHVOLTAGE_MIN, HIGHVOLTAGE_MAX);
MAX1932_Disable();
setHighVoltage(DEFAULT_HIGH_VOLTAGE);
initError = setHighVoltage(DEFAULT_HIGH_VOLTAGE, initErrorMessage);
if (initError == FAIL)
return;
// adc
AD9257_SetDefines(ADC_SPI_REG, ADC_SPI_SRL_CS_OTPT_MSK,
@@ -1398,13 +1400,20 @@ int getADC(enum ADCINDEX ind) {
return retval;
}
int setHighVoltage(int val) {
// setting hv
if (val >= 0) {
LOG(logINFO, ("Setting High voltage: %d V", val));
MAX1932_Set(&val);
highvoltage = val;
int setHighVoltage(int val, char* mess) {
if (val < 0) {
sprintf(mess, "Could not set high voltage. Invalid value:%d\n", val);
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFO, ("Setting High voltage: %d V", val));
MAX1932_Set(&val);
highvoltage = val;
return OK;
}
int getHighVoltage(int *retval, char* mess) {
LOG(logDEBUG1, ("High Voltage: %d\n", retval));
return highvoltage;
}

View File

@@ -126,8 +126,8 @@ void setDAC(enum DACINDEX ind, int val, int mV);
int getDAC(enum DACINDEX ind, int mV);
int getMaxDacSteps();
int getADC(enum ADCINDEX ind);
int setHighVoltage(int val);
int getHighVoltage(int *retval);
int setHighVoltage(int val, char* mess);
int getHighVoltage(int *retval, char* mess);
// parameters - timing, extsig
int setMaster(enum MASTERINDEX m);

View File

@@ -461,7 +461,9 @@ void setupDetector() {
SPI_HV_SRL_DGTL_OTPT_MSK, SPI_HV_SRL_DGTL_OTPT_OFST,
HIGHVOLTAGE_MIN, HIGHVOLTAGE_MAX);
MAX1932_Disable();
setHighVoltage(DEFAULT_HIGH_VOLTAGE);
initError = setHighVoltage(DEFAULT_HIGH_VOLTAGE, initErrorMessage);
if (initError == FAIL)
return;
// adc
AD9257_SetDefines(ADC_SPI_REG, ADC_SPI_SRL_CS_OTPT_MSK,
@@ -966,16 +968,24 @@ int getADC(enum ADCINDEX ind) {
return retval;
}
int setHighVoltage(int val) {
// setting hv
if (val >= 0) {
LOG(logINFO, ("Setting High voltage: %d V", val));
MAX1932_Set(&val);
highvoltage = val;
int setHighVoltage(int val, char* mess) {
if (val < 0) {
sprintf(mess, "Could not set high voltage. Invalid value:%d\n", val);
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFO, ("Setting High voltage: %d V", val));
MAX1932_Set(&val);
highvoltage = val;
return OK;
}
int getHighVoltage(int *retval, char* mess) {
LOG(logDEBUG1, ("High Voltage: %d\n", retval));
return highvoltage;
}
/* parameters - timing, extsig */
int setMaster(enum MASTERINDEX m) {

View File

@@ -119,7 +119,8 @@ void setDAC(enum DACINDEX ind, int val, int mV);
int getDAC(enum DACINDEX ind, int mV);
int getMaxDacSteps();
int getADC(enum ADCINDEX ind);
int setHighVoltage(int val);
int setHighVoltage(int val, char* mess);
int getHighVoltage(int *retval, char* mess);
// parameters - timing, extsig
int setMaster(enum MASTERINDEX m);

View File

@@ -493,10 +493,8 @@ void setupDetector() {
cleanFifos();
// defaults
initError = setHighVoltage(DEFAULT_HIGH_VOLTAGE);
initError = setHighVoltage(DEFAULT_HIGH_VOLTAGE, initErrorMessage);
if (initError == FAIL) {
sprintf(initErrorMessage, "Could not set high voltage to %d\n",
DEFAULT_HIGH_VOLTAGE);
return;
}
@@ -1692,17 +1690,38 @@ int getADC(enum ADCINDEX ind, int *value) {
return OK;
}
int setHighVoltage(int val) {
// limit values
if (val > HV_SOFT_MAX_VOLTAGE) {
val = HV_SOFT_MAX_VOLTAGE;
int setHighVoltage(int val, char* mess) {
// validate input value
if (val < 0 || val > HV_SOFT_MAX_VOLTAGE) {
sprintf(mess, "Invalid Voltage. Valid range (0 - %d)\n",
HV_SOFT_MAX_VOLTAGE);
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFO, ("Setting High voltage: %d V\n", val));
return DAC6571_Set(val);
if (DAC6571_Set(val, mess) == FAIL) {
return FAIL;
}
// validate get
int retval = 0;
if (getHighVoltage(&retval, mess) == FAIL)
return FAIL;
if (val != retval) {
sprintf(mess, "Could not set high voltage. Set %d, but got %d\n", val, retval);
LOG(logERROR, (mess));
return FAIL;
}
return OK;
}
int getHighVoltage(int *retval) { return DAC6571_Get(retval); }
int getHighVoltage(int *retval, char* mess) {
int ret = DAC6571_Get(retval, mess);
LOG(logDEBUG1, ("High Voltage: %d\n", retval));
return ret;
}
/* parameters - timing */

View File

@@ -140,8 +140,8 @@ int getDAC(enum DACINDEX ind, int mV);
int getMaxDacSteps();
int getADC(enum ADCINDEX ind, int *value);
int setHighVoltage(int val);
int getHighVoltage(int *retval);
int setHighVoltage(int val, char* mess);
int getHighVoltage(int *retval, char* mess);
// parameters - timing, extsig
int isMaster(int *retval);

View File

@@ -5,5 +5,5 @@
#include <inttypes.h>
void DAC6571_SetDefines(int hardMaxV, char *driverfname);
int DAC6571_Set(int val);
int DAC6571_Get(int *retval);
int DAC6571_Set(int val, char* mess);
int DAC6571_Get(int *retval, char* mess);

View File

@@ -30,18 +30,21 @@ void DAC6571_SetDefines(int hardMaxV, char *driverfname) {
#endif
}
int DAC6571_Set(int val) {
int DAC6571_Set(int val, char* mess) {
LOG(logDEBUG1, ("Setting high voltage to %d\n", val));
if (val < 0)
if (val < 0) {
sprintf(mess, "Invalid value. Cannot be negative.\n");
LOG(logERROR, (mess));
return FAIL;
}
int dacvalue = 0;
// convert value
if (ConvertToDifferentRange(0, DAC6571_HardMaxVoltage, DAC6571_MIN_DAC_VAL,
DAC6571_MAX_DAC_VAL, val, &dacvalue) == FAIL) {
LOG(logERROR,
("Could not convert %d high voltage to a valid dac value\n", val));
sprintf(mess, "Could not convert %d high voltage to a valid dac value\n", val);
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFO, ("\t%dV (dacval %d)\n", val, dacvalue));
@@ -52,9 +55,8 @@ int DAC6571_Set(int val) {
// open file
FILE *fd = fopen(DAC6571_DriverFileName, "w");
if (fd == NULL) {
LOG(logERROR,
("Could not open file %s for writing to set high voltage\n",
DAC6571_DriverFileName));
sprintg(mess, "Could not open file %s for writing to set high voltage\n", DAC6571_DriverFileName);
LOG(logERROR, (mess));
return FAIL;
}
// convert to string, add 0 and write to file
@@ -65,7 +67,7 @@ int DAC6571_Set(int val) {
return OK;
}
int DAC6571_Get(int *retval) {
int DAC6571_Get(int *retval, char* mess) {
LOG(logDEBUG1, ("Getting high voltage\n"));
int dacvalue = 0;
@@ -74,7 +76,8 @@ int DAC6571_Get(int *retval) {
#else
if (readParameterFromFile(DAC6571_DriverFileName, "high voltage",
&dacvalue) == FAIL) {
LOG(logERROR, ("Could not get high voltage\n"));
sprintf(mess, "Could not get high voltage\n");
LOG(logERROR, (mess));
return FAIL;
}
#endif
@@ -83,9 +86,8 @@ int DAC6571_Get(int *retval) {
if (ConvertToDifferentRange(DAC6571_MIN_DAC_VAL, DAC6571_MAX_DAC_VAL, 0,
DAC6571_HardMaxVoltage, dacvalue,
retval) == FAIL) {
LOG(logERROR,
("Could not convert %d dac value to a valid high voltage\n",
dacvalue));
sprintf(mess, "Could not convert %d dac value to a valid high voltage\n", dacvalue);
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFO, ("\t%dV (dacval %d)\n", (*retval), dacvalue));
@@ -94,9 +96,8 @@ int DAC6571_Get(int *retval) {
// open file
FILE *fd = fopen(DAC6571_DriverFileName, "w");
if (fd == NULL) {
LOG(logERROR,
("Could not open file %s for writing to set high voltage\n",
DAC6571_DriverFileName));
sprintf(mess, "Could not open file %s for writing to get high voltage\n", DAC6571_DriverFileName);
LOG(logERROR, (mess));
return FAIL;
}
// convert to string, add 0 and write to file

View File

@@ -1152,14 +1152,98 @@ enum DACINDEX getDACIndex(enum dacIndex ind) {
}
int validateAndSetDac(enum dacIndex ind, int val, int mV) {
int retval = -1;
switch (ind) {
#ifdef EIGERD
case IO_DELAY:
retval = setIODelay(val);
LOG(logDEBUG1, ("IODelay: %d\n", retval));
validate(&ret, mess, val, retval, "set iodelay", DEC);
return retval;
#endif
#if defined(CHIPTESTBOARDD)
case ADC_VPP:
if (val != GET_FLAG)
ret = setADCVpp(val, mV, mess);
else
ret = getADCVpp(mV, &retval, mess);
return retval;
#endif
#if defined(MYTHEN3D) || defined(GOTTHARD2D) || defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD)
case HIGH_VOLTAGE:
if (val != GET_VAL)
ret = setHighVoltage(val, mess);
else
ret = getHighVoltage(&retval, mess);
return retval;
#endif
#ifdef CHIPTESTBOARDD
case V_POWER_CHIP:
if (val != GET_VAL) {
ret = FAIL;
sprintf(mess, "Can not set Vchip. Can only be set automatically in the background (+200mV from highest power regulator voltage).\n");
LOG(logERROR, (mess));
return retval;
}
ret = getVchip(&retval, mess);
return retval;
#endif
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
case V_LIMIT:
if (val != GET_VAL) {
if (!mV) {
ret = FAIL;
strcpy(mess, "Could not set vlimit. VLimit should be in "
"mV and not dac units.\n");
LOG(logERROR, (mess));
return retval;
}
ret = setVLimit(val, mess);
} else
retval = getVLimit();
#endif
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
case V_POWER_A:
case V_POWER_B:
case V_POWER_C:
case V_POWER_D:
case V_POWER_IO:
if (val != GET_VAL) {
if (!mV) {
ret = FAIL;
sprintf(mess, "Could not set power. Power regulator %d should be in mV and not dac units.\n", ind);
LOG(logERROR, (mess));
return retval;
}
ret = setPower(val, mess);
} else
ret = getPower(&retval, mess);
#endif
int retval = -1;
enum DACINDEX serverDacIndex = 0;
// valid enums
switch (ind) {
#ifndef XILINX_CHIPTESTBOARDD
case HIGH_VOLTAGE:
#endif
#ifdef EIGERD
case IO_DELAY:
#elif CHIPTESTBOARDD
@@ -1176,191 +1260,17 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) {
if (ret == FAIL) {
return retval;
}
#ifdef XILINX_CHIPTESTBOARDD
ret = SetDacEnum(ind, val, mV, &retval, mess);
return retval;
#endif
switch (ind) {
// adc vpp
#if defined(CHIPTESTBOARDD)
case ADC_VPP:
// set
if (val >= 0) {
ret = AD9257_SetVrefVoltage(val, mV);
if (ret == FAIL) {
sprintf(mess, "Could not set Adc Vpp. Please set a "
"proper value\n");
LOG(logERROR, (mess));
}
}
retval = AD9257_GetVrefVoltage(mV);
LOG(logDEBUG1,
("Adc Vpp retval: %d %s\n", retval, (mV ? "mV" : "mode")));
// cannot validate (its just a variable and mv gives different
// value)
break;
#endif
// io delay
#ifdef EIGERD
case IO_DELAY:
retval = setIODelay(val);
LOG(logDEBUG1, ("IODelay: %d\n", retval));
validate(&ret, mess, val, retval, "set iodelay", DEC);
break;
#endif
// high voltage
#ifndef XILINX_CHIPTESTBOARDD
case HIGH_VOLTAGE:
#if defined(MYTHEN3D) || defined(GOTTHARD2D)
if ((val != -1 && val < 0) || (val > HV_SOFT_MAX_VOLTAGE)) {
ret = FAIL;
sprintf(mess, "Invalid Voltage. Valid range (0 - %d)\n",
HV_SOFT_MAX_VOLTAGE);
LOG(logERROR, (mess));
} else {
if (val >= 0) {
ret = setHighVoltage(val);
if (ret == FAIL) {
strcpy(mess, "Could not set high voltage.\n");
LOG(logERROR, (mess));
}
}
if (ret == OK) {
ret = getHighVoltage(&retval);
if (ret == FAIL) {
strcpy(mess, "Could not get high voltage.\n");
LOG(logERROR, (mess));
}
LOG(logDEBUG1, ("High Voltage: %d\n", retval));
validate(&ret, mess, val, retval, "set high voltage", DEC);
}
}
#else
retval = setHighVoltage(val);
LOG(logDEBUG1, ("High Voltage: %d\n", retval));
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD)
validate(&ret, mess, val, retval, "set high voltage", DEC);
#endif
#endif
#ifdef EIGERD
if ((retval != SLAVE_HIGH_VOLTAGE_READ_VAL) && (retval < 0)) {
ret = FAIL;
if (retval == -1)
sprintf(mess,
"Setting high voltage failed. Bad value %d. "
"The range is from 0 to 200 V.\n",
val);
else if (retval == -2)
strcpy(mess, "Setting high voltage failed. "
"Serial/i2c communication failed.\n");
else if (retval == -3)
strcpy(mess, "Getting high voltage failed. "
"Serial/i2c communication failed.\n");
LOG(logERROR, (mess));
}
#endif
break;
#endif
// power
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
case V_POWER_A:
case V_POWER_B:
case V_POWER_C:
case V_POWER_D:
case V_POWER_IO:
if (val != GET_FLAG) {
if (!mV) {
ret = FAIL;
sprintf(mess,
"Could not set power. Power regulator %d "
"should be in mV and not dac units.\n",
ind);
LOG(logERROR, (mess));
} else if (checkVLimitCompliant(val) == FAIL) {
ret = FAIL;
sprintf(mess,
"Could not set power. Power regulator %d "
"exceeds voltage limit %d.\n",
ind, getVLimit());
LOG(logERROR, (mess));
}
else if (!isPowerValid(serverDacIndex, val)) {
ret = FAIL;
sprintf(
mess,
"Could not set power. Power regulator %d "
"should be between %d and %d mV\n",
ind,
(serverDacIndex == D_PWR_IO ? VIO_MIN_MV : POWER_RGLTR_MIN),
#ifdef CHIPTESTBOARDD
(VCHIP_MAX_MV - VCHIP_POWER_INCRMNT));
#else
POWER_RGLTR_MAX);
#endif
LOG(logERROR, (mess));
}
else {
setPower(serverDacIndex, val);
}
}
if (ret == OK) {
retval = getPower(serverDacIndex);
LOG(logDEBUG1, ("Power regulator(%d): %d\n", ind, retval));
validate(&ret, mess, val, retval, "set power regulator", DEC);
}
break;
#endif
#ifdef CHIPTESTBOARDD
case V_POWER_CHIP:
if (val >= 0) {
ret = FAIL;
sprintf(mess, "Can not set Vchip. Can only be set "
"automatically in the background (+200mV "
"from highest power regulator voltage).\n");
LOG(logERROR, (mess));
/* restrict users from setting vchip
if (!mV) {
ret = FAIL;
sprintf(mess,"Could not set Vchip. Should be in mV and
not dac units.\n"); LOG(logERROR,(mess)); } else if
(!isVchipValid(val)) { ret = FAIL; sprintf(mess,"Could not
set Vchip. Should be between %d and %d mV\n", VCHIP_MIN_MV,
VCHIP_MAX_MV); LOG(logERROR,(mess)); } else { setVchip(val);
}
*/
}
retval = getVchip();
LOG(logDEBUG1, ("Vchip: %d\n", retval));
if (ret == OK && val != GET_FLAG && val != -100 && retval != val) {
ret = FAIL;
sprintf(mess, "Could not set vchip. Set %d, but read %d\n", val,
retval);
LOG(logERROR, (mess));
}
break;
#endif
// vlimit
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
case V_LIMIT:
if (val >= 0) {
if (!mV) {
ret = FAIL;
strcpy(mess, "Could not set power. VLimit should be in "
"mV and not dac units.\n");
LOG(logERROR, (mess));
} else {
setVLimit(val);
}
}
retval = getVLimit();
LOG(logDEBUG1, ("VLimit: %d\n", retval));
validate(&ret, mess, val, retval, "set vlimit", DEC);
break;
#endif
// dacs
default:
if (mV && val > DAC_MAX_MV) {
@@ -1443,8 +1353,11 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) {
break;
}
return retval;
#endif
}
int set_dac(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));

View File

@@ -1151,6 +1151,31 @@ int64_t getMeasurementTime() {
/* parameters - dac, adc, hv */
int setPower(enum DACINDEX ind, int val, int mV, char* mess) {
serverdacindex
if (checkVLimitCompliant(val) == FAIL) {
sprintf(mess, "Could not set power. Power regulator %d exceeds voltage limit %d.\n", ind, getVLimit());
LOG(logERROR, (mess));
return FAIL;
}
if (!isPowerValid(ind, val)) {
sprintf(mess, "Could not set power. Power regulator %d should be between %d and %d mV\n", ind, (ind == D_PWR_IO ? VIO_MIN_MV : POWER_RGLTR_MIN), POWER_RGLTR_MAX);
LOG(logERROR, (mess));
return FAIL;
}
setPower(ind, val);
int retval = getPower(ind);
validate(&ret, mess, val, retval, "set power regulator", DEC);
}
int getPower(enum DACINDEX ind, int* retval, char* mess) {
*retval = getPower(ind);
LOG(logDEBUG1, ("Power regulator(%d): %d\n", ind, retval));
}
void setDAC(enum DACINDEX ind, int val, int mV) {
char dacName[MAX_STR_LENGTH] = {0};
memset(dacName, 0, MAX_STR_LENGTH);
@@ -1208,9 +1233,13 @@ int checkVLimitDacCompliant(int dac) {
int getVLimit() { return vLimit; }
void setVLimit(int l) {
if (l >= 0)
vLimit = l;
int setVLimit(int val, char* mess) {
if (val < 0) {
sprintf(mess, "Could not set vlimit. Invalid value %d\n", val);
LOG(logERROR, (mess));
return FAIL;
}
vLimit = val;
}
int getBitOffsetFromDACIndex(enum DACINDEX ind) {

View File

@@ -126,11 +126,11 @@ int dacToVoltage(int dac);
int checkVLimitCompliant(int mV);
int checkVLimitDacCompliant(int dac);
int getVLimit();
void setVLimit(int l);
int setVLimit(int val, char* mess);
int getBitOffsetFromDACIndex(enum DACINDEX ind);
int isPowerValid(enum DACINDEX ind, int val);
int getPower();
void setPower(enum DACINDEX ind, int val);
int getPower(int* retval, char* mess);
int setPower(enum DACINDEX ind, int val, char* mess);
int getADC(enum ADCINDEX ind, int *value);
int getSlowADC(int ichan, int *retval);
int getTemperature(int *retval);