From 9e764fa01379cc515831e4353eade0b1cf53c8bf Mon Sep 17 00:00:00 2001 From: Octasic Inc Date: Fri, 16 Jul 2010 16:25:26 +0300 Subject: importing OCT612x-01.04.01 --- .../oct6100api/oct6100_api/oct6100_channel.c | 402 ++++++++++++++++++--- 1 file changed, 358 insertions(+), 44 deletions(-) (limited to 'software/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c') 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; +} /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ -- cgit v1.2.3