diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index 6ab8ca615..465ee4956 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -490,6 +490,8 @@ enum readOutFlags { DIGITAL_ONLY=0x80000, /** chiptest board read only digital bits (not adc values)*/ ANALOG_AND_DIGITAL=0x100000, /** chiptest board read adc values and digital bits digital bits */ DUT_CLK=0x200000, /** chiptest board fifo clock comes from device under test */ + SHOW_OVERFLOW=0x400000, /** eiger 32 bit mode, show saturated for overflow of single subframes */ + NOOVERFLOW=0x800000 /** eiger 32 bit mode, do not show saturated for overflow of single subframes */ }; /** trimming modes diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.c b/slsDetectorSoftware/eigerDetectorServer/Beb.c index 15ced3006..074980d8c 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.c +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.c @@ -415,6 +415,43 @@ int Beb_Activate(int enable){ } +int Beb_Set32bitOverflow(int val) { + if(!Beb_activated) + return val; + + //mapping new memory + u_int32_t* csp0base=0; + u_int32_t valueread = 0; + u_int32_t offset = FLOW_REG_OFFSET; + if(val>0) val = 1; + + //open file pointer + int fd = Beb_open(&csp0base,XPAR_PLB_GPIO_SYS_BASEADDR); + if(fd < 0){ + cprintf(BG_RED,"Could not read register to set overflow flag in 32 bit mode. FAIL\n"); + return -1; + } + else{ + if(val > -1){ + // reset bit + valueread = Beb_Read32(csp0base, offset); + Beb_Write32(csp0base, offset,valueread & ~FLOW_REG_OVERFLOW_32_BIT_MSK); + + // set bit + valueread = Beb_Read32(csp0base, offset); + Beb_Write32(csp0base, offset,valueread | + ((val << FLOW_REG_OVERFLOW_32_BIT_OFST) & FLOW_REG_OVERFLOW_32_BIT_MSK)); + } + + valueread = (Beb_Read32(csp0base, offset) & FLOW_REG_OVERFLOW_32_BIT_MSK) >> FLOW_REG_OVERFLOW_32_BIT_OFST; + } + //close file pointer + if(fd > 0) + Beb_close(fd,csp0base); + + return valueread; +} + int Beb_SetNetworkParameter(enum NETWORKINDEX mode, int val){ if(!Beb_activated) @@ -441,7 +478,7 @@ int Beb_SetNetworkParameter(enum NETWORKINDEX mode, int val){ strcpy(modename,"Transmission Delay Frame"); break; case FLOWCTRL_10G: - offset = TXM_FLOW_CONTROL_10G; + offset = FLOW_REG_OFFSET; strcpy(modename,"Flow Control for 10G"); if(val>0) val = 1; break; @@ -455,14 +492,29 @@ int Beb_SetNetworkParameter(enum NETWORKINDEX mode, int val){ } else{ if(val > -1){ - valueread = Beb_Read32(csp0base, offset); - //cprintf(BLUE, "%s value before:%d\n",modename,valueread); - Beb_Write32(csp0base, offset,val); - cprintf(BLUE,"%s value:%d\n", modename,valueread); + if (mode != FLOWCTRL_10G) { + valueread = Beb_Read32(csp0base, offset); + Beb_Write32(csp0base, offset,val); + } + // flow control reg has other bits for other control + else { + // reset bit + valueread = Beb_Read32(csp0base, offset); + Beb_Write32(csp0base, offset,valueread & ~FLOW_REG_TXM_FLOW_CNTRL_10G_MSK); + + // set bit + valueread = Beb_Read32(csp0base, offset); + Beb_Write32(csp0base, offset,valueread | + ((val << FLOW_REG_TXM_FLOW_CNTRL_10G_OFST) & FLOW_REG_TXM_FLOW_CNTRL_10G_MSK)); + + } + } valueread = Beb_Read32(csp0base, offset); - //cprintf(BLUE,"%s value:%d\n", modename,valueread); + if (mode == FLOWCTRL_10G) + valueread = (valueread & FLOW_REG_TXM_FLOW_CNTRL_10G_MSK) >> FLOW_REG_TXM_FLOW_CNTRL_10G_OFST; + } //close file pointer if(fd > 0) diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.h b/slsDetectorSoftware/eigerDetectorServer/Beb.h index a0229dd3b..73718db03 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.h +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.h @@ -51,6 +51,7 @@ struct BebInfo{ int Beb_SetMasterViaSoftware(); int Beb_SetSlaveViaSoftware(); int Beb_Activate(int enable); + int Beb_Set32bitOverflow(int val); int Beb_SetNetworkParameter(enum NETWORKINDEX mode, int val); int Beb_ResetToHardwareSettings(); u_int32_t Beb_GetFirmwareRevision(); diff --git a/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h b/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h index 5950a85f8..1562fe1e4 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h +++ b/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h @@ -139,7 +139,12 @@ #define TXM_DELAY_LEFT_OFFSET 0x180 #define TXM_DELAY_RIGHT_OFFSET 0x1A0 #define TXM_DELAY_FRAME_OFFSET 0x1C0 -#define TXM_FLOW_CONTROL_10G 0x140 +#define FLOW_REG_OFFSET 0x140 + +#define FLOW_REG_TXM_FLOW_CNTRL_10G_OFST (0) +#define FLOW_REG_TXM_FLOW_CNTRL_10G_MSK (0x1 << FLOW_REG_TXM_FLOW_CNTRL_10G_OFST) +#define FLOW_REG_OVERFLOW_32_BIT_OFST (2) +#define FLOW_REG_OVERFLOW_32_BIT_MSK (0x1 << FLOW_REG_OVERFLOW_32_BIT_OFST) //command memory #define LEFT_OFFSET 0x0 diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_developer index a0cd4082d..980781aad 100755 Binary files a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_developer and b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_developer differ diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt index ba9b56634..2aad5bbd5 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware/eigerDetectorServer URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: 23d73ae5aee55e52d1d05452c633073ac1c6ad1a -Revision: 334 -Branch: developer +Repsitory UUID: 0ed82d4ef7a10d8a935b5d075a990509da288e32 +Revision: 338 +Branch: 32bitoverflow Last Changed Author: Dhanya_Thattil -Last Changed Rev: 3817 -Last Changed Date: 2018-05-15 16:16:15.000000002 +0200 ./FebRegisterDefs.h +Last Changed Rev: 3831 +Last Changed Date: 2018-05-22 18:04:57.000000002 +0200 ./Beb.c diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h index 4362e67fc..85ae05016 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "23d73ae5aee55e52d1d05452c633073ac1c6ad1a" +#define GITREPUUID "0ed82d4ef7a10d8a935b5d075a990509da288e32" #define GITAUTH "Dhanya_Thattil" -#define GITREV 0x3817 -#define GITDATE 0x20180515 -#define GITBRANCH "developer" +#define GITREV 0x3831 +#define GITDATE 0x20180522 +#define GITBRANCH "32bitoverflow" diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c index 7e69314f4..4eb9eb220 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c @@ -36,6 +36,7 @@ int eiger_photonenergy = 0; int eiger_dynamicrange = 0; int eiger_readoutmode = 0; int eiger_storeinmem = 0; +int eiger_overflow32 = 0; int eiger_readoutspeed = 0; int eiger_triggermode = 0; int eiger_extgating = 0; @@ -333,7 +334,9 @@ void setupDetector() { setTimer(FRAME_PERIOD, DEFAULT_PERIOD); setDynamicRange(DEFAULT_DYNAMIC_RANGE); eiger_photonenergy = DEFAULT_PHOTON_ENERGY; - setReadOutFlags(DEFAULT_READOUT_FLAG); + setReadOutFlags(DEFAULT_READOUT_MODE); + setReadOutFlags(DEFAULT_READOUT_STOREINRAM_MODE); + setReadOutFlags(DEFAULT_READOUT_OVERFLOW32_MODE); setSpeed(CLOCK_DIVIDER, DEFAULT_CLK_SPEED);//clk_devider,half speed setIODelay(DEFAULT_IO_DELAY, DEFAULT_MOD_INDEX); setTiming(DEFAULT_TIMING_MODE); @@ -430,7 +433,24 @@ enum readOutFlags setReadOutFlags(enum readOutFlags val){ eiger_readoutmode = val; else return -1; - }else{ + } + + else if (val&0xF00000) { + switch(val){ + case SHOW_OVERFLOW: val=1; printf(" Setting Read out Flag: Overflow in 32 bit mode\n"); break; + case NOOVERFLOW: val=0; printf(" Setting Read out Flag: No overflow in 32 bit mode\n"); break; + default: + cprintf(RED,"Cannot set unknown readout flag. 0x%x\n", val); + return -1; + } + printf(" Setting Read out Flag: %d\n",val); + if(Beb_Set32bitOverflow(val) != -1) + eiger_overflow32 = val; + else return -1; + } + + + else{ switch(val){ case STORE_IN_RAM: val=1; printf(" Setting Read out Flag: Store in Ram\n"); break; case CONTINOUS_RO: val=0; printf(" Setting Read out Flag: Continuous Readout\n"); break; @@ -451,10 +471,19 @@ enum readOutFlags setReadOutFlags(enum readOutFlags val){ case E_SAFE: retval=SAFE; break; } + switch(eiger_overflow32){ + case 1: retval|=SHOW_OVERFLOW; break; + case 0: retval|=NOOVERFLOW; break; + } + + switch(eiger_storeinmem){ case 0: retval|=CONTINOUS_RO; break; case 1: retval|=STORE_IN_RAM; break; } + + + printf("Read out Flag: 0x%x\n",retval); return retval; } diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h index 8493a6f50..dfc9befc1 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h @@ -76,7 +76,10 @@ enum NETWORKINDEX {TXN_LEFT, TXN_RIGHT, TXN_FRAME,FLOWCTRL_10G}; #define DEFAULT_SUBFRAME_EXPOSURE (2621440) // 2.6ms #define DEFAULT_SUBFRAME_PERIOD (0) #define DEFAULT_DYNAMIC_RANGE (16) -#define DEFAULT_READOUT_FLAG (NONPARALLEL) + +#define DEFAULT_READOUT_MODE (NONPARALLEL) +#define DEFAULT_READOUT_STOREINRAM_MODE (CONTINOUS_RO) +#define DEFAULT_READOUT_OVERFLOW32_MODE (NOOVERFLOW) #define DEFAULT_CLK_SPEED (HALF_SPEED) #define DEFAULT_IO_DELAY (650) #define DEFAULT_TIMING_MODE (AUTO_TIMING) diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 0b20090f5..5d70029a6 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -5440,17 +5440,7 @@ int slsDetector::sendROI(int n,ROI roiLimits[]){ -/* -enum readOutFlags { -NORMAL_READOUT, -setReadOutFlags(STORE_IN_RAM, -READ_HITS, -ZERO_COMPRESSION, -BACKGROUND_CORRECTION -}{}; - -*/ int slsDetector::setReadOutFlags(readOutFlags flag){ diff --git a/slsDetectorSoftware/slsDetector/slsDetectorBase.h b/slsDetectorSoftware/slsDetector/slsDetectorBase.h index cbf613149..c2c47af43 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorBase.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorBase.h @@ -407,6 +407,15 @@ class slsDetectorBase : public virtual slsDetectorDefs, public virtual errorDef } \ }; + void setOverflowMode(int value){ \ + if(value>=0){ \ + switch(value){ \ + case 1: setReadOutFlags(SHOW_OVERFLOW);break; \ + case 0: setReadOutFlags(NOOVERFLOW);break; \ + } \ + } \ + }; + /** get readout mode of detector (eiger specific) \returns 0 for nonparallel, 1 for parallel, 2 for safe @@ -417,6 +426,18 @@ class slsDetectorBase : public virtual slsDetectorDefs, public virtual errorDef if (ret&PARALLEL) return 1; \ if (ret&SAFE) return 2; \ return -1; \ + } + + + /** + get readout overflow mode of detector (eiger specific) + \returns 1 for show overflow, 0 for do not show overflow + */ + int getOverflowMode(){ \ + int ret = setReadOutFlags(); \ + if (ret&SHOW_OVERFLOW) return 1; \ + if (ret&NOOVERFLOW) return 0; \ + return -1; \ } \ /** diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 3d12a864e..d925a5eae 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -414,7 +414,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page config - - flags [flag] sets/gets the readout flags to mode. Options: none, storeinram, tot, continous, parallel, nonparallel, safe, digital, analog_digital, unknown. Used for MYTHEN and EIGER only. \c Returns \c (string). put takes one string and \c returns concatenation of all active flags separated by spaces. + - flags [flag] sets/gets the readout flags to mode. Options: none, storeinram, tot, continous, parallel, nonparallel, safe, digital, analog_digital, overflow, nooverflow, unknown. Used for MYTHEN and EIGER only. \c Returns \c (string). put takes one string and \c returns concatenation of all active flags separated by spaces. */ descrToFuncMap[i].m_pFuncName="flags"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; @@ -6016,6 +6016,10 @@ string slsDetectorCommand::cmdAdvanced(int narg, char *args[], int action) { flag=DIGITAL_ONLY; else if (sval=="analog_digital") flag=ANALOG_AND_DIGITAL; + else if (sval=="overflow") + flag=SHOW_OVERFLOW; + else if (sval=="nooverflow") + flag=NOOVERFLOW; else return string("could not scan flag ")+string(args[1]); } @@ -6044,6 +6048,10 @@ string slsDetectorCommand::cmdAdvanced(int narg, char *args[], int action) { strcat(answer,"digital " ); if (retval & ANALOG_AND_DIGITAL) strcat(answer,"analog_digital "); + if (retval & SHOW_OVERFLOW) + strcat(answer,"overflow "); + if (retval & NOOVERFLOW) + strcat(answer,"nooverflow "); if(strlen(answer)) return string(answer); @@ -6148,7 +6156,7 @@ string slsDetectorCommand::helpAdvanced(int narg, char *args[], int action) { if (action==PUT_ACTION || action==HELP_ACTION) { os << "extsig:i mode \t sets the mode of the external signal i. can be \n \t \t \t off, \n \t \t \t gate_in_active_high, \n \t \t \t gate_in_active_low, \n \t \t \t trigger_in_rising_edge, \n \t \t \t trigger_in_falling_edge, \n \t \t \t ro_trigger_in_rising_edge, \n \t \t \t ro_trigger_in_falling_edge, \n \t \t \t gate_out_active_high, \n \t \t \t gate_out_active_low, \n \t \t \t trigger_out_rising_edge, \n \t \t \t trigger_out_falling_edge, \n \t \t \t ro_trigger_out_rising_edge, \n \t \t \t ro_trigger_out_falling_edge" << std::endl; - os << "flags mode \t sets the readout flags to mode. can be none, storeinram, tot, continous, parallel, nonparallel, safe, digital, analog_digital, unknown" << std::endl; + os << "flags mode \t sets the readout flags to mode. can be none, storeinram, tot, continous, parallel, nonparallel, safe, digital, analog_digital, overlow, nooverflow, unknown." << std::endl; os << "programfpga f \t programs the fpga with file f (with .pof extension)." << std::endl; os << "resetfpga f \t resets fpga, f can be any value" << std::endl; @@ -6161,9 +6169,8 @@ string slsDetectorCommand::helpAdvanced(int narg, char *args[], int action) { os << "extsig:i \t gets the mode of the external signal i. can be \n \t \t \t off, \n \t \t \t gate_in_active_high, \n \t \t \t gate_in_active_low, \n \t \t \t trigger_in_rising_edge, \n \t \t \t trigger_in_falling_edge, \n \t \t \t ro_trigger_in_rising_edge, \n \t \t \t ro_trigger_in_falling_edge, \n \t \t \t gate_out_active_high, \n \t \t \t gate_out_active_low, \n \t \t \t trigger_out_rising_edge, \n \t \t \t trigger_out_falling_edge, \n \t \t \t ro_trigger_out_rising_edge, \n \t \t \t ro_trigger_out_falling_edge" << std::endl; - os << "flags \t gets the readout flags. can be none, storeinram, tot, continous, parallel, nonparallel, safe, digital, analog_digital, unknown" << std::endl; + os << "flags \t gets the readout flags. can be none, storeinram, tot, continous, parallel, nonparallel, safe, digital, analog_digital, overflow, nooverflow, unknown" << std::endl; os << "led \t returns led status (0 off, 1 on)" << std::endl; - os << "flags \t gets the readout flags. can be none, storeinram, tot, continous, parallel, nonparallel, safe, unknown" << std::endl; os << "powerchip \t gets if the chip has been powered on or off" << std::endl; os << "auto_comp_disable \t Currently not implemented. gets if the automatic comparator diable mode is enabled/disabled" << std::endl; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp index 66757b484..6e3f58e42 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp @@ -343,6 +343,12 @@ int slsDetectorUsers::setParallelMode(int value) { return myDetector->getParallelMode(); } +int slsDetectorUsers::setOverflowMode(int value) { + if(value >= 0) + myDetector->setOverflowMode(value); + return myDetector->getOverflowMode(); +} + int slsDetectorUsers::setAllTrimbits(int val, int id) { return myDetector->setAllTrimbits(val, id); } diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h index 6a5693f6b..bf1e980c9 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h @@ -612,6 +612,13 @@ class slsDetectorUsers */ int setParallelMode(int value); + /** + * @short show saturated for overflow in subframes in 32 bit mode (eiger only) + * \param value 0 for do not show saturatd, 1 for show saturated (-1 gets) + * \returns overflow mode enable in 32 bit mode + */ + int setOverflowMode(int value); + /** @short sets all trimbits to value (only available for eiger) \param val value to be set (-1 gets) diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index c716b3fac..cf91185a5 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -3102,6 +3102,8 @@ int set_readout_flags(int file_des) { case PARALLEL: case NONPARALLEL: case SAFE: + case SHOW_OVERFLOW: + case NOOVERFLOW: #endif retval=setReadOutFlags(arg); break;