Exemple #1
0
int main(int argc, char* argv[]) 
{
    sys_stat stat;
	int rtn;

	
    fpga_reg_wr(0x400,0xA5A5A5A5);
    rtn = fpga_reg_rd(0x400);          //Read version register
    printf("Register : %0x\n",rtn);


	return 0;
}                 
int main(int argc, char *argv[]) {

    FILE *in_file;
    FILE *out_file;
    char *file_header;
    char *file_data;
    int rtn;
    int sent = 0;
    int recv = 0;
    int len = 512*512;
    FILE *file;
    char *buffer;
    unsigned long fileLen;
    if(argc != 3) {
        printf("Wrong number of arguments\n");
        return -1;
    }
    in_file = fopen(argv[1],"rb");
    if (!in_file)
    {
	fprintf(stderr, "Unable to open image file\n");
	return;
    }
    file_header=(char *)malloc(header_size);
    fread(file_header, 1, header_size, in_file);
    //Save file data
    file_data=(char *)malloc(image_size);
    fread(file_data, 4, image_size, in_file);
    //Close the image file
    fclose(in_file);
    //Open a new file to store the result
    out_file = fopen(argv[2],"wb");
    //Store image header
    fwrite(file_header, 1, header_size, out_file);
    //Open partial bitstream file
    //Reset user logic
    rtn = fpga_reg_wr(UCTR_REG,0x0);
    rtn = fpga_reg_wr(UCTR_REG,0x1);
    rtn = fpga_reg_wr(CTRL_REG,0x0);
    rtn = fpga_reg_wr(CTRL_REG,0x1);
    while(sent < len){
        rtn = fpga_send_data(USERPCIE1,(unsigned char *) file_data+sent,512,1);
        rtn = fpga_send_data(USERPCIE2,(unsigned char *) file_data+sent+512,512,1);
        rtn = fpga_send_data(USERPCIE3,(unsigned char *) file_data+sent+1024,512,1);
        rtn = fpga_reg_wr(0x400,0x1);
        rtn = fpga_recv_data(USERPCIE1,(unsigned char *) gDATA+recv,512,1);
	rtn = fpga_reg_wr(0x400,0x0);
	sent += 512;
        recv += 512;
    }
    fwrite(gDATA,1,image_size+2,out_file);
    fclose(out_file);
    free(file_header);
    free(file_data);
    return 0;
}
Exemple #3
0
/*Function to issue a soft reset to the user logic
  Input : Reset active polarity
  The function initially deasserts the reset, then asserts and again deasserts*/
