我正在尝试从 PUTTY 窗口中的 Cyclone V Altera FPGA 上的HPS通过轻量轴将整数(1114129)写入FPGA端的32位PIO接口。我正在使用mmap(),并且已经尝试了几个月,无法使其正常工作。
我已经正确设置了硬件方面,因为我可以从地址为0xff205000的另一个32位PIO读取,这可以正常工作,但是我无法读取或写入第二个PIO。我也尝试了多个不同的地址,但这似乎没有什么不同。
这是我得到的错误,这是由于mmap返回MAP_FAILED
open /dev/mem successfully !
npheap_alloc(): Invalid argument
#
如上所示,该文件已正确打开,然后在mmap调用中失败。
以下是im正在使用的c代码。没有编译问题。 如果有人能帮助甚至指导我正确的方向,我将不胜感激它使我发疯。
#define MAPPED_SIZE 4
#define DDR_RAM_PHYS 0xff205010
int main(void)
{
int _fdmem;
void *map;
const char memDevice[] = "/dev/mem";
_fdmem = open( memDevice, O_RDWR | O_SYNC );
if (_fdmem < 0){
printf("Failed to open the /dev/mem !\n");
return 0;
}
else{
printf("open /dev/mem successfully !\n");
}
/* mmap() the opened /dev/mem */
map = mmap(0, MAPPED_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, _fdmem, DDR_RAM_PHYS);
if (map == MAP_FAILED) { perror("npheap_alloc()"); exit(1); }
*(unsigned int*)(map+(0xff205010)) = (unsigned short)1114129;
//int *q = (int *)map;
//*q = 1114129;
/* unmap the area & error checking */
if (munmap(map,MAPPED_SIZE)==-1){
perror("Error un-mmapping the file");
}
/* close the character device */
close(_fdmem);
}
答案 0 :(得分:2)
0xff205010
不是有效的mmap
偏移量:它不是页面对齐的。另外,将0xff205010
添加到映射将是无效的;地图将已经引用该物理地址。
相反,您需要mmap
正确的页面(0xff205010 & -PAGESIZE
),然后使用(0xff205010 % PAGESIZE
)作为映射的偏移量。