我们供应商的自定义驱动程序使用dma_alloc_coherent()
来获取虚拟地址和总线地址,然后使用virt_to_phys()
来获取物理地址。
当在PC上执行驱动程序和应用程序时,此方法工作正常,但在板上启用了SMMU时,此方法将失败。
应用程序中的内存分配,映射和数据传输如下执行。
status = AllocMemory( hDrv, local.memSize, &local.memPhysAdrs, &local.memBusAdrs );
printf("1. Physical Memory[DATA] : %llx [%llx] (0x%x)\n",local.memPhysAdrs,local.memBusAdrs,local.memSize);
// Map a physical memory block to virtual space
status = MapMemory( hDrv, local.memPhysAdrs, local.memSize, (PVOID*)&local.hSharedMemory, MM_NONCACHED );
printf("Virtual Address[DATA] : %llx\n",local.hSharedMemory);
status = MemDmaWriteRaw(hDrv,DMA_WAIT_COMPLETION,partner.devId,Channel,
local.memBusSrc,partner.memBusAdrs,local.memSize,0);
有人可以通过DMA API帮助我获取物理地址吗? 当前,总线地址已分配给物理地址,但是DMA操作失败。
提前谢谢!!!