From b5367258d7a78236f4f4e2345441cc681a42c6dd Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 3 Sep 2026 11:46:40 +0200 Subject: [PATCH] jungfrau: changing cds timer of asic: chipv1.0 stays at 0x1f always, but the rother chip versions: if higher filter resistor, then 0x5F, else 0x1F --- .../jungfrauDetectorServer/RegisterDefs.h | 8 +-- .../slsDetectorFunctionList.c | 70 +++++++++++++------ .../include/slsDetectorFunctionList.h | 3 +- 3 files changed, 56 insertions(+), 25 deletions(-) diff --git a/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h b/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h index 6ea71da55..d99d0d0ca 100644 --- a/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h +++ b/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h @@ -492,10 +492,10 @@ Time before end of exposure when comparator is disabled */ #define ASIC_CTRL_PRCHRG_TMR_MSK (0x000000FF << ASIC_CTRL_PRCHRG_TMR_OFST) #define ASIC_CTRL_PRCHRG_TMR_VAL ((0x1F << ASIC_CTRL_PRCHRG_TMR_OFST) & ASIC_CTRL_PRCHRG_TMR_MSK) // tDS = (DST + 1) * 25ns -#define ASIC_CTRL_DS_TMR_OFST (8) -#define ASIC_CTRL_DS_TMR_MSK (0x000000FF << ASIC_CTRL_DS_TMR_OFST) -#define ASIC_CTRL_DS_TMR_VAL ((0x1F << ASIC_CTRL_DS_TMR_OFST) & ASIC_CTRL_DS_TMR_MSK) -#define ASIC_CTRL_DS_TMR_CHIP1_1_VAL ((0xFF << ASIC_CTRL_DS_TMR_OFST) & ASIC_CTRL_DS_TMR_MSK) +#define ASIC_CTRL_CDS_TMR_OFST (8) +#define ASIC_CTRL_CDS_TMR_MSK (0x000000FF << ASIC_CTRL_CDS_TMR_OFST) +#define ASIC_CTRL_CDS_TMR_LOW_FLTR_RSSTR_VAL ((0x1F << ASIC_CTRL_CDS_TMR_OFST) & ASIC_CTRL_CDS_TMR_MSK) +#define ASIC_CTRL_CDS_TMR_HIGH_FLTR_RSSTR_VAL ((0x5F << ASIC_CTRL_CDS_TMR_OFST) & ASIC_CTRL_CDS_TMR_MSK) /* ADC 0 Deserializer Control */ #define ADC_DSRLZR_0_REG (0xF0 << MEM_MAP_SHIFT) diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c index 9729be453..36b398374 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -673,7 +673,8 @@ void setupDetector() { resetCore(); alignDeserializer(); - configureASICTimer(); + configureAsicPrechargeTimer(); + updateAsicCDSTimer(); bus_w(ADC_PORT_INVERT_REG, (isHardwareVersion_1_0() ? ADC_PORT_INVERT_BOARD2_VAL : ADC_PORT_INVERT_VAL)); @@ -2208,17 +2209,41 @@ int64_t getComparatorDisableTime() { return bus_r(COMP_DSBLE_TIME_REG) / (1E-3 * CLK_RUN); } -void configureASICTimer() { - bus_w(ASIC_CTRL_REG, (bus_r(ASIC_CTRL_REG) & ~ASIC_CTRL_PRCHRG_TMR_MSK) | - ASIC_CTRL_PRCHRG_TMR_VAL); +void configureAsicPrechargeTimer() { + uint32_t addr = ASIC_CTRL_REG; + uint32_t mask = ASIC_CTRL_PRCHRG_TMR_MSK; + uint32_t ofst = ASIC_CTRL_PRCHRG_TMR_OFST; + uint32_t value = ASIC_CTRL_PRCHRG_TMR_VAL; + bus_w(addr, bus_r(addr) & ~mask); + bus_w(addr, bus_r(addr) | value); + LOG(logINFO, ("Configured ASIC Precharge Timer [0x%x]\n", + ((bus_r(addr) & mask) >> ofst))); +} - uint32_t val = ASIC_CTRL_DS_TMR_CHIP1_1_VAL; - // TODO: value of chipindex v1_2 value to be decided. +// configure ASIC correlated double sampling timer +void updateAsicCDSTimer() { + uint32_t addr = ASIC_CTRL_REG; + uint32_t mask = ASIC_CTRL_CDS_TMR_MSK; + uint32_t ofst = ASIC_CTRL_CDS_TMR_OFST; + uint32_t low_res_val = ASIC_CTRL_CDS_TMR_LOW_FLTR_RSSTR_VAL; + uint32_t high_res_val = ASIC_CTRL_CDS_TMR_HIGH_FLTR_RSSTR_VAL; + uint32_t val = 0; + + // chip v1.0 has always low res value + // chip v1.1 and 1.2 depends on filter resistor value + bus_w(addr, bus_r(addr) & ~mask); if (chipIndex == v1_0) { - val = ASIC_CTRL_DS_TMR_VAL; + val = low_res_val; + } else { + if (getFilterResistor() == 0) { + val = low_res_val; + } else { + val = high_res_val; + } } - bus_w(ASIC_CTRL_REG, (bus_r(ASIC_CTRL_REG) & ~ASIC_CTRL_DS_TMR_MSK) | val); - LOG(logINFO, ("Configured ASIC Timer [0x%x]\n", bus_r(ASIC_CTRL_REG))); + bus_w(addr, bus_r(addr) | val); + LOG(logINFO, + ("Configured ASIC CDS Timer [0x%x]\n", ((bus_r(addr) & mask) >> ofst))); } int setReadoutSpeed(int val) { @@ -2569,22 +2594,27 @@ int getFilterResistor() { } int setFilterResistor(int value) { - // lower resistor - if (value == 0) { + uint32_t addr = CONFIG_V11_REG; + uint32_t low_res_mask = CONFIG_V11_FLTR_RSSTR_SMLR_MSK; + + switch (value) { + case 0: LOG(logINFO, ("Setting Lower Filter Resistor\n")); - bus_w(CONFIG_V11_REG, - bus_r(CONFIG_V11_REG) | CONFIG_V11_FLTR_RSSTR_SMLR_MSK); + bus_w(addr, bus_r(addr) | low_res_mask); + updateAsicCDSTimer(); return OK; - } - // higher resistor - else if (value == 1) { + + case 1: LOG(logINFO, ("Setting Higher Filter Resistor\n")); - bus_w(CONFIG_V11_REG, - bus_r(CONFIG_V11_REG) & ~CONFIG_V11_FLTR_RSSTR_SMLR_MSK); + bus_w(addr, bus_r(addr) & ~low_res_mask); + updateAsicCDSTimer(); return OK; + + default: + LOG(logERROR, + ("Could not set Filter Resistor. Invalid value %d\n", value)); + return FAIL; } - LOG(logERROR, ("Could not set Filter Resistor. Invalid value %d\n", value)); - return FAIL; } int getNumberOfFilterCells() { diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 7d19789aa..d29a63c5d 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -567,7 +567,8 @@ void configureChip(); int autoCompDisable(int on); int setComparatorDisableTime(int64_t val); int64_t getComparatorDisableTime(); -void configureASICTimer(); +void configureAsicPrechargeTimer(); +void updateAsicCDSTimer(); #endif int setReadoutSpeed(int val); int getReadoutSpeed(int *retval);