moench speeds (#776)

* added other speeds and updated readoutspeedlist, test, gui
This commit is contained in:
maliakal_d 2023-07-10 15:09:51 +02:00 committed by GitHub
parent 58cdb5bd20
commit 5be503c1bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 62 additions and 30 deletions

View File

@ -2034,10 +2034,10 @@ class Detector(CppDetectorApi):
-----
[Jungfrau][Moench] FULL_SPEED, HALF_SPEED (Default), QUARTER_SPEED
[Eiger] FULL_SPEED (Default), HALF_SPEED, QUARTER_SPEED
[Moench] FULL_SPEED (Default), HALF_SPEED, QUARTER_SPEED
[Gottthard2] G2_108MHZ (Default), G2_144MHZ
[Jungfrau] FULL_SPEED option only available from v2.0 boards and is recommended to set number of interfaces to 2. \n
Also overwrites adcphase to recommended default.
[Moench] FULL_SPEED (Default)
"""
return element_if_equal(self.getReadoutSpeed())

View File

@ -43,6 +43,7 @@ void qTabDataOutput::SetupWidgetWindow() {
case slsDetectorDefs::MYTHEN3:
chkParallel->setEnabled(true);
break;
case slsDetectorDefs::MOENCH:
case slsDetectorDefs::JUNGFRAU:
lblClkDivider->setEnabled(true);
comboClkDivider->setEnabled(true);

View File

@ -167,6 +167,11 @@
#define CONFIG_OPRTN_MDE_2_X_10GbE_MSK (0x00000001 << CONFIG_OPRTN_MDE_2_X_10GbE_OFST)
#define CONFIG_INNR_PRIMRY_INTRFCE_OFST (17)
#define CONFIG_INNR_PRIMRY_INTRFCE_MSK (0x00000001 << CONFIG_INNR_PRIMRY_INTRFCE_OFST)
#define CONFIG_READOUT_SPEED_OFST (20)
#define CONFIG_READOUT_SPEED_MSK (0x00000003 << CONFIG_READOUT_SPEED_OFST)
#define CONFIG_QUARTER_SPEED_10MHZ_VAL ((0x0 << CONFIG_READOUT_SPEED_OFST) & CONFIG_READOUT_SPEED_MSK)
#define CONFIG_HALF_SPEED_20MHZ_VAL ((0x1 << CONFIG_READOUT_SPEED_OFST) & CONFIG_READOUT_SPEED_MSK)
#define CONFIG_FULL_SPEED_40MHZ_VAL ((0x2 << CONFIG_READOUT_SPEED_OFST) & CONFIG_READOUT_SPEED_MSK)
#define CONFIG_TDMA_ENABLE_OFST (24)
#define CONFIG_TDMA_ENABLE_MSK (0x00000001 << CONFIG_TDMA_ENABLE_OFST)
#define CONFIG_TDMA_TIMESLOT_OFST (25) // 1ms

View File

@ -1411,23 +1411,37 @@ int setReadoutSpeed(int val) {
// stop state machine if running
if (runBusy()) {
stopStateMachine();
return FAIL;
}
if (isHardwareVersion_1_0()) {
LOG(logERROR, ("Cannot set full speed. Not implemented for this pcb version (1.0)\n"));
return FAIL;
}
uint32_t adcOfst = 0;
uint32_t sampleAdcSpeed = 0;
uint32_t adcPhase = 0;
uint32_t config = 0;
uint32_t sampleAdcDecimationFactor = 0;
switch (val) {
case FULL_SPEED:
if (isHardwareVersion_1_0()) {
LOG(logERROR, ("Cannot set full speed. Should not be here\n"));
return FAIL;
}
LOG(logINFO, ("Setting Full Speed (40 MHz):\n"));
sampleAdcSpeed = SAMPLE_ADC_FULL_SPEED;
adcPhase = ADC_PHASE_DEG_FULL_SPEED;
adcOfst = ADC_OFST_FULL_SPEED_VAL;
config = CONFIG_FULL_SPEED_40MHZ_VAL;
sampleAdcDecimationFactor = ADC_DECMT_FULL_SPEED
<< SAMPLE_ADC_DECMT_FACTOR_OFST;
break;
case HALF_SPEED:
LOG(logINFO, ("Setting Speed Speed (20 MHz):\n"));
config = CONFIG_HALF_SPEED_20MHZ_VAL;
sampleAdcDecimationFactor = ADC_DECMT_HALF_SPEED
<< SAMPLE_ADC_DECMT_FACTOR_OFST;
break;
case QUARTER_SPEED:
LOG(logINFO, ("Setting Quarter Speed (10 MHz):\n"));
config = CONFIG_QUARTER_SPEED_10MHZ_VAL;
sampleAdcDecimationFactor = ADC_DECMT_QUARTER_SPEED
<< SAMPLE_ADC_DECMT_FACTOR_OFST;
break;
default:
@ -1435,23 +1449,35 @@ int setReadoutSpeed(int val) {
return FAIL;
}
bus_w(ADC_OFST_REG, (bus_r(ADC_OFST_REG) & ~ADC_OFFSET_MSK));
bus_w(ADC_OFST_REG, (bus_r(ADC_OFST_REG) |
((adcOfst << ADC_OFFSET_OFST) & ADC_OFFSET_MSK)));
LOG(logINFO, ("\tSet ADC Ofst Reg to 0x%x\n",
((bus_r(ADC_OFST_REG) & ADC_OFFSET_MSK) >> ADC_OFFSET_OFST)));
bus_w(CONFIG_REG, bus_r(CONFIG_REG) & ~CONFIG_READOUT_SPEED_MSK);
bus_w(CONFIG_REG, bus_r(CONFIG_REG) | config);
LOG(logINFO, ("\tSet Config Reg to 0x%x\n", bus_r(CONFIG_REG)));
bus_w(SAMPLE_REG, sampleAdcSpeed);
bus_w(SAMPLE_REG, bus_r(SAMPLE_REG) & ~SAMPLE_ADC_DECMT_FACTOR_MSK);
bus_w(SAMPLE_REG, bus_r(SAMPLE_REG) | sampleAdcDecimationFactor);
LOG(logINFO, ("\tSet Sample Reg to 0x%x\n", bus_r(SAMPLE_REG)));
setPhase(ADC_CLK, adcPhase, 1);
LOG(logINFO, ("\tSet ADC Phase Reg to %d deg\n", adcPhase));
// TODO: adcofst, adcphase?
return OK;
}
int getReadoutSpeed(int *retval) {
*retval = FULL_SPEED;
u_int32_t speed = bus_r(CONFIG_REG) & CONFIG_READOUT_SPEED_MSK;
switch (speed) {
case CONFIG_FULL_SPEED_40MHZ_VAL:
*retval = FULL_SPEED;
break;
case CONFIG_HALF_SPEED_20MHZ_VAL:
*retval = HALF_SPEED;
break;
case CONFIG_QUARTER_SPEED_10MHZ_VAL:
*retval = QUARTER_SPEED;
break;
default:
LOG(logERROR, ("Unknown speed val: %d\n", speed));
*retval = -1;
return FAIL;
}
return OK;
}

View File

@ -65,6 +65,10 @@
#define MAX_PHASE_SHIFTS (240)
#define BIT16_MASK (0xFFFF)
#define ADC_DECMT_QUARTER_SPEED (0x3)
#define ADC_DECMT_HALF_SPEED (0x1)
#define ADC_DECMT_FULL_SPEED (0x0)
// pipeline
#define ADC_PORT_INVERT_VAL (0x55555555)

View File

@ -9438,10 +9438,8 @@ int set_readout_speed(int file_des) {
switch (arg) {
#if defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD)
case FULL_SPEED:
#ifndef MOENCHD
case HALF_SPEED:
case QUARTER_SPEED:
#endif
#elif GOTTHARD2D
case G2_108MHZ:
case G2_144MHZ:

View File

@ -708,8 +708,7 @@ std::string CmdProxy::ReadoutSpeed(int action) {
"full_speed option only available from v2.0 boards and is "
"recommended to set number of interfaces to 2. Also overwrites "
"adcphase to recommended default.\n\t [144|108]\n\t\t[Gotthard2] "
"Readout speed of chip in MHz. Default is 108.\n\t\t[Moench] "
"Only Full speed is implemented."
"Readout speed of chip in MHz. Default is 108."
<< '\n';
} else {
defs::detectorType type = det->getDetectorType().squash();

View File

@ -506,10 +506,9 @@ std::vector<defs::speedLevel> Detector::getReadoutSpeedList() const {
switch (getDetectorType().squash()) {
case defs::EIGER:
case defs::JUNGFRAU:
case defs::MOENCH:
return std::vector<defs::speedLevel>{defs::FULL_SPEED, defs::HALF_SPEED,
defs::QUARTER_SPEED};
case defs::MOENCH:
return std::vector<defs::speedLevel>{defs::FULL_SPEED};
case defs::GOTTHARD2:
return std::vector<defs::speedLevel>{defs::G2_108MHZ, defs::G2_144MHZ};
default:

View File

@ -1050,9 +1050,9 @@ TEST_CASE("readoutspeed", "[.cmd]") {
// full speed for jungfrau/moench only works for new boards (chipv1.1 is
// with new board [hw1.0 and chipv1.0 not tested here])
if (((det_type == defs::JUNGFRAU || det_type == defs::MOENCH) &&
if (((det_type == defs::JUNGFRAU) &&
det.getChipVersion().squash() * 10 == 11) ||
(det_type == defs::EIGER)) {
(det_type == defs::EIGER) || (det_type == defs::MOENCH)) {
std::ostringstream oss1, oss2, oss3, oss4;
proxy.Call("readoutspeed", {"0"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "readoutspeed full_speed\n");

View File

@ -8,6 +8,6 @@
#define APIGOTTHARD "developer 0x230615"
#define APIGOTTHARD2 "developer 0x230615"
#define APIJUNGFRAU "developer 0x230615"
#define APIMOENCH "developer 0x230615"
#define APICTB "developer 0x230621"
#define APIMYTHEN3 "developer 0x230621"
#define APIMOENCH "developer 0x230707"