#include #include #include #include #include #include #include #include #include #include #include #include #include #define NCH 18 #define NCHIP 4 #define NDIM 400 #define A16D16 "/dev/vme16d16" #define ADDRESS_DSP 0x6000 // <-- #define SIZE_DSP 0x20 // <-- #define ADR_VERSION 0x00 // check board version; read only #define ADR_MODE1 0x02 // mode set register 1 #define ADR_MODE2 0x04 // mode set register 2 #define ADR_SPW 0x06 // strobe pulse width #define ADR_STATUS 0x08 // status #define ADR_RESET 0x0a // software reset; write only #define ADR_IO1L 0x18 // I/O 1 lower 16 bit #define ADR_IO1H 0x1a // I/O 1 higher 16 bit #define ADR_IO2L 0x1c // I/O 2 lower 16 bit #define ADR_IO2H 0x1e // I/O 2 higher 16 bit #define CMD_TEST 0x0000 // test buffer #define CMD_RESET 0x0010 // reset #define CMD_CLEAR 0x0020 // clear #define CMD_NREP_HDREAD 0x0030 // set the number of repetition #define CMD_DACCLRALL 0x0080 // ---- #define CMD_DACSET 0x0090 //[*] set DAC value #define CMD_ASIC_INITALL 0x0100 // initialize all the ASIC #define CMD_ASIC_INIT 0x0200 //[*] initialize one ASIC #define CMD_ASIC_PRMSHIFT 0x0210 // shift parameter values #define CMD_ASIC_PRMSET 0x0220 //[*] set ASIC register #define CMD_ASIC_PRMREADBACK 0x0230 // readback #define CMD_CSR0 0x0240 // set CSR0 #define CMD_CSR1 0x0250 // set CSR1 #define VME_D16(x) ( *((unsigned short *) (x))) size_t size_dsp=SIZE_DSP; // <-- unsigned long addr_dsp=ADDRESS_DSP; // <-- char * vme_mem; // <-- int fd; //a16d16 mem space unsigned short flag=0; unsigned short offset[72]; unsigned short threshold[4]={2000,2000,2000,2000}; unsigned short delay=0; unsigned short chip[NCHIP]={0,1,4,5}; // # DAC A1 A2 C1 C2 unsigned short val; int vmeinit(){ int pagesize = getpagesize(); off_t vmeoffset = (off_t)addr_dsp / pagesize * pagesize; off_t res = (off_t)addr_dsp % pagesize; // - for VME if((fd = open(A16D16, O_RDWR)) == -1 ){ perror("open"); exit(1); } if((vme_mem = mmap(0,size_dsp+res,PROT_WRITE|PROT_READ,MAP_SHARED,fd,vmeoffset)) == (caddr_t)-1){ perror("mmap_dsp"); exit(1); } vme_mem+=res; // DSP8230 initialization fprintf(stderr, "DSP module ID: 0x%04x\n",VME_D16(vme_mem) ); // for debug (can be removed) return 0; } /* ------------------- optparse ----------------- */ void optparse(argc, argv) int argc; char *argv[]; { FILE *fp; char filename[256]; int dum; register char *c; unsigned short i; int ch,data; int ndim=NDIM; char line[NDIM]; char cmd[200]; /* set values to defaults */ for (i=0;i 0) /* Process options */ { if(*(c = *++argv) == '-') { switch(*++c | 0x20) { case 'f': sscanf (c+1, "=%s", filename); fp=fopen(filename,"r"); while (fgets(line,ndim,fp)!=NULL) { if (line[0]=='#') continue; if (!sscanf(line,"%s%d%d",cmd,&ch,&data)) continue; data &= 0xFFFF; if (strstr(cmd ,"T" ) != NULL) threshold[ch]=data; if (strstr(cmd ,"O" ) != NULL) offset[ch]=data; } fclose(fp); printf("Constants read from %s\n",filename); break; case 'o': sscanf (c+1, "=%d", &dum); for (i=0;i %x %x\n",j, ((offset[j+i*NCH]<<3) | flag ), VME_D16(vme_mem+ADR_IO1L)); } // # veto enable etc. VME_D16(vme_mem+ADR_IO2H)=CMD_ASIC_PRMSHIFT; VME_D16(vme_mem+ADR_IO2L)=0x233; VME_D16(vme_mem+ADR_IO2H)=CMD_CSR0; // # delay = 9; clock cycle = 3 VME_D16(vme_mem+ADR_IO2H)=CMD_ASIC_PRMSHIFT; VME_D16(vme_mem+ADR_IO2L)=(delay << 16 )| 0x03; VME_D16(vme_mem+ADR_IO2H)=CMD_CSR1; return 0; } int main(int argc, char **argv){ if (argc<2) { fprintf(stderr,"Usage:%s -f= -d=\n",argv[0]); fprintf(stderr,"Usage:%s -t= -o= -b=\n",argv[0]); exit(0); } optparse(argc,argv); vmeinit(); boot(); return 0; }