通过设备驱动程序访问 AXIS FIFO 寄存器时未处理的故障
Unhandled fault when accessing AXIS FIFO registers through device driver
我正在使用带 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)
成功了。
我正在使用带 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)
成功了。