尝试读取或写入旋风V FPGA上的PIO地址时,mmap()不断返回MAP_FAILED

时间:2019-08-28 22:06:23

标签: c fpga mmap

我正在尝试从 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);
}

1 个答案:

答案 0 :(得分:2)

0xff205010不是有效的mmap偏移量:它不是页面对齐的。另外,将0xff205010添加到映射将是无效的;地图将已经引用该物理地址。

相反,您需要mmap正确的页面(0xff205010 & -PAGESIZE),然后使用(0xff205010 % PAGESIZE)作为映射的偏移量。