read_frame works and moved get temp to the getadc function

git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@116 951219d9-93cf-4727-9268-0efd64621fa3
This commit is contained in:
l_maliakal_d 2012-02-16 14:16:38 +00:00
parent 2e15e9c2db
commit ee2652f864
4 changed files with 207 additions and 300 deletions

View File

@ -6,7 +6,7 @@
CROSS = bfin-uclinux- CROSS = bfin-uclinux-
CC = $(CROSS)gcc CC = $(CROSS)gcc
CFLAGS += -Wall -DMCB_FUNCS -DVERBOSE #-DVERY_VERBOSE #-DVIRTUAL CFLAGS += -Wall -DMCB_FUNCS -DVERBOSE #-DVERYVERBOSE #-DVIRTUAL
#INCLUDES= /usr/src/kernels/2.6.18-238.12.1.el5-i686/include #INCLUDES= /usr/src/kernels/2.6.18-238.12.1.el5-i686/include
#/home/l_maliakal_d/bfin/blackfin-linux-dist/linux-2.6.x/include #/home/l_maliakal_d/bfin/blackfin-linux-dist/linux-2.6.x/include

View File

@ -174,8 +174,8 @@ int mapCSP0(void) {
u_int32_t address; u_int32_t address;
address = FIFO_DATA_REG_OFF; address = FIFO_DATA_REG_OFF;
values=(u_int32_t*)(CSP0BASE+address*2); values=(u_int16_t*)(CSP0BASE+address*2);
printf("values=%08x\n",values); //printf("values=%04x\n",values);
//printf("values=%08x\n",((u_int32_t*)(CSP0BASE+FIFO_DATA_REG_OFF*2))); //printf("values=%08x\n",((u_int32_t*)(CSP0BASE+FIFO_DATA_REG_OFF*2)));
/* must b uncommentedlater//////////////////////////////////////////////////////// /* must b uncommentedlater////////////////////////////////////////////////////////
@ -1396,109 +1396,51 @@ u_int32_t fifo_full(void)
u_int32_t* fifo_read_event() u_int32_t* fifo_read_event()
{ {
#ifdef VERBOSE
int ichip;
int ichan;
#endif
#ifdef VIRTUAL #ifdef VIRTUAL
return NULL; return NULL;
#endif #endif
#ifdef VERBOSE
printf("before looping\n"); printf("before looping\n");
#ifdef VERYVERBOSE
printf("before looping\n");
for (ichip=0; ichip<nModBoard*NCHIP; ichip++) {
if ((fifoReadCounter(ichip)&FIFO_COUNTER_MASK)%128)
printf("FIFO %d contains %d words\n",ichip,(fifoReadCounter(ichip)&FIFO_COUNTER_MASK));
}
#endif #endif
while(bus_r(LOOK_AT_ME_REG)==0) { while(bus_r(LOOK_AT_ME_REG)==0) {
//#ifdef VERYVERBOSE #ifdef VERBOSE
printf("Waiting for data status %x\n",runState()); printf("Waiting for data status %x\n",runState());
//#endif #endif
if (runBusy()==0) { if (runBusy()==0) {
if (bus_r(LOOK_AT_ME_REG)==0) { if (bus_r(LOOK_AT_ME_REG)==0) {
//#ifdef VERBOSE #ifdef VERBOSE
printf("no frame found - exiting "); printf("no frame found - exiting ");
printf("%08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG));
printf("%08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG)); #endif
/* for (ichip=0; ichip<nModBoard*NCHIP; ichip++) {
if ((fifoReadCounter(ichip)&FIFO_COUNTER_MASK)%128)
printf("FIFO %d contains %d words\n",ichip,(fifoReadCounter(ichip)&FIFO_COUNTER_MASK));
}
*/
//#endif
return NULL; return NULL;
} else { } else {
//#ifdef VERYVERBOSE #ifdef VERBOSE
printf("no frame found %x status %x\n", bus_r(LOOK_AT_ME_REG),runState()); printf("no frame found %x status %x\n", bus_r(LOOK_AT_ME_REG),runState());
//#endif #endif
break; break;
} }
} }
} }
printf("before readout %08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG));
#ifdef VERYVERBOSE
printf("before readout %08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG));
for (ichip=0; ichip<nModBoard*NCHIP; ichip++) {
if ((fifoReadCounter(ichip)&FIFO_COUNTER_MASK)%128)
printf("FIFO %d contains %d words\n",ichip,(fifoReadCounter(ichip)&FIFO_COUNTER_MASK));
}
#endif
//unsigned long flags;
// register int ihalf;
// save_flags(flags);
// cli(); /* This code runs with interrupts disabled */
/* for (ihalf=0;ihalf<dataBytes/sizeof(int); ihalf++){
ram_values[ihalf]=*values;
}*/
// restore_flags(flags);
/*
for (ihalf=0;ihalf<dataBytes/sizeof(int); ihalf++)
printf("\n%d: 0x%0x 0x%0x",ihalf,ram_values[ihalf]&0xffff,(ram_values[ihalf]>>16)&0xffff);
*/
/* for (ichip=0;ichip<dataBytes/2; ichip++)
printf("\n%d: %08x",ichip,*values);*/
//sram_free(now_ptr);
memcpy(now_ptr, values, dataBytes);
/*
#ifdef VERBOSE #ifdef VERBOSE
for (ichip=0;ichip<dataBytes/4; ichip++) { printf("before readout %08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG));
now_ptr[ichip*4]=values[ichip];
#ifdef VERBOSE
if (((fifoReadCounter(ichip/128)&FIFO_COUNTER_MASK)+(ichip%128))>128)
printf("chip %d ch %d %d\n",ichip/128, ichip%128, (fifoReadCounter(ichip/128)&FIFO_COUNTER_MASK));
#endif
}
#endif #endif
*/ dma_memcpy(now_ptr,values ,dataBytes);
//#ifdef VERYVERBOSE
printf("Copying to ptr %x %d\n",now_ptr, dataBytes);
//#endif
printf("after readout %08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG));
#ifdef VERYVERBOSE #ifdef VERYVERBOSE
printf("after readout %08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG)); printf("\n x%08x\n",now_ptr);
for (ichip=0; ichip<nModBoard*NCHIP; ichip++) { int a;
if ((fifoReadCounter(ichip)&FIFO_COUNTER_MASK)%128) for (a=0;a<10; a=a+2)
printf("FIFO %d contains %d words\n",ichip,(fifoReadCounter(ichip)&FIFO_COUNTER_MASK)); printf("\n%d: x%04x",a,now_ptr[a]);
} printf("\n");
//memcpy(now_ptr, values, dataBytes);
#endif #endif
#ifdef VERBOSE
printf("Copying to ptr %08x %d\n",now_ptr, dataBytes);
printf("after readout %08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG));
#endif
if (storeInRAM>0) { if (storeInRAM>0) {
now_ptr+=dataBytes; now_ptr+=dataBytes;
} }
@ -1735,7 +1677,8 @@ int allocateRAM() {
#endif #endif
// clearRAM(); // clearRAM();
// ram_values=malloc(size); // ram_values=malloc(size);
ram_values=realloc(ram_values,size); //+2 was added since dma_memcpy would switch the 16 bit values and the mem is 32 bit
ram_values=realloc(ram_values,size)+2;
if (ram_values) { if (ram_values) {
now_ptr=(char*)ram_values; now_ptr=(char*)ram_values;
@ -1750,7 +1693,7 @@ int allocateRAM() {
printf("retrying\n"); printf("retrying\n");
storeInRAM=0; storeInRAM=0;
size=dataBytes; size=dataBytes;
ram_values=realloc(ram_values,size); ram_values=realloc(ram_values,size)+2;
if (ram_values==NULL) if (ram_values==NULL)
printf("Fatal error: there must be a memory leak somewhere! You can't allocate even one frame!\n"); printf("Fatal error: there must be a memory leak somewhere! You can't allocate even one frame!\n");
else { else {

View File

@ -19,14 +19,14 @@
// DAC definitions // DAC definitions
enum dacsVal{VREF_DS, VCASCN_PB, VCASCP_PB, VOUT_CM, VCASC_OUT, VIN_CM, VREF_COMP, IB_TESTC}; enum dacsVal{VREF_DS, VCASCN_PB, VCASCP_PB, VOUT_CM, VCASC_OUT, VIN_CM, VREF_COMP, IB_TESTC,HIGH_VOLTAGE, CONFGAIN};
/* DAC adresses */ /* DAC adresses */
#define DACCS {0,0,1,1,2,2,3,3,4,4,5,5,6,6} #define DACCS {0,0,1,1,2,2,3,3,4,4,5,5,6,6}
#define DACADDR {0,1,0,1,0,1,0,1,0,1,0,1,0,1} #define DACADDR {0,1,0,1,0,1,0,1,0,1,0,1,0,1}
//Register Definitions for temp,hv,dac gain //Register Definitions for temp,hv,dac gain
enum RegVals{TEMP_FPGA, TEMP_ADC, HIGH_VOLTAGE, CONFGAIN}; enum adcVals{TEMP_FPGA, TEMP_ADC};
//dynamic range //dynamic range
#define MAX5523 #define MAX5523

View File

@ -821,16 +821,16 @@ int read_register(int file_des) {
//#ifdef VERBOSE //#ifdef VERBOSE
printf("reading register 0x%x\n", addr); printf("reading register 0x%x\n", addr);
//#endif //#endif
if(ret!=FAIL){ if(ret!=FAIL){
address=(addr<<11); address=(addr<<11);
if((addr==0x29)||(addr==0x80)) if(addr==0x80)
retval=bus_r16(address); retval=bus_r16(address);
else else
retval=bus_r(address); retval=bus_r(address);
} }
@ -861,232 +861,201 @@ int read_register(int file_des) {
} }
int set_dac(int file_des) { int set_dac(int file_des) {
//everything in here does for all mods //default:all mods
float retval; float retval;
int ret=OK; int ret=OK;
int arg[2]; int arg[2];
enum dacIndex ind; enum dacIndex ind;
int imod; int imod;
int n; int n;
float val; float val;
int idac=0; int idac=0;
int ireg=-1;
sprintf(mess,"Can't set DAC/TEMP/HV\n"); sprintf(mess,"Can't set DAC\n");
n = receiveDataOnly(file_des,arg,sizeof(arg)); n = receiveDataOnly(file_des,arg,sizeof(arg));
if (n < 0) { if (n < 0) {
sprintf(mess,"Error reading from socket\n"); sprintf(mess,"Error reading from socket\n");
ret=FAIL; ret=FAIL;
} }
ind=arg[0]; ind=arg[0];
imod=arg[1]; imod=arg[1];
n = receiveDataOnly(file_des,&val,sizeof(val)); n = receiveDataOnly(file_des,&val,sizeof(val));
if (n < 0) { if (n < 0) {
sprintf(mess,"Error reading from socket\n"); sprintf(mess,"Error reading from socket\n");
ret=FAIL; ret=FAIL;
} }
#ifdef VERBOSE #ifdef VERBOSE
printf("Setting DAC/TEMP/HV %d of module %d to %f V\n", ind, imod, val); printf("Setting DAC %d of module %d to %f V\n", ind, imod, val);
#endif #endif
if (imod>=getNModBoard()) if (imod>=getNModBoard())
ret=FAIL; ret=FAIL;
if (imod<0) if (imod<0)
imod=ALLMOD; imod=ALLMOD;
#ifdef MCB_FUNCS #ifdef MCB_FUNCS
switch (ind) { switch (ind) {
case G_VREF_DS : case G_VREF_DS :
idac=VREF_DS; idac=VREF_DS;
break; break;
case G_VCASCN_PB: case G_VCASCN_PB:
idac=VCASCN_PB; idac=VCASCN_PB;
break; break;
case G_VCASCP_PB: case G_VCASCP_PB:
idac=VCASCP_PB; idac=VCASCP_PB;
break; break;
case G_VOUT_CM: case G_VOUT_CM:
idac=VOUT_CM; idac=VOUT_CM;
break; break;
case G_VCASC_OUT: case G_VCASC_OUT:
idac=VCASC_OUT; idac=VCASC_OUT;
break; break;
case G_VIN_CM: case G_VIN_CM:
idac=VIN_CM; idac=VIN_CM;
break; break;
case G_VREF_COMP: case G_VREF_COMP:
idac=VREF_COMP; idac=VREF_COMP;
break; break;
case G_IB_TESTC: case G_IB_TESTC:
idac=IB_TESTC; idac=IB_TESTC;
break; break;
case TEMPERATURE_FPGA: case HV_POT:
ireg=TEMP_FPGA; idac=HIGH_VOLTAGE;
break; break;
case TEMPERATURE_ADC:
ireg=TEMP_ADC;
break;
case HV_POT:
ireg=HIGH_VOLTAGE;
break;
default: default:
printf("Unknown DAC/TEMP/HV index %d\n",ind); printf("Unknown DAC index %d\n",ind);
sprintf(mess,"Unknown DAC/TEMP/HV index %d\n",ind); sprintf(mess,"Unknown DAC index %d\n",ind);
ret=FAIL; ret=FAIL;
} }
if (ret==OK) { if (ret==OK) {
if (differentClients==1 && lockStatus==1 && val!=-1) { if (differentClients==1 && lockStatus==1 && val!=-1) {
ret=FAIL; ret=FAIL;
sprintf(mess,"Detector locked by %s\n",lastClientIP); sprintf(mess,"Detector locked by %s\n",lastClientIP);
} else{ } else{
//dac if(idac==HIGH_VOLTAGE)
if(ireg==-1) retval=initHighVoltageByModule(val,imod);
retval=initDACbyIndexDACU(idac,val,imod); else
else retval=initDACbyIndexDACU(idac,val,imod);
{ //HV }
if(ireg==HIGH_VOLTAGE) }
retval=initHighVoltageByModule(val,imod); if(ret==OK){
//Temp ret=FAIL;
else if(idac==HIGH_VOLTAGE){
retval=getTemperatureByModule(ireg,imod); if(retval==-2)
strcpy(mess,"Invalid Voltage.Valid values are 0,90,110,120,150,180,200");
else if(retval==-3)
strcpy(mess,"Weird value read back or it has not been set yet\n");
else
ret=OK;
}
else if (retval==val || val==-1)
ret=OK;
} }
}
}
#endif #endif
#ifdef VERBOSE #ifdef VERBOSE
printf("DAC/TEMP/HV set to %f V\n", retval); printf("DAC set to %f V\n", retval);
#endif #endif
ret=FAIL;
if(ireg==HIGH_VOLTAGE){ if(ret==FAIL)
if(retval==-2) printf("Setting dac %d of module %d: wrote %f but read %f\n", ind, imod, val, retval);
strcpy(mess,"Invalid Voltage.Valid values are 0,90,110,120,150,180,200"); else{
else if(retval==-3) if (differentClients)
strcpy(mess,"Weird value read back\n"); ret=FORCE_UPDATE;
else }
ret=OK;
}
else if (retval==val || val==-1)
ret=OK;
if(ret==FAIL)
printf("Setting dac/hv %d of module %d: wrote %f but read %f\n", ind, imod, val, retval);
else{
if (differentClients)
ret=FORCE_UPDATE;
}
/* send answer */ /* send answer */
/* send OK/failed */ /* send OK/failed */
n = sendDataOnly(file_des,&ret,sizeof(ret)); n = sendDataOnly(file_des,&ret,sizeof(ret));
if (ret!=FAIL) { if (ret!=FAIL) {
/* send return argument */ /* send return argument */
n += sendDataOnly(file_des,&retval,sizeof(retval)); n += sendDataOnly(file_des,&retval,sizeof(retval));
} else { } else {
n += sendDataOnly(file_des,mess,sizeof(mess)); n += sendDataOnly(file_des,mess,sizeof(mess));
} }
/*return ok/fail*/ /*return ok/fail*/
return ret; return ret;
} }
int get_adc(int file_des) { int get_adc(int file_des) {
//default: mod 0
float retval;
int ret=OK;
int arg[2];
enum dacIndex ind;
int imod;
int n;
int idac=0;
float retval; sprintf(mess,"Can't read ADC\n");
int ret=OK;
int arg[2];
enum dacIndex ind;
int imod;
int n;
int idac=0;
sprintf(mess,"Can't read ADC\n");
n = receiveDataOnly(file_des,arg,sizeof(arg)); n = receiveDataOnly(file_des,arg,sizeof(arg));
if (n < 0) { if (n < 0) {
sprintf(mess,"Error reading from socket\n"); sprintf(mess,"Error reading from socket\n");
ret=FAIL; ret=FAIL;
} }
ind=arg[0]; ind=arg[0];
imod=arg[1]; imod=arg[1];
#ifdef VERBOSE
printf("Getting ADC %d of module %d\n", ind, imod);
#endif
if (imod>=getNModBoard() || imod<0) if (imod>=getNModBoard() || imod<0)
ret=FAIL; ret=FAIL;
#ifdef MCB_FUNCS #ifdef MCB_FUNCS
switch (ind) { switch (ind) {
case G_VREF_DS : case TEMPERATURE_FPGA:
idac=VREF_DS; idac=TEMP_FPGA;
break; break;
case G_VCASCN_PB: case TEMPERATURE_ADC:
idac=VCASCN_PB; idac=TEMP_ADC;
break; break;
case G_VCASCP_PB: default:
idac=VCASCP_PB; printf("Unknown DAC index %d\n",ind);
break; sprintf(mess,"Unknown DAC index %d\n",ind);
case G_VOUT_CM: ret=FAIL;
idac=VOUT_CM; }
break;
case G_VCASC_OUT: if (ret==OK)
idac=VCASC_OUT; retval=getTemperatureByModule(idac,imod);
break; #endif
case G_VIN_CM:
idac=VIN_CM;
break;
case G_VREF_COMP:
idac=VREF_COMP;
break;
case G_IB_TESTC:
idac=IB_TESTC;
break;
default:
printf("Unknown DAC index %d\n",ind);
ret=FAIL;
sprintf(mess,"Unknown DAC index %d\n",ind);
}
if (ret==OK) {
retval=getDACbyIndexDACU(idac,imod);
}
#endif
#ifdef VERBOSE
printf("Getting ADC %d of module %d\n", ind, imod);
#endif
#ifdef VERBOSE #ifdef VERBOSE
printf("ADC is %f V\n", retval); printf("ADC is %f V\n", retval);
#endif #endif
if (ret==FAIL) { if (ret==FAIL) {
printf("Getting adc %d of module %d failed\n", ind, imod); printf("Getting adc %d of module %d failed\n", ind, imod);
} }
if (differentClients)
ret=FORCE_UPDATE;
if (differentClients) /* send answer */
ret=FORCE_UPDATE; /* send OK/failed */
n = sendDataOnly(file_des,&ret,sizeof(ret));
if (ret!=FAIL) {
/* send return argument */
n += sendDataOnly(file_des,&retval,sizeof(retval));
} else {
n += sendDataOnly(file_des,mess,sizeof(mess));
}
/* send answer */ /*return ok/fail*/
/* send OK/failed */ return ret;
n = sendDataOnly(file_des,&ret,sizeof(ret));
if (ret!=FAIL) {
/* send return argument */
n += sendDataOnly(file_des,&retval,sizeof(retval));
} else {
n += sendDataOnly(file_des,mess,sizeof(mess));
}
/*return ok/fail*/
return ret;
} }
@ -1852,7 +1821,7 @@ int get_run_status(int file_des) {
#endif #endif
retval= runState(); retval= runState();
printf("\n\nSTATUS=%x\n",retval); printf("\n\nSTATUS=%08x\n",retval);
if (retval&0x00000001){ if (retval&0x00000001){
printf("-----------------------------------RUNNING-----------------------------------\n"); printf("-----------------------------------RUNNING-----------------------------------\n");
@ -1898,12 +1867,7 @@ int get_run_status(int file_des) {
} }
int read_frame(int file_des) { int read_frame(int file_des) {
/*
int *retval=NULL;
char *ptr=NULL;
int ret=OK;
int f=0, i;
*/
#ifdef VERBOSE #ifdef VERBOSE
int n; int n;
#endif #endif
@ -1921,14 +1885,14 @@ int read_frame(int file_des) {
if (storeInRAM==0) { if (storeInRAM==0) {
if ((dataretval=(char*)fifo_read_event())) { if ((dataretval=(char*)fifo_read_event())) {
dataret=OK; dataret=OK;
//#ifdef VERYVERBOSE #ifdef VERYVERBOSE
printf("Sending ptr %x %d\n",dataretval, dataBytes); printf("Sending ptr %x %d\n",dataretval, dataBytes);
//#endif #endif
sendDataOnly(file_des,&dataret,sizeof(dataret)); sendDataOnly(file_des,&dataret,sizeof(dataret));
sendDataOnly(file_des,dataretval,dataBytes); sendDataOnly(file_des,dataretval,dataBytes);
//#ifdef VERBOSE #ifdef VERBOSE
printf("sent %d bytes\n",dataBytes); printf("sent %d bytes\n",dataBytes);
//#endif #endif
printf("dataret OK\n"); printf("dataret OK\n");
return OK; return OK;
} else { } else {
@ -1946,7 +1910,7 @@ int read_frame(int file_des) {
printf("%d %d %x %s\n",sizeof(mess),strlen(mess), mess,mess); printf("%d %d %x %s\n",sizeof(mess),strlen(mess), mess,mess);
#endif #endif
sendDataOnly(file_des,&dataret,sizeof(dataret)); sendDataOnly(file_des,&dataret,sizeof(dataret));
sendDataOnly(file_des,mess,sizeof(mess));//sizeof(mess));//sizeof(mess)); sendDataOnly(file_des,mess,sizeof(mess));
#ifdef VERYVERBOSE #ifdef VERYVERBOSE
printf("message sent\n",mess); printf("message sent\n",mess);
#endif #endif
@ -1960,14 +1924,14 @@ int read_frame(int file_des) {
} }
dataretval=(char*)ram_values; dataretval=(char*)ram_values;
dataret=OK; dataret=OK;
//#ifdef VERBOSE #ifdef VERBOSE
printf("sending data of %d frames\n",nframes); printf("sending data of %d frames\n",nframes);
//#endif #endif
for (iframes=0; iframes<nframes; iframes++) { for (iframes=0; iframes<nframes; iframes++) {
sendDataOnly(file_des,&dataret,sizeof(dataret)); sendDataOnly(file_des,&dataret,sizeof(dataret));
//#ifdef VERYVERBOSE #ifdef VERYVERBOSE
printf("sending pointer %x of size %d\n",dataretval,dataBytes); printf("sending pointer %x of size %d\n",dataretval,dataBytes);
//#endif #endif
sendDataOnly(file_des,dataretval,dataBytes); sendDataOnly(file_des,dataretval,dataBytes);
dataretval+=dataBytes; dataretval+=dataBytes;
} }
@ -1982,9 +1946,9 @@ int read_frame(int file_des) {
if (differentClients) if (differentClients)
dataret=FORCE_UPDATE; dataret=FORCE_UPDATE;
} }
//#ifdef VERBOSE #ifdef VERBOSE
printf("Frames left %d\n",getFrames()); printf("Frames left %d\n",getFrames());
//#endif #endif
sendDataOnly(file_des,&dataret,sizeof(dataret)); sendDataOnly(file_des,&dataret,sizeof(dataret));
sendDataOnly(file_des,mess,sizeof(mess)); sendDataOnly(file_des,mess,sizeof(mess));
printf("dataret %d\n",dataret); printf("dataret %d\n",dataret);