confirm if it is really moench detector;optimized code;option to start moench server with gotthard module

git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@530 951219d9-93cf-4727-9268-0efd64621fa3
This commit is contained in:
l_maliakal_d 2013-04-26 12:07:49 +00:00
parent 679a7dfd7e
commit f006d289a3
5 changed files with 120 additions and 140 deletions

View File

@ -50,6 +50,7 @@ int masterMode=NO_MASTER, syncMode=NO_SYNCHRONIZATION, timingMode=AUTO_TIMING;
enum externalSignalFlag signals[4]={EXT_SIG_OFF, EXT_SIG_OFF, EXT_SIG_OFF, EXT_SIG_OFF}; enum externalSignalFlag signals[4]={EXT_SIG_OFF, EXT_SIG_OFF, EXT_SIG_OFF, EXT_SIG_OFF};
int withGotthard = 0;
#ifdef MCB_FUNCS #ifdef MCB_FUNCS
extern const int nChans; extern const int nChans;
@ -177,6 +178,7 @@ int mapCSP0(void) {
address = FIFO_DATA_REG_OFF; address = FIFO_DATA_REG_OFF;
values=(u_int16_t*)(CSP0BASE+address*2); values=(u_int16_t*)(CSP0BASE+address*2);
printf("statusreg=%08x\n",bus_r(STATUS_REG)); printf("statusreg=%08x\n",bus_r(STATUS_REG));
printf("\n\n");
return OK; return OK;
} }
@ -256,7 +258,7 @@ int setPhaseShiftOnce(){
int cleanFifo(){ int cleanFifo(){
u_int32_t addr, reg, val; u_int32_t addr, reg, val;
printf("\nCleaning FIFO\n"); printf("Cleaning FIFO\n");
addr=ADC_SYNC_REG; addr=ADC_SYNC_REG;
//88332214 //88332214
@ -295,7 +297,7 @@ int setDAQRegister()
//depended on pcb rev //depended on pcb rev
int tokenTiming = TOKEN_TIMING_REV2; int tokenTiming = TOKEN_TIMING_REV2;
if(bus_r(PCB_REV_REG)==1) if((bus_r(PCB_REV_REG)&BOARD_REVISION_MASK)==1)
tokenTiming= TOKEN_TIMING_REV1; tokenTiming= TOKEN_TIMING_REV1;
@ -763,7 +765,7 @@ u_int32_t getFirmwareSVNVersion(){
// for fpga test // for fpga test
u_int32_t testFpga(void) { u_int32_t testFpga(void) {
printf("Test FPGA:\n"); printf("Testing FPGA:\n");
volatile u_int32_t val,addr,val2; volatile u_int32_t val,addr,val2;
int result=OK,i; int result=OK,i;
//fixed pattern //fixed pattern
@ -812,8 +814,9 @@ u_int32_t testFpga(void) {
{ {
printf("----------------------------------------------------------------------------------------------"); printf("----------------------------------------------------------------------------------------------");
printf("\nATTEMPT 1000000: FPGA DUMMY REGISTER OK!!!\n"); printf("\nATTEMPT 1000000: FPGA DUMMY REGISTER OK!!!\n");
printf("----------------------------------------------------------------------------------------------\n"); printf("----------------------------------------------------------------------------------------------");
} }
printf("\n");
return result; return result;
} }
@ -825,7 +828,7 @@ u_int32_t testRAM(void) {
allocateRAM(); allocateRAM();
// while(i<100000) { // while(i<100000) {
memcpy(ram_values, values, dataBytes); memcpy(ram_values, values, dataBytes);
printf ("Test RAM:\t%d: copied fifo %x to memory %x size %d\n",i++, (unsigned int)(values), (unsigned int)(ram_values), dataBytes); printf ("Testing RAM:\t%d: copied fifo %x to memory %x size %d\n",i++, (unsigned int)(values), (unsigned int)(ram_values), dataBytes);
// } // }
return result; return result;
} }
@ -1192,7 +1195,7 @@ int initConfGain(int isettings,int val,int imod){
int setADC(int adc){ int setADC(int adc){
int reg,nchips,mask; int reg,nchips,mask,nchans;
if(adc==-1) ROI_flag=0; if(adc==-1) ROI_flag=0;
else ROI_flag=1; else ROI_flag=1;
@ -1200,33 +1203,46 @@ int setADC(int adc){
setDAQRegister();//token timing setDAQRegister();//token timing
cleanFifo();//adc sync cleanFifo();//adc sync
//all adc //with gotthard module
if(adc==-1){ if(withGotthard){
//set packet size //set packet size
ipPacketSize= DEFAULT_IP_PACKETSIZE; ipPacketSize= DEFAULT_IP_PACKETSIZE;
udpPacketSize=DEFAULT_UDP_PACKETSIZE; udpPacketSize=DEFAULT_UDP_PACKETSIZE;
//set channel mask //set channel mask
nchips = GOTTHARDNCHIP; nchips = GOTTHARDNCHIP;
nchans = GOTTHARDNCHAN;
mask = ACTIVE_ADC_MASK; mask = ACTIVE_ADC_MASK;
} }
//1 adc
//with moench module all adc
else{/* if(adc==-1){*/
//set packet size
ipPacketSize= DEFAULT_IP_PACKETSIZE;
udpPacketSize=DEFAULT_UDP_PACKETSIZE;
//set channel mask
nchips = NCHIP;
nchans = NCHANS;
mask = ACTIVE_ADC_MASK;
}/*
//with moench module 1 adc -- NOT IMPLEMENTED
else{ else{
ipPacketSize= ADC1_IP_PACKETSIZE; ipPacketSize= ADC1_IP_PACKETSIZE;
udpPacketSize=ADC1_UDP_PACKETSIZE; udpPacketSize=ADC1_UDP_PACKETSIZE;
//set channel mask //set channel mask
nchips = NCHIPS_PER_ADC; nchips = NCHIPS_PER_ADC;
nchans = GOTTHARDNCHAN;
mask = 1<<adc; mask = 1<<adc;
} }*/
//set channel mask //set channel mask
reg = (GOTTHARDNCHAN*nchips)<<CHANNEL_OFFSET; reg = (nchans*nchips)<<CHANNEL_OFFSET;
reg&=CHANNEL_MASK; reg&=CHANNEL_MASK;
reg|=(ACTIVE_ADC_MASK & mask); reg|=(ACTIVE_ADC_MASK & mask);
bus_w(CHIP_OF_INTRST_REG,reg); bus_w(CHIP_OF_INTRST_REG,reg);
#ifdef DDEBUG //#ifdef DDEBUG
printf("Chip of Intrst Reg:%x\n",bus_r(CHIP_OF_INTRST_REG)); printf("Chip of Interest Reg:%x\n",bus_r(CHIP_OF_INTRST_REG));
#endif //#endif
adcConfigured = adc; adcConfigured = adc;
@ -1458,22 +1474,15 @@ u_int32_t runState(void) {
int startStateMachine(){ int startStateMachine(){
//#ifdef VERBOSE //#ifdef VERBOSE
printf("*******Starting State Machine***************\n"); printf("*******Starting State Machine*******\n");
//#endif //#endif
cleanFifo(); cleanFifo();
// fifoReset(); printf("Starting State Machine\n"); // fifoReset();
now_ptr=(char*)ram_values; now_ptr=(char*)ram_values;
#ifdef SHAREDMEMORY #ifdef SHAREDMEMORY
write_stop_sm(0); write_stop_sm(0);
write_status_sm("Started"); write_status_sm("Started");
#endif #endif
/*
#ifdef MCB_FUNCS
setCSregister(ALLMOD);
clearSSregister(ALLMOD);
#endif
*/
//putout("0000000000000000",ALLMOD);
bus_w16(CONTROL_REG, START_ACQ_BIT | START_EXPOSURE_BIT); bus_w16(CONTROL_REG, START_ACQ_BIT | START_EXPOSURE_BIT);
bus_w16(CONTROL_REG, 0x0); bus_w16(CONTROL_REG, 0x0);
printf("statusreg=%08x\n",bus_r(STATUS_REG)); printf("statusreg=%08x\n",bus_r(STATUS_REG));
@ -1485,9 +1494,9 @@ int startStateMachine(){
int stopStateMachine(){ int stopStateMachine(){
#ifdef VERBOSE //#ifdef VERBOSE
printf("Stopping State Machine\n"); printf("*******Stopping State Machine*******\n");
#endif //#endif
#ifdef SHAREDMEMORY #ifdef SHAREDMEMORY
write_stop_sm(1); write_stop_sm(1);
write_status_sm("Stopped"); write_status_sm("Stopped");
@ -1691,39 +1700,6 @@ u_int32_t* decode_data(int *datain)
int setDynamicRange(int dr) { int setDynamicRange(int dr) {
/*
int ow;
int nm;
u_int32_t np=getProbes();
#ifdef VERYVERBOSE
printf("probes==%02x\n",np);
#endif
if (dr>0) {
nm=setNMod(-1);
if (dr==1) {
dynamicRange=1;
ow=5;
} else if (dr<=4) {
dynamicRange=4;
ow=4;
} else if (dr<=8) {
dynamicRange=8;
ow=3;
} else if (dr<=16) {
dynamicRange=16;
ow=2;
} else {
dynamicRange=32;
ow=0; //or 1?
}
setCSregister(ALLMOD);
initChipWithProbes(0, ow,np, ALLMOD);
putout("0000000000000000",ALLMOD);
setNMod(nm);
}
*/
return getDynamicRange(); return getDynamicRange();
} }
@ -1733,46 +1709,6 @@ int setDynamicRange(int dr) {
int getDynamicRange() { int getDynamicRange() {
/*
int dr;
u_int32_t shiftin=bus_r(GET_SHIFT_IN_REG);
u_int32_t outmux=(shiftin >> OUTMUX_OFF) & OUTMUX_MASK;
u_int32_t probes=(shiftin >> PROBES_OFF) & PROBES_MASK;
#ifdef VERYVERBOSE
printf("%08x ",shiftin);
printf("outmux=%02x probes=%d\n",outmux,probes);
#endif
switch (outmux) {
case 2:
dr=16;
break;
case 4:
dr=8;
break;
case 8:
dr=4;
break;
case 16:
dr=1;
break;
default:
dr=32;
}
dynamicRange=dr;
if (probes==0) {
dataBytes=nModX*nModY*NCHIP*NCHAN*dynamicRange/8;
} else {
dataBytes=nModX*nModY*NCHIP*NCHAN*4;///
}
#ifdef VERBOSE
printf("Number of data bytes %d - probes %d dr %d\n", dataBytes, probes, dr);
#endif
if (allocateRAM()==OK) {
;
} else
printf("ram not allocated\n");
*/
dynamicRange=16; dynamicRange=16;
return dynamicRange; return dynamicRange;
@ -1891,6 +1827,7 @@ int allocateRAM() {
} }
int prepareADC(){ int prepareADC(){
printf("Preparing ADC\n");
u_int32_t valw,codata,csmask; u_int32_t valw,codata,csmask;
int i,cdx,ddx; int i,cdx,ddx;
cdx=0; ddx=1; cdx=0; ddx=1;
@ -1902,11 +1839,17 @@ int prepareADC(){
valw=((0xffffffff&(~csmask)));bus_w(ADC_WRITE_REG,valw); //chip sel bar down valw=((0xffffffff&(~csmask)));bus_w(ADC_WRITE_REG,valw); //chip sel bar down
for (i=0;i<24;i++) { for (i=0;i<24;i++) {
valw=valw&(~(0x1<<cdx));bus_w(ADC_WRITE_REG,valw);usleep(0); //cldwn valw=valw&(~(0x1<<cdx));bus_w(ADC_WRITE_REG,valw);usleep(0); //cldwn
#ifdef VERBOSE
printf("DOWN 0x%x \n",valw); printf("DOWN 0x%x \n",valw);
#endif
valw=(valw&(~(0x1<<ddx)))+(((codata>>(23-i))&0x1)<<ddx); bus_w(ADC_WRITE_REG,valw); usleep(0); //write data (i) valw=(valw&(~(0x1<<ddx)))+(((codata>>(23-i))&0x1)<<ddx); bus_w(ADC_WRITE_REG,valw); usleep(0); //write data (i)
#ifdef VERBOSE
printf("LOW 0x%x \n",valw); printf("LOW 0x%x \n",valw);
#endif
valw=valw+(0x1<<cdx);bus_w(ADC_WRITE_REG,valw); usleep(0); //clkup valw=valw+(0x1<<cdx);bus_w(ADC_WRITE_REG,valw); usleep(0); //clkup
#ifdef VERBOSE
printf("up 0x%x \n",valw); printf("up 0x%x \n",valw);
#endif
} }
valw=valw&(~(0x1<<cdx));usleep(0); valw=valw&(~(0x1<<cdx));usleep(0);

View File

@ -21,43 +21,73 @@ void error(char *msg)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int portno, b; int portno, b;
char cmd[100]; char cmd[500];
int retval=OK; int retval=OK;
int sd, fd; int sd, fd;
int iarg; int iarg;
int checkType = 1;
for(iarg=1; iarg<argc; iarg++){ for(iarg=1; iarg<argc; iarg++){
if(!strcasecmp(argv[iarg],"-phaseshift")){ if(!strcasecmp(argv[iarg],"-phaseshift")){
if(argc==iarg+1){
printf("No phaseshift given. Exiting.\n");
return 1;
}
if ( sscanf(argv[iarg+1],"%d",&phase_shift)==0) { if ( sscanf(argv[iarg+1],"%d",&phase_shift)==0) {
printf("could not decode phase shift\n"); printf("could not decode phase shift\n");
return 1; return 1;
} }
argc=1; }
else if(!strcasecmp(argv[iarg],"-test")){
if(argc==iarg+1){
printf("No test condition given. Exiting.\n");
return 1;
}
if(!strcasecmp(argv[iarg+1],"with_gotthard")){
checkType = 0;
}else{
printf("could not decode test condition. Possible arguments: with_gotthard. Exiting\n");
return 1;
}
} }
} }
if (argc==1) {
portno = DEFAULT_PORTNO; //stop server
sprintf(cmd,"%s %d &",argv[0],DEFAULT_PORTNO+1); if ((argc > 2) && (!strcasecmp(argv[2],"stopserver"))){
printf("opening control server on port %d\n",portno );
system(cmd);
b=1;
} else {
portno = DEFAULT_PORTNO+1; portno = DEFAULT_PORTNO+1;
if ( sscanf(argv[1],"%d",&portno) ==0) { if ( sscanf(argv[1],"%d",&portno) ==0) {
printf("could not open stop server: unknown port\n"); printf("could not open stop server: unknown port\n");
return 1; return 1;
} }
b=0; b=0;
printf("opening stop server on port %d\n",portno); printf("\n\nStop Server\nOpening stop server on port %d\n",portno);
} }
init_detector(b);
//control server
else {
portno = DEFAULT_PORTNO;
if(checkType)
sprintf(cmd,"%s %d stopserver &",argv[0],DEFAULT_PORTNO+1);
else
sprintf(cmd,"%s %d stopserver -test with_gotthard &",argv[0],DEFAULT_PORTNO+1);
printf("\n\nControl Server\nOpening control server on port %d\n",portno );
//printf("\n\ncmd:%s\n",cmd);
system(cmd);
b=1;
}
init_detector(b, checkType);
sd=bindSocket(portno); sd=bindSocket(portno);
sockfd=sd; sockfd=sd;
if (getServerError(sd)) { if (getServerError(sd)) {
printf("server error!\n"); printf("server error!\n");
return -1; return -1;

View File

@ -8,23 +8,23 @@
// Hardware definitions // Hardware definitions
#define NCHAN 160*160 #define NCHAN (160*160)
#define NCHIP 1 #define NCHIP 1
#define NMAXMODX 1 #define NMAXMODX 1
#define NMAXMODY 1 #define NMAXMODY 1
#define NMAXMOD NMAXMODX*NMAXMODY #define NMAXMOD (NMAXMODX*NMAXMODY)
#define NDAC 8 #define NDAC 8
#define NADC 1 #define NADC 1
/**change this for the real moench chip*/ /**when moench readout tested with gotthard module*/
#define GOTTHARDNCHAN 128 #define GOTTHARDNCHAN 128
#define GOTTHARDNCHIP 10 #define GOTTHARDNCHIP 10
#define NCHANS NCHAN*NCHIP*NMAXMOD #define NCHANS (NCHAN*NCHIP*NMAXMOD)
#define NDACS NDAC*NMAXMOD #define NDACS (NDAC*NMAXMOD)
#define NTRIMBITS 6 #define NTRIMBITS 6
#define NCOUNTBITS 24 #define NCOUNTBITS 24

View File

@ -53,39 +53,44 @@ char mess[1000];
int digitalTestBit = 0; int digitalTestBit = 0;
extern int withGotthard;
int init_detector( int b) { int init_detector(int b, int checkType) {
#ifndef PICASSOD
printf("This is a MOENCH detector with %d chips per module\n", NCHIP);
#else
printf("This is a PICASSO detector with %d chips per module\n", NCHIP);
#endif
if (mapCSP0()==FAIL) { printf("Could not map memory\n"); if (mapCSP0()==FAIL) { printf("Could not map memory\n");
exit(1); exit(1);
} }
//testFpga(); //confirm if it is really moench
if(((bus_r(PCB_REV_REG) & DETECTOR_TYPE_MASK)>>DETECTOR_TYPE_OFFSET) != MOENCH_MODULE ){
if(checkType){
printf("This is a Gotthard detector. Exiting Moench Server.\n\n");
exit(-1);
}
//no check required as specified in command line arguments
else if(b){
printf("***This is a GOTTHARD detector with %d chips per module***\n",GOTTHARDNCHIP);
printf("***Assuming this to be a MOENCH detector***\n");
}
withGotthard = 1;
}
if (b) { if (b) {
int reg;
#ifdef MCB_FUNCS #ifdef MCB_FUNCS
printf("\nBoard Revision:0x%x\n",(bus_r(PCB_REV_REG)&BOARD_REVISION_MASK));
initDetector(); initDetector();
printf("\n***initdetector done*** \n\n"); printf("Initializing Detector\n");
#endif #endif
testFpga(); testFpga();
testRAM(); testRAM();
//moench specific //moench specific
setPhaseShiftOnce(); setPhaseShiftOnce();
prepareADC(); prepareADC();
setADC(-1); //already does setdaqreg and clean fifo setADC(-1); //already does setdaqreg and clean fifo
printf("in chip of interes reg:%d\n",bus_r(CHIP_OF_INTRST_REG));
int reg = /*NCHAN*40;*/(GOTTHARDNCHAN*GOTTHARDNCHIP)<<CHANNEL_OFFSET;
reg&=CHANNEL_MASK;
reg|=ACTIVE_ADC_MASK;
bus_w(CHIP_OF_INTRST_REG,reg);
printf("in chip of interes reg:%d\n",bus_r(CHIP_OF_INTRST_REG));
setSettings(GET_SETTINGS,-1); setSettings(GET_SETTINGS,-1);
//Initialization //Initialization
setFrames(1); setFrames(1);
setTrains(1); setTrains(1);
@ -2279,6 +2284,10 @@ int set_roi(int file_des) {
//#endif //#endif
} }
/* execute action if the arguments correctly arrived*/ /* execute action if the arguments correctly arrived*/
ret = FAIL;
/* NOT IMPLEMENTED
#ifdef MCB_FUNCS #ifdef MCB_FUNCS
if (lockStatus==1 && differentClients==1){//necessary??? if (lockStatus==1 && differentClients==1){//necessary???
sprintf(mess,"Detector locked by %s\n", lastClientIP); sprintf(mess,"Detector locked by %s\n", lastClientIP);
@ -2294,8 +2303,7 @@ int set_roi(int file_des) {
} }
#endif #endif
*/
if(ret==OK && differentClients){ if(ret==OK && differentClients){
printf("Force update\n"); printf("Force update\n");
ret=FORCE_UPDATE; ret=FORCE_UPDATE;

View File

@ -23,8 +23,7 @@ int sockfd;
int function_table(); int function_table();
int decode_function(int); int decode_function(int);
int init_detector(int,int);
int init_detector(int);
int M_nofunc(int); int M_nofunc(int);
int exit_server(int); int exit_server(int);