mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-21 17:18:00 +02:00
Client and jungfrau server funcs added for pattern generator
This commit is contained in:
@ -2612,3 +2612,121 @@ int calibratePedestal(int frames){
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
uint64_t writePatternWord(int addr, uint64_t word) {
|
||||
|
||||
int cntrl=0;
|
||||
if (addr>=MAX_PATTERN_LENGTH)
|
||||
return -1;
|
||||
|
||||
if (word>=0) {
|
||||
set64BitReg(word,PATTERN_IN_REG_LSB,PATTERN_IN_REG_MSB);
|
||||
cntrl= (addr&APATTERN_MASK) << PATTERN_CTRL_ADDR_OFFSET;
|
||||
bus_w(PATTERN_CNTRL_REG, cntrl);
|
||||
bus_w(PATTERN_CNTRL_REG, cntrl | (1<< PATTERN_CTRL_WRITE_BIT) );
|
||||
bus_w(PATTERN_CNTRL_REG, cntrl);
|
||||
}
|
||||
return word;
|
||||
}
|
||||
uint64_t writePatternIOControl(uint64_t word) {
|
||||
if (word>=0)set64BitReg(word,PATTERN_IOCTRL_REG_LSB,PATTERN_IOCTRL_REG_MSB);
|
||||
return get64BitReg(PATTERN_IOCTRL_REG_LSB,PATTERN_IOCTRL_REG_MSB);
|
||||
|
||||
}
|
||||
uint64_t writePatternClkControl(uint64_t word) {
|
||||
if (word>=0)set64BitReg(word,PATTERN_IOCLKCTRL_REG_LSB,PATTERN_IOCLKCTRL_REG_MSB);
|
||||
return get64BitReg(PATTERN_IOCLKCTRL_REG_LSB,PATTERN_IOCLKCTRL_REG_MSB);
|
||||
|
||||
}
|
||||
|
||||
int setPatternLoop(int level, int *start, int *stop, int *n) {
|
||||
int ret=OK;
|
||||
int lval=0;
|
||||
|
||||
|
||||
switch (level) {
|
||||
case 0:
|
||||
if (*n>=0) bus_w(*n,PATTERN_N_LOOP0_REG);
|
||||
*n=bus_r(PATTERN_N_LOOP0_REG);
|
||||
lval=bus_r(PATTERN_LOOP0_AREG);
|
||||
if (*start==-1) *start=(lval>> ASTART_OFFSET) & APATTERN_MASK;
|
||||
if (*stop==-1) *start=(lval>> ASTOP_OFFSET) & APATTERN_MASK;
|
||||
lval= ((*start & APATTERN_MASK) << ASTART_OFFSET) | ((*stop & APATTERN_MASK) << ASTOP_OFFSET);
|
||||
bus_w(lval, PATTERN_LOOP0_AREG);
|
||||
break;
|
||||
case 1:
|
||||
if (*n>=0) bus_w(*n,PATTERN_N_LOOP1_REG);
|
||||
*n=bus_r(PATTERN_N_LOOP1_REG);
|
||||
lval=bus_r(PATTERN_LOOP1_AREG);
|
||||
if (*start==-1) *start=(lval>> ASTART_OFFSET) & APATTERN_MASK;
|
||||
if (*stop==-1) *start=(lval>> ASTOP_OFFSET) & APATTERN_MASK;
|
||||
lval= ((*start & APATTERN_MASK) << ASTART_OFFSET) | ((*stop & APATTERN_MASK) << ASTOP_OFFSET);
|
||||
bus_w(lval, PATTERN_LOOP1_AREG);
|
||||
|
||||
break;
|
||||
case 2:
|
||||
if (*n>=0) bus_w(*n,PATTERN_N_LOOP2_REG);
|
||||
*n=bus_r(PATTERN_N_LOOP2_REG);
|
||||
lval=bus_r(PATTERN_LOOP2_AREG);
|
||||
if (*start==-1) *start=(lval>> ASTART_OFFSET) & APATTERN_MASK;
|
||||
if (*stop==-1) *start=(lval>> ASTOP_OFFSET) & APATTERN_MASK;
|
||||
lval= ((*start & APATTERN_MASK) << ASTART_OFFSET) | ((*stop & APATTERN_MASK) << ASTOP_OFFSET);
|
||||
bus_w(lval, PATTERN_LOOP2_AREG);
|
||||
|
||||
break;
|
||||
case -1:
|
||||
|
||||
lval=bus_r(PATTERN_LIMITS_AREG);
|
||||
if (*start==-1) start=(lval>> ASTART_OFFSET) & APATTERN_MASK;
|
||||
if (*stop==-1) start=(lval>> ASTOP_OFFSET) & APATTERN_MASK;
|
||||
lval= ((*start & APATTERN_MASK) << ASTART_OFFSET) | ((*stop & APATTERN_MASK) << ASTOP_OFFSET);
|
||||
bus_w(lval, PATTERN_LIMITS_AREG);
|
||||
break;
|
||||
default:
|
||||
ret=FAIL;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int setPatternWaitAddress(int level, int addr) {
|
||||
int ret=-1;
|
||||
switch (level) {
|
||||
case 0:
|
||||
if (addr>=0) bus_w(addr,PATTERN_WAIT0_AREG);
|
||||
return bus_r(PATTERN_WAIT0_AREG);
|
||||
case 1:
|
||||
if (addr>=0) bus_w(addr,PATTERN_WAIT1_AREG);
|
||||
return bus_r(PATTERN_WAIT1_AREG);
|
||||
case 2:
|
||||
if (addr>=0) bus_w(addr,PATTERN_WAIT2_AREG);
|
||||
return bus_r(PATTERN_WAIT2_AREG);
|
||||
};
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
uint64_t setPatternWaitTime(int level, uint64_t t) {
|
||||
uint64_t ret=-1;
|
||||
switch (level) {
|
||||
case 0:
|
||||
if (t>=0) set64BitReg(t,PATTERN_WAIT0_TIME_REG_LSB,PATTERN_WAIT0_TIME_REG_MSB);
|
||||
return get64BitReg(PATTERN_WAIT0_TIME_REG_LSB,PATTERN_WAIT0_TIME_REG_MSB);
|
||||
case 1:
|
||||
if (t>=0) set64BitReg(t,PATTERN_WAIT1_TIME_REG_LSB,PATTERN_WAIT1_TIME_REG_MSB);
|
||||
return get64BitReg(PATTERN_WAIT1_TIME_REG_LSB,PATTERN_WAIT1_TIME_REG_MSB);
|
||||
case 2:
|
||||
if (t>=0) set64BitReg(t,PATTERN_WAIT2_TIME_REG_LSB,PATTERN_WAIT2_TIME_REG_MSB);
|
||||
return get64BitReg(PATTERN_WAIT2_TIME_REG_LSB,PATTERN_WAIT2_TIME_REG_MSB);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -149,6 +149,14 @@ int resetCounterBlock(int startACQ);
|
||||
|
||||
int calibratePedestal(int frames);
|
||||
|
||||
uint64_t writePatternWord(int addr, uint64_t word);
|
||||
uint64_t writePatternIOControl(uint64_t word);
|
||||
uint64_t writePatternClkControl(uint64_t word);
|
||||
int setPatternLoop(int level, int *start, int *stop, int *n);
|
||||
int setPatternWaitAddress(int level, int addr);
|
||||
uint64_t setPatternWaitTime(int level, uint64_t t);
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
Binary file not shown.
Binary file not shown.
@ -108,7 +108,6 @@
|
||||
//#define FLOW_STATUS_REG 0x12<<11
|
||||
//#define FRAME_REG 0x13<<11
|
||||
#define MULTI_PURPOSE_REG 0x14<<11
|
||||
#define DAQ_REG 0x15<<11
|
||||
//#define TIME_FROM_START_REG 0x16<<11
|
||||
#define DAC_REG 64<<11//0x17<<11// control the dacs
|
||||
//ADC
|
||||
@ -210,12 +209,44 @@
|
||||
#define DETECTORIP_AREG 75<<11//detectorip_AReg_c : integer:= 75; */
|
||||
#define IPCHKSUM_AREG 76<<11//ipchksum_AReg_c : integer:= 76; */
|
||||
|
||||
#define PATTERN_CNTRL_REG 82<<11
|
||||
#define PATTERN_LIMITS_AREG 83<<11
|
||||
|
||||
#define PATTERN_LOOP0_AREG 84<<11
|
||||
#define PATTERN_N_LOOP0_REG 85<<11
|
||||
|
||||
#define PATTERN_LOOP1_AREG 86<<11
|
||||
#define PATTERN_N_LOOP1_REG 87<<11
|
||||
|
||||
#define PATTERN_LOOP2_AREG 88<<11
|
||||
#define PATTERN_N_LOOP2_REG 89<<11
|
||||
|
||||
#define PATTERN_WAIT0_AREG 90<<11
|
||||
#define PATTERN_WAIT1_AREG 91<<11
|
||||
#define PATTERN_WAIT2_AREG 92<<11
|
||||
|
||||
|
||||
|
||||
#define DAQ_REG 93<<11
|
||||
#define ADC_LATCH_ENABLE_REG 94<<11
|
||||
|
||||
|
||||
|
||||
|
||||
#define PATTERN_IOCTRL_REG_LSB 108<<11
|
||||
#define PATTERN_IOCTRL_REG_MSB 109<<12
|
||||
#define PATTERN_IOCLKCTRL_REG_LSB 110<<11
|
||||
#define PATTERN_IOCLKCTRL_REG_MSB 111<<11
|
||||
#define PATTERN_IN_REG_LSB 112<<11
|
||||
#define PATTERN_IN_REG_MSB 113<<11
|
||||
#define PATTERN_WAIT0_TIME_REG_LSB 114<<11
|
||||
#define PATTERN_WAIT0_TIME_REG_MSB 115<<11
|
||||
#define PATTERN_WAIT1_TIME_REG_LSB 116<<11
|
||||
#define PATTERN_WAIT1_TIME_REG_MSB 117<<11
|
||||
#define PATTERN_WAIT2_TIME_REG_LSB 118<<11
|
||||
#define PATTERN_WAIT2_TIME_REG_MSB 119<<11
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -450,14 +481,24 @@
|
||||
#define PPL_C0_CNT_PARAM_DEFAULT 0x20D0C
|
||||
#define PPL_C1_CNT_PARAM_DEFAULT 0xA0A0
|
||||
#define PPL_C2_CNT_PARAM_DEFAULT 0x20D0C
|
||||
#define PPL_C2_CNT_PARAM_DEFAULT 0x0808
|
||||
#define PPL_C3_CNT_PARAM_DEFAULT 0x0808
|
||||
#define PPL_BW_PARAM_DEFAULT 0x2EE0
|
||||
#define PPL_VCO_PARAM_DEFAULT 0x1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**------------------
|
||||
-- pattern registers definitions
|
||||
--------------------------------------------- */
|
||||
#define IOSIGNALS_MASK 0xfffffffffffff
|
||||
#define ADC_ENABLE_BIT 63
|
||||
#define APATTERN_MASK 0x3ff
|
||||
#define ASTART_OFFSET 0
|
||||
#define ASTOP_OFFSET 16
|
||||
#define PATTERN_CTRL_WRITE_BIT 0
|
||||
#define PATTERN_CTRL_ADDR_OFFSET 16
|
||||
#define MAX_PATTERN_LENGTH 1024
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -227,6 +227,7 @@ int function_table() {
|
||||
flist[F_START_RECEIVER]=&start_receiver;
|
||||
flist[F_STOP_RECEIVER]=&stop_receiver;
|
||||
flist[F_CALIBRATE_PEDESTAL]=&calibrate_pedestal;
|
||||
flist[F_SET_CTB_PATTERN]=&set_ctb_pattern;
|
||||
return OK;
|
||||
}
|
||||
|
||||
@ -3106,3 +3107,138 @@ int calibrate_pedestal(int file_des){
|
||||
}
|
||||
|
||||
|
||||
int set_ctb_pattern(int file_des){
|
||||
|
||||
int ret=FAIL;
|
||||
int retval=-1;
|
||||
int n;
|
||||
int mode;
|
||||
uint64_t word, retval64, t;
|
||||
int addr;
|
||||
int level, start, stop, nl;
|
||||
|
||||
sprintf(mess,"Could not set pattern\n");
|
||||
|
||||
n = receiveDataOnly(file_des,&mode,sizeof(mode));
|
||||
switch (mode) {
|
||||
|
||||
case 0: //sets word
|
||||
n = receiveDataOnly(file_des,&addr,sizeof(addr));
|
||||
n = receiveDataOnly(file_des,&word,sizeof(word));
|
||||
ret=OK;
|
||||
|
||||
switch (addr) {
|
||||
case -1:
|
||||
retval64=writePatternIOControl(word);
|
||||
break;
|
||||
case -2:
|
||||
retval64=writePatternClkControl(word);
|
||||
break;
|
||||
default:
|
||||
retval64=writePatternWord(addr,word);
|
||||
};
|
||||
|
||||
|
||||
//write word;
|
||||
//@param addr address of the word, -1 is I/O control register, -2 is clk control register
|
||||
//@param word 64bit word to be written, -1 gets
|
||||
|
||||
n = sendDataOnly(file_des,&ret,sizeof(ret));
|
||||
if (ret==FAIL)
|
||||
n += sendDataOnly(file_des,mess,sizeof(mess));
|
||||
else
|
||||
n += sendDataOnly(file_des,&retval64,sizeof(retval64));
|
||||
break;
|
||||
|
||||
case 1: //pattern loop
|
||||
n = receiveDataOnly(file_des,&level,sizeof(level));
|
||||
n = receiveDataOnly(file_des,&start,sizeof(start));
|
||||
n = receiveDataOnly(file_des,&stop,sizeof(stop));
|
||||
n = receiveDataOnly(file_des,&nl,sizeof(nl));
|
||||
|
||||
|
||||
/** Sets the pattern or loop limits in the CTB
|
||||
@param level -1 complete pattern, 0,1,2, loop level
|
||||
@param start start address if >=0
|
||||
@param stop stop address if >=0
|
||||
@param n number of loops (if level >=0)
|
||||
@returns OK/FAIL
|
||||
*/
|
||||
ret=setPatternLoop(level, &start, &stop, &nl);
|
||||
|
||||
n = sendDataOnly(file_des,&ret,sizeof(ret));
|
||||
if (ret==FAIL)
|
||||
n += sendDataOnly(file_des,mess,sizeof(mess));
|
||||
else {
|
||||
n += sendDataOnly(file_des,&start,sizeof(start));
|
||||
n += sendDataOnly(file_des,&stop,sizeof(stop));
|
||||
n += sendDataOnly(file_des,&nl,sizeof(nl));
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
|
||||
case 2: //wait address
|
||||
n = receiveDataOnly(file_des,&level,sizeof(level));
|
||||
n = receiveDataOnly(file_des,&addr,sizeof(addr));
|
||||
|
||||
|
||||
|
||||
/** Sets the wait address in the CTB
|
||||
@param level 0,1,2, wait level
|
||||
@param addr wait address, -1 gets
|
||||
@returns actual value
|
||||
*/
|
||||
retval=setPatternWaitAddress(level,addr);
|
||||
ret=OK;
|
||||
if (ret==FAIL)
|
||||
n += sendDataOnly(file_des,mess,sizeof(mess));
|
||||
else {
|
||||
n += sendDataOnly(file_des,&retval,sizeof(retval));
|
||||
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
|
||||
|
||||
case 3: //wait time
|
||||
n = receiveDataOnly(file_des,&level,sizeof(level));
|
||||
n = receiveDataOnly(file_des,&t,sizeof(t));
|
||||
|
||||
|
||||
/** Sets the wait time in the CTB
|
||||
@param level 0,1,2, wait level
|
||||
@param t wait time, -1 gets
|
||||
@returns actual value
|
||||
*/
|
||||
|
||||
ret=OK;
|
||||
|
||||
retval64=setPatternWaitTime(level,t);
|
||||
|
||||
n = sendDataOnly(file_des,&ret,sizeof(ret));
|
||||
if (ret==FAIL)
|
||||
n += sendDataOnly(file_des,mess,sizeof(mess));
|
||||
else
|
||||
n += sendDataOnly(file_des,&retval64,sizeof(retval64));
|
||||
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
ret=FAIL;
|
||||
sprintf(mess,"%s - wrong mode %d\n",mess, mode);
|
||||
n = sendDataOnly(file_des,&ret,sizeof(ret));
|
||||
n += sendDataOnly(file_des,mess,sizeof(mess));
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*return ok/fail*/
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
@ -93,5 +93,6 @@ int stop_receiver(int);
|
||||
int calibrate_pedestal(int);
|
||||
|
||||
int set_roi(int);
|
||||
int set_ctb_pattern(int);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user