summaryrefslogtreecommitdiff
path: root/software/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c
diff options
context:
space:
mode:
Diffstat (limited to 'software/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c')
-rw-r--r--software/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c402
1 files changed, 358 insertions, 44 deletions
diff --git a/software/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c b/software/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c
index ef97dd8..b7dfb7a 100644
--- a/software/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c
+++ b/software/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c
@@ -23,9 +23,9 @@ You should have received a copy of the GNU General Public License
along with the OCT6100 GPL API; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-$Octasic_Release: OCT612xAPI-01.03.05 $
+$Octasic_Release: OCT612xAPI-01.04.01 $
-$Octasic_Revision: 521 $
+$Octasic_Revision: 523 $
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
@@ -1084,6 +1084,130 @@ UINT32 Oct6100ChannelUnMute(
return cOCT6100_ERR_OK;
}
+/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
+
+Function: Oct6100ApiEnableChannelRecording
+
+Description: Enable the recording channel
+
+-------------------------------------------------------------------------------
+| Argument | Description
+-------------------------------------------------------------------------------
+f_pApiInstance Pointer to API instance. This memory is used to keep the
+ present state of the chip and all its resources.
+
+f_pChannelRecord Pointer to a tOCT6100_ENABLE_CHANNEL_RECORDING structure.
+
+\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
+UINT32 Oct6100ApiEnableChannelRecordingDef(
+ IN OUT tPOCT6100_ENABLE_CHANNEL_RECORDING f_pChannelRecord )
+{
+ f_pChannelRecord->pulChannelHndlConflict = NULL;
+ return cOCT6100_ERR_OK;
+}
+
+UINT32 Oct6100ApiEnableChannelRecording(
+ IN tPOCT6100_INSTANCE_API f_pApiInstance,
+ IN OUT tPOCT6100_ENABLE_CHANNEL_RECORDING f_pChannelRecord )
+{
+ tOCT6100_SEIZE_SERIALIZE_OBJECT SeizeSerObj;
+ tOCT6100_RELEASE_SERIALIZE_OBJECT ReleaseSerObj;
+ UINT32 ulSerRes = cOCT6100_ERR_OK;
+ UINT32 ulFncRes = cOCT6100_ERR_OK;
+
+ /* Set the process context of the serialize structure.*/
+ SeizeSerObj.pProcessContext = f_pApiInstance->pProcessContext;
+ ReleaseSerObj.pProcessContext = f_pApiInstance->pProcessContext;
+
+ /* Seize all list semaphores needed by this function. */
+ SeizeSerObj.ulSerialObjHndl = f_pApiInstance->ulApiSerObj;
+ SeizeSerObj.ulTryTimeMs = cOCT6100_WAIT_INFINITELY;
+ ulSerRes = Oct6100UserSeizeSerializeObject( &SeizeSerObj );
+ if ( ulSerRes == cOCT6100_ERR_OK )
+ {
+ /* Call the serialized function. */
+ ulFncRes = Oct6100ApiEnableChannelRecordingSer( f_pApiInstance, f_pChannelRecord );
+ }
+ else
+ {
+ return ulSerRes;
+ }
+
+ /* Release the seized semaphores. */
+ ReleaseSerObj.ulSerialObjHndl = f_pApiInstance->ulApiSerObj;
+ ulSerRes = Oct6100UserReleaseSerializeObject( &ReleaseSerObj );
+
+ /* If an error occured then return the error code. */
+ if ( ulSerRes != cOCT6100_ERR_OK )
+ return ulSerRes;
+ if ( ulFncRes != cOCT6100_ERR_OK )
+ return ulFncRes;
+
+ return cOCT6100_ERR_OK;
+}
+
+/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
+
+Function: Oct6100ApiDisableChannelRecording
+
+Description: Disables the recording channel
+
+-------------------------------------------------------------------------------
+| Argument | Description
+-------------------------------------------------------------------------------
+f_pApiInstance Pointer to API instance. This memory is used to keep the
+ present state of the chip and all its resources.
+
+f_pChannelRecord Pointer to a tOCT6100_DISABLE_CHANNEL_RECORDING structure.
+
+\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
+UINT32 Oct6100ApiDisableChannelRecordingDef(
+ IN OUT tPOCT6100_DISABLE_CHANNEL_RECORDING f_pChannelRecord )
+{
+ f_pChannelRecord->ulUnused = 0;
+ return cOCT6100_ERR_OK;
+}
+
+UINT32 Oct6100ApiDisableChannelRecording(
+ IN tPOCT6100_INSTANCE_API f_pApiInstance,
+ IN OUT tPOCT6100_DISABLE_CHANNEL_RECORDING f_pChannelRecord )
+{
+ tOCT6100_SEIZE_SERIALIZE_OBJECT SeizeSerObj;
+ tOCT6100_RELEASE_SERIALIZE_OBJECT ReleaseSerObj;
+ UINT32 ulSerRes = cOCT6100_ERR_OK;
+ UINT32 ulFncRes = cOCT6100_ERR_OK;
+
+ /* Set the process context of the serialize structure.*/
+ SeizeSerObj.pProcessContext = f_pApiInstance->pProcessContext;
+ ReleaseSerObj.pProcessContext = f_pApiInstance->pProcessContext;
+
+ /* Seize all list semaphores needed by this function. */
+ SeizeSerObj.ulSerialObjHndl = f_pApiInstance->ulApiSerObj;
+ SeizeSerObj.ulTryTimeMs = cOCT6100_WAIT_INFINITELY;
+ ulSerRes = Oct6100UserSeizeSerializeObject( &SeizeSerObj );
+ if ( ulSerRes == cOCT6100_ERR_OK )
+ {
+ /* Call the serialized function. */
+ ulFncRes = Oct6100ApiDisableChannelRecordingSer( f_pApiInstance, f_pChannelRecord );
+ }
+ else
+ {
+ return ulSerRes;
+ }
+
+ /* Release the seized semaphores. */
+ ReleaseSerObj.ulSerialObjHndl = f_pApiInstance->ulApiSerObj;
+ ulSerRes = Oct6100UserReleaseSerializeObject( &ReleaseSerObj );
+
+ /* If an error occured then return the error code. */
+ if ( ulSerRes != cOCT6100_ERR_OK )
+ return ulSerRes;
+ if ( ulFncRes != cOCT6100_ERR_OK )
+ return ulFncRes;
+
+ return cOCT6100_ERR_OK;
+}
+
/**************************** PRIVATE FUNCTIONS ****************************/
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
@@ -1177,7 +1301,7 @@ UINT32 Oct6100ApiChannelsEchoSwInit(
/* Initialize the ECHO channel API list.*/
usMaxChannels = pSharedInfo->ChipConfig.usMaxChannels;
- /* add a channel to initialize if the recording is activated. */
+ /* Add a channel to initialize if the recording is activated. */
if ( pSharedInfo->ChipConfig.fEnableChannelRecording == TRUE )
usMaxChannels++;
@@ -1215,14 +1339,6 @@ UINT32 Oct6100ApiChannelsEchoSwInit(
return cOCT6100_ERR_OK;
}
-
-
-
-
-
-
-
-
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
Function: Oct6100ChannelOpenSer
@@ -2506,7 +2622,7 @@ UINT32 Oct6100ApiUpdateChannelEntry(
/*=======================================================================*/
/* Update num active channel stats. */
if ( f_pChannelOpen->ulEchoOperationMode != cOCT6100_ECHO_OP_MODE_POWER_DOWN )
- {
+ {
f_pApiInstance->pSharedInfo->MiscVars.ulNumActiveChannels++;
}
/*=======================================================================*/
@@ -2913,7 +3029,7 @@ UINT32 Oct6100ApiInvalidateChannelStructs(
SmearParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId;
/* If this channel is currently debugged, automatically close the debug channel. */
- if ( ( pSharedInfo->ChipConfig.fEnableChannelRecording == TRUE )
+ if ( ( pSharedInfo->ChipConfig.fEnableChannelRecording == TRUE || pSharedInfo->ChipConfig.fAllowDynamicRecording == TRUE )
&& ( pSharedInfo->DebugInfo.usCurrentDebugChanIndex == f_usChanIndex ) )
{
tOCT6100_DEBUG_SELECT_CHANNEL SelectDebugChan;
@@ -3290,7 +3406,7 @@ UINT32 Oct6100ApiReleaseChannelResources(
/*=======================================================================*/
/* Update num active channel stats. */
if ( pChanEntry->byEchoOperationMode != cOCT6100_ECHO_OP_MODE_POWER_DOWN )
- {
+ {
f_pApiInstance->pSharedInfo->MiscVars.ulNumActiveChannels--;
}
/*=======================================================================*/
@@ -4408,37 +4524,41 @@ UINT32 Oct6100ApiModifyChannelResources(
if ( ulResult == cOCT6100_ERR_OK )
{
- UINT32 ulMixerEventCntNeeded = 0;
+ /* No mixer is needed if the TDM config has not been modified */
+ if ( f_pChannelModify->fTdmConfigModified == TRUE )
+ {
+ UINT32 ulMixerEventCntNeeded = 0;
- /* Calculate how many mixer events are needed. */
- if ( pChanEntry->usBridgeIndex == cOCT6100_INVALID_INDEX )
- {
- /* If the channel is in bidir mode, do not create the Rin silence event!!! */
- if ( pChanEntry->fBiDirChannel == FALSE )
+ /* Calculate how many mixer events are needed. */
+ if ( pChanEntry->usBridgeIndex == cOCT6100_INVALID_INDEX )
{
- if ( ( *f_pusNewRinTsstIndex == cOCT6100_INVALID_INDEX )
- && ( pChanEntry->usRinSilenceEventIndex == cOCT6100_INVALID_INDEX ) )
- ulMixerEventCntNeeded++;
+ /* If the channel is in bidir mode, do not create the Rin silence event!!! */
+ if ( pChanEntry->fBiDirChannel == FALSE )
+ {
+ if ( ( *f_pusNewRinTsstIndex == cOCT6100_INVALID_INDEX )
+ && ( pChanEntry->usRinSilenceEventIndex == cOCT6100_INVALID_INDEX ) )
+ ulMixerEventCntNeeded++;
+ }
}
- }
- if ( ( *f_pusNewSinTsstIndex == cOCT6100_INVALID_INDEX )
- && ( pChanEntry->usSinSilenceEventIndex == cOCT6100_INVALID_INDEX ) )
- {
- ulMixerEventCntNeeded++;
- }
+ if ( ( *f_pusNewSinTsstIndex == cOCT6100_INVALID_INDEX )
+ && ( pChanEntry->usSinSilenceEventIndex == cOCT6100_INVALID_INDEX ) )
+ {
+ ulMixerEventCntNeeded++;
+ }
- /* If at least 1 mixer event is needed, check if those are available. */
- if ( ulMixerEventCntNeeded != 0 )
- {
- ulResult = Oct6100ApiGetFreeMixerEventCnt( f_pApiInstance, &ulFreeMixerEventCnt );
- if ( ulResult == cOCT6100_ERR_OK )
+ /* If at least 1 mixer event is needed, check if those are available. */
+ if ( ulMixerEventCntNeeded != 0 )
{
- /* The API might need more mixer events if the ports have to be muted. */
- /* Check if these are available. */
- if ( ulFreeMixerEventCnt < ulMixerEventCntNeeded )
+ ulResult = Oct6100ApiGetFreeMixerEventCnt( f_pApiInstance, &ulFreeMixerEventCnt );
+ if ( ulResult == cOCT6100_ERR_OK )
{
- ulResult = cOCT6100_ERR_CHANNEL_OUT_OF_MIXER_EVENTS;
+ /* The API might need more mixer events if the ports have to be muted. */
+ /* Check if these are available. */
+ if ( ulFreeMixerEventCnt < ulMixerEventCntNeeded )
+ {
+ ulResult = cOCT6100_ERR_CHANNEL_OUT_OF_MIXER_EVENTS;
+ }
}
}
}
@@ -5818,7 +5938,7 @@ UINT32 Oct6100ApiModifyChannelEntry(
if ( pChanEntry->byEchoOperationMode != byOpenEchoMode )
{
if ( pChanEntry->byEchoOperationMode == cOCT6100_ECHO_OP_MODE_POWER_DOWN )
- {
+ {
f_pApiInstance->pSharedInfo->MiscVars.ulNumActiveChannels++;
}
else if ( byOpenEchoMode == cOCT6100_ECHO_OP_MODE_POWER_DOWN )
@@ -12425,7 +12545,6 @@ UINT32 Oct6100ApiWriteDebugChanMemory(
return cOCT6100_ERR_OK;
}
-
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
Function: Oct6100ApiDebugChannelOpen
@@ -12462,20 +12581,55 @@ UINT32 Oct6100ApiDebugChannelOpen(
TempChanOpen.VqeConfig.lDefaultErlDb = 0;
/* Loop to reserve the proper entry for the debug channel */
+ if ( pSharedInfo->ChipConfig.fAllowDynamicRecording == TRUE )
+ Oct6100UserMemSet( pSharedInfo->MiscVars.ausSuperArray, 0xFF, sizeof( pSharedInfo->MiscVars.ausSuperArray ) );
+
for( usChanIndex = 0; usChanIndex < ( pSharedInfo->DebugInfo.usRecordChanIndex + 1 ); usChanIndex ++ )
{
ulResult = Oct6100ApiReserveEchoEntry( f_pApiInstance, &usDummyEchoIndex );
if( ulResult != cOCT6100_ERR_OK )
- return ulResult;
+ {
+ if ( pSharedInfo->ChipConfig.fEnableChannelRecording == TRUE )
+ return ulResult;
+ }
+ else
+ {
+ if ( ( pSharedInfo->ChipConfig.fAllowDynamicRecording == TRUE )
+ && ( usDummyEchoIndex == pSharedInfo->DebugInfo.usRecordChanIndex ) )
+ break;
+
+ if ( ( pSharedInfo->ChipConfig.fEnableChannelRecording == FALSE )
+ && ( pSharedInfo->ChipConfig.fAllowDynamicRecording == TRUE ) )
+ pSharedInfo->MiscVars.ausSuperArray[ usChanIndex ] = usDummyEchoIndex;
+ }
+ }
+
+ if ( pSharedInfo->ChipConfig.fAllowDynamicRecording == TRUE )
+ {
+ if ( usChanIndex == ( pSharedInfo->DebugInfo.usRecordChanIndex + 1 ) )
+ return cOCT6100_ERR_FATAL_EE;
}
/* Loop to free all entries except the one for the debug channel */
for( usChanIndex = pSharedInfo->DebugInfo.usRecordChanIndex; usChanIndex > 0; )
{
usChanIndex--;
- ulResult = Oct6100ApiReleaseEchoEntry( f_pApiInstance, usChanIndex );
- if( ulResult != cOCT6100_ERR_OK )
- return ulResult;
+ if ( ( pSharedInfo->ChipConfig.fEnableChannelRecording == FALSE )
+ && ( pSharedInfo->ChipConfig.fAllowDynamicRecording == TRUE ) )
+ {
+ if ( pSharedInfo->MiscVars.ausSuperArray[ usChanIndex ] != 0xFFFF )
+ {
+ ulResult = Oct6100ApiReleaseEchoEntry( f_pApiInstance, pSharedInfo->MiscVars.ausSuperArray[ usChanIndex ] );
+ if( ulResult != cOCT6100_ERR_OK )
+ return ulResult;
+ }
+ }
+ else
+ {
+ ulResult = Oct6100ApiReleaseEchoEntry( f_pApiInstance, usChanIndex );
+ if( ulResult != cOCT6100_ERR_OK )
+ return ulResult;
+ }
}
ulResult = Oct6100ApiWriteDebugChanMemory( f_pApiInstance,
@@ -12492,6 +12646,166 @@ UINT32 Oct6100ApiDebugChannelOpen(
return cOCT6100_ERR_OK;
}
+/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
+
+Function: Oct6100ApiEnableChannelRecordingSer
+
+Description: Open the debug channel.
+
+-------------------------------------------------------------------------------
+| Argument | Description
+-------------------------------------------------------------------------------
+f_pApiInstance Pointer to API instance. This memory is used to keep
+ the present state of the chip and all its resources.
+
+\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
+UINT32 Oct6100ApiEnableChannelRecordingSer(
+ IN tPOCT6100_INSTANCE_API f_pApiInstance,
+ IN OUT tPOCT6100_ENABLE_CHANNEL_RECORDING f_pChannelRecord )
+{
+ tPOCT6100_SHARED_INFO pSharedInfo;
+ tPOCT6100_API_CHANNEL pChanEntry;
+ UINT32 ulResult;
+
+ pSharedInfo = f_pApiInstance->pSharedInfo;
+
+ if ( pSharedInfo->ChipConfig.fAllowDynamicRecording == FALSE )
+ return cOCT6100_ERR_CHANNEL_RECORDING_DISABLED;
+
+ if ( f_pChannelRecord->pulChannelHndlConflict == NULL )
+ return cOCT6100_ERR_CHANNEL_RECORDING_INVALID_HANDLE;
+
+ if ( pSharedInfo->DebugInfo.fRecordChanUp == TRUE )
+ return cOCT6100_ERR_CHANNEL_RECORDING_ALREADY_ENABLED;
+
+ /* Obtain record channel pointer using recording index */
+ mOCT6100_GET_CHANNEL_ENTRY_PNT( f_pApiInstance->pSharedInfo, pChanEntry, pSharedInfo->DebugInfo.usRecordChanIndex )
+ if ( pChanEntry->fReserved == TRUE )
+ {
+ /* Form handle returned to user. The channel must be closed first. */
+ *f_pChannelRecord->pulChannelHndlConflict = cOCT6100_HNDL_TAG_CHANNEL | (pChanEntry->byEntryOpenCnt << cOCT6100_ENTRY_OPEN_CNT_SHIFT) | pSharedInfo->DebugInfo.usRecordChanIndex;
+ return cOCT6100_ERR_CHANNEL_RECORDING_HANDLE_USED;
+ }
+
+ ulResult = Oct6100ApiDebugChannelOpen( f_pApiInstance );
+ if ( ulResult != cOCT6100_ERR_OK )
+ return ulResult;
+
+ pSharedInfo->DebugInfo.fRecordChanUp = TRUE;
+ return cOCT6100_ERR_OK;
+}
+
+/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
+
+Function: Oct6100ApiDisableChannelRecordingSer
+
+Description: Close the debug channel.
+
+-------------------------------------------------------------------------------
+| Argument | Description
+-------------------------------------------------------------------------------
+f_pApiInstance Pointer to API instance. This memory is used to keep
+ the present state of the chip and all its resources.
+
+\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
+UINT32 Oct6100ApiDisableChannelRecordingSer(
+ IN tPOCT6100_INSTANCE_API f_pApiInstance,
+ IN OUT tPOCT6100_DISABLE_CHANNEL_RECORDING f_pChannelRecord )
+{
+ tPOCT6100_SHARED_INFO pSharedInfo;
+ tOCT6100_WRITE_PARAMS WriteParams;
+ tOCT6100_WRITE_SMEAR_PARAMS SmearParams;
+ UINT32 ulResult;
+
+ pSharedInfo = f_pApiInstance->pSharedInfo;
+
+ if ( pSharedInfo->ChipConfig.fAllowDynamicRecording == FALSE )
+ return cOCT6100_ERR_CHANNEL_RECORDING_DISABLED;
+
+ /* If a channel is currently being recorded, it must be disabled first. */
+ if ( pSharedInfo->DebugInfo.usCurrentDebugChanIndex != cOCT6100_INVALID_INDEX )
+ return cOCT6100_ERR_DEBUG_CHANNEL_RECORDING_ENABLED;
+
+ WriteParams.pProcessContext = f_pApiInstance->pProcessContext;
+
+ WriteParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId;
+
+ SmearParams.pProcessContext = f_pApiInstance->pProcessContext;
+
+ SmearParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId;
+
+ /* We let through even though this could already be disabled.. */
+ if ( pSharedInfo->DebugInfo.fRecordChanUp == TRUE )
+ {
+ /*------------------------------------------------------------------------------*/
+ /* Deactivate the ECHO control memory entry.*/
+
+ /* Set the input Echo control entry to unused.*/
+ WriteParams.ulWriteAddress = cOCT6100_ECHO_CONTROL_MEM_BASE + ( pSharedInfo->DebugInfo.usRecordChanIndex * cOCT6100_ECHO_CONTROL_MEM_ENTRY_SIZE );
+ WriteParams.usWriteData = 0x85FF; /* TSI index 1535 reserved for power-down mode */
+
+ mOCT6100_DRIVER_WRITE_API( WriteParams, ulResult );
+ if ( ulResult != cOCT6100_ERR_OK )
+ return ulResult;
+
+ WriteParams.ulWriteAddress += 2;
+ WriteParams.usWriteData = 0xC5FF; /* TSI index 1535 reserved for power-down mode */
+
+ mOCT6100_DRIVER_WRITE_API( WriteParams, ulResult );
+ if ( ulResult != cOCT6100_ERR_OK )
+ return ulResult;
+ /*------------------------------------------------------------------------------*/
+
+
+ /*------------------------------------------------------------------------------*/
+ /* Clear the VQE memory. */
+
+ SmearParams.ulWriteAddress = cOCT6100_CHANNEL_ROOT_BASE + ( pSharedInfo->DebugInfo.usRecordChanIndex * cOCT6100_CHANNEL_ROOT_SIZE ) + pSharedInfo->MemoryMap.ulChanRootConfOfst + 0x20;
+ SmearParams.usWriteData = 0x0000;
+ SmearParams.ulWriteLength = 2;
+
+ mOCT6100_DRIVER_WRITE_SMEAR_API( SmearParams, ulResult );
+ if ( ulResult != cOCT6100_ERR_OK )
+ return ulResult;
+ /*------------------------------------------------------------------------------*/
+
+
+ /*------------------------------------------------------------------------------*/
+ /* Clear the NLP memory. */
+
+ SmearParams.ulWriteAddress = cOCT6100_CHANNEL_ROOT_BASE + ( pSharedInfo->DebugInfo.usRecordChanIndex * cOCT6100_CHANNEL_ROOT_SIZE ) + pSharedInfo->MemoryMap.ulChanRootConfOfst + 0x28;
+ SmearParams.usWriteData = 0x0000;
+ SmearParams.ulWriteLength = 2;
+
+ mOCT6100_DRIVER_WRITE_SMEAR_API( SmearParams, ulResult );
+ if ( ulResult != cOCT6100_ERR_OK )
+ return ulResult;
+ /*------------------------------------------------------------------------------*/
+
+
+ /*------------------------------------------------------------------------------*/
+ /* Clear the AF information memory. */
+
+ SmearParams.ulWriteAddress = pSharedInfo->MemoryMap.ulChanMainMemBase + ( pSharedInfo->DebugInfo.usRecordChanIndex * f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainMemSize ) + f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainIoMemOfst;
+ SmearParams.usWriteData = 0x0000;
+ SmearParams.ulWriteLength = 12;
+
+ mOCT6100_DRIVER_WRITE_SMEAR_API( SmearParams, ulResult );
+ if ( ulResult != cOCT6100_ERR_OK )
+ return ulResult;
+ /*------------------------------------------------------------------------------*/
+
+
+ /* Release echo mem entry */
+ ulResult = Oct6100ApiReleaseEchoEntry( f_pApiInstance, pSharedInfo->DebugInfo.usRecordChanIndex );
+ if( ulResult != cOCT6100_ERR_OK )
+ return ulResult;
+
+ pSharedInfo->DebugInfo.fRecordChanUp = FALSE;
+ }
+
+ return cOCT6100_ERR_OK;
+}
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\