0

我正在使用带有 Petalinux 2016.2 的 Zynq SoC 我最初通过打开它来访问我的 AXIS Fifo

open("/dev/mem", O_RDWR | O_SYNC)

并使用 mmap 访问它。我可以访问 AXIS 设备的寄存器,并通过我的 C 应用程序与设备成功连接。

然后我创建了一个平台设备驱动程序,并创建了其他设备节点来访问该设备。该设备被驱动程序成功识别,然后我

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)
4

1 回答 1

1

似乎内存在 vma_area_struct 中被标记为缓存:

很简单:

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);

vm_iomap_memory(vma, start, length)

成功了。

于 2016-09-06T11:11:07.180 回答