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.

[参考译文] TDA4VM:CSIRX 不需要的流启用

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1640196/tda4vm-csirx-unwanted-stream-enable

器件型号: TDA4VM

PSDK 版本(最高 11.2)似乎都存在该问题。

如果 csirx 遇到标头 ECC 错误(如果在传输过程中调优了 csirx,则可能会发生该错误)、则调用 ISR 处理程序 CsirxDrv_errorEventIsrFxn ()、并转到 errStatus.headerEccIrq==1U 分支。 在这里,它会为所有 4 个流调用 CsirxDrv_resetStream (),无论启用了哪些流。

在 CsirxDrv_resetStream() 内、它所调用的流始终处于启用状态。 因此、这会导致所有数据流都被启用。

对于之前未正确配置和启用的流、这将很快导致流 FIFO 溢出错误、从而导致系统中出现错误的安全事件。

可能的修复方法是:

diff --git a/pdk_j784s4_11_02_00_15/packages/ti/drv/csirx/src/csirx_event.c b/pdk_j784s4_11_02_00_15/packages/ti/drv/csirx/src/csirx_event.c
index d2bc7ff8f..97b3faf49 100755
--- a/pdk_j784s4_11_02_00_15/packages/ti/drv/csirx/src/csirx_event.c
+++ b/pdk_j784s4_11_02_00_15/packages/ti/drv/csirx/src/csirx_event.c
@@ -1143,6 +1143,7 @@ static int32_t CsirxDrv_resetStream(const CsirxDrv_InstObj *instObj,
     CSIRX_StreamStatus strmStatus;
     CSIRX_StreamCtrl strmCtrlParams;
     uint32_t status, currTimeout = 0U;
+    uint32_t wasRunning = 0U;
 
     /* check if stream is enabled */
     if (CDN_EOK != CSIRX_GetStreamStatus(&instObj->cslObj.cslCfgData,
@@ -1156,6 +1157,8 @@ static int32_t CsirxDrv_resetStream(const CsirxDrv_InstObj *instObj,
     {
         if (1U == strmStatus.running)
         {
+            wasRunning = 1U;
+
             /* Stream is enabled */
             strmCtrlParams.softRst = 1U;
             strmCtrlParams.abrt    = 0U;
@@ -1202,7 +1205,7 @@ static int32_t CsirxDrv_resetStream(const CsirxDrv_InstObj *instObj,
         }
     }
     /* Re-start stream */
-    if (FVID2_SOK == retVal)
+    if (FVID2_SOK == retVal && 1U == wasRunning)
     {
         strmCtrlParams.softRst = 0U;
         strmCtrlParams.abrt    = 0U;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、 Nikita Yushchenko

    CsirxDrv_resetStream 应仅检查特定的流 ID?

    您是否有错误日志或您是否已逐步完成?

    此致、
    Jared

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

    我在研究这样一种情况:当 通过 TIOVX 捕获节点使用 CSIRX 时、它仅启用流 0(到存储器)、从不启用流 1(到 CSITX)、但有时、每执行几十次、会出现  CSIRX_EVENT_TYPE_ERR_FIFO_OVERFLOAD_STRM1 错误。

    TIOVX 捕获节点从不 为 0 以外的流设置 instCfg.enableStrm、因此流 1 永远不会启动、也永远不会溢出。

    因此,我 在 CSIRX 驱动程序中寻找一个路径,可以导致流 1 启动,尽管驱动程序从未被要求这样做。 我发现了这样一条路。

    如果出现 ECC 错误、则对所有正在运行的流进行复位似乎是有效的。 因此循环遍历所有流并调用 CsirxDrv_resetStream () 看起来不错。 但是、 对于未运行的流、应该有一个条件不调用 CsirxDrv_resetStream ()、如果 CsirxDrv_resetStream () 未在调用时运行、则不启动它。 我的补丁会执行第二个操作。

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

    你好、 Nikita Yushchenko

    如果未启用流、则不应重置/启动流。

        /* check if stream is enabled */
        if (CDN_EOK != CSIRX_GetStreamStatus(&instObj->cslObj.cslCfgData,
                                  &strmStatus,
                                  strmIdx))
        {
            retVal = FVID2_EFAIL;
        }
        ...
        /* Re-start stream */
        if (FVID2_SOK == retVal)
        {
            strmCtrlParams.softRst = 0U;
            strmCtrlParams.abrt    = 0U;
            strmCtrlParams.stop    = 0U;
            strmCtrlParams.start   = 1U;
            status = CSIRX_SetStreamCtrl(&instObj->cslObj.cslCfgData,
                                         &strmCtrlParams,
                                         strmIdx);
            if (CDN_EOK != status)
            {
                retVal = FVID2_EBADARGS;
            }
        }

     在您的补丁之后、您是否注意到任何 CSIRX_EVENT_TYPE_ERR_FIFO_OVERFLE_STRM1?

    您是否在函数中放置了断点或 PRINT 语句、以查看禁用的流是否正在启动(即使已禁用)?

    此致、
    Jared

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

    对于未启动的流、 CSIRX_GetStreamStatus() 返回 0(未启动的标志在 strmStatus 中返回)。  因此 执行启用流的 CSIRX_SetStreamctrl ()。

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

    你好、 Nikita Yushchenko

    我明白了。 我会提交一个错误。

    查看当前代码、看起来不会在流未运行时重置流。 这只是重新启动过程。

        /* Reset stream */
        if (FVID2_SOK == retVal)
        {
            if (1U == strmStatus.running)
            {
                /* Stream is enabled */
                strmCtrlParams.softRst = 1U;
                strmCtrlParams.abrt    = 0U;

    我将重启逻辑移入复位块。

    diff --git a/packages/ti/drv/csirx/src/csirx_event.c b/./csirx_event.c
    index d2bc7ff..640381d 100755
    --- a/packages/ti/drv/csirx/src/csirx_event.c
    +++ b/./csirx_event.c
    @@ -1199,21 +1199,22 @@ static int32_t CsirxDrv_resetStream(const CsirxDrv_InstObj *instObj,
                         currTimeout++;
                     }
                 }
    -        }
    -    }
    -    /* Re-start stream */
    -    if (FVID2_SOK == retVal)
    -    {
    -        strmCtrlParams.softRst = 0U;
    -        strmCtrlParams.abrt    = 0U;
    -        strmCtrlParams.stop    = 0U;
    -        strmCtrlParams.start   = 1U;
    -        status = CSIRX_SetStreamCtrl(&instObj->cslObj.cslCfgData,
    -                                     &strmCtrlParams,
    -                                     strmIdx);
    -        if (CDN_EOK != status)
    -        {
    -            retVal = FVID2_EBADARGS;
    +
    +            /* Re-start stream */
    +            if (FVID2_SOK == retVal)
    +            {
    +                strmCtrlParams.softRst = 0U;
    +                strmCtrlParams.abrt    = 0U;
    +                strmCtrlParams.stop    = 0U;
    +                strmCtrlParams.start   = 1U;
    +                status = CSIRX_SetStreamCtrl(&instObj->cslObj.cslCfgData,
    +                                            &strmCtrlParams,
    +                                            strmIdx);
    +                if (CDN_EOK != status)
    +                {
    +                    retVal = FVID2_EBADARGS;
    +                }
    +            }
             }
         }
     
    

    此致、
    Jared

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

     如果“if"操作“操作、您不应该将启动调用放入 else 子句?  在当前版本中、如果发生错误、您将重新启动...

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

    你好、 Nikita Yushchenko

    由于差异的外观、它似乎就是这样。

        /* Reset stream */
        if (FVID2_SOK == retVal)
        {
            if (1U == strmStatus.running)
            {
                /* Stream is enabled */
                strmCtrlParams.softRst = 1U;
                strmCtrlParams.abrt    = 0U;
                strmCtrlParams.stop    = 0U;
                strmCtrlParams.start   = 0U;
                status = CSIRX_SetStreamCtrl(&instObj->cslObj.cslCfgData,
                                             &strmCtrlParams,
                                             strmIdx);
                if (CDN_EOK != status)
                {
                    retVal = FVID2_EBADARGS;
                }
                currTimeout = 0U;
                status = CSIRX_GetStreamStatus(&instObj->cslObj.cslCfgData,
                                               &strmStatus,
                                               strmIdx);
                if (CDN_EOK != status)
                {
                    retVal = FVID2_EBADARGS;
                }
                /* Wait for stream to become IDLE */
                while ((0x0U != strmStatus.readyState) &&
                       (0x0U != strmStatus.streamFsm)  &&
                       (FVID2_SOK == retVal))
                {
                     status = CSIRX_GetStreamStatus(&instObj->cslObj.cslCfgData,
                                               &strmStatus,
                                               strmIdx);
                    if (CDN_EOK != status)
                    {
                        retVal = FVID2_EBADARGS;
                        break;
                    }
                    if (CSIRX_TIMEOUT_VAL_MS < currTimeout)
                    {
                        retVal = FVID2_ETIMEOUT;
                    }
                    else
                    {
                        (void)Osal_delay(1U);
                        currTimeout++;
                    }
                }
    
                /* Re-start stream */
                if (FVID2_SOK == retVal)
                {
                    strmCtrlParams.softRst = 0U;
                    strmCtrlParams.abrt    = 0U;
                    strmCtrlParams.stop    = 0U;
                    strmCtrlParams.start   = 1U;
                    status = CSIRX_SetStreamCtrl(&instObj->cslObj.cslCfgData,
                                                &strmCtrlParams,
                                                strmIdx);
                    if (CDN_EOK != status)
                    {
                        retVal = FVID2_EBADARGS;
                    }
                }
            }
        }

    此致、
    Jared

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

    此版本看起来正常

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

    你好、 Nikita Yushchenko

    如果该补丁解决了问题、我们能否将该主题标记为“已关闭“? 已创建票证、将来应将修复程序集成到 SDK 中。  

    此致、
    Jared