干货:fpga地址映射到linux用户空间,方便调试参数配置。
/*----------------------------------------------------------------------------
* 映射 PL端寄存器 (禁止修改!)
* dwRegAddr:映射起始地址
* dwLen :长度
* pVirAddr :返回的虚拟地址
* pdwVirAddrOffset:虚拟地址偏移
*----------------------------------------------------------------------------*/
static int axi_dma_map_PLaddr(unsigned int dwRegAddr, unsigned int dwLen, void **pVirAddr, uint32_t *pdwVirAddrOffset)
{
int fd = 0;
size_t pagesize = sysconf(_SC_PAGE_SIZE);
off_t page_base = (dwRegAddr / pagesize) * pagesize;
off_t page_offset = dwRegAddr - page_base;
*pdwVirAddrOffset = page_offset;
fd = open("/dev/mem", O_RDWR | O_SYNC);
if(fd < 0)
{
printf("axi_dma_map_PLaddr: open /dev/mem error!!%d\n", fd);
}
else
{
*pVirAddr = mmap(NULL, page_offset + dwLen, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED, fd, page_base);
if (*pVirAddr == MAP_FAILED)
{
perror("axi_dma_map_PLaddr: map Reg error!!\n");
*pVirAddr = NULL;
close(fd);
fd = -1;
}
}
return fd;
}
//写地址方法:
*(unsigned int*)(p->pVirAddr + p->dwVirAddrOffset + dwRegOffset/*寄存器地址偏移*/) = value;