c -通过设备驱动程序访问AXIS FIFO寄存器时未处理的错误



我正在使用带有Petalinux 2016.2的Zynq SoC,我最初通过使用

打开它来访问AXIS Fifo
open("/dev/mem", O_RDWR | O_SYNC)

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

然后,我创建了一个平台设备驱动程序和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函数,我在其中执行以下操作,其中开始和长度表示AXIS FIFO寄存器的映射区域的大小。

vm_iomap_memory(vma, start, length)

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

:

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

之前
vm_iomap_memory(vma, start, length)

最新更新