器件型号: 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;