我正在编写一个Linux内核驱动程序,它需要告诉FPGA一个RAM中的基地址来写入。
内存驱动程序使用dma_alloc_coherent
分配内存。
这将生成32位物理地址和内核虚拟地址,物理地址将传递给FPGA
FPGA是带有嵌入式ARM Cortex-A9的Cyclone V,带有驱动程序的嵌入式Linux正在运行
现在的问题是,FPGA架构仅产生27位宽的总线来寻址sdram,而由dma调用产生的物理地址具有32位,例如,物理地址为0x2f220000
,超过27位跨度
我想知道,如果可以屏蔽最重要的5位并告诉FPGA地址0x7220000
并且仍然具有正确的行为(在文档中说明,物理地址应该被转换为总线宽度,这意味着掩盖,因为我不能在处理器中使用27位)
还可以使用简单的memcpy命令访问DMA内存,该命令从内核虚拟地址复制到缓冲区吗?
提前谢谢。
答案 0 :(得分:2)
答案真正取决于设备的物理内存布局。如果FPGA的地址总线补充了丢失的位,以便实际地址解析为正确的存储器,那么屏蔽可能是正常的。如果没有,那么Linux内核返回给你的内存可能只是FPGA可以访问的内存。如果是这种情况,你将不得不找到一种方法来让Linux只为你提供可访问的内存缓冲区。