Part Number: TDA4VM
All PSDK versions up to 11.2 seem to have this issue.
If csirx gets a header ecc error (which can happen if csirx is tuned on in the middle of transmission), then the ISR handler CsirxDrv_errorEventIsrFxn() is called, and goes to the errStatus.headerEccIrq==1U branch. From there, it calls CsirxDrv_resetStream() for all 4 streams, regardless of which streams are enabled.
Inside CsirxDrv_resetStream(), the stream it was called for is always enabled. So this results into all streams getting enabled.
For stream that was not properly configured and enabled before, this will cause stream FIFO overflow error soon - which results into false safety event in the system.
Possible fix is:
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;