MCU2_0:
physical_addr_= appMemGetVirt2PhyBufPtr
将 physical_addr 发送到 linux
然后如何将 physcal addr 映射到虚拟地址?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
MCU2_0:
physical_addr_= appMemGetVirt2PhyBufPtr
将 physical_addr 发送到 linux
然后如何将 physcal addr 映射到虚拟地址?
Bruce、您好!
您可以在 Linux 驱动程序中使用以下函数来获取物理地址的虚拟地址: https://www.thegeekdiary.com/what-is-ioremap/
此致、
基尔西
如果使用函数 ioremap、则头文件 因素。
但如何设置包含路径呢?
此外、 我想介绍滤波器设计工具的
我们在 MCU2_0上分配 vx_image、然后通过映射获取 data_ptr
然后通过调用函数 appMemGetVirt2PhyBufPtr 来获取 data_ptr 的 pyhsical addr。
然后 在 Linux 上将物理地址发送到 A72、我们需要转储 vx_image 内容并将物理地址传递到 LDC 节点、 如何使用或转换物理地址?
Bruce、您好!
在该 SDK 中、OpenVX 以 A72作为主机运行。 因此、Vx_image 等数据对象的分配将由 A72使用 dma_buf 框架来完成、其中框架使用文件描述符跟踪虚拟地址和相应的物理地址。
您可以在运行软件的 appMemAlloc() API 中看到 ${PSDKRA}/vision_apps/utils/mem/src/app_mem_linux_dma_heap.c
A72的这种分配发生在所有内核均可访问的 DDR_SHARED_MEM 区域。
因此调用 appMemGetVirt2PhyBufPtr()将从 appMemAlloc()期间创建的 mem_map_list 中的虚拟地址返回物理地址。
如果从 R5调用 appMemGetVirt2PhyBufPtr(),那么在这里,virt addr =phy addr (因为直接使用物理地址进行分配)。
此致、
尼基尔
为了快速获取图像、我们在 MCU2_0上构造 CaptureNode、因此 主机为 MCU2_0 然后我们需要将 vx_image 的物理地址发送到 A72 Linux。 以及转储 Vx_image 或发送到 Linux 上的其他 openx2节点。
现在、问题在于 如何在 Linux 上获取虚拟地址?
MCU2_0代码
frameInfo.info[index].data_ptr[i]= appMemGetVirt2PhyBufPtr ((uint64_t) data_ptr、APP_MEM_HEAP_DDR);
// Linux 代码:
appMemGetDmaBuffFd 返回-1
它需要一些配置吗? 如 dtsi。。。
如何配置 dtsi 以及如何使用它?
您好!
这里的问题是,当你从 MCU2_0执行 appMemAlloc()时,只存在一个物理地址。 这里没有虚拟地址和 FD。
因此,如果您将物理地址传递到 appMemGetDmaBufFd(),它将返回-1 ,因为这个函数要求虚拟地址作为其输入,并且按照它在 vision_apps/utils/mem/src/中 的 app_mem_free_rtos.c 则返回-1。
这是 SDK 中当前的实现、因为 SDK 中不支持主机。
不过、如果您让 R5作为主机运行、并且您希望将物理地址转换为虚拟地址并将其发送到 A72、
您可以尝试以下方法。
第1步:应在运行 RTOS 应用程序之前运行 Linux 应用程序。
步骤2:在该 Linux 应用中、您必须执行 mmap 来访问 DDR_shared_MEM 区域、如下所示
/*Global Variables*/ void *PHY_VIRT_ADDR_OFFSET; void mem_Mapping_DDR_Shared_to_virt_offset() { void *DDR_shared_addr_virt = appMemMap((void *)DDR_SHARED_MEM_ADDR, (uint32_t)DDR_SHARED_MEM_SIZE); PHY_VIRT_ADDR_OFFSET = (DDR_shared_addr_virt - DDR_SHARED_MEM_ADDR); }
appMemMap () 可从以下网址获得: vision_apps/utils/console_io/src/app_log_linux.c
第3步:将此偏移 PHY_Virt_ADDR_OFFSET 添加到 MCU2_0在 DDR_SHARED_MEM 中分配的物理地址以获取虚拟地址。
失调电压的实现如下所示
此致、
尼基尔
Bruce、您好!
它是在 A72上运行的节点、还是另一个应用?
添加 A72应用程序的原因是、当前如果它是 A72上的节点、R5主机无法在不知道 A72端点的情况下在 OpenVX 框架内向 A72发送 IPC 命令。
因此、我们将 首先从 A72发送一个虚拟 IPC 命令并将端点存储在 R5F、然后用它通过框架将数据发送到 A72。
步骤2:在该 Linux 应用中、您必须执行 mmap 来访问 DDR_shared_MEM 区域、如下所示
[/报价]如果您没有在 A72上使用 OpenVX 节点、那么您可以执行 以上 在 A72上一次、并且当您从 R5接收到物理地址时、您可以 将该偏移 PHY_Virt_ADDR_OFFSET 添加到 MCU2_0在 DDR_shared_MEM 中分配的物理地址、以获取 A72上的虚拟地址。
我对您用例的理解是否正确?
此致、
尼基尔
"因此、我们将 首先从 A72发送一个虚拟 IPC 命令、并将端点存储在 R5F、然后使用该命令通过框架将数据发送到 A72。"
实际上、A72会通过上述方式接收物理地址。
我们曾经尝试过几种方法将物理 addr 映射到虚拟 addr , 但都失败了!
如何获取 devMemFd?
"第2步:在该 Linux 应用程序中,您必须执行 mmap 到 DDR_shared_MEM 区域,如下所示"
我在下面看不到任何内容、这是一个空白表格。
"您可以 将此偏移 PHY_Virt_ADDR_OFFSET 添加到 MCU2_0在 DDR_shared_MEM 中分配的物理地址、以获取 A72上的虚拟地址。"
您能否详细描述您刚才所说的方式?