#include "util.h" #include "mcu_port.h" #include "jtag.h" #include "daq.h" extern struct QSPI gqspi; #define MAXCHAN 512 //max number of channels, in reality 4*128*7 #define MAXEVENTSIZE ((MAXCHAN+10)*4)*sizeof(short) struct EVBUF { char padding[8];//really 4 bytes used by datasink_sendData unsigned char buf[MAXEVENTSIZE]; }gevbuf; int daq_init() { int ii; unsigned short value; char stxt[80]; //"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" // init QSPI inteface //setup QSPI registers gqspi.qdlyr = //0x0202; // the QDLYR settings takes effect only if MCF_QSPI_QCR_DT is set //MCF_QSPI_QDLYR_QCD(0x2) | //delay CS-CLK MCF_QSPI_QDLYR_QCD(0x6) | //delay CS-CLK MCF_QSPI_QDLYR_DTL(0x2) ; //delay after transfer gqspi.qmr = //0xb308; MCF_QSPI_QMR_MSTR | //MCF_QSPI_QMR_BITS(0xc)| //12 bits MCF_QSPI_QMR_BITS_16 | //MCF_QSPI_QMR_BITS(0x0) | //16 bits //MCF_QSPI_QMR_CPOL | //CLK polarity MCF_QSPI_QMR_CPHA | //CLK pase //MCF_QSPI_QMR_BAUD(0x8) ; //baud rate = 4.688 MHz MCF_QSPI_QMR_BAUD(0x2); //baud rate = 18.75 MHz gqspi.qwr = //0x0f00; MCF_QSPI_QWR_ENDQP(0xf); gqspi.qir = //0xd00f; MCF_QSPI_QIR_WCEFB | MCF_QSPI_QIR_ABRTB | MCF_QSPI_QIR_ABRTL | MCF_QSPI_QIR_WCEF | MCF_QSPI_QIR_ABRT | MCF_QSPI_QIR_SPIF; gqspi.qcr = //0xd100; MCF_QSPI_QCR_CONT | //CS remain asserted after transfer of 16 words MCF_QSPI_QCR_BITSE | //MCF_QSPI_QCR_DT | MCF_QSPI_QCR_DSCK | MCF_QSPI_QCR_CS(1) ; //select only CS8 MCF_QSPI_QMR = gqspi.qmr; MCF_QSPI_QDLYR = gqspi.qdlyr; MCF_QSPI_QIR = gqspi.qir; MCF_QSPI_QWR = gqspi.qwr; //setup command RAM //select first command RAM entry MCF_QSPI_QAR = 0x0020; for(ii=0;ii<16;ii++) MCF_QSPI_QDR = gqspi.qcr; } unsigned short gqspi_pattern; void print_qspy() { static char string1[80]="print_qspy\n"; sprintf(string1,"QMR=%04x, QDLYR=%04x, QWR=%04x, QIR=%04x, QAR=%04x, QDR=%04x=%04x\n", MCF_QSPI_QMR,MCF_QSPI_QDLYR,MCF_QSPI_QWR,MCF_QSPI_QIR,MCF_QSPI_QAR,MCF_QSPI_QDR,gqspi_pattern); printl(string1); //print_qspy_ram(0,80); } extern unsigned long gcycle; //int gDBG_one_shot = 0; // set in debugger for single operation int gDBG_print_event = 0;//print everything extern int datasink_active; int process_event() { unsigned short *pev; unsigned long *pevh = (unsigned long*)gevbuf.buf; int evsize=0,ii,i1; char txt[80]; gqspi_pattern = (unsigned short)(gcycle << 4); //Update baud rate and delays. useful for debugging: set gqspi.qmr=xxxx MCF_QSPI_QDLYR = gqspi.qdlyr; MCF_QSPI_QMR = gqspi.qmr; //update QMR, the gqspi_qmr could be changed by debugger //MCF_QSPI_QMR = gqspi_qmr; //update QCRs, the gqspi_qcr could be changed by debugger //MCF_QSPI_QAR = 0x0020; for(ii=0;ii<16;ii++) MCF_QSPI_QDR = gqspi_qcr; //update data MCF_QSPI_QAR = 0x0000; evsize = jtag_check_fifo(); if(gDBG_print_event&1) {sprintf(txt,"FIFO has 0x%03x words\n",evsize); printl(txt);} if(evsize*sizeof(short)>MAXEVENTSIZE) { sprintf(txt,"Event size 0x%x too big\n",evsize); printl(txt); return 1; } if(evsize==0) return 0; //set event header *pevh = evsize*sizeof(short) + sizeof(*pevh); //assuming the MSB byte is 0 for this type of event pev = (unsigned short*)(pevh+1); MCF_QSPI_QAR = 0x0000; for (ii=16; ii>=0; --ii) { //MCF_QSPI_QDR = gqspi_pattern + ii; //Write pattern for debugging //&RA if shifting something in then there will be spikes on CS lines // let's keep the transfer as clean as possible MCF_QSPI_QDR = 0; } MCF_QSPI_QAR = 0x0000; //read event for(i1 = (evsize-1)/16 + 1; i1>=0 ;--i1) { MCF_QSPI_QIR = gqspi.qir; //clear SPIF and possible errors // start transfer MCF_QSPI_QDLYR = gqspi.qdlyr | MCF_QSPI_QDLYR_SPE; MCF_QSPI_QAR = 0x0010;//prepare for readout //wait until it is finished while((MCF_QSPI_QIR & MCF_QSPI_QIR_SPIF)==0); //it is wise to check here the error conditions //print_qspy(); //ii = (i1==1) ? (evsize-1)%16 + 1 : 16; ii=16; for(;ii>0;--ii) *pev++ = MCF_QSPI_QDR; } //print_qspy(); if(gDBG_print_event) { if(gDBG_print_event&2) {sprintf(txt,"Event read %08x:\n",*pevh); printl(txt);} if(gDBG_print_event&4) { pev = (unsigned short*)(pevh+1); for(ii=0;iidaq_send_header(0x%x)\n",evtype);printl(txt); evbuf.ev = ((evtype&0xff)<<24) | sizeof(evbuf.ev); sprintf(txt,"0x%x\n",evbuf.ev);printl(txt); ii=datasink_sendData(&(evbuf.ev),sizeof(evbuf.ev)); sprintf(txt,"Sent 0x%x bytes out of 0x%x header=0x%2x\n", ii,sizeof(evbuf.ev),evtype&0xff); printl(txt); } int daq_send_start_run(){ return daq_send_header(DAQ_EVTYPE_START_RUN);} int daq_send_stop_run(){ return daq_send_header(DAQ_EVTYPE_STOP_RUN);} ///""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" int daq_run() { //if(!gDBG_one_shot) return 0; if(gDBG_one_shot == 1) gDBG_one_shot = 0; if(jtag_check_fifo()) { process_event(); } }