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.

[参考译文] TDA4AL-Q1:如何在 Linux 平台上将物理地址映射到虚拟地址

Guru**** 1555290 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1253295/tda4al-q1-how-to-map-a-physical-addr-to-virtual-addr-on-linux-platform

器件型号:TDA4AL-Q1

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代码

    vx_char 名称[vx_MAX_reference_name];
              snprintf (name、vx_MAX_reference_name、"capture_node_raw_image_arr_%d"、q);
              vxSetReferenceName ((vx_reference) captureObj->raw_image_arr[q]、name);
              //添加用于快速采集的新代码
              int k = 0
              for (k = 0;k < sensorObj->num_camers_enabled;k++){
                vx_image img =(Vx_image)vxGetObjectArrayItem(captureObj->raW_image_arr[q],k);
                void *PTR[1]={appMemAlloc(app_MEM_heap_DDR, 1920*1300*2, 1)};
                void *pre_ptr[1]
                vxSwapImageHandle (img、ptr、pre_ptr、1);             
              }

    frameInfo.info[index].data_ptr[i]= appMemGetVirt2PhyBufPtr ((uint64_t) data_ptr、APP_MEM_HEAP_DDR);

    状态= appIpcSendNotifyPort (app_IPC_CPU_MPU1_0、&frameInfo、obj->port_id、sizeof (frameInfo));

    // Linux 代码:

    如果 (devMemFd ==-1)
      {
        // devMemFd = open ("/dev/dma_heap/vision_apps_shared-memories、O_RDWR | O_SYNC);
        // devMemFd = open ("/dev/dma_heap/cam_apps_shared-memories、O_RDWR | O_SYNC);

         devMemFd = appMemGetDmaBufFd ((void *) phyAddr、&offset);
         printf ("APP_MEM:%d:已导出偏移%d\n"devMemFd、偏移的 dmaBufId);
        
        如果 (devMemFd <0)
        {
          STATUS =-1
        }
        printf ("已分配!\n");
      }

      if ((0 == status)&&(0 <= devMemFd))
      {
        //taddr =(uintptr_t) phyAddr;
        //tsize =大小;
        //tsize = appAlign (tsize +(taddr % pagesize)、...?);
        //taddr = appFloor (taddr、pagesize);
        printf ("before mmap physical_addr %ld size %u\n"、(uint64_t) phyAddr、size);
        VirtAddr = mmap (0、size、(PROT_READ|PROT_WRITE)、MAP_shared、devMemFd、 (int64_t) phyAddr);
        printf ("after mmap\n");

        if (map_failed == virtAddr)
        {
          VirtAddr = NULL
          perror ("错误:");
          printf ("mmap failed\n");
        }
      }

    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 中分配的物理地址以获取虚拟地址。

    失调电压的实现如下所示  

    此致、

    尼基尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    由于用户的要求、 捕获中的标记预计会尽快得到。 MCU2_0启动得比 A72 Linux 早很多。 因此、我们构建了 openvx 框架、以获取图像、并将 MCU2_0作为主机。

    因此、我们首先仍需要在 MCU2_0上分配空间、 然后发送物理地址到 A72 Linux。

    在这种情况下、是否存在将物理地址映射到 Linux 上虚拟地址的方法?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    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 = open ("/dev/dma_heap/vision_apps_shared-memories、O_RDWR | O_SYNC);
    // devMemFd = open ("/dev/dma_heap/cam_apps_shared-memories、O_RDWR | O_SYNC);
    devMemFd = open ("/dev/mem、O_RDWR | O_SYNC);
    VirtAddr = mmap (0、size、(PROT_READ|PROT_WRITE)、MAP_shared、devMemFd、 (int64_t) phyAddr);

    如何获取 devMemFd?

    "第2步:在该 Linux 应用程序中,您必须执行 mmap 到 DDR_shared_MEM 区域,如下所示"

    我在下面看不到任何内容、这是一个空白表格。

    "您可以 将此偏移 PHY_Virt_ADDR_OFFSET 添加到 MCU2_0在 DDR_shared_MEM 中分配的物理地址、以获取 A72上的虚拟地址。"

    您能否详细描述您刚才所说的方式?