mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-22 22:40:02 +02:00
Added pattern generator - must still implement client-server commands
This commit is contained in:
parent
18188cd095
commit
2d66e1f731
20
slsDetectorSoftware/patternGenerator/generate.sh
Executable file
20
slsDetectorSoftware/patternGenerator/generate.sh
Executable file
@ -0,0 +1,20 @@
|
|||||||
|
if [ "$#" -eq 0 ]; then
|
||||||
|
echo "Wrong number of arguments: usage should be $0 patname"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
infile=$1
|
||||||
|
outfile=$infile"at"
|
||||||
|
if [ "$#" -ge 2 ]; then
|
||||||
|
outfile=$2
|
||||||
|
fi
|
||||||
|
exe=$infile"exe"
|
||||||
|
if [ "$#" -ge 3 ]; then
|
||||||
|
exe=$3
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$infile" ]
|
||||||
|
then
|
||||||
|
gcc -DINFILE="\"$infile\"" -DOUTFILE="\"$outfile\"" -o $exe generator.c ; ./$exe ; rm $exe
|
||||||
|
else
|
||||||
|
echo "$infile not found."
|
||||||
|
fi
|
160
slsDetectorSoftware/patternGenerator/generator.c
Executable file
160
slsDetectorSoftware/patternGenerator/generator.c
Executable file
@ -0,0 +1,160 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
usage to generate a patter test.pat from test.p
|
||||||
|
|
||||||
|
gcc -DINFILE="\"test.p\"" -DOUTFILE="\"test.pat\"" -o test.exe generator.c ; ./test.exe ; rm test.exe
|
||||||
|
|
||||||
|
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
#include <stdlib.h> /* exit() */
|
||||||
|
#include <stdint.h> /* exit() */
|
||||||
|
#include <string.h> /* memset(), memcpy() */
|
||||||
|
#include <sys/utsname.h> /* uname() */
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h> /* fork(), write(), close() */
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
//#include <asm/page.h>
|
||||||
|
|
||||||
|
#define MAXLOOPS 3
|
||||||
|
#define MAXTIMERS 3
|
||||||
|
#define MAXWORDS 1024
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
uint64_t pat=0;
|
||||||
|
uint64_t iopat=0;
|
||||||
|
uint64_t clkpat=0;
|
||||||
|
|
||||||
|
int iaddr=0;
|
||||||
|
int waitaddr[3]={-1,-1,-1};
|
||||||
|
int startloopaddr[3]={-1,-1,-1};
|
||||||
|
int stoploopaddr[3]={-1,-1,-1};
|
||||||
|
int start=0, stop=0;
|
||||||
|
uint64_t waittime[3]={0,0,0};
|
||||||
|
int nloop[3]={0,0,0};
|
||||||
|
|
||||||
|
char infile[10000], outfile[10000];
|
||||||
|
|
||||||
|
FILE *fd;
|
||||||
|
|
||||||
|
int i,ii,iii,j,jj,jjj,pixx,pixy,memx,memy,muxout,memclk,colclk,rowclk,muxclk,memcol,memrow,loopcounter;
|
||||||
|
//int W[33];
|
||||||
|
//u_int32_t W;
|
||||||
|
|
||||||
|
void setstart() {
|
||||||
|
start=iaddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setstop() {
|
||||||
|
stop=iaddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setinput(int bit) {
|
||||||
|
uint64_t mask=1;
|
||||||
|
mask=mask<<bit;
|
||||||
|
iopat &= ~mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setoutput(int bit) {
|
||||||
|
uint64_t mask=1;
|
||||||
|
mask=mask<<bit;
|
||||||
|
iopat |= mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setclk(int bit) {
|
||||||
|
uint64_t mask=1;
|
||||||
|
mask=mask<<bit;
|
||||||
|
iopat |= mask;
|
||||||
|
clkpat |= mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearbit(int bit){
|
||||||
|
uint64_t mask=1;
|
||||||
|
mask=mask<<bit;
|
||||||
|
// printf("CB %d %016llx %016llx ",bit, pat, mask);
|
||||||
|
pat &= ~mask;
|
||||||
|
// printf("%016llx\n", pat);
|
||||||
|
}
|
||||||
|
void setbit(int bit){
|
||||||
|
uint64_t mask=1;
|
||||||
|
mask=mask<<bit;
|
||||||
|
// printf("SB %d %016llx %016llx ",bit, pat, mask);
|
||||||
|
pat |= mask;
|
||||||
|
// printf("%016llx\n", pat);
|
||||||
|
}
|
||||||
|
|
||||||
|
int checkbit(int bit) {
|
||||||
|
uint64_t mask=1;
|
||||||
|
mask=mask<<bit;
|
||||||
|
return (pat & mask ) >>bit;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setstartloop(int iloop) {
|
||||||
|
if (iloop>=0 && iloop<MAXLOOPS)
|
||||||
|
startloopaddr[iloop]=iaddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setstoploop(int iloop) {
|
||||||
|
if (iloop>=0 && iloop<MAXLOOPS)
|
||||||
|
stoploopaddr[iloop]=iaddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setnloop(int iloop, int n) {
|
||||||
|
if (iloop>=0 && iloop<MAXLOOPS)
|
||||||
|
nloop[iloop]=n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setwaitpoint(int iloop) {
|
||||||
|
if (iloop>=0 && iloop<MAXTIMERS)
|
||||||
|
waitaddr[iloop]=iaddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setwaittime(int iloop, uint64_t t) {
|
||||||
|
if (iloop>=0 && iloop<MAXTIMERS)
|
||||||
|
waittime[iloop]=t;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void pw(){
|
||||||
|
fprintf(fd,"patword %04x %016llx\n",iaddr, pat);
|
||||||
|
iaddr++;
|
||||||
|
if (iaddr>=MAXWORDS) printf("ERROR: too many word in the pattern (%d instead of %d)!",iaddr, MAXWORDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
main(void) {
|
||||||
|
int iloop=0;
|
||||||
|
fd=fopen(OUTFILE,"w");
|
||||||
|
|
||||||
|
#include INFILE
|
||||||
|
|
||||||
|
fprintf(fd,"patctrl %016llx\n",iopat);
|
||||||
|
fprintf(fd,"patclkctrl %016llx\n",clkpat);
|
||||||
|
fprintf(fd,"patlimits %04x %04x\n",start, stop);
|
||||||
|
|
||||||
|
for (iloop=0; iloop<MAXLOOPS; iloop++) {
|
||||||
|
fprintf(fd,"loop%d %04x %04x\n",iloop, startloopaddr[iloop], stoploopaddr[iloop]);
|
||||||
|
if ( startloopaddr[iloop]<0 || stoploopaddr[iloop]<= startloopaddr[iloop]) nloop[iloop]=0;
|
||||||
|
fprintf(fd,"nloop%d %d\n",iloop, nloop[iloop]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (iloop=0; iloop<MAXTIMERS; iloop++) {
|
||||||
|
fprintf(fd,"wait%d %04x\n",iloop, waitaddr[iloop]);
|
||||||
|
if (waitaddr[iloop]<0) waittime[iloop]=0;
|
||||||
|
fprintf(fd,"waittime%d %lld\n",iloop, waittime[iloop]);
|
||||||
|
}
|
||||||
|
|
||||||
|
close((int)fd);
|
||||||
|
}
|
197
slsDetectorSoftware/patternGenerator/test.p
Normal file
197
slsDetectorSoftware/patternGenerator/test.p
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
//define signals and directions (Input, outputs, clocks)
|
||||||
|
|
||||||
|
|
||||||
|
#define compTestIN 1
|
||||||
|
setoutput(compTestIN);
|
||||||
|
|
||||||
|
#define curON 32
|
||||||
|
setoutput(curON);
|
||||||
|
|
||||||
|
#define side_clk 2
|
||||||
|
setclk(side_clk);
|
||||||
|
|
||||||
|
#define side_din 3
|
||||||
|
setoutput(side_din);
|
||||||
|
|
||||||
|
#define clear_shr 4
|
||||||
|
setoutput(clear_shr);
|
||||||
|
|
||||||
|
#define bottom_din 5
|
||||||
|
setoutput(bottom_din);
|
||||||
|
|
||||||
|
#define bottom_clk 6
|
||||||
|
setclk(bottom_clk);
|
||||||
|
|
||||||
|
#define gHG 7
|
||||||
|
setoutput(gHG);
|
||||||
|
|
||||||
|
#define bypassCDS 31
|
||||||
|
setoutput(bypassCDS);
|
||||||
|
|
||||||
|
|
||||||
|
#define ENprechPRE 8
|
||||||
|
setoutput(ENprechPRE);
|
||||||
|
|
||||||
|
|
||||||
|
#define res 9
|
||||||
|
setoutput(res);
|
||||||
|
|
||||||
|
#define pulseOFF 30
|
||||||
|
setoutput(pulseOFF);
|
||||||
|
|
||||||
|
#define connCDS 27
|
||||||
|
setoutput(connCDS);
|
||||||
|
|
||||||
|
#define Dsg_1 24
|
||||||
|
setoutput(Dsg_1);
|
||||||
|
|
||||||
|
|
||||||
|
#define Dsg_2 25
|
||||||
|
setoutput(Dsg_2);
|
||||||
|
|
||||||
|
|
||||||
|
#define Dsg_3 23
|
||||||
|
setoutput(Dsg_3);
|
||||||
|
|
||||||
|
#define sto0 10
|
||||||
|
setoutput(sto0);
|
||||||
|
|
||||||
|
#define sto1 11
|
||||||
|
setoutput(sto1);
|
||||||
|
|
||||||
|
#define sto2 12
|
||||||
|
setoutput(sto2);
|
||||||
|
|
||||||
|
#define resCDS 13
|
||||||
|
setoutput(resCDS);
|
||||||
|
|
||||||
|
#define prechargeConnect 14
|
||||||
|
setoutput(prechargeConnect);
|
||||||
|
|
||||||
|
#define pulse 15
|
||||||
|
setoutput(pulse);
|
||||||
|
|
||||||
|
#define PCT_mode 21
|
||||||
|
setoutput(PCT_mode);
|
||||||
|
|
||||||
|
#define res_DGS 16
|
||||||
|
setoutput(res_DGS);
|
||||||
|
|
||||||
|
#define adc_ena 17
|
||||||
|
setoutput(adc_ena);
|
||||||
|
|
||||||
|
|
||||||
|
#define CLKBIT 18
|
||||||
|
setclk(CLKBIT);
|
||||||
|
|
||||||
|
|
||||||
|
#define adc_sync 19
|
||||||
|
setoutput(adc_sync);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define PW pw()
|
||||||
|
#define SB(x) setbit(x)
|
||||||
|
#define CB(x) clearbit(x)
|
||||||
|
#define CLOCK clearbit(CLKBIT); pw();setbit(CLKBIT);pw()
|
||||||
|
#define LCLOCK clearbit(CLKBIT); pw();setbit(CLKBIT);pw();clearbit(CLKBIT); pw()
|
||||||
|
#define CLOCKS(x) for (i=0;i<x;i++) {clearbit(CLKBIT);pw(); setbit(CLKBIT); pw();}
|
||||||
|
#define STOP setstop();
|
||||||
|
#define START setstart();
|
||||||
|
#define REPEAT(x) for (i=0;i<(x);i++) {pw();}
|
||||||
|
#define DOFOR(x) for (j=0;j<(x);j++) {
|
||||||
|
// }
|
||||||
|
#define STARTUP1 CB(compTestIN);SB(clear_shr);CB(side_clk);CB(side_din);CB(bottom_din);CB(bottom_clk);
|
||||||
|
#define STARTUP2 CB(pulse);SB(PCT_mode);SB(pulseOFF);CB(curON);
|
||||||
|
#define STARTUP3 SB(res);SB(gHG);SB(ENprechPRE);
|
||||||
|
#define STARTUP4 SB(bypassCDS); CB(connCDS);CB(sto0);SB(sto1);SB(sto2);
|
||||||
|
#define STARTUP5 SB(resCDS);CB(Dsg_1);CB(Dsg_2);SB(Dsg_3);CB(prechargeConnect);SB(res_DGS);
|
||||||
|
#define STARTUP STARTUP1 STARTUP2 STARTUP3 STARTUP4 STARTUP5 PW;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//****NOTES****//
|
||||||
|
//FUNCTIONS
|
||||||
|
//Declare functions at the beginning
|
||||||
|
void load_pix(int nx, int ny)
|
||||||
|
{//SELECT PIXEL 1,1 for readout
|
||||||
|
SB(clear_shr);PW;PW;
|
||||||
|
CB(clear_shr);PW;PW;PW;PW;
|
||||||
|
|
||||||
|
SB(side_din);PW;
|
||||||
|
SB(side_clk);PW;
|
||||||
|
CB(side_din);
|
||||||
|
setstartloop(0); //loop on the rows
|
||||||
|
SB(side_clk);PW;
|
||||||
|
setstoploop(0); //finish loop on the rows
|
||||||
|
setnloop(0,ny); //set number row selected -can be changed dynamically
|
||||||
|
CB(side_clk);PW;
|
||||||
|
SB(bottom_din);PW;
|
||||||
|
SB(bottom_clk);PW;
|
||||||
|
CB(bottom_din);
|
||||||
|
setstartloop(1); //loop on the columns
|
||||||
|
SB(bottom_clk);PW;
|
||||||
|
setstoploop(1); //loop on the columns
|
||||||
|
setnloop(1,ny); //set number columns selected -can be changed dynamically
|
||||||
|
}
|
||||||
|
|
||||||
|
void load_col(void)
|
||||||
|
{//SELECT COLUMN 1 for readout
|
||||||
|
SB(clear_shr);PW;PW;
|
||||||
|
CB(clear_shr);PW;PW;PW;PW;
|
||||||
|
SB(bottom_din);PW;
|
||||||
|
SB(bottom_clk);PW;
|
||||||
|
CB(bottom_clk);PW;
|
||||||
|
CB(bottom_din);PW;
|
||||||
|
}
|
||||||
|
//END of FUNCTIONS
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//LET'S BYPASS PREAMP AND CDS and write on preamp out.//
|
||||||
|
//THIS ALLOWS CHECKING SOURCE FOLLOWERS //
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
PW;
|
||||||
|
SB(5); PW;
|
||||||
|
CB(5); PW;
|
||||||
|
|
||||||
|
START; //pattern starts from here
|
||||||
|
STARTUP;
|
||||||
|
setwaitpoint(0); //set wait points
|
||||||
|
PW;
|
||||||
|
setwaittime(0,20); //wait time - can be changed dynamically
|
||||||
|
SB(adc_ena);PW;
|
||||||
|
SB(adc_sync);
|
||||||
|
CB(gHG);
|
||||||
|
setwaitpoint(1); //set wait points
|
||||||
|
setwaittime(1,16); //wait time - can be changed dynamically
|
||||||
|
CB(adc_sync);PW;
|
||||||
|
//NB: We have to SELECT A PIXEL to enable column out.
|
||||||
|
//SELECT PIXEL 1,1 for readout
|
||||||
|
load_pix(10, 20);
|
||||||
|
|
||||||
|
CB(res);
|
||||||
|
//CB(Dsg_3);PW;
|
||||||
|
CB(res_DGS);
|
||||||
|
setwaitpoint(2); //set wait points
|
||||||
|
setwaittime(2,1000); //wait time - can be changed dynamically
|
||||||
|
|
||||||
|
//SB(res_DGS);
|
||||||
|
//PW;
|
||||||
|
//SB(Dsg_3);
|
||||||
|
//
|
||||||
|
//CB(connCDS);
|
||||||
|
//TEST SIGNALS END
|
||||||
|
//
|
||||||
|
REPEAT(20)
|
||||||
|
|
||||||
|
//****************//
|
||||||
|
//*FINAL COMMANDS*//
|
||||||
|
//****************//
|
||||||
|
CB(adc_ena);PW;
|
||||||
|
//STARTUP;
|
||||||
|
STOP; PW; //stops here
|
||||||
|
//REPEAT(4);
|
Loading…
x
Reference in New Issue
Block a user