使用EDMA通过GPMC在处理器和FPGA之间进行数据传输

时间:2019-02-19 03:46:50

标签: linux

我们正在开发一个包含AM3359处理器的主板。

我们正在使用的SDK是ti-processor-sdk-linux-am335x-evm-05.00.00.15。

我们的客户希望查看通过EDMA通过8条GPMC线连接的处理器(AM3359)与FPGA之间的数据传输吞吐量

我们现在要做的就是按照以下流程实现GPMC_EDMA数据传输程序。

Processor and FPGA lines

处理器已启动---->运行GPMC_EDMA数据传输程序---->完成数据传输---->计算吞吐量。

这是我的代码,用于通过8条GPMC线将数据传输到FPGA。

#include <stdio.h>                                                      
#include <stdint.h>                                                          
#include <stdlib.h>                                                          
#include <termios.h>                                                         
#include <string.h>                                                          
#include <unistd.h>                                                          
#include <fcntl.h>                                                           
#include <errno.h>                                                           
#include <time.h>                                                            
#include <sys/mman.h>                                                        

#define FATAL do { fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \
  __LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0)

int verbose = 0;                                                                                                      

#define BUF_SIZE 4096                                                                                                 

int main(){                                                                                                           
    int i,fd;char ch;                                                                                             
    int buf[BUF_SIZE];                                                                                            
    volatile uint8_t *map_base;                                                                                   
    int a=1;   

    for(i=0;i<BUF_SIZE;i++){                                             
            if(i%100==0){                                                
                    a++;                                                 
                    printf("i: %d,   a: %d\n",i,a);                      
            }                                                 
            buf[i]=a;                                                    
    }                                                                    
    //buf[BUF_SIZE]=43;                                                  

    if((fd=open("/dev/mem", O_RDWR | O_SYNC)) == -1) {                   
            printf("Error in opening gpmc\n");return 0;                  
    }                                                                    
    printf("Successfully opened\n");                          

    map_base =(uint8_t *) mmap((void*)0x01000000, 0x01000000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x01000000);
    if(map_base == (void *) -1) FATAL;                                                                            
    if (verbose) {                                                                                                
      printf("Memory mapped at address %p.\n", map_base);                                                         
      fflush(stdout);                                                                                             
    }                                                                                                             
    volatile uint32_t *p32 = (uint32_t *) &map_base[0x0800];                                                      
    //while(1/*(ch=getchar())!='\n'*/){                                                                           
            //*p32 = 0x1;                                                                                         
            for(i=0;i<BUF_SIZE;i++){                                                                              
                    *p32 = buf[i];                                                                                
            }                                                                                                     
            printf("Sent %d bytes\n",BUF_SIZE);                                                                   
    //}                                                                                                           
    printf("Closing FD\n");                                                                                       
    close(fd);                                                                                                    
} 

有人对我有严格的时间限制,也很新鲜,所以请帮助我进一步前进。

问候 瓦姆西

0 个答案:

没有答案