From af079f3168585f5e7bc561e05d7ace2f5c77e8d9 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 10 Aug 2017 14:49:02 +0200 Subject: [PATCH] posisibility to read adnd write registers in the front end board for eiger --- .../eigerDetectorServer/FebControl.c | 31 ++++++++++++++++++ .../eigerDetectorServer/FebControl.h | 2 ++ ....0.16.5 => eigerDetectorServerv3.0.0.16.6} | Bin 288605 -> 288747 bytes .../slsDetectorFunctionList.c | 7 ++++ .../slsDetector/slsDetectorCommand.cpp | 22 ++++++------- .../slsDetectorFunctionList.h | 3 ++ .../slsDetectorServer_funcs.c | 20 ----------- 7 files changed, 54 insertions(+), 31 deletions(-) rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerv3.0.0.16.5 => eigerDetectorServerv3.0.0.16.6} (62%) diff --git a/slsDetectorSoftware/eigerDetectorServer/FebControl.c b/slsDetectorSoftware/eigerDetectorServer/FebControl.c index ce68ef7ce..76028a105 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebControl.c +++ b/slsDetectorSoftware/eigerDetectorServer/FebControl.c @@ -1921,4 +1921,35 @@ int Feb_Control_GetRightFPGATemp(){ } +uint32_t Feb_Control_WriteRegister(uint32_t offset, uint32_t data) { + uint32_t value=0; + if(Module_TopAddressIsValid(&modules[1])){ + if(!Feb_Interface_WriteRegister(Module_GetTopRightAddress (&modules[1]),offset, data,0, 0)) { + cprintf(RED,"Could not read value. Value read:%d\n", value); + value = 0; + } + } else { + if(!Feb_Interface_WriteRegister(Module_GetBottomRightAddress (&modules[1]),offset, data,0, 0)) { + cprintf(RED,"Could not read value. Value read:%d\n", value); + value = 0; + } + } + return Feb_Control_ReadRegister(offset); +} + +uint32_t Feb_Control_ReadRegister(uint32_t offset) { + uint32_t value=0; + if(Module_TopAddressIsValid(&modules[1])){ + if(!Feb_Interface_ReadRegister(Module_GetTopRightAddress (&modules[1]),offset, &value)) { + cprintf(RED,"Could not read value. Value read:%d\n", value); + value = 0; + } + } else { + if(!Feb_Interface_ReadRegister(Module_GetBottomRightAddress (&modules[1]),offset, &value)) { + cprintf(RED,"Could not read value. Value read:%d\n", value); + value = 0; + } + } + return value; +} diff --git a/slsDetectorSoftware/eigerDetectorServer/FebControl.h b/slsDetectorSoftware/eigerDetectorServer/FebControl.h index fb75c8a67..892d6b22c 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebControl.h +++ b/slsDetectorSoftware/eigerDetectorServer/FebControl.h @@ -198,4 +198,6 @@ int Feb_Control_GetModuleNumber(); int Feb_Control_GetLeftFPGATemp(); int Feb_Control_GetRightFPGATemp(); + uint32_t Feb_Control_WriteRegister(uint32_t offset, uint32_t data); + uint32_t Feb_Control_ReadRegister(uint32_t offset); #endif diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.5 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.6 similarity index 62% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.5 rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.6 index 19f1ac075adc72fd9f06ee9893f600ccd3d98e7a..1d201568e1eb80d8f4e173f60f337dd8bab1be85 100755 GIT binary patch delta 40277 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 O2PbPLdbS4l*8Cq{X-5wL diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c index 2bfa2ae5e..9ab1467ab 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c @@ -342,7 +342,14 @@ void setupDetector() { +/* advanced read/write reg */ +uint32_t writeRegister(uint32_t offset, uint32_t data) { + return Feb_Control_WriteRegister(offset, data); +} +uint32_t readRegister(uint32_t offset) { + return Feb_Control_ReadRegister(offset); +} /* set parameters - nmod, dr, roi */ diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 12bb191fe..d33e5e4dd 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -3359,9 +3359,9 @@ string slsDetectorCommand::cmdDetectorSize(int narg, char *args[], int action) { return string("unknown detector size ")+cmd; if (cmd=="roimask") - sprintf(ans,"%x",ret); + sprintf(ans,"0x%x",ret); else - sprintf(ans,"%d",ret); + sprintf(ans,"0x%d",ret); return string(ans); @@ -3689,7 +3689,7 @@ string slsDetectorCommand::cmdDigiTest(int narg, char *args[], int action) { if (cmd=="bustest"){ if (action==PUT_ACTION) return string("cannot set ")+cmd; - sprintf(answer,"%x",myDet->digitalTest(DETECTOR_BUS_TEST)); + sprintf(answer,"0x%x",myDet->digitalTest(DETECTOR_BUS_TEST)); return string(answer); } @@ -3698,7 +3698,7 @@ string slsDetectorCommand::cmdDigiTest(int narg, char *args[], int action) { return string("cannot set ")+cmd; int ival=-1; if (sscanf(args[0],"digitest:%d",&ival)) { - sprintf(answer,"%x",myDet->digitalTest(CHIP_TEST, ival)); + sprintf(answer,"0x%x",myDet->digitalTest(CHIP_TEST, ival)); return string(answer); } else return string("undefined module number"); @@ -3710,7 +3710,7 @@ string slsDetectorCommand::cmdDigiTest(int narg, char *args[], int action) { int ival=-1; if (sscanf(args[1],"%d",&ival)) { if((ival==0)||(ival==1)){ - sprintf(answer,"%x",myDet->digitalTest(DIGITAL_BIT_TEST,ival)); + sprintf(answer,"0x%x",myDet->digitalTest(DIGITAL_BIT_TEST,ival)); return string(answer); } else @@ -3783,13 +3783,13 @@ string slsDetectorCommand::cmdRegister(int narg, char *args[], int action) { ; else return string("Could not scan value (hexadecimal fomat) ")+string(args[2]); - sprintf(answer,"%x",myDet->writeRegister(addr,val)); + sprintf(answer,"0x%x",myDet->writeRegister(addr,val)); } else if (cmd=="adcreg") { if (sscanf(args[2],"%x",&val)) ; else return string("Could not scan value (hexadecimal fomat) ")+string(args[2]); - sprintf(answer,"%x",myDet->writeAdcRegister(addr,val)); + sprintf(answer,"0x%x",myDet->writeAdcRegister(addr,val)); } else { if (sscanf(args[2],"%d",&n)) @@ -3801,9 +3801,9 @@ string slsDetectorCommand::cmdRegister(int narg, char *args[], int action) { return string("Bit number out of range")+string(args[2]); if (cmd=="setbit") - sprintf(answer,"%x",myDet->writeRegister(addr,myDet->readRegister(addr)| 1<writeRegister(addr,myDet->readRegister(addr)| 1<writeRegister(addr,myDet->readRegister(addr) & ~(1<writeRegister(addr,myDet->readRegister(addr) & ~(1<readRegister(addr)); + sprintf(answer,"0x%x",myDet->readRegister(addr)); } @@ -3861,7 +3861,7 @@ string slsDetectorCommand::helpRegister(int narg, char *args[], int action) { ostringstream os; if (action==PUT_ACTION || action==HELP_ACTION) { - os << "reg addr val \n writes the register addr with the value val"<< std::endl; + os << "reg addr val \n writes the register addr with the value val (hexadecimal format)"<< std::endl; } if (action==GET_ACTION || action==HELP_ACTION) { os << "reg addr \n reads the register addr"<< std::endl; diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h index 14a08a07d..145af32fa 100644 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h @@ -59,6 +59,9 @@ void setupDetector(); #ifndef EIGERD extern u_int32_t writeRegister(u_int32_t offset, u_int32_t data); // blackfin.h extern u_int32_t readRegister(u_int32_t offset); // blackfin.h +#else +uint32_t writeRegister(uint32_t offset, uint32_t data); +uint32_t readRegister(uint32_t offset); #endif diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index 8caad22fe..7e7ef4e65 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -1242,15 +1242,6 @@ int write_register(int file_des) { int retval=-1; sprintf(mess,"write to register failed\n"); -#ifdef EIGERD - //to receive any arguments - while (n > 0) - n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); - ret = FAIL; - sprintf(mess,"Function (Write Register) is not implemented for this detector\n"); - cprintf(RED, "Warning: %s", mess); -#else - // receive arguments int arg[2]={-1,-1}; n = receiveData(file_des,arg,sizeof(arg),INT32); @@ -1282,7 +1273,6 @@ int write_register(int file_des) { #endif if (ret==OK && differentClients) ret=FORCE_UPDATE; -#endif // ret could be swapped during sendData ret1 = ret; @@ -1310,15 +1300,6 @@ int read_register(int file_des) { int retval=-1; sprintf(mess,"read register failed\n"); -#ifdef EIGERD - //to receive any arguments - while (n > 0) - n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); - ret = FAIL; - sprintf(mess,"Function (Read Register) is not implemented for this detector\n"); - cprintf(RED, "Warning: %s", mess); -#else - // receive arguments int arg=0; n = receiveData(file_des,&arg,sizeof(arg),INT32); @@ -1337,7 +1318,6 @@ int read_register(int file_des) { #endif if (ret==OK && differentClients) ret=FORCE_UPDATE; -#endif // ret could be swapped during sendData ret1 = ret;