From 1edcdff9361093aee40478174b2e6f39cbf22a44 Mon Sep 17 00:00:00 2001 From: Anna Bergamaschi Date: Tue, 31 Mar 2015 13:54:59 +0200 Subject: [PATCH] Updates for JCTB: adcvpp, save parameters. jungfrauDetectorServer works with JMCBv0.1 --- .../commonFiles/sls_detector_defs.h | 3 +- .../jungfrauDetectorServer/Makefile | 2 +- .../jungfrauDetectorServer/firmware_funcs.c | 232 +++++++++++------- .../jungfrauDetectorServer/firmware_funcs.h | 5 +- .../jungfrauDetectorServer/mcb_funcs.c | 6 +- .../jungfrauDetectorServer/server_funcs.c | 75 ++++-- .../jungfrauDetectorServer/trimming_funcs.c | 10 +- .../slsDetector/slsDetectorCommand.cpp | 68 ++++- .../slsDetector/slsDetectorUtils.cpp | 180 +++++++------- 9 files changed, 362 insertions(+), 219 deletions(-) diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index 649436162..dd5e0cd0b 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -341,7 +341,8 @@ enum dacIndex { E_Vcp, /**< eiger */ E_Vcn, /**< eiger */ E_Vis, /**< eiger */ - IO_DELAY /**< eiger io delay */ + IO_DELAY, /**< eiger io delay */ + ADC_VPP /**< adc vpp for jctb */ }; /** diff --git a/slsDetectorSoftware/jungfrauDetectorServer/Makefile b/slsDetectorSoftware/jungfrauDetectorServer/Makefile index 928dae653..6333c7b88 100755 --- a/slsDetectorSoftware/jungfrauDetectorServer/Makefile +++ b/slsDetectorSoftware/jungfrauDetectorServer/Makefile @@ -6,7 +6,7 @@ CROSS = bfin-uclinux- CC = $(CROSS)gcc -CFLAGS += -Wall -DMOENCHD -DMCB_FUNCS -DDACS_INT -DDEBUG #-DVERBOSE #-DVERYVERBOSE #-DVIRTUAL #-DDACS_INT_CSERVER +CFLAGS += -Wall -DMOENCHD -DMCB_FUNCS -DDACS_INT -DDEBUG -DV1#-DVERBOSE #-DVERYVERBOSE #-DVIRTUAL #-DDACS_INT_CSERVER PROGS= jungfrauDetectorServer diff --git a/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c b/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c index 60fdc0554..592b99291 100755 --- a/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c +++ b/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c @@ -1,7 +1,7 @@ //#define TESTADC #define TESTADC1 - +//#define TIMEDBG #include "server_defs.h" #include "firmware_funcs.h" #include "mcb_funcs.h" @@ -20,6 +20,10 @@ #include #include +#include + +struct timeval tss,tse,tsss; //for timing + //for memory mapping u_int64_t CSP0BASE; @@ -375,7 +379,7 @@ u_int32_t setPllReconfigReg(u_int32_t reg, u_int32_t val, int trig) { - printf("*********** pll busy: %08x\n",bus_r(STATUS_REG)&PLL_RECONFIG_BUSY); + // printf("*********** pll busy: %08x\n",bus_r(STATUS_REG)&PLL_RECONFIG_BUSY); bus_w(PLL_PARAM_REG,val); // printf("param: %x\n",val); @@ -396,7 +400,7 @@ u_int32_t setPllReconfigReg(u_int32_t reg, u_int32_t val, int trig) { // printf("wrote: %08x\n",vv); bus_w(PLL_CNTRL_REG,vv); usleep(10000); - printf("+++++++++ pll busy: %08x\n",bus_r(STATUS_REG)&PLL_RECONFIG_BUSY); + // printf("+++++++++ pll busy: %08x\n",bus_r(STATUS_REG)&PLL_RECONFIG_BUSY); // bus_w(PLL_CNTRL_REG,(1<0) { + val= (2<<18)| (odd<<17) | l | (h<<8); + + printf("Counter %d, val: %08x\n", i, val); + setPllReconfigReg(PLL_C_COUNTER_REG, val,0); + + } } else { // if (mode==1) { // } else { - printf("phase in %d\n",clkPhase[0]); + printf("phase in %d\n",clkPhase[1]); - if (clkPhase[0]>0) { + if (clkPhase[1]>0) { inv=0; - phase=clkPhase[0]; + phase=clkPhase[1]; } else { inv=1; - phase=-1*clkPhase[0]; + phase=-1*clkPhase[1]; } printf("phase out %d %08x\n",phase,phase); - val=phase | (inv<<16);;// | (inv<<21); + if (inv) { + val=phase | (1<<16);// | (inv<<21); + printf("**************** phase word %08x\n",val); - printf("Phase, val: %08x\n", val); setPllReconfigReg(PLL_PHASE_SHIFT_REG,val,0); //shifts counter 0 + // printf("Phase, val: %08x\n", val); + setPllReconfigReg(PLL_PHASE_SHIFT_REG,val,0); //shifts counter 0 + } else { + + + val=phase ;// | (inv<<21); + printf("**************** phase word %08x\n",val); + + // printf("Phase, val: %08x\n", val); + setPllReconfigReg(PLL_PHASE_SHIFT_REG,val,0); //shifts counter 0 + val=phase | (2<<16);// | (inv<<21); + printf("Start reconfig\n"); setPllReconfigReg(PLL_START_REG, 1,0); + + // bus_w(PLL_CNTRL_REG, 0); + printf("Status register\n"); getPllReconfigReg(PLL_STATUS_REG,0); + // sleep(1); + + printf("**************** phase word %08x\n",val); + + // printf("Phase, val: %08x\n", val); + setPllReconfigReg(PLL_PHASE_SHIFT_REG,val,0); //shifts counter 0 + } - } + } printf("Start reconfig\n"); setPllReconfigReg(PLL_START_REG, 1,0); @@ -521,14 +557,14 @@ void configurePll(int i) { // printf("PLL mode\n"); setPllReconfigReg(PLL_MODE_REG,0,0); usleep(10000); -/* if (mode!=1) { */ - /* printf("reset pll\n"); */ -/* bus_w(PLL_CNTRL_REG,((1<0) */ -/* ic=1; */ -/* else { */ -/* ic=0; */ -/* st*=-1; */ -/* } */ +int phaseStep(int st){ int i; - if (st>65535 || st<-65535) - return -1; + if (st>65535 || st<-65535) + return clkPhase[0]; + + printf("phase %d\n", st); + + clkPhase[1]=st-clkPhase[0]; - printf("ic=%d; phase %d\n", ic, st); - - if (ic==1) - clkPhase[0]=-st; - else if (ic==0) - clkPhase[0]=st; - - - - /* printf("Changin phase %d\n",st); */ -/* for (i=0; i>(23-i))&0x1)<2500) - val=-1; + if (ind<16) { + + if (mV) { + if (val>2500) + val=-1; printf("%d mV is ",val); if (val>0) - val=16535*val/2500; + val=4095*val/2500; printf("%d DACu\n", val); - } else if (val>16535) - val=-1; - - + } else if (val>4095) + val=-1; + + retval=setDac(ind,val); -/* if(idac==HIGH_VOLTAGE) */ -/* retval=initHighVoltageByModule(val,imod); */ -/* else */ -/* retval=initDACbyIndexDACU(idac,val,imod); */ + /* if(idac==HIGH_VOLTAGE) */ + /* retval=initHighVoltageByModule(val,imod); */ + /* else */ + /* retval=initDACbyIndexDACU(idac,val,imod); */ + } + else if (ind==ADC_VPP) { + printf("Setting ADC VPP to %d\n",val); + if (val>4 || val<0) + printf("Cannot set ADC VPP to %d\n",val); + else { + writeADC(0x18,val); + adcvpp=val; + } + retval=adcvpp;; + + } } } if(ret==OK){ @@ -1024,8 +1040,8 @@ int set_dac(int file_des) { /* ret=OK; */ /* }//since v r saving only msb */ /* else if ((retval-val)<=3 || val==-1) */ -/* ret=OK; */ - +/* ret=OK; */ + if (ind<16) { if (mV) { printf("%d DACu is ",retval); @@ -1039,7 +1055,7 @@ int set_dac(int file_des) { #ifdef VERBOSE printf("DAC set to %d V\n", retval); #endif - + } if(ret==FAIL) printf("Setting dac %d of module %d: wrote %d but read %d\n", ind, imod, val, retval); else{ @@ -2361,7 +2377,17 @@ int set_speed(int file_des) { if (ret==OK) { + if (arg==PHASE_SHIFT || arg==ADC_PHASE) { + + + retval=phaseStep(val); + + } else { + + if (val!=-1) { + + if (differentClients==1 && lockStatus==1 && val>=0) { ret=FAIL; sprintf(mess,"Detector locked by %s\n",lastClientIP); @@ -2371,9 +2397,9 @@ int set_speed(int file_des) { retval=setClockDivider(val,0); break; - case PHASE_SHIFT: - retval=phaseStep(val,0); - break; +/* case PHASE_SHIFT: */ +/* retval=phaseStep(val,0); */ +/* break; */ case OVERSAMPLING: retval=setOversampling(val); @@ -2383,9 +2409,9 @@ int set_speed(int file_des) { retval=setClockDivider(val,1); break; - case ADC_PHASE: - retval=phaseStep(val,1); - break; +/* case ADC_PHASE: */ +/* retval=phaseStep(val,1); */ +/* break; */ case ADC_PIPELINE: @@ -2402,16 +2428,19 @@ int set_speed(int file_des) { } + } + + switch (arg) { case CLOCK_DIVIDER: retval=getClockDivider(0); break; case PHASE_SHIFT: + retval=getPhase(); // retval=phaseStep(-1); //ret=FAIL; //sprintf(mess,"Cannot read phase",arg); - retval=-1; break; case OVERSAMPLING: @@ -2423,7 +2452,7 @@ int set_speed(int file_des) { break; case ADC_PHASE: - retval=-1; + retval=getPhase(); break; diff --git a/slsDetectorSoftware/jungfrauDetectorServer/trimming_funcs.c b/slsDetectorSoftware/jungfrauDetectorServer/trimming_funcs.c index 9a28b9b4a..23762b25e 100755 --- a/slsDetectorSoftware/jungfrauDetectorServer/trimming_funcs.c +++ b/slsDetectorSoftware/jungfrauDetectorServer/trimming_funcs.c @@ -236,7 +236,7 @@ int choose_vthresh_and_vtrim(int countlim, int nsigma, int im) { while (runBusy()) { } usleep(500); - fifodata=fifo_read_event(); + fifodata=fifo_read_event(0); scan=decode_data(fifodata); for (imod=modmi; imodsetOnline(ONLINE_FLAG); @@ -4335,6 +4354,9 @@ string slsDetectorCommand::helpPattern(int narg, char *args[], int action) { os << "patwaittime0 nclk \t sets wait 0 waiting time in clock number " << std::endl; os << "patwaittime1 nclk \t sets wait 1 waiting time in clock number " << std::endl; os << "patwaittime2 nclk \t sets wait 2 waiting time in clock number " << std::endl; + os << "adcinvert mask\t sets the adcinversion mask (hex)" << std::endl; + os << "adcdisable mask\t sets the adcdisable mask (hex)" << std::endl; + } if (action==GET_ACTION || action==HELP_ACTION){ os << "pattern \t cannot get" << std::endl; @@ -4354,6 +4376,9 @@ string slsDetectorCommand::helpPattern(int narg, char *args[], int action) { os << "patwaittime0 \t returns the wait 0 waiting time in clock number " << std::endl; os << "patwaittime1 \t returns the wait 1 waiting time in clock number " << std::endl; os << "patwaittime2 \t returns the wait 2 waiting time in clock number " << std::endl; + os << "adcinvert \t returns the adcinversion mask " << std::endl; + + os << "adcdisable \t returns the adcdisable mask " << std::endl; } return os.str(); @@ -4757,7 +4782,42 @@ string slsDetectorCommand::cmdPattern(int narg, char *args[], int action) { os << myDet->setCTBPatWaitTime(2,-1); + } else if (cmd=="adcinvert") { + if (action==PUT_ACTION) { + + if (sscanf(args[1],"%x",&addr)) + ; + else + return string("Could not scan adcinvert reg ")+string(args[1]); + + + myDet->writeRegister(67,addr); + } + + + + os << hex << myDet->readRegister(67) << dec; + + } else if (cmd=="adcdisable") { + if (action==PUT_ACTION) { + + if (sscanf(args[1],"%x",&addr)) + ; + else + return string("Could not scan adcdisable reg ")+string(args[1]); + + + myDet->writeRegister(94,addr); + } + + + + os << hex << myDet->readRegister(94) << dec; + } + + + else return helpPattern(narg, args, action); diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp index ab39eaecc..8acfbb8e1 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp @@ -786,118 +786,122 @@ int slsDetectorUtils::dumpDetectorSetup(string const fname, int level){ slsDetectorCommand *cmd; string names[100]; int nvar=0; + int nvar1=0; + + names[nvar++]="fname"; + names[nvar++]="index"; + names[nvar++]="dr"; + names[nvar++]="settings"; + names[nvar++]="exptime"; + names[nvar++]="period"; + names[nvar++]="frames"; + names[nvar++]="cycles"; + names[nvar++]="measurements"; + names[nvar++]="timing"; switch (getDetectorsType()) { case EIGER: - names[nvar++]="fname"; - names[nvar++]="index"; - names[nvar++]="flags"; - names[nvar++]="dr"; - names[nvar++]="settings"; + names[nvar++]="flags"; names[nvar++]="threshold"; - names[nvar++]="exptime"; - names[nvar++]="period"; - names[nvar++]="frames"; - names[nvar++]="cycles"; - names[nvar++]="timing"; - names[nvar++]="fineoff"; - names[nvar++]="startscript"; - names[nvar++]="startscriptpar"; - names[nvar++]="stopscript"; - names[nvar++]="stopscriptpar"; - names[nvar++]="scriptbefore"; - names[nvar++]="scriptbeforepar"; - names[nvar++]="scriptafter"; - names[nvar++]="scriptafterpar"; - names[nvar++]="scan0script"; - names[nvar++]="scan0par"; - names[nvar++]="scan0prec"; - names[nvar++]="scan0steps"; - names[nvar++]="scan1script"; - names[nvar++]="scan1par"; - names[nvar++]="scan1prec"; - names[nvar++]="scan1steps"; names[nvar++]="ratecorr"; - names[nvar++]="flatfield"; - names[nvar++]="badchannels"; break; case GOTTHARD: - names[nvar++]="fname"; - names[nvar++]="index"; - names[nvar++]="flags"; - names[nvar++]="dr"; - names[nvar++]="settings"; - names[nvar++]="exptime"; - names[nvar++]="period"; + names[nvar++]="flags"; names[nvar++]="delay"; names[nvar++]="gates"; - names[nvar++]="frames"; - names[nvar++]="cycles"; - names[nvar++]="timing"; - names[nvar++]="fineoff"; - names[nvar++]="startscript"; - names[nvar++]="startscriptpar"; - names[nvar++]="stopscript"; - names[nvar++]="stopscriptpar"; - names[nvar++]="scriptbefore"; - names[nvar++]="scriptbeforepar"; - names[nvar++]="scriptafter"; - names[nvar++]="scriptafterpar"; - names[nvar++]="scan0script"; - names[nvar++]="scan0par"; - names[nvar++]="scan0prec"; - names[nvar++]="scan0steps"; - names[nvar++]="scan1script"; - names[nvar++]="scan1par"; - names[nvar++]="scan1prec"; - names[nvar++]="scan1steps"; names[nvar++]="ratecorr"; - names[nvar++]="flatfield"; - names[nvar++]="badchannels"; break; case MYTHEN: - names[nvar++]="fname"; - names[nvar++]="index"; - names[nvar++]="flags"; - names[nvar++]="dr"; - names[nvar++]="settings"; + names[nvar++]="flags"; names[nvar++]="threshold"; - names[nvar++]="exptime"; - names[nvar++]="period"; names[nvar++]="delay"; names[nvar++]="gates"; - names[nvar++]="frames"; - names[nvar++]="cycles"; names[nvar++]="probes"; - names[nvar++]="timing"; names[nvar++]="fineoff"; - names[nvar++]="startscript"; - names[nvar++]="startscriptpar"; - names[nvar++]="stopscript"; - names[nvar++]="stopscriptpar"; - names[nvar++]="scriptbefore"; - names[nvar++]="scriptbeforepar"; - names[nvar++]="scriptafter"; - names[nvar++]="scriptafterpar"; - names[nvar++]="scan0script"; - names[nvar++]="scan0par"; - names[nvar++]="scan0prec"; - names[nvar++]="scan0steps"; - names[nvar++]="scan1script"; - names[nvar++]="scan1par"; - names[nvar++]="scan1prec"; - names[nvar++]="scan1steps"; names[nvar++]="ratecorr"; - names[nvar++]="flatfield"; - names[nvar++]="badchannels"; names[nvar++]="trimbits"; break; + case JUNGFRAUCTB: + names[nvar++]="dac:0"; + names[nvar++]="dac:1"; + names[nvar++]="dac:2"; + names[nvar++]="dac:3"; + names[nvar++]="dac:4"; + names[nvar++]="dac:5"; + names[nvar++]="dac:6"; + names[nvar++]="dac:7"; + names[nvar++]="dac:8"; + names[nvar++]="dac:9"; + names[nvar++]="dac:10"; + names[nvar++]="dac:11"; + names[nvar++]="dac:12"; + names[nvar++]="dac:13"; + names[nvar++]="dac:14"; + names[nvar++]="dac:15"; + names[nvar++]="adcvpp"; + + + + names[nvar++]="adcclk"; + names[nvar++]="clkdivider"; + names[nvar++]="adcphase"; + names[nvar++]="adcpipeline"; + names[nvar++]="adcinvert"; // + names[nvar++]="adcdisable"; + names[nvar++]="patioctrl"; + names[nvar++]="patclkctrl"; + names[nvar++]="patlimits"; + names[nvar++]="patloop0"; + names[nvar++]="patnloop0"; + names[nvar++]="patwait0"; + names[nvar++]="patwaittime0"; + names[nvar++]="patloop1"; + names[nvar++]="patnloop1"; + names[nvar++]="patwait1"; + names[nvar++]="patwaittime1"; + names[nvar++]="patloop2"; + names[nvar++]="patnloop2"; + names[nvar++]="patwait2"; + names[nvar++]="patwaittime2"; } + names[nvar++]="startscript"; + names[nvar++]="startscriptpar"; + names[nvar++]="stopscript"; + names[nvar++]="stopscriptpar"; + names[nvar++]="scriptbefore"; + names[nvar++]="scriptbeforepar"; + names[nvar++]="scriptafter"; + names[nvar++]="scriptafterpar"; + names[nvar++]="scan0script"; + names[nvar++]="scan0par"; + names[nvar++]="scan0prec"; + names[nvar++]="scan0steps"; + names[nvar++]="scan1script"; + names[nvar++]="scan1par"; + names[nvar++]="scan1prec"; + names[nvar++]="scan1steps"; + switch (getDetectorsType()) { + case EIGER: + case MYTHEN: + case GOTTHARD: + names[nvar++]="flatfield"; + names[nvar++]="badchannels"; + break; + + } + + switch (getDetectorsType()) { + case EIGER: + case MYTHEN: + names[nvar++]="trimbits"; + break; + + } // char ext[100]; @@ -907,8 +911,8 @@ int slsDetectorUtils::dumpDetectorSetup(string const fname, int level){ ofstream outfile; - char *args[2]; - for (int ia=0; ia<2; ia++) { + char *args[4]; + for (int ia=0; ia<4; ia++) { args[ia]=new char[1000]; }