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; }
/*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); } }
/* 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; }
/*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; }
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..."); }