/** * @author Ian Johnson * @version 1.0 */ /*#include #include */ #include #include #include #include "xparameters.h" #include "Feb.h" void Feb_Feb(){ Feb_nfebs = 0; Feb_feb_numb = 0; Feb_send_ndata = 0; Feb_send_buffer_size = 1026; Feb_send_data_raw = malloc((Feb_send_buffer_size+1)*sizeof(int)); Feb_send_data = &Feb_send_data_raw[1]; Feb_recv_ndata = 0; Feb_recv_buffer_size = 1026; Feb_recv_data_raw = malloc((Feb_recv_buffer_size+1)*sizeof(int)); Feb_recv_data = &Feb_recv_data_raw[1]; Local_LocalLinkInterface1(ll,XPAR_PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_RIGHT_BASEADDR); } /* ~Feb(){ delete ll; if(feb_numb) delete [] feb_numb; delete [] send_data_raw; delete [] recv_data_raw; } */ void Feb_SendCompleteFebList(unsigned int n,unsigned int* list){ unsigned int i; if(Feb_feb_numb) free(Feb_feb_numb); Feb_nfebs = n; Feb_feb_numb = malloc(n*sizeof(unsigned int)); for(i=0;i0xfff) return 0; Feb_send_data_raw[0] = 0x90000000 | (ch<<16); //we if(Local_Write(ll,4,Feb_send_data_raw)!=4) return 0; Feb_send_data_raw[0] = 0xc0000000; //data return 1;//((Feb_send_ndata+1)*4==Local_Write(ll,(Feb_send_ndata+1)*4,Feb_send_data_raw)); } int Feb_ReadFrom(unsigned int ch, unsigned int ntrys){ unsigned int t; if(ch>=0xfff) return 0; Feb_recv_data_raw[0] = 0xa0000000 | (ch<<16); //read data Local_Write(ll,4,Feb_recv_data_raw); usleep(20); Feb_recv_ndata=-1; for(t=0;t0){ Feb_recv_ndata--; break; } printf("\t Read try number: %d\n",t); usleep(1000); } return (Feb_recv_ndata>=0); } void Feb_PrintData(){ int i; printf("Sent data: %d\n",Feb_send_ndata); for(i=0;i1&&Feb_recv_ndata>1){ printf("\t\t Tail sent: %d (0x%x) receiver: %d (0x%x)\n",Feb_send_data[Feb_send_ndata-1],Feb_send_data[Feb_send_ndata-1],Feb_recv_data[Feb_recv_ndata-1],Feb_recv_data[Feb_recv_ndata-1]); }else{ printf("Error printing tail, too little data nsent = 0x%x, nrecv = 0x%x.\n",Feb_send_ndata, Feb_recv_ndata); } Feb_PrintData(); } return header_returned_is_ok; } int Feb_CheckTail(unsigned int valid_bit_mask){ if(Feb_send_ndata<=1&&Feb_recv_ndata<=1){ printf("Error checking tail, too little data nsent = %d, nrecv = %d.\n",Feb_send_ndata, Feb_recv_ndata); return 0; } unsigned int the_tail = Feb_recv_data[Feb_recv_ndata-1]&valid_bit_mask; if(the_tail!=0){ printf("Error returned in tail: 0x%x (%d)\n",the_tail,the_tail); if(the_tail&0x10000000) printf("\t\tBusy flag address error.\n"); if(the_tail&0x20000000) printf("\t\tRead register address error.\n"); if(the_tail&0x40000000) printf("\t\tWrite register address error.\n"); if(the_tail&0x80000000) printf("\t\tBram number error.\n"); if(the_tail&0x08000000) printf("\t\tFifo to read from error.\n"); if(the_tail&0x3ff) printf("\t\tNumber of data send error.\n"); return 0; //error } return 1; } int Feb_CheckCommunication(){ Feb_send_data_raw[0] = 0x8fff0000; //rst-all serial coms and lls if(Local_Write(ll,4,Feb_send_data_raw)!=4) return 0; printf("CheckingCommunication ....\n"); while((Local_Read(ll,Feb_recv_buffer_size*4,Feb_recv_data_raw)/4)>0) printf("\t) Cleanning buffer ...\n"); return Feb_SetByteOrder(); } int Feb_SetByteOrder(){ unsigned int i; Feb_send_ndata = 2; Feb_send_data[0] = 0; //header Feb_send_data[1] = 0; //tail unsigned int dst = 0xff; for( i=0;i=nfebs){ cout<<"Error invalid sub number "<Feb_send_buffer_size-2) return 0; Feb_send_ndata = nreads+2; Feb_send_data[0] = 0x20000000 | nreads << 14; //cmd -> read "00" , nreads for(i=0;iFeb_send_buffer_size-2) return 0; //cout<<"Write register : "< write nwrites and how many Feb_send_data[2*nwrites+1] = 0; //tail for(i=0;iFeb_send_buffer_size-2) return 0; Feb_send_ndata = nwrites+2; Feb_send_data[0] = 0xc0000000 | mem_num << 24 | nwrites << 14 | start_address; //cmd -> write to memory, nwrites, mem number, start address Feb_send_data[nwrites+1] = 0; //tail for(i=0;i