源码下载
配置官方FPGA_XDMA驱动到FPGA设备,使用vscode加载代码,测试代码位于
xdma_driver\tools\xdma_stram_src\pcie_stream_rev2.c
//目前使用到的设备 user_reg = "/dev/xdma0_user" ; irq_et0 = "/dev/xdma0_events_0" ; irq_et1 = "/dev/xdma0_events_1" ; wdevice = "/dev/xdma0_h2c_0" ; rdevice = "/dev/xdma0_c2h_0" ;
对XDMA寄存器读写,查看在/dev/下是否有xdma0_user这个设备,如果没有,则FPGA端配置未成功
int user_write_reg(char *device, uint32_t reg_addr,uint32_t reg_data)//写寄存器
{
void *map_base,*virt_addr;
int reg_fd;
if ((reg_fd = open(device, O_RDWR | O_SYNC)) == -1)
return -1;
//printf("character device %s opened.\n",device);
fflush(stdout);
map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, reg_fd, 0);
if (map_base == (void *)-1)
return -1;
//printf("Memory mapped at address %p.\n", map_base);
fflush(stdout);
virt_addr = map_base + reg_addr;
reg_data = htoll(reg_data);
*((uint32_t *) virt_addr) = reg_data;
close(reg_fd);
return 1;
}
int user_read_reg(char *device, uint32_t reg_addr,uint32_t *reg_data)//读寄存器
{
void *map_base,*virt_addr;
int reg_fd;
if ((reg_fd = open(device, O_RDWR | O_SYNC)) == -1)
return -1;
//printf("character device %s opened.\n",device);
fflush(stdout);
map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, reg_fd, 0);
if (map_base == (void *)-1)
return -1;
//printf("Memory mapped at address %p.\n", map_base);
fflush(stdout);
virt_addr = map_base + reg_addr;
*reg_data = *((uint32_t *) virt_addr);
*reg_data = ltohl(*reg_data);
close(reg_fd);
return 1;
}
寄存器可配置为读或者写,同步到FPGA侧,用于传输一些参数和指令,实现一些同步操作,但读写寄存器需要时间,实测一次在8us左右