示例#1
0
int main(int argc, char* argv[]) 
{
    int rtn,i;
    long usecs;
    unsigned int test_size = 256;
    
	printf("# data transfer between FPGA DRAM to user logic for different data size\n");
   // 	printf("# Transfer Size(Bytes), Transfer Time (s),Throughput: (MB/s)\n"); 
	//printf("Transfer Size(Bytes)\t\t\t\tThroughput: MB/s,\n"); 

	//while(test_size <= DATA_SIZE) {
   		user_ddr_send_data(USERDRAM1,test_size,0x0,0);
		user_ddr_send_data(USERDRAM2,test_size,0x0,0);
		user_ddr_send_data(USERDRAM3,test_size,0x0,0);
		user_ddr_send_data(USERDRAM4,test_size,0x0,0);
		fpga_wait_interrupt(user1ddr);   
		fpga_wait_interrupt(user2ddr); 
		fpga_wait_interrupt(user3ddr); 
		fpga_wait_interrupt(user4ddr); 
		//printf("%d, %f, %f\n", test_size,(e-s)*1e-6,(double)(test_size*1000000.0)/(1024.0*1024.0*(double)(e-s)));
	    //printf("%d \t\t\t\t\t\t %f\n", 4*test_size,(double)(4*test_size*1000000.0)/(1024.0*1024.0*(double)(e-s))); 
	//	test_size *= 2;
	//}


	return 0;
}                 
示例#2
0
int main(int argc, char* argv[]) 
{
	int rtn,i;
        long usecs;
        unsigned int arg = 0;
        
        fpga_wait_interrupt(hostuser2); 

}
示例#3
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;                
}
示例#4
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;
}
示例#5
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...");
	
}