我正在遵循此框架https://forums.xilinx.com/xlnx/attachments/xlnx/ELINUX/10693/1/Linux%20DMA%20from%20User%20Space-public.pdf来使用DMA执行数据传输。我没有使用AXI DMA 分散聚集,传输流循环回接收 流。我正在使用的代码如下:dma_proxy.c, dma_proxy.h,dma_proxy_test.c。 我试图改变u32 for u64,因为我在64位系统中工作。 dma_proxy内核模块正常工作并正确执行INTERNAL_TEST,但是当我在用户应用程序上映射它们后尝试读取/写入dma缓冲区时,我收到此错误:
DMA proxy test
[ 397.889331] Unhandled fault: level 3 address size fault (0x92000043) at 0x0000007f94d4b004
Bus error
根据框架的说法,当我导出内核页面表时,我应该在内核映射区域上观察DMA缓冲区,但是我在vmalloc()上获得了它:
0xffffff80012c5000-0xffffff80012cd000 32K RW NX SHD AF UXN MEM/NORMAL-NC
0xffffff80012ce000-0xffffff80015cf000 3076K RW NX SHD AF UXN MEM/NORMAL-NC
0xffffff80015d0000-0xffffff80015d8000 32K RW NX SHD AF UXN MEM/NORMAL-NC
0xffffff80015d9000-0xffffff80018da000 3076K RW NX SHD AF UXN MEM/NORMAL-NC
这些文件来自这篇文章:https://forums.xilinx.com/t5/Embedded-Linux/BRAM-DMA-transfer-limitation/m-p/555953#M11603 我在Xilinx(Zynq Ultrascale +)的zcu102评估板上运行。
任何想法??
答案 0 :(得分:0)
我已经在Xilinx Suppornt的帮助下解决了我的问题。它是驱动程序代码mmap函数,它使用dma_common_mmap而不是dma_mmap_coherent,它应该用于映射dmam_alloc_coherent分配的内存区域。