我正在使用带有Petalinux 2016的Zynq SoC.2我最初通过打开它来访问我的AXIS Fifo
open("/dev/mem", O_RDWR | O_SYNC)
并使用mmap访问它。我可以通过我的C应用程序访问AXIS设备的寄存器并与设备成功连接。
然后我创建了一个平台设备驱动程序,并使用misc设备节点来访问该设备。该设备被驾驶员成功识别,然后我
fd = open("/dev/devname, O_RDWR | O_SYNC)
然后使用以下命令重新映射设备:
info->mapped_base = mmap(0, AXIFIFO_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)
我可以读取寄存器,它似乎是正确的内存区域。但是当我开始写一些寄存器时,我开始收到以下错误:
Unhandled fault: imprecise external abort (0x1406) at 0x36e42000
pgd = 40ab4000
[36e42000] *pgd=3bff0831, *pte=43c0075f, *ppte=43c00c7f
Bus error
起初它似乎只是在我写入SRR复位寄存器时,但是还有其他一些地方。
有什么东西显而易见我错过了吗?我怀疑它是关于与内存映射方式有关的特定标志,并且可以访问。
我目前在设备驱动程序中有自己的mmap函数,我在其中执行以下操作,其中start和length表示AXIS FIFO寄存器的映射区域的大小。
vm_iomap_memory(vma, start, length)
答案 0 :(得分:1)
似乎内存在vma_area_struct中被标记为缓存:
如此简单:
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
之前
vm_iomap_memory(vma, start, length)
做了这个伎俩。