void user_soft_reset(unsigned int polarity) {
   int rtn;
   rtn = fpga_reg_rd(UCTR_REG); 
   if(polarity == 0) {
      fpga_reg_wr(UCTR_REG,rtn & 0xFFFFFFFF);
      fpga_reg_wr(UCTR_REG,rtn & 0xFFFFFFFE);
      fpga_reg_wr(UCTR_REG,rtn & 0xFFFFFFFF);
  }
  else {
      fpga_reg_wr(UCTR_REG,rtn & 0xFFFFFFFE);
      fpga_reg_wr(UCTR_REG,rtn & 0xFFFFFFFF);
      fpga_reg_wr(UCTR_REG,rtn & 0xFFFFFFFE);
  }
}
Exemple #4
0
/* Receiving data functions. */
int fpga_recv_data(DMA_PNT dest, unsigned char * recvdata, int recvlen, unsigned int addr) {
        unsigned int rtn;
        unsigned int len;
        unsigned int size;
        unsigned int amt;
        unsigned int buf = 10;
        unsigned int pre_buf = 11;
        unsigned int tmp_buf;
        unsigned int ddr_addr;
        int copyd = 0;
        int sent = 0;
        int pre_amt = 0;
        if(dest == USERPCIE1){
            len = recvlen;
            size = BUF_SIZE;
            amt = len < size ? len : size;
            rtn = write(fpgaDev->intrFds[buf], NULL, 0);
            fpga_reg_wr(USER1_PC_DMA_SYS,rtn);
            fpga_reg_wr(USER1_PC_DMA_LEN,amt);
            fpga_reg_wr(CTRL_REG,RECV_USER1_DATA|0x00000001);
            sent += amt;
            pre_amt = amt; 
            while(1){
               fpga_wait_interrupt(user1host);          //Wait for interrupt from first buffer
               if (sent < len) { 
                   rtn = write(fpgaDev->intrFds[pre_buf], NULL, 0);  //just to get the DMA buffer address
                   amt = (len-sent < size ? len-sent : size); 
                   fpga_reg_wr(USER1_PC_DMA_SYS,rtn);
                   fpga_reg_wr(USER1_PC_DMA_LEN,amt);
                   fpga_reg_wr(CTRL_REG,RECV_USER1_DATA|0x00000001);
                   sent += amt;               
               }
               rtn = read(fpgaDev->intrFds[buf],recvdata+copyd,pre_amt);
               copyd += pre_amt;
               if (copyd >= len) {
                   return copyd;
               }
               pre_amt = amt;              
               tmp_buf = buf;
               buf = pre_buf;
               pre_buf = tmp_buf; 
            }
        }        
        else if(dest == USERPCIE2){
            copyd = 0;
            len = recvlen;
            size = BUF_SIZE;
            amt = len < size ? len : size;
            rtn = write(fpgaDev->intrFds[buf], NULL, 0);
            fpga_reg_wr(USER2_PC_DMA_SYS,rtn);
            fpga_reg_wr(USER2_PC_DMA_LEN,amt);
            fpga_reg_wr(CTRL_REG,RECV_USER2_DATA|0x00000001);
            sent += amt;
            pre_amt = amt; 
            while(1){
                fpga_wait_interrupt(user2host);          //Wait for interrupt from first buffer
                if (sent < len) { 
                    rtn = write(fpgaDev->intrFds[pre_buf], NULL, 0);  //just to get the DMA buffer address
                    amt = (len-sent < size ? len-sent : size); 
                    fpga_reg_wr(USER2_PC_DMA_SYS,rtn);
                    fpga_reg_wr(USER2_PC_DMA_LEN,amt);
                    fpga_reg_wr(CTRL_REG,RECV_USER2_DATA|0x00000001);
                    sent += amt;               
               }
               rtn = read(fpgaDev->intrFds[buf],recvdata+copyd,pre_amt);
               copyd += pre_amt;
               if (copyd >= len) {
                   return copyd;
               }
               pre_amt = amt;              
               tmp_buf = buf;
               buf = pre_buf;
               pre_buf = tmp_buf; 
            } 
        }   
        else if(dest == USERPCIE3){
            len = recvlen;
            size = BUF_SIZE;
            amt = len < size ? len : size;
            rtn = write(fpgaDev->intrFds[buf], NULL, 0);
            fpga_reg_wr(USER3_PC_DMA_SYS,rtn);
            fpga_reg_wr(USER3_PC_DMA_LEN,amt);
            fpga_reg_wr(CTRL_REG,RECV_USER3_DATA|0x00000001);
            sent += amt;
            pre_amt = amt; 
            while(1){
               fpga_wait_interrupt(user3host);          //Wait for interrupt from first buffer
               if (sent < len) { 
                   rtn = write(fpgaDev->intrFds[pre_buf], NULL, 0);  //just to get the DMA buffer address
                   amt = (len-sent < size ? len-sent : size); 
                   fpga_reg_wr(USER3_PC_DMA_SYS,rtn);
                   fpga_reg_wr(USER3_PC_DMA_LEN,amt);
                   fpga_reg_wr(CTRL_REG,RECV_USER3_DATA|0x00000001);
                   sent += amt;               
               }
               rtn = read(fpgaDev->intrFds[buf],recvdata+copyd,pre_amt);
               copyd += pre_amt;
               if (copyd >= len) {
                   return copyd;
               }
               pre_amt = amt;              
               tmp_buf = buf;
               buf = pre_buf;
               pre_buf = tmp_buf; 
            } 
        }
        else if(dest == USERPCIE4){
            len = recvlen;
            size = BUF_SIZE;
            amt = len < size ? len : size;
            rtn = write(fpgaDev->intrFds[buf], NULL, 0);
            fpga_reg_wr(USER4_PC_DMA_SYS,rtn);
            fpga_reg_wr(USER4_PC_DMA_LEN,amt);
            fpga_reg_wr(CTRL_REG,RECV_USER4_DATA|0x00000001);
            sent += amt;
            pre_amt = amt; 
            while(1){
               fpga_wait_interrupt(user4host);          //Wait for interrupt from first buffer
               if (sent < len) { 
                   rtn = write(fpgaDev->intrFds[pre_buf], NULL, 0);  //just to get the DMA buffer address
                   amt = (len-sent < size ? len-sent : size); 
                   fpga_reg_wr(USER4_PC_DMA_SYS,rtn);
                   fpga_reg_wr(USER4_PC_DMA_LEN,amt);
                   fpga_reg_wr(CTRL_REG,RECV_USER4_DATA|0x00000001);
                   sent += amt;               
               }
               rtn = read(fpgaDev->intrFds[buf],recvdata+copyd,pre_amt);
               copyd += pre_amt;
               if (copyd >= len) {
                   return copyd;
               }
               pre_amt = amt;              
               tmp_buf = buf;
               buf = pre_buf;
               pre_buf = tmp_buf; 
            } 
        }
        else
            printf("Wrong destination\n");
    return 0;                
}
Exemple #5
0
/*The main function used to send PCIe data to the SWITCH DDR interface and the PCIe user stream interfaces
    inputs :  destination type (ddr, user1, user2 etc)
            data buffer holdin the send data
            total length of the transfer
            target address in case of data transfer to DDR and blocking-non blocking indication in case of user data transfer
    output :  Returns total number of bytes sent
    The function rounds the transfer size to 64byte boundary for PCIe packet requirement
    The total transfer data is divided into 4MB chunks to fit into the host DMA buffers.
*/
int fpga_send_data(DMA_PNT dest, unsigned char * senddata, int sendlen, unsigned int addr) {
        unsigned int rtn;
        unsigned int len;
        unsigned int ddr_addr;
        unsigned int size = BUF_SIZE;
        unsigned int amt;
        unsigned int buf;
        unsigned int pre_buf;
        unsigned int tmp_buf;
        int sent = 0;
        if(dest == ICAP){
            buf = 0;
            pre_buf = 1;
            ddr_addr = addr;
            len = (sendlen+63)&0xFFFFFFC0;                         //Align length to 64 bytes
            // Send initial transfer request.
            amt = len < size ? len : size;
            rtn = write(fpgaDev->intrFds[0], senddata, amt);
            fpga_reg_wr(0x50,rtn);
//          fpga_reg_wr(PC_DDR_DMA_FPGA_REG,ddr_addr); 
            fpga_reg_wr(0x54,amt);
            fpga_reg_wr(CTRL_REG,0x100001);
            ddr_addr += amt;
            sent += amt;
            // Still more data, send to next buffer
            if (sent < len) {
                amt = (len-sent < size ? len-sent : size);
                rtn = write(fpgaDev->intrFds[1], senddata+sent, amt);         
            }
            while(1){
               fpga_wait_interrupt(config);          //Wait for interrupt from first buffer
               if (sent < len) {
           	   fpga_reg_wr(0x50,rtn);
       //          fpga_reg_wr(PC_DDR_DMA_FPGA_REG,ddr_addr); 
                   fpga_reg_wr(0x54,amt);
                   fpga_reg_wr(CTRL_REG,0x100001); 
                   ddr_addr += amt;
                   sent += amt;
                   tmp_buf = buf;
                   buf = pre_buf;
                   pre_buf = tmp_buf;                                 
                   if (sent < len) {
                       amt = (len-sent < size ? len-sent : size);
                       rtn = write(fpgaDev->intrFds[pre_buf], senddata+sent, amt);
                   }
               }
               else{
                   return sent;
               }
            }
        }
        else if(dest == USERPCIE1){
            buf = 0;
            pre_buf = 1;
            len = sendlen;
            amt = len < size ? len : size;
            rtn = write(fpgaDev->intrFds[0], senddata, amt);
            fpga_reg_wr(PC_USER1_DMA_SYS,rtn);
            fpga_reg_wr(PC_USER1_DMA_LEN,amt);
            fpga_reg_wr(CTRL_REG,SEND_USER1_DATA|0x00000001);
	    //printf("Buffer address is %0x\n",rtn); 
            sent += amt; 
            // Still more data, send to next buffer
            if (sent < len) {
                amt = (len-sent < size ? len-sent : size);
                rtn = write(fpgaDev->intrFds[1], senddata+sent, amt);         
            }            
            if(addr != 0){
                while(1){
                    fpga_wait_interrupt(hostuser1);  
                    if (sent < len) {
                        fpga_reg_wr(PC_USER1_DMA_SYS,rtn);
                        fpga_reg_wr(PC_USER1_DMA_LEN,amt);
                        fpga_reg_wr(CTRL_REG,SEND_USER1_DATA|0x00000001); 
	    		//printf("Buffer address is %0x\n",rtn); 
		        sent += amt; 
                        sent += amt;
                        tmp_buf = buf;
                        buf = pre_buf;
                        pre_buf = tmp_buf;     
                        if (sent < len){                         
                            amt = (len-sent < size ? len-sent : size);
                            rtn = write(fpgaDev->intrFds[pre_buf], senddata+sent, amt);
                        }
                    }
                    else
                       return sent;
                }
            }
        }
        else if(dest == USERPCIE2){
            buf = 2;
            pre_buf = 3;
            len = sendlen;
            amt = len < size ? len : size;
            rtn = write(fpgaDev->intrFds[2], senddata, amt);
            fpga_reg_wr(PC_USER2_DMA_SYS,rtn);
            fpga_reg_wr(PC_USER2_DMA_LEN,amt);
            fpga_reg_wr(CTRL_REG,SEND_USER2_DATA|0x00000001); 
		
	    //printf("Buffer address is %0x\n",rtn); 
            sent += amt; 
            sent += amt; 
            // Still more data, send to next buffer
            if (sent < len) {
                amt = (len-sent < size ? len-sent : size);
                rtn = write(fpgaDev->intrFds[3], senddata+sent, amt);         
            }            
            if(addr != 0){
                while(1){
                    fpga_wait_interrupt(hostuser2);  
                    if (sent < len) {
                        fpga_reg_wr(PC_USER2_DMA_SYS,rtn);
                        fpga_reg_wr(PC_USER2_DMA_LEN,amt);
                        fpga_reg_wr(CTRL_REG,SEND_USER2_DATA|0x00000001);
 
	    //printf("Buffer address is %0x\n",rtn); 
            sent += amt; 
                        sent += amt;
                        tmp_buf = buf;
                        buf = pre_buf;
                        pre_buf = tmp_buf;     
                        if (sent < len){                         
                            amt = (len-sent < size ? len-sent : size);
                            rtn = write(fpgaDev->intrFds[pre_buf], senddata+sent, amt);
                        }
                    }
                    else
                       return sent;
                }
            }
        }
        else if(dest == USERPCIE3){
            buf = 4;
            pre_buf = 5;
            len = sendlen;
            amt = len < size ? len : size;
            rtn = write(fpgaDev->intrFds[4], senddata, amt);
            fpga_reg_wr(PC_USER3_DMA_SYS,rtn);
            fpga_reg_wr(PC_USER3_DMA_LEN,amt);
            fpga_reg_wr(CTRL_REG,SEND_USER3_DATA|0x00000001);
 
	    //printf("Buffer address is %0x\n",rtn); 
            sent += amt; 
            sent += amt; 
            // Still more data, send to next buffer
            if (sent < len) {
                amt = (len-sent < size ? len-sent : size);
                rtn = write(fpgaDev->intrFds[5], senddata+sent, amt);         
            }            
            if(addr != 0){
                while(1){
                    fpga_wait_interrupt(hostuser3);  
                    if (sent < len) {
                        fpga_reg_wr(PC_USER3_DMA_SYS,rtn);
                        fpga_reg_wr(PC_USER3_DMA_LEN,amt);
                        fpga_reg_wr(CTRL_REG,SEND_USER3_DATA|0x00000001);
 
	    //printf("Buffer address is %0x\n",rtn); 
            sent += amt; 
                        sent += amt;
                        tmp_buf = buf;
                        buf = pre_buf;
                        pre_buf = tmp_buf;     
                        if (sent < len){                         
                            amt = (len-sent < size ? len-sent : size);
                            rtn = write(fpgaDev->intrFds[pre_buf], senddata+sent, amt);
                        }
                    }
                    else
                       return sent;
                }
            }
        }
        else if(dest == USERPCIE4){
            buf = 6;
            pre_buf = 7;
            len = sendlen;
            amt = len < size ? len : size;
            rtn = write(fpgaDev->intrFds[6], senddata, amt);
            fpga_reg_wr(PC_USER4_DMA_SYS,rtn);
            fpga_reg_wr(PC_USER4_DMA_LEN,amt);
            fpga_reg_wr(CTRL_REG,SEND_USER4_DATA|0x00000001); 
		
	    //printf("Buffer address is %0x\n",rtn); 
            sent += amt; 
            sent += amt; 
            // Still more data, send to next buffer
            if (sent < len) {
                amt = (len-sent < size ? len-sent : size);
                rtn = write(fpgaDev->intrFds[7], senddata+sent, amt);         
            }            
            if(addr != 0){
                while(1){
                    fpga_wait_interrupt(hostuser4);  
                    if (sent < len) {
                        fpga_reg_wr(PC_USER4_DMA_SYS,rtn);
                        fpga_reg_wr(PC_USER4_DMA_LEN,amt);
                        fpga_reg_wr(CTRL_REG,SEND_USER4_DATA|0x00000001); 
			
	    		//printf("Buffer address is %0x\n",rtn); 
            		sent += amt; 
                        sent += amt;
                        tmp_buf = buf;
                        buf = pre_buf;
                        pre_buf = tmp_buf;     
                        if (sent < len){                         
                            amt = (len-sent < size ? len-sent : size);
                            rtn = write(fpgaDev->intrFds[pre_buf], senddata+sent, amt);
                        }
                    }
                    else
                       return sent;
                }
            }
        }
        else
            printf("Wrong destination\n");
    return 0;
}
Exemple #6
0
int main(int argc, char *argv[]) {

    FILE *in_file;
    FILE *out_file;
    char *file_header;
    char *file_data;
    int rtn;
    int sent = 0;
    int recv = 0;
    int len = 512*512;
    int line_buff = 1;
    FILE *file;
    char *buffer;
    unsigned long fileLen;
    in_file = fopen(argv[1],"rb");
    if (!in_file)
    {
	fprintf(stderr, "Unable to open image file\n");
	return;
    }
    file_header=(char *)malloc(header_size);
    fread(file_header, 1, header_size, in_file);
    //Save file data
    file_data=(char *)malloc(image_size);
    fread(file_data, 4, image_size, in_file);
    //Close the image file
    fclose(in_file);
    //Open a new file to store the result
    out_file = fopen(argv[2],"wb");
    //Store image header
    fwrite(file_header, 1, header_size, out_file);
    //Open partial bitstream file
    file = fopen(argv[3], "rb");
    if (!file)
    {
	fprintf(stderr, "Unable to open partial bit file\n");
	return;
    }
    //Get file length
    fseek(file, 0, SEEK_END);
    fileLen=ftell(file);
    fseek(file, 0, SEEK_SET);
    //Allocate memory
    buffer=(char *)malloc(fileLen+1);
    if (!buffer)
    {
	fprintf(stderr, "Memory error!\n");
        fclose(file);
	return;
    }
    //Read file contents into buffer
    fread(buffer, 1, fileLen, file);
    fclose(file);
    //Send partial bitstream to FPGA
    rtn = fpga_send_data(ICAP, (unsigned char *) buffer, fileLen, 0); 
    free(buffer);
    //Reset user logic
    rtn = fpga_reg_wr(UCTR_REG,0x0);
    rtn = fpga_reg_wr(UCTR_REG,0x1);
    rtn = fpga_reg_wr(CTRL_REG,0x0);
    rtn = fpga_reg_wr(CTRL_REG,0x1);
    if(strcmp(argv[4],"s")==0) {
        printf("Streaming filter");
    	while(sent < len){
	        rtn = fpga_send_data(USERPCIE1,(unsigned char *) file_data+sent,4096,1);
	        rtn = fpga_recv_data(USERPCIE1,(unsigned char *) gDATA+sent,4096,1);
	        sent += 4096;
        }  
    }
    else if (strcmp(argv[4],"c")==0) {
      while(sent < len){
        rtn = fpga_send_data(USERPCIE1,(unsigned char *) file_data+sent,512,1);
        rtn = fpga_send_data(USERPCIE2,(unsigned char *) file_data+sent+512,512,1);
        rtn = fpga_send_data(USERPCIE3,(unsigned char *) file_data+sent+1024,512,1);
        //rtn = fpga_wait_interrupt(hostuser1);
        //rtn = fpga_wait_interrupt(hostuser2);
        //rtn = fpga_wait_interrupt(hostuser3);
        rtn = fpga_reg_wr(0x400,0x1);
        rtn = fpga_recv_data(USERPCIE1,(unsigned char *) gDATA+recv,512,1);
	//printf("Data receive done\n");
	rtn = fpga_reg_wr(0x400,0x0);
	sent += 512;
        recv += 512;
      }
    }
    else
        printf("Wrong filter type %s\n",argv[3]);
    fwrite(gDATA,1,image_size+2,out_file);
    fclose(out_file);
    free(file_header);
    free(file_data);
    return 0;
}
int main()
{
	float packet_time;
	char buff[200] = "\0";
	char wr_len[15];
	int rtn,timeout,i,k;
        int packet_num;
	char pkt_num_str[15];
        unsigned int arg = 100;
        int rd_size = 1024*1;
        int wr_size = 1024*1; // 64 KByte is the buffer-limit
        int src_addr = 0x0;
        int dst_addr = 1024;
	int num_tx_pack = wr_size/1024;
        timeout = 10*1000; // 10 secs.


   	 FILE* ett = NULL;
         ett = fopen("Res_eth_tx_test.txt","w+");
         fclose(ett); 

	printf("Initializing DRAM at %0x with incremental pattern \n ",src_addr);
	int test_val = 0x0;
	for(i = 0; i < DATA_SIZE/4; i++){
			senddata[i] = test_val;
            test_val++;
        }
        rtn = fpga_send_data(DRAM, (unsigned char *) senddata,DATA_SIZE, src_addr);
// Loop Tests
	for (k = 1; k <= 1024*1024; k=k*2) {

		wr_size = 1024 * k;
	
		// Eth SND DATA
        printf("Setting Write size to %0x\n", wr_size);
        rtn = fpga_reg_wr(ETH_TX_SIZE, wr_size);
        printf("Setting DRAM source address to %0x\n",src_addr);
        rtn = fpga_reg_wr(ETH_SRC_ADDR, src_addr);

		rtn = fpga_reg_rd(0x40 );
		printf("FPGA TX SIZE %0x \n",rtn);
        
        printf("Enabling ethernet\n");

        rtn = fpga_reg_wr( 0x8,0x00000004);
		rtn = fpga_reg_rd( 0x10);

		fpga_wait_interrupt(enet);
		rtn = fpga_reg_rd(ETH_TX_STAT);
		printf("FPGA ENET STS %0x \n",rtn);	
		packet_time = rtn * 5.0;
		printf("Total Time : %0f ns\n",packet_time);
		printf("Tpt : %0f MBps\n", (float)(wr_size/packet_time)*1000000000/1024/1024); 
		sprintf(wr_len,"%d",wr_size);
		strcpy (buff,wr_len);
		//	strcat (buff," Bytes \n");
		strcat (buff,",");
		//	strcat (buff,"Time : ");
		//	sprintf(wr_len,"%f",packet_time);
		//	strcat(buff,wr_len);
		//	strcat(buff,"\nTpt : ");
		sprintf(wr_len,"%f", (float)(wr_size/packet_time)*1000000000/1024/1024);
		strcat(buff,wr_len);
		strcat(buff,"\n");
		ett = fopen("Res_eth_tx_test.txt","a");        
		fwrite(&buff,1,strlen(buff),ett);
		fclose(ett);
		strcpy(buff,"\0");
	//sleep(5);
	}

printf("Exiting...");
	
}