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.

[参考译文] J721S2XSOMXEVM:UDMA 帧复制损坏问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1643123/j721s2xsomxevm-udma-frame-copy-corruption-issue

器件型号: J721S2XSOMXEVM

你好,我们正在试图复制 MSC 缩放缓冲器使用 UDMA 和面临的问题与更高的分辨率 (1408Ux1184U ),与较低的分辨率 (704Ux592U) 这是很好的当我们更改为更高的分辨率 (1408Ux1184U ),似乎 UV 刻度正在给出问题.

 

问题出现在 variantData = 1 时、其中分辨率为 1408x1184。

 

在此处附加我的嗅探->  

 

 

静态 void App_udmaTrpdInit (Udma_Ch 处理程序、
               uint8_t *pTrpdMem、
               const void *destBuf、
               const void *srcBuf、
               uint32_t 长度、
               Bool isframecopy)

  CSL_UdmapCppi5TRPD *pTrpd =(CSL_UdmapCppi5TRPD *) pTrpdMem;
  CSL_UdmapTR15 *ptr =(CSL_UdmapTR15 *) UdmaUtils_getTrpdTr1Pointer (pTrpdMem、0U);
  uint32_t *pTrResp =(uint32_t *)(pTrpdMem +(sizeof (CSL_UdmapTR15)* 2U));
  uint32_t cqRingNum = UDMA_chGetCqRingNum (chHandle);
  uint32_t 宽度;
  uint32_t 高度;
  uint64_t maxlength = 0;

  if (g_variantData == 1)
  {
     宽度= 1408U;
     高度= 1184U;
     maxLength = 1000000U;
  }
  暴露
  {
     宽度= 704U;
     高度= 592U;
     maxLength = 400000U;
  }
  const uint32_t srcYStride =宽度; //704
  const uint32_t srcUVStride =宽度; //704
  const uint32_t dstYStride = FULL_W; //1408
  const uint32_t dstUVStride = FULL_W; //1408

  /*使 TRPD */
  UdmaUtils_makeTrpd (pTrpd、UDMA_TR_TYPE_15、1U、cqRingNum);

  /*设置 TR */
  ptr->flags = CSL_FMK (UDMAP_TR_FLAGS_TYPE、15)|
         CSL_FMK (UDMAP_TR_FLAGS_STATIC、0U)|
         CSL_FMK (UDMAP_TR_FLAGS_EOL、0U)|/* NA */
         CSL_FMK (UDMAP_TR_FLAGS_EVENT_SIZE、CSL_UDMAP_TR_flags_event_size_completion)|
         CSL_FMK (UDMAP_TR_FLAGS_TRIGGER0、CSL_UDMAP_TR_FLAGS_TRIGGER_NONE)|
         CSL_FMK (UDMAP_TR_FLAGS_TRIGGER0_TYPE、CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL)|
         CSL_FMK (UDMAP_TR_FLAGS_trigger1、CSL_UDMAP_TR_FLAGS_TRIGGER_NONE)|
         CSL_FMK (UDMAP_TR_FLAGS_trigger1_type、CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL)|
         CSL_FMK (UDMAP_TR_FLAGS_CMD_ID、0x25U)|/*这将在 TR 响应中返回*/
         CSL_FMK (UDMAP_TR_FLAGS_SA_INDIRECT、0U)|
         CSL_FMK (UDMAP_TR_FLAGS_DA_INDIRECT、0U)|
         CSL_FMK (UDMAP_TR_FLAGS_EOP、1U);

  uint32_t ySize =宽度*高度;
  uint32_t uvSize = ySize / 2U;


  // uint8_t *dstY =(uint8_t *) destBuf;
  //  uint8_t *dstUV = dstY +(FULL_W * FULL_H);


  IF (isframecopy)
  {
    if (length == uvSize) // UV
    {
      ptr->icnt0 =宽度;        // 704.
      PTR->icnt1 =高度/2;      // 296.
      PTR->DIM1 = srcUVStride;// 704-704 = 0
      ptr->ddim1 = dstUVStride;  // 1408 - 704 = 704
      ptr->addr =(uint64_t) srcBuf /* UDMA_appVirtToPhyFxn (srcBuf、0U、NULL)*/;
      ptr->daddr =(uint64_t) destBuf;//+(592U/2U)* 1536U + 768U /* UDMA_appVirtToPhyFxn (DESTBuf、0U、NULL)*/;
    }
    否则  //Y
    {
      ptr->icnt0 =宽度;
      pt->icnt1 =高度;
      PTR->DIM1 = srcYStride; // 704-704 = 0
      ptr->ddim1 = dstYStride; // 1408 - 704 = 704
      ptr->addr =(uint64_t) srcBuf /* UDMA_appVirtToPhyFxn (srcBuf、0U、NULL)*/;
      ptr->daddr =(uint64_t) destBuf/*UDMA_appVirtToPhyFxn (destBuf、0U、NULL)*/;
    }
    ptr->icnt2=1u;
    ptr->icnt3=1u;
    ptr->dim2 = 0;
    ptr->dim3 = 0;
    ptr->fmtflags = 0x00000000U;/*线性寻址、每个元素 1 个字节。 替换为 CSL-FL API */
    ptr->dicnt0 = ptr->icnt0;
    ptr->dicnt1 = ptr->icnt1;
    ptr->dicnt2=1u;
    ptr->dicnt3=1u;     
    ptr->ddim2 = 0;
    ptr->ddim3 = 0;
  }
  暴露
  {
  ptr->icnt0 =长度;
  PTR->icnt1 = 1U;
  ptr->icnt2=1u;
  ptr->icnt3=1u;
  ptr->DIM1 = ptr->icnt0;
  ptr->dim2 =(ptr->icnt0 * ptr->icnt1);
  ptr->dim3 =(ptr->icnt0 * ptr->icnt1 * ptr->icnt2);
  ptr->addr =(uint64_t) srcBuf /* UDMA_appVirtToPhyFxn (srcBuf、0U、NULL)*/;
  ptr->fmtflags = 0x00000000U;/*线性寻址、每个元素 1 个字节。
        替换为 CSL-FL API */
  ptr->dicnt0 =长度;
  PTR->dicnt1 = 1U;
  ptr->dicnt2=1u;
  ptr->dicnt3=1u;
  ptr->ddim1 = ptr->dicnt0;
  ptr->ddim2 =(ptr->dicnt0 * ptr->dicnt1);
  ptr->ddim3 =(ptr->dicnt0 * ptr->dicnt1 * ptr->dicnt2);
  ptr->daddr =(uint64_t) destBuf /* UDMA_appVirtToPhyFxn (destBuf、0U、NULL)*/;
  }

  /*清除 TR 响应存储器*/
  *pTrResp = 0xFFFFFFFFFFFFU;

  /*回写缓存*/
  UDMA_appUtilsCacheWb (pTrpdMem、UDMA_TEST_APP_TRPD_SIZE);

  返回;
}

 

 

 

 

 

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

    尊敬的 Manan Bhatt

    你在努力实现什么? 它只是整个图像/帧的简单传输吗? 为什么逻辑在较小分辨率与较大分辨率之间会发生变化?

    什么是 UV Scale?

    此致、
    Jared

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

    是的整个 NV12 Y+NV1408x1184 UV。对于将复制 4 个较低分辨率的 qurd 帧、我们具有较小的分辨率、但在这里、对于高分辨率的变体、我们有较高的分辨率要求。 Y = 1408x1184 UV 1408 X (1184/2)

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

    尊敬的 Manan Bhatt

    为什么需要在 TR 中设置多个尺寸?

    这不是简单的 1D 传输、其中 icnt0 和 dicnt0 的宽度等于*高度* ppb 吗?

    此致、
    Jared