gotthard2: timingsource and currentsource features, (timing source external yet to be implemented in fpga to test (#80)

This commit is contained in:
Dhanya Thattil
2020-02-28 12:45:02 +01:00
committed by GitHub
parent 2e2e91b219
commit 11e7737a2f
17 changed files with 334 additions and 3 deletions

View File

@ -104,6 +104,8 @@
#define CONTROL_PRPHRL_RST_MSK (0x00000001 << CONTROL_PRPHRL_RST_OFST)
#define CONTROL_CLR_ACQSTN_FIFO_OFST (15)
#define CONTROL_CLR_ACQSTN_FIFO_MSK (0x00000001 << CONTROL_CLR_ACQSTN_FIFO_OFST)
#define CONTROL_TIMING_SOURCE_EXT_OFST (17)
#define CONTROL_TIMING_SOURCE_EXT_MSK (0x00000001 << CONTROL_TIMING_SOURCE_EXT_OFST)
#define CONTROL_PWR_CHIP_OFST (31)
#define CONTROL_PWR_CHIP_MSK (0x00000001 << CONTROL_PWR_CHIP_OFST)
@ -128,6 +130,8 @@
#define ASIC_CONFIG_FIX_GAIN_1_VAL ((0x1 << ASIC_CONFIG_GAIN_OFST) & ASIC_CONFIG_GAIN_MSK)
#define ASIC_CONFIG_FIX_GAIN_2_VAL ((0x2 << ASIC_CONFIG_GAIN_OFST) & ASIC_CONFIG_GAIN_MSK)
#define ASIC_CONFIG_RESERVED_VAL ((0x3 << ASIC_CONFIG_GAIN_OFST) & ASIC_CONFIG_GAIN_MSK)
#define ASIC_CONFIG_CURRENT_SRC_EN_OFST (7)
#define ASIC_CONFIG_CURRENT_SRC_EN_MSK (0x00000001 << ASIC_CONFIG_CURRENT_SRC_EN_OFST)
#define ASIC_CONFIG_RST_DAC_OFST (15)
#define ASIC_CONFIG_RST_DAC_MSK (0x00000001 << ASIC_CONFIG_RST_DAC_OFST)
#define ASIC_CONFIG_DONE_OFST (31)

View File

@ -447,6 +447,8 @@ void setupDetector() {
setDelayAfterTrigger(DEFAULT_DELAY_AFTER_TRIGGER);
setBurstPeriod(DEFAULT_BURST_PERIOD);
setTiming(DEFAULT_TIMING_MODE);
setCurrentSource(DEFAULT_CURRENT_SOURCE);
setTimingSource(DEFAULT_TIMING_SOURCE);
}
int readConfigFile() {
@ -1961,6 +1963,44 @@ enum burstMode getBurstMode() {
return burstMode;
}
void setCurrentSource(int value) {
uint32_t addr = ASIC_CONFIG_REG;
if (value > 0) {
bus_w(addr, (bus_r(addr) | ASIC_CONFIG_CURRENT_SRC_EN_MSK));
} else if (value == 0) {
bus_w(addr, (bus_r(addr) &~ ASIC_CONFIG_CURRENT_SRC_EN_MSK));
}
}
int getCurrentSource() {
return ((bus_r(ASIC_CONFIG_REG) & ASIC_CONFIG_CURRENT_SRC_EN_MSK) >> ASIC_CONFIG_CURRENT_SRC_EN_OFST);
}
void setTimingSource(enum timingSourceType value) {
uint32_t addr = CONTROL_REG;
switch (value) {
case TIMING_INTERNAL:
FILE_LOG(logINFO, ("Setting timing source to internal\n"));
bus_w(addr, (bus_r(addr) &~ CONTROL_TIMING_SOURCE_EXT_MSK));
break;
case TIMING_EXTERNAL:
FILE_LOG(logINFO, ("Setting timing source to exernal\n"));
bus_w(addr, (bus_r(addr) | CONTROL_TIMING_SOURCE_EXT_MSK));
break;
default:
FILE_LOG(logERROR, ("Unknown timing source %d\n", value));
break;
}
}
enum timingSourceType getTimingSource() {
if (bus_r(CONTROL_REG) & CONTROL_TIMING_SOURCE_EXT_MSK) {
return TIMING_EXTERNAL;
}
return TIMING_INTERNAL;
}
/* aquisition */

View File

@ -41,6 +41,9 @@
#define DEFAULT_HIGH_VOLTAGE (0)
#define DEFAULT_TIMING_MODE (AUTO_TIMING)
#define DEFAULT_SETTINGS (DYNAMICGAIN)
#define DEFAULT_CURRENT_SOURCE (0)
#define DEFAULT_TIMING_SOURCE (TIMING_INTERNAL)
#define DEFAULT_READOUT_C0 (144444448) // rdo_clk, 144 MHz
#define DEFAULT_READOUT_C1 (144444448) // rdo_x2_clk, 144 MHz
#define DEFAULT_SYSTEM_C0 (144444448) // run_clk, 144 MHz

View File

@ -482,6 +482,10 @@ int configureADC();
int setBurstModeinFPGA(enum burstMode value);
int setBurstMode(enum burstMode burst);
enum burstMode getBurstMode();
void setCurrentSource(int value);
int getCurrentSource();
void setTimingSource(enum timingSourceType value);
enum timingSourceType getTimingSource();
#endif

View File

@ -212,3 +212,7 @@ int get_num_bursts(int);
int set_num_bursts(int);
int get_burst_period(int);
int set_burst_period(int);
int get_current_source(int);
int set_current_source(int);
int get_timing_source(int);
int set_timing_source(int);

View File

@ -319,6 +319,10 @@ const char* getFunctionName(enum detFuncs func) {
case F_SET_NUM_BURSTS: return "F_SET_NUM_BURSTS";
case F_GET_BURST_PERIOD: return "F_GET_BURST_PERIOD";
case F_SET_BURST_PERIOD: return "F_SET_BURST_PERIOD";
case F_GET_CURRENT_SOURCE: return "F_GET_CURRENT_SOURCE";
case F_SET_CURRENT_SOURCE: return "F_SET_CURRENT_SOURCE";
case F_GET_TIMING_SOURCE: return "F_GET_TIMING_SOURCE";
case F_SET_TIMING_SOURCE: return "F_SET_TIMING_SOURCE";
default: return "Unknown Function";
}
@ -507,6 +511,10 @@ void function_table() {
flist[F_SET_NUM_BURSTS] = &set_num_bursts;
flist[F_GET_BURST_PERIOD] = &get_burst_period;
flist[F_SET_BURST_PERIOD] = &set_burst_period;
flist[F_GET_CURRENT_SOURCE] = &get_current_source;
flist[F_SET_CURRENT_SOURCE] = &set_current_source;
flist[F_GET_TIMING_SOURCE] = &get_timing_source;
flist[F_SET_TIMING_SOURCE] = &set_timing_source;
// check
if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) {
@ -6735,4 +6743,102 @@ int set_burst_period(int file_des) {
}
#endif
return Server_SendResult(file_des, INT64, UPDATE, NULL, 0);
}
int set_current_source(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
int arg = 0;
if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0)
return printSocketReadError();
FILE_LOG(logINFO, ("Setting current source enable: %u\n", arg));
#ifndef GOTTHARD2D
functionNotImplemented();
#else
// only set
if (Server_VerifyLock() == OK) {
setCurrentSource(arg);
int retval = getCurrentSource();
FILE_LOG(logDEBUG1, ("current source enable retval: %u\n", retval));
validate(arg, retval, "current source enable", DEC);
}
#endif
return Server_SendResult(file_des, INT32, UPDATE, NULL, 0);
}
int get_current_source(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
int retval = -1;
FILE_LOG(logDEBUG1, ("Getting current source enable\n"));
#ifndef GOTTHARD2D
functionNotImplemented();
#else
// get only
retval = getCurrentSource();
FILE_LOG(logDEBUG1, ("current source enable retval: %u\n", retval));
#endif
return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval));
}
int set_timing_source(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
enum timingSourceType arg = TIMING_INTERNAL;
if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0)
return printSocketReadError();
FILE_LOG(logDEBUG1, ("Setting timing source: %d\n", arg));
#ifndef GOTTHARD2D
functionNotImplemented();
#else
// only set
if (Server_VerifyLock() == OK) {
switch (arg) {
case TIMING_INTERNAL:
case TIMING_EXTERNAL:
break;
default:
modeNotImplemented("timing source", (int)arg);
break;
}
if (ret == OK) {
setTimingSource(arg);
enum timingSourceType retval = getTimingSource();
FILE_LOG(logDEBUG, ("timing source retval: %d\n", retval));
if (retval != arg) {
ret = FAIL;
sprintf(mess, "Could not set timing source. Set %d, got %d\n", arg, retval);
FILE_LOG(logERROR, (mess));
}
}
}
#endif
return Server_SendResult(file_des, INT32, UPDATE, NULL, 0);
}
int get_timing_source(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
enum timingSourceType retval = TIMING_INTERNAL;
FILE_LOG(logDEBUG1, ("Getting timing source\n"));
#ifndef GOTTHARD2D
functionNotImplemented();
#else
// get only
retval = getTimingSource();
FILE_LOG(logDEBUG1, ("Get timing source retval:%d\n", retval));
#endif
return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval));
}