2. Dev/add jf pedestal feature (#807)

This commit is contained in:
2023-09-29 11:25:58 +02:00
committed by GitHub
parent 72bec5d62e
commit d003a6d8e0
27 changed files with 751 additions and 109 deletions

View File

@ -255,6 +255,17 @@
#define PLL_CNTRL_ADDR_OFST (16)
#define PLL_CNTRL_ADDR_MSK (0x0000003F << PLL_CNTRL_ADDR_OFST)
/* Pedestal Mode Regiser */
#define PEDESTAL_MODE_REG (0x57 << MEM_MAP_SHIFT)
#define PEDESTAL_MODE_ITRTNS_OFST (0)
#define PEDESTAL_MODE_ITRTNS_MSK (0x0000FFFF << PEDESTAL_MODE_ITRTNS_OFST)
#define PEDESTAL_MODE_LNGTH_OFST (16)
#define PEDESTAL_MODE_LNGTH_MSK (0x000000FF << PEDESTAL_MODE_LNGTH_OFST)
#define PEDESTAL_MODE_ENBLE_OFST (31)
#define PEDESTAL_MODE_ENBLE_MSK (0x00000001 << PEDESTAL_MODE_ENBLE_OFST)
/* Config Register for chip 1.1 */
#define CONFIG_V11_REG (0x58 << MEM_MAP_SHIFT)

View File

@ -55,6 +55,9 @@ int32_t clkPhase[NUM_CLOCKS] = {};
int detPos[4] = {};
int chipConfigured = 0;
uint64_t normal_mode_frames = -1;
uint64_t normal_mode_triggers = -1;
int isInitCheckDone() { return initCheckDone; }
int getInitResult(char **mess) {
@ -555,6 +558,13 @@ void setupDetector() {
setFlipRows(DEFAULT_FLIP_ROWS);
setReadNRows(MAX_ROWS_PER_READOUT);
}
#ifdef VIRTUAL
// setting pedestalmode depends on previous values
bus_w(PEDESTAL_MODE_REG,
bus_r(PEDESTAL_MODE_REG) & ~PEDESTAL_MODE_ENBLE_MSK);
#endif
setPedestalMode(DEFAULT_PEDESTAL_MODE, DEFAULT_PEDESTAL_FRAMES,
DEFAULT_PEDESTAL_LOOPS);
}
int resetToDefaultDacs(int hardReset) {
@ -975,6 +985,9 @@ int getNextFrameNumber(uint64_t *retval) {
}
void setNumFrames(int64_t val) {
if (getPedestalMode()) {
return;
}
if (val > 0) {
LOG(logINFO, ("Setting number of frames %lld\n", (long long int)val));
set64BitReg(val, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG);
@ -986,6 +999,9 @@ int64_t getNumFrames() {
}
void setNumTriggers(int64_t val) {
if (getPedestalMode()) {
return;
}
if (val > 0) {
LOG(logINFO, ("Setting number of triggers %lld\n", (long long int)val));
set64BitReg(val, SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG);
@ -1439,6 +1455,9 @@ void setSynchronization(int enable) {
}
void setTiming(enum timingMode arg) {
if (getPedestalMode()) {
return;
}
switch (arg) {
case AUTO_TIMING:
LOG(logINFO, ("Set Timing: Auto\n"));
@ -2513,6 +2532,81 @@ uint64_t getSelectCurrentSource() {
}
}
int getPedestalMode() {
return ((bus_r(PEDESTAL_MODE_REG) & PEDESTAL_MODE_ENBLE_MSK) >>
PEDESTAL_MODE_ENBLE_OFST);
}
void getPedestalParameters(uint8_t *frames, uint16_t *loops) {
uint32_t addr = PEDESTAL_MODE_REG;
*frames =
((bus_r(addr) & PEDESTAL_MODE_LNGTH_MSK) >> PEDESTAL_MODE_LNGTH_OFST);
*loops = ((bus_r(PEDESTAL_MODE_REG) & PEDESTAL_MODE_ITRTNS_MSK) >>
PEDESTAL_MODE_ITRTNS_OFST);
}
void setPedestalMode(int enable, uint8_t frames, uint16_t loops) {
int prevPedestalEnable = getPedestalMode();
uint32_t addr = PEDESTAL_MODE_REG;
if (enable) {
LOG(logINFOBLUE, ("Enabling pedestal mode [frames: %hhu, loops: %hu]\n",
frames, loops));
// enable
bus_w(addr, bus_r(addr) | PEDESTAL_MODE_ENBLE_MSK);
// frames
bus_w(addr, bus_r(addr) & ~PEDESTAL_MODE_LNGTH_MSK);
bus_w(addr, bus_r(addr) | ((frames << PEDESTAL_MODE_LNGTH_OFST) &
PEDESTAL_MODE_LNGTH_MSK));
// loops
bus_w(addr, bus_r(addr) & ~PEDESTAL_MODE_ITRTNS_MSK);
bus_w(addr, bus_r(addr) | ((loops << PEDESTAL_MODE_ITRTNS_OFST) &
PEDESTAL_MODE_ITRTNS_MSK));
// if it was switched off before, remember the #frames and #triggers
if (prevPedestalEnable == 0) {
normal_mode_frames = getNumFrames();
normal_mode_triggers = getNumTriggers();
LOG(logINFO, ("\tRemembering Normal mode #frames and "
"#triggers[%lld, %lld]\n",
normal_mode_frames, normal_mode_triggers));
}
// overwrite #frames and #triggers to new values
int64_t expFrames = -1;
int64_t expTriggers = -1;
enum timingMode timing = getTiming();
if (timing == AUTO_TIMING ||
(timing == TRIGGER_EXPOSURE && normal_mode_frames > 1)) {
expFrames = frames * loops * 2;
expTriggers = 1;
} else {
expFrames = 1;
expTriggers = frames * loops * 2;
}
LOG(logINFO, ("\tOverwriting [#frames: %lld, #triggers: %lld]\n",
expFrames, expTriggers));
set64BitReg(expFrames, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG);
set64BitReg(expTriggers, SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG);
} else {
LOG(logINFOBLUE, ("Disabling pedestal mode\n"));
bus_w(addr, bus_r(addr) & ~PEDESTAL_MODE_ENBLE_MSK);
// if it was switched on before, reset the normal mode #frames and
// #triggers
if (prevPedestalEnable == 1) {
LOG(logINFO,
("\tResetting to Normal mode [#frames:%lld, #triggers:%lld\n",
normal_mode_frames, normal_mode_triggers));
set64BitReg(normal_mode_frames, SET_FRAMES_LSB_REG,
SET_FRAMES_MSB_REG);
set64BitReg(normal_mode_triggers, SET_CYCLES_LSB_REG,
SET_CYCLES_MSB_REG);
}
}
}
int getTenGigaFlowControl() {
return ((bus_r(CONFIG_REG) & CONFIG_ETHRNT_FLW_CNTRL_MSK) >>
CONFIG_ETHRNT_FLW_CNTRL_OFST);

View File

@ -5,8 +5,8 @@
#include "sls/sls_detector_defs.h"
#define MIN_REQRD_VRSN_T_RD_API 0x171220
#define REQRD_FRMWRE_VRSN_BOARD2 0x230516 // 1.0 pcb (version = 010)
#define REQRD_FRMWRE_VRSN 0x230515 // 2.0 pcb (version = 011)
#define REQRD_FRMWRE_VRSN_BOARD2 0x230920 // 1.0 pcb (version = 010)
#define REQRD_FRMWRE_VRSN 0x230921 // 2.0 pcb (version = 011)
#define NUM_HARDWARE_VERSIONS (2)
#define HARDWARE_VERSION_NUMBERS \
@ -52,6 +52,9 @@
#define DEFAULT_FLIP_ROWS (0)
#define DEFAULT_FILTER_RESISTOR (1) // higher resistor
#define DEFAULT_FILTER_CELL (0)
#define DEFAULT_PEDESTAL_MODE (0)
#define DEFAULT_PEDESTAL_FRAMES (1)
#define DEFAULT_PEDESTAL_LOOPS (1)
#define HIGHVOLTAGE_MIN (60)
#define HIGHVOLTAGE_MAX (200)