dahdi-linux/xpp/oct612x/octdeviceapi/oct6100api/oct6100_api/oct6100_tone_detection.c
Tzafrir Cohen d3cadf5352 xpp: A copy of oct612x in dahdi-tools
Include a copy of the oct612x Octasic echo canceller interface to be used
by astribank_hexload to load the echo canceller firmware to a Xorcom
Astribank.


git-svn-id: http://svn.astersk.org/svn/dahdi/tools/trunk@10030 17933a7a-c749-41c5-a318-cba88f637d49
2011-07-10 16:10:32 +00:00

1089 lines
38 KiB
C

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
File: oct6100_tone_detection.c
Copyright (c) 2001-2007 Octasic Inc.
Description:
This file contains functions used to enable and disable tone detection on
an echo channel.
This file is part of the Octasic OCT6100 GPL API . The OCT6100 GPL API is
free software; you can redistribute it and/or modify it under the terms of
the GNU General Public License as published by the Free Software Foundation;
either version 2 of the License, or (at your option) any later version.
The OCT6100 GPL API is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
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.00-PR49 $
$Octasic_Revision: 51 $
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
/***************************** INCLUDE FILES *******************************/
#include "octdef.h"
#include "oct6100api/oct6100_defines.h"
#include "oct6100api/oct6100_errors.h"
#include "oct6100api/oct6100_apiud.h"
#include "apilib/octapi_llman.h"
#include "oct6100api/oct6100_tlv_inst.h"
#include "oct6100api/oct6100_chip_open_inst.h"
#include "oct6100api/oct6100_chip_stats_inst.h"
#include "oct6100api/oct6100_interrupts_inst.h"
#include "oct6100api/oct6100_remote_debug_inst.h"
#include "oct6100api/oct6100_debug_inst.h"
#include "oct6100api/oct6100_api_inst.h"
#include "oct6100api/oct6100_channel_inst.h"
#include "oct6100api/oct6100_tone_detection_inst.h"
#include "oct6100api/oct6100_events_inst.h"
#include "oct6100api/oct6100_interrupts_pub.h"
#include "oct6100api/oct6100_chip_open_pub.h"
#include "oct6100api/oct6100_channel_pub.h"
#include "oct6100api/oct6100_tone_detection_pub.h"
#include "oct6100api/oct6100_events_pub.h"
#include "oct6100_chip_open_priv.h"
#include "oct6100_miscellaneous_priv.h"
#include "oct6100_memory_priv.h"
#include "oct6100_channel_priv.h"
#include "oct6100_tone_detection_priv.h"
#include "oct6100_events_priv.h"
/**************************** PUBLIC FUNCTIONS *****************************/
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
Function: Oct6100ToneDetectionEnable
Description: This function enables the generation of event for a selected
tone on the specified 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_pToneDetectEnable Pointer to tone detection enable structure.
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if !SKIP_Oct6100ToneDetectionEnableDef
UINT32 Oct6100ToneDetectionEnableDef(
tPOCT6100_TONE_DETECTION_ENABLE f_pToneDetectEnable )
{
f_pToneDetectEnable->ulChannelHndl = cOCT6100_INVALID_HANDLE;
f_pToneDetectEnable->ulToneNumber = cOCT6100_INVALID_TONE;
return cOCT6100_ERR_OK;
}
#endif
#if !SKIP_Oct6100ToneDetectionEnable
UINT32 Oct6100ToneDetectionEnable(
tPOCT6100_INSTANCE_API f_pApiInstance,
tPOCT6100_TONE_DETECTION_ENABLE f_pToneDetectEnable )
{
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 = Oct6100ToneDetectionEnableSer( f_pApiInstance, f_pToneDetectEnable );
}
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;
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
Function: Oct6100ToneDetectionDisable
Description: This function disables the detection of a tone for a specific
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_pToneDetectDisable Pointer to tone detection disable structure.
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if !SKIP_Oct6100ToneDetectionDisableDef
UINT32 Oct6100ToneDetectionDisableDef(
tPOCT6100_TONE_DETECTION_DISABLE f_pToneDetectDisable )
{
f_pToneDetectDisable->ulChannelHndl = cOCT6100_INVALID_HANDLE;
f_pToneDetectDisable->ulToneNumber = cOCT6100_INVALID_VALUE;
f_pToneDetectDisable->fDisableAll = FALSE;
return cOCT6100_ERR_OK;
}
#endif
#if !SKIP_Oct6100ToneDetectionDisable
UINT32 Oct6100ToneDetectionDisable(
tPOCT6100_INSTANCE_API f_pApiInstance,
tPOCT6100_TONE_DETECTION_DISABLE f_pToneDetectDisable )
{
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 = Oct6100ToneDetectionDisableSer( f_pApiInstance, f_pToneDetectDisable );
}
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;
}
#endif
/**************************** PRIVATE FUNCTIONS ****************************/
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
Function: Oct6100ToneDetectionEnableSer
Description: Activate the detection of a tone on the specified 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_pToneDetectEnable Pointer to tone detect enable structure. This structure
contains, among other things, the tone ID to enable
and the channel handle where detection should be
enabled.
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if !SKIP_Oct6100ToneDetectionEnableSer
UINT32 Oct6100ToneDetectionEnableSer(
IN OUT tPOCT6100_INSTANCE_API f_pApiInstance,
IN tPOCT6100_TONE_DETECTION_ENABLE f_pToneDetectEnable )
{
UINT32 ulChanIndex;
UINT32 ulExtToneChanIndex;
UINT32 ulToneEventNumber = 0;
UINT32 ulResult;
/* Check the user's configuration of the tone detection for errors. */
ulResult = Oct6100ApiCheckToneEnableParams(
f_pApiInstance,
f_pToneDetectEnable,
&ulChanIndex,
&ulToneEventNumber,
&ulExtToneChanIndex );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
/* Write to all resources needed to enable tone detection. */
ulResult = Oct6100ApiWriteToneDetectEvent(
f_pApiInstance,
ulChanIndex,
ulToneEventNumber,
ulExtToneChanIndex );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
/* Update the channel entry to indicate that a new tone has been activated. */
ulResult = Oct6100ApiUpdateChanToneDetectEntry(
f_pApiInstance,
ulChanIndex,
ulToneEventNumber,
ulExtToneChanIndex );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
return cOCT6100_ERR_OK;
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
Function: Oct6100ApiCheckToneEnableParams
Description: Check the validity of the channel and tone requested.
-------------------------------------------------------------------------------
| 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_pToneDetectEnable Pointer to tone detection enable structure.
f_pulChannelIndex Pointer to the channel index.
f_pulToneEventNumber Pointer to the Index of the tone associated to the requested tone.
f_pulExtToneChanIndex Pointer to the index of the extended channel index.
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if !SKIP_Oct6100ApiCheckToneEnableParams
UINT32 Oct6100ApiCheckToneEnableParams(
IN OUT tPOCT6100_INSTANCE_API f_pApiInstance,
IN tPOCT6100_TONE_DETECTION_ENABLE f_pToneDetectEnable,
OUT PUINT32 f_pulChannelIndex,
OUT PUINT32 f_pulToneEventNumber,
OUT PUINT32 f_pulExtToneChanIndex )
{
tPOCT6100_API_CHANNEL pEchoChannel;
UINT32 ulEntryOpenCnt;
UINT32 i;
/*=====================================================================*/
/* Check the channel handle. */
if ( (f_pToneDetectEnable->ulChannelHndl & cOCT6100_HNDL_TAG_MASK) != cOCT6100_HNDL_TAG_CHANNEL )
return cOCT6100_ERR_TONE_DETECTION_CHANNEL_HANDLE_INVALID;
*f_pulChannelIndex = f_pToneDetectEnable->ulChannelHndl & cOCT6100_HNDL_INDEX_MASK;
if ( *f_pulChannelIndex >= f_pApiInstance->pSharedInfo->ChipConfig.usMaxChannels )
return cOCT6100_ERR_TONE_DETECTION_CHANNEL_HANDLE_INVALID;
mOCT6100_GET_CHANNEL_ENTRY_PNT( f_pApiInstance->pSharedInfo, pEchoChannel, *f_pulChannelIndex )
/* Extract the entry open count from the provided handle. */
ulEntryOpenCnt = (f_pToneDetectEnable->ulChannelHndl >> cOCT6100_ENTRY_OPEN_CNT_SHIFT) & cOCT6100_ENTRY_OPEN_CNT_MASK;
/* Check for errors. */
if ( pEchoChannel->fReserved != TRUE )
return cOCT6100_ERR_TONE_DETECTION_CHANNEL_NOT_OPEN;
if ( ulEntryOpenCnt != pEchoChannel->byEntryOpenCnt )
return cOCT6100_ERR_TONE_DETECTION_CHANNEL_HANDLE_INVALID;
/* Set the extended tone detection info if it is activated on the channel. */
*f_pulExtToneChanIndex = pEchoChannel->usExtToneChanIndex;
/*=====================================================================*/
/* Check the tone information. */
/* Find out if the tone is present in the build. */
for ( i = 0; i < cOCT6100_MAX_TONE_EVENT; i++ )
{
if ( f_pApiInstance->pSharedInfo->ImageInfo.aToneInfo[ i ].ulToneID == f_pToneDetectEnable->ulToneNumber )
{
*f_pulToneEventNumber = i;
break;
}
}
/* Check if tone is present. */
if ( i == cOCT6100_MAX_TONE_EVENT )
return cOCT6100_ERR_NOT_SUPPORTED_TONE_NOT_PRESENT_IN_FIRMWARE;
/* Check if the requested tone is actually detected. */
if ((( pEchoChannel->aulToneConf[ *f_pulToneEventNumber / 32 ] >> ( 31 - ( *f_pulToneEventNumber % 32 ))) & 0x1) == 1 )
return cOCT6100_ERR_TONE_DETECTION_TONE_ACTIVATED;
/*=====================================================================*/
return cOCT6100_ERR_OK;
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
Function: Oct6100ApiWriteToneDetectEvent
Description: Write the tone detection event in the channel main structure.
-------------------------------------------------------------------------------
| 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_ulChannelIndex Index of the channel within the API's channel list.
f_ulToneEventNumber Event number of the tone to be activated.
f_ulExtToneChanIndex Index of the extended tone detection channel.
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if !SKIP_Oct6100ApiWriteToneDetectEvent
UINT32 Oct6100ApiWriteToneDetectEvent(
IN OUT tPOCT6100_INSTANCE_API f_pApiInstance,
IN UINT32 f_ulChannelIndex,
IN UINT32 f_ulToneEventNumber,
IN UINT32 f_ulExtToneChanIndex )
{
tPOCT6100_SHARED_INFO pSharedInfo;
tOCT6100_WRITE_PARAMS WriteParams;
tOCT6100_READ_PARAMS ReadParams;
UINT32 ulResult;
UINT16 usReadData;
/* Obtain local pointer to shared portion of instance. */
pSharedInfo = f_pApiInstance->pSharedInfo;
ReadParams.pProcessContext = f_pApiInstance->pProcessContext;
ReadParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId;
ReadParams.pusReadData = &usReadData;
WriteParams.pProcessContext = f_pApiInstance->pProcessContext;
WriteParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId;
/*=======================================================================*/
/* Read the current event config about to be modified. */
ReadParams.ulReadAddress = pSharedInfo->MemoryMap.ulChanMainMemBase + ( f_ulChannelIndex * pSharedInfo->MemoryMap.ulChanMainMemSize );
ReadParams.ulReadAddress += cOCT6100_CH_MAIN_TONE_EVENT_OFFSET;
ReadParams.ulReadAddress += (f_ulToneEventNumber / 16) * 2;
mOCT6100_DRIVER_READ_API( ReadParams, ulResult );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
/*=======================================================================*/
/* Set the tone event in the channel main memory for the requested direction. */
WriteParams.ulWriteAddress = ReadParams.ulReadAddress;
WriteParams.usWriteData = usReadData;
WriteParams.usWriteData |= ( 0x1 << ( 15 - ( f_ulToneEventNumber % 16 )));
mOCT6100_DRIVER_WRITE_API( WriteParams, ulResult );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
/*=======================================================================*/
/* Also program the extended channel if one is present. */
if ( f_ulExtToneChanIndex != cOCT6100_INVALID_INDEX )
{
/* Read the current event config about to be modified. */
ReadParams.ulReadAddress = pSharedInfo->MemoryMap.ulChanMainMemBase + ( f_ulExtToneChanIndex * pSharedInfo->MemoryMap.ulChanMainMemSize );
ReadParams.ulReadAddress += cOCT6100_CH_MAIN_TONE_EVENT_OFFSET;
ReadParams.ulReadAddress += (f_ulToneEventNumber / 16) * 2;
mOCT6100_DRIVER_READ_API( ReadParams, ulResult );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
/* Write the tone event in the channel main memory for the requested direction. */
WriteParams.ulWriteAddress = ReadParams.ulReadAddress;
WriteParams.usWriteData = usReadData;
WriteParams.usWriteData |= ( 0x1 << ( 15 - ( f_ulToneEventNumber % 16 )));
mOCT6100_DRIVER_WRITE_API( WriteParams, ulResult );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
}
/*=======================================================================*/
return cOCT6100_ERR_OK;
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
Function: Oct6100ApiUpdateChanToneDetectEntry
Description: Update the echo channel entry to store the info about the tone
being configured to generate detection events.
-------------------------------------------------------------------------------
| 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_ulChannelIndex Index of the channel within the API's channel list.
f_ulToneEventNumber Enabled tone event number.
f_ulExtToneChanIndex Index of the extended tone detection channel.
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if !SKIP_Oct6100ApiUpdateChanToneDetectEntry
UINT32 Oct6100ApiUpdateChanToneDetectEntry (
IN OUT tPOCT6100_INSTANCE_API f_pApiInstance,
IN UINT32 f_ulChannelIndex,
IN UINT32 f_ulToneEventNumber,
IN UINT32 f_ulExtToneChanIndex )
{
tPOCT6100_API_CHANNEL pEchoChanEntry;
tPOCT6100_SHARED_INFO pSharedInfo;
UINT32 ulToneEntry;
/* Obtain local pointer to shared portion of instance. */
pSharedInfo = f_pApiInstance->pSharedInfo;
/* Update the channel entry. */
mOCT6100_GET_CHANNEL_ENTRY_PNT( pSharedInfo, pEchoChanEntry, f_ulChannelIndex );
/* Set the corresponding bit in the channel array. */
ulToneEntry = pEchoChanEntry->aulToneConf[ f_ulToneEventNumber / 32 ];
/* Modify the entry. */
ulToneEntry |= ( 0x1 << ( 31 - ( f_ulToneEventNumber % 32 )));
/* Copy back the new value. */
pEchoChanEntry->aulToneConf[ f_ulToneEventNumber / 32 ] = ulToneEntry;
/* Configure also the extended channel if necessary. */
if ( f_ulExtToneChanIndex != cOCT6100_INVALID_INDEX )
{
/* Update the channel entry. */
mOCT6100_GET_CHANNEL_ENTRY_PNT( pSharedInfo, pEchoChanEntry, f_ulExtToneChanIndex );
/* Set the corresponding bit in the channel array. */
ulToneEntry = pEchoChanEntry->aulToneConf[ f_ulToneEventNumber / 32 ];
/* Modify the entry. */
ulToneEntry |= ( 0x1 << ( 31 - ( f_ulToneEventNumber % 32 )));
/* Copy back the new value. */
pEchoChanEntry->aulToneConf[ f_ulToneEventNumber / 32 ] = ulToneEntry;
}
/* Check for the SS tone events that could have been generated before. */
if ( f_ulExtToneChanIndex == cOCT6100_INVALID_INDEX )
{
BOOL fSSTone;
UINT32 ulResult;
ulResult = Oct6100ApiIsSSTone( f_pApiInstance, pSharedInfo->ImageInfo.aToneInfo[ f_ulToneEventNumber ].ulToneID, &fSSTone );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
/* Is this a signaling system tone? */
if ( fSSTone == TRUE )
{
/* Check if must generate an event for the last detected SS tone. */
if ( ( pEchoChanEntry->ulLastSSToneDetected != cOCT6100_INVALID_INDEX )
&& ( pEchoChanEntry->ulLastSSToneDetected == pSharedInfo->ImageInfo.aToneInfo[ f_ulToneEventNumber ].ulToneID ) )
{
/* Must write an event for this. */
tPOCT6100_API_TONE_EVENT pSoftEvent;
/* If enough space. */
if ( ( ( pSharedInfo->SoftBufs.ulToneEventBufferWritePtr + 1 ) != pSharedInfo->SoftBufs.ulToneEventBufferReadPtr ) &&
( ( pSharedInfo->SoftBufs.ulToneEventBufferWritePtr + 1 ) != pSharedInfo->SoftBufs.ulToneEventBufferSize || pSharedInfo->SoftBufs.ulToneEventBufferReadPtr != 0 ) )
{
/* Form the event for this captured tone. */
mOCT6100_GET_TONE_EVENT_BUF_PNT( pSharedInfo, pSoftEvent )
pSoftEvent += pSharedInfo->SoftBufs.ulToneEventBufferWritePtr;
pSoftEvent->ulChannelHandle = cOCT6100_HNDL_TAG_CHANNEL | (pEchoChanEntry->byEntryOpenCnt << cOCT6100_ENTRY_OPEN_CNT_SHIFT) | f_ulChannelIndex;
pSoftEvent->ulUserChanId = pEchoChanEntry->ulUserChanId;
pSoftEvent->ulToneDetected = pSharedInfo->ImageInfo.aToneInfo[ f_ulToneEventNumber ].ulToneID;
pSoftEvent->ulTimestamp = pEchoChanEntry->ulLastSSToneTimestamp;
pSoftEvent->ulExtToneDetectionPort = cOCT6100_INVALID_VALUE;
pSoftEvent->ulEventType = cOCT6100_TONE_PRESENT;
/* Update the control variables of the buffer. */
pSharedInfo->SoftBufs.ulToneEventBufferWritePtr++;
if ( pSharedInfo->SoftBufs.ulToneEventBufferWritePtr == pSharedInfo->SoftBufs.ulToneEventBufferSize )
pSharedInfo->SoftBufs.ulToneEventBufferWritePtr = 0;
/* Set the interrupt manager such that the user knows that some tone events */
/* are pending in the software Q. */
pSharedInfo->IntrptManage.fToneEventsPending = TRUE;
}
else
{
/* Set the overflow flag of the buffer. */
pSharedInfo->SoftBufs.ulToneEventBufferOverflowCnt++;
}
}
}
}
return cOCT6100_ERR_OK;
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
Function: Oct6100ToneDetectionDisableSer
Description: Disable the generation of events for a selected tone on the
specified 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_pToneDetectDisable Pointer to tOCT6100_TONE_DETECTION_DISABLE structure.
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if !SKIP_Oct6100ToneDetectionDisableSer
UINT32 Oct6100ToneDetectionDisableSer(
IN OUT tPOCT6100_INSTANCE_API f_pApiInstance,
IN tPOCT6100_TONE_DETECTION_DISABLE f_pToneDetectDisable )
{
UINT32 ulChanIndex;
UINT32 ulExtToneChanIndex;
UINT32 ulToneEventNumber = 0;
UINT32 ulResult;
BOOL fDisableAll;
/* Check the user's configuration of the tone detection disable structure for errors. */
ulResult = Oct6100ApiAssertToneDetectionParams(
f_pApiInstance,
f_pToneDetectDisable,
&ulChanIndex,
&ulToneEventNumber,
&ulExtToneChanIndex,
&fDisableAll );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
/* Clear the event to detect the specified tone. */
ulResult = Oct6100ApiClearToneDetectionEvent(
f_pApiInstance,
ulChanIndex,
ulToneEventNumber,
ulExtToneChanIndex,
fDisableAll );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
/* Update the channel structure to indicate that the tone is no longer detected. */
ulResult = Oct6100ApiReleaseToneDetectionEvent(
f_pApiInstance,
ulChanIndex,
ulToneEventNumber,
ulExtToneChanIndex,
fDisableAll );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
return cOCT6100_ERR_OK;
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
Function: Oct6100ApiAssertToneDetectionParams
Description: Check the validity of the tone detection disable command.
-------------------------------------------------------------------------------
| 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_pToneDetectDisable Pointer to tone detection disable structure.
f_pulChannelIndex Pointer to the channel index
f_pulToneEventNumber Pointer to the tone event number.
f_pulExtToneChanIndex Pointer to the extended channel index.
f_pfDisableAll Pointer to the flag specifying whether all tones
should be disabled.
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if !SKIP_Oct6100ApiAssertToneDetectionParams
UINT32 Oct6100ApiAssertToneDetectionParams(
IN OUT tPOCT6100_INSTANCE_API f_pApiInstance,
IN tPOCT6100_TONE_DETECTION_DISABLE f_pToneDetectDisable,
OUT PUINT32 f_pulChannelIndex,
OUT PUINT32 f_pulToneEventNumber,
OUT PUINT32 f_pulExtToneChanIndex,
OUT PBOOL f_pfDisableAll )
{
tPOCT6100_API_CHANNEL pEchoChannel;
UINT32 ulEntryOpenCnt;
UINT32 i;
/*=====================================================================*/
/* Check the echo channel handle. */
if ( (f_pToneDetectDisable->ulChannelHndl & cOCT6100_HNDL_TAG_MASK) != cOCT6100_HNDL_TAG_CHANNEL )
return cOCT6100_ERR_TONE_DETECTION_CHANNEL_HANDLE_INVALID;
*f_pulChannelIndex = f_pToneDetectDisable->ulChannelHndl & cOCT6100_HNDL_INDEX_MASK;
if ( *f_pulChannelIndex >= f_pApiInstance->pSharedInfo->ChipConfig.usMaxChannels )
return cOCT6100_ERR_TONE_DETECTION_CHANNEL_HANDLE_INVALID;
mOCT6100_GET_CHANNEL_ENTRY_PNT( f_pApiInstance->pSharedInfo, pEchoChannel, *f_pulChannelIndex )
/* Extract the entry open count from the provided handle. */
ulEntryOpenCnt = (f_pToneDetectDisable->ulChannelHndl >> cOCT6100_ENTRY_OPEN_CNT_SHIFT) & cOCT6100_ENTRY_OPEN_CNT_MASK;
/* Check for errors. */
if ( pEchoChannel->fReserved != TRUE )
return cOCT6100_ERR_TONE_DETECTION_CHANNEL_NOT_OPEN;
if ( ulEntryOpenCnt != pEchoChannel->byEntryOpenCnt )
return cOCT6100_ERR_TONE_DETECTION_CHANNEL_HANDLE_INVALID;
/* Return the extended channel index. */
*f_pulExtToneChanIndex = pEchoChannel->usExtToneChanIndex;
/* Check the disable all flag. */
if ( f_pToneDetectDisable->fDisableAll != TRUE && f_pToneDetectDisable->fDisableAll != FALSE )
return cOCT6100_ERR_TONE_DETECTION_DISABLE_ALL;
/*=====================================================================*/
/* Check the tone information. */
/* Find out if the tone is present in the build. */
if ( f_pToneDetectDisable->fDisableAll == FALSE )
{
for ( i = 0; i < cOCT6100_MAX_TONE_EVENT; i++ )
{
if ( f_pApiInstance->pSharedInfo->ImageInfo.aToneInfo[ i ].ulToneID == f_pToneDetectDisable->ulToneNumber )
{
*f_pulToneEventNumber = i;
break;
}
}
/* Check if tone is present. */
if ( i == cOCT6100_MAX_TONE_EVENT )
return cOCT6100_ERR_NOT_SUPPORTED_TONE_NOT_PRESENT_IN_FIRMWARE;
/* Check if the requested tone is actually detected. */
if ((( pEchoChannel->aulToneConf[ *f_pulToneEventNumber / 32 ] >> ( 31 - ( *f_pulToneEventNumber % 32 ))) & 0x1) == 0 )
return cOCT6100_ERR_TONE_DETECTION_TONE_NOT_ACTIVATED;
}
/*=====================================================================*/
/* Return the disable all flag as requested. */
*f_pfDisableAll = f_pToneDetectDisable->fDisableAll;
return cOCT6100_ERR_OK;
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
Function: Oct6100ApiClearToneDetectionEvent
Description: Clear the buffer playout event in the channel main structure.
-------------------------------------------------------------------------------
| 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_ulChannelIndex Index of the channel within the API's channel list.
f_ulToneEventNumber Tone event number to be deactivated.
f_ulExtToneChanIndex Index of the extended tone detection channel.
f_fDisableAll Clear all activated tones.
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if !SKIP_Oct6100ApiClearToneDetectionEvent
UINT32 Oct6100ApiClearToneDetectionEvent(
IN OUT tPOCT6100_INSTANCE_API f_pApiInstance,
IN UINT32 f_ulChannelIndex,
IN UINT32 f_ulToneEventNumber,
IN UINT32 f_ulExtToneChanIndex,
IN BOOL f_fDisableAll )
{
tPOCT6100_SHARED_INFO pSharedInfo;
tOCT6100_WRITE_PARAMS WriteParams;
tOCT6100_READ_PARAMS ReadParams;
tOCT6100_WRITE_SMEAR_PARAMS SmearParams;
UINT32 ulResult;
UINT32 ulToneEventBaseAddress;
UINT16 usReadData;
/* Obtain local pointer to shared portion of instance. */
pSharedInfo = f_pApiInstance->pSharedInfo;
ReadParams.pProcessContext = f_pApiInstance->pProcessContext;
ReadParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId;
ReadParams.pusReadData = &usReadData;
WriteParams.pProcessContext = f_pApiInstance->pProcessContext;
WriteParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId;
SmearParams.pProcessContext = f_pApiInstance->pProcessContext;
SmearParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId;
/*=======================================================================*/
/* Read the current event config about to be modified. */
ulToneEventBaseAddress = pSharedInfo->MemoryMap.ulChanMainMemBase + ( f_ulChannelIndex * pSharedInfo->MemoryMap.ulChanMainMemSize );
ulToneEventBaseAddress += cOCT6100_CH_MAIN_TONE_EVENT_OFFSET;
/* Check if must disable all tone events or not. */
if ( f_fDisableAll == FALSE )
{
ReadParams.ulReadAddress = ulToneEventBaseAddress;
ReadParams.ulReadAddress += (f_ulToneEventNumber / 16) * 2;
mOCT6100_DRIVER_READ_API( ReadParams, ulResult );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
/* Clear the event in the channel main memory.*/
WriteParams.ulWriteAddress = ReadParams.ulReadAddress;
WriteParams.usWriteData = usReadData;
WriteParams.usWriteData &= (~( 0x1 << ( 15 - ( f_ulToneEventNumber % 16 ))));
mOCT6100_DRIVER_WRITE_API( WriteParams, ulResult );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
}
else /* if ( f_fDisableAll == TRUE ) */
{
/* Clear all events in the channel main memory. */
SmearParams.ulWriteLength = 4;
SmearParams.usWriteData = 0x0000;
SmearParams.ulWriteAddress = ulToneEventBaseAddress;
mOCT6100_DRIVER_WRITE_SMEAR_API( SmearParams, ulResult );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
}
/*=======================================================================*/
/* Also program the extended channel if one is present. */
if ( f_ulExtToneChanIndex != cOCT6100_INVALID_INDEX )
{
ulToneEventBaseAddress = pSharedInfo->MemoryMap.ulChanMainMemBase + ( f_ulExtToneChanIndex * pSharedInfo->MemoryMap.ulChanMainMemSize );
ulToneEventBaseAddress += cOCT6100_CH_MAIN_TONE_EVENT_OFFSET;
/* Check if must disable all tone events or not. */
if ( f_fDisableAll == FALSE )
{
/* Read the current event config about to be modified. */
ReadParams.ulReadAddress = ulToneEventBaseAddress;
ReadParams.ulReadAddress += (f_ulToneEventNumber / 16) * 2;
mOCT6100_DRIVER_READ_API( ReadParams, ulResult );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
/* Clear the event in the channel main memory.*/
WriteParams.ulWriteAddress = ReadParams.ulReadAddress;
WriteParams.usWriteData = usReadData;
WriteParams.usWriteData &= (~( 0x1 << ( 15 - ( f_ulToneEventNumber % 16 ))));
mOCT6100_DRIVER_WRITE_API( WriteParams, ulResult );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
}
else /* if ( f_fDisableAll == TRUE ) */
{
/* Clear all events in the channel main memory.*/
SmearParams.ulWriteLength = 4;
SmearParams.usWriteData = 0x0000;
SmearParams.ulWriteAddress = ulToneEventBaseAddress;
mOCT6100_DRIVER_WRITE_SMEAR_API( SmearParams, ulResult );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
}
}
return cOCT6100_ERR_OK;
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
Function: Oct6100ApiReleaseToneDetectionEvent
Description: Clear the entry made for this tone in the channel tone
enable array.
-------------------------------------------------------------------------------
| 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_ulChannelIndex Index of the channel within the API's channel list.
f_ulToneEventNumber Tone event number to be deactivated.
f_ulExtToneChanIndex Index of the extended tone detection channel.
f_fDisableAll Release all activated tones.
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if !SKIP_Oct6100ApiReleaseToneDetectionEvent
UINT32 Oct6100ApiReleaseToneDetectionEvent (
IN OUT tPOCT6100_INSTANCE_API f_pApiInstance,
IN UINT32 f_ulChannelIndex,
IN UINT32 f_ulToneEventNumber,
IN UINT32 f_ulExtToneChanIndex,
IN BOOL f_fDisableAll )
{
tPOCT6100_API_CHANNEL pEchoChanEntry;
tPOCT6100_SHARED_INFO pSharedInfo;
UINT32 ulToneEntry;
UINT32 ulResult;
UINT32 ulToneEventNumber;
BOOL fSSTone;
/* Obtain local pointer to shared portion of instance. */
pSharedInfo = f_pApiInstance->pSharedInfo;
/* Update the channel entry. */
mOCT6100_GET_CHANNEL_ENTRY_PNT( pSharedInfo, pEchoChanEntry, f_ulChannelIndex );
/* Check if must release all tone events. */
if ( f_fDisableAll == FALSE )
{
/* Set the corresponding bit in the channel array. */
ulToneEntry = pEchoChanEntry->aulToneConf[ f_ulToneEventNumber / 32 ];
/* Modify the entry. */
ulToneEntry &= (~( 0x1 << ( 31 - ( f_ulToneEventNumber % 32 ))));
/* Copy back the new value. */
pEchoChanEntry->aulToneConf[ f_ulToneEventNumber / 32 ] = ulToneEntry;
}
else /* if ( f_fDisableAll == TRUE ) */
{
/* Clear all events. */
Oct6100UserMemSet( pEchoChanEntry->aulToneConf, 0x00, sizeof( pEchoChanEntry->aulToneConf ) );
}
/* Configure also the extended channel if necessary. */
if ( f_ulExtToneChanIndex != cOCT6100_INVALID_INDEX )
{
/* Update the channel entry. */
mOCT6100_GET_CHANNEL_ENTRY_PNT( pSharedInfo, pEchoChanEntry, f_ulExtToneChanIndex );
/* Check if must release all tone events. */
if ( f_fDisableAll == FALSE )
{
/* Set the corresponding bit in the channel array. */
ulToneEntry = pEchoChanEntry->aulToneConf[ f_ulToneEventNumber / 32 ];
/* Modify the entry. */
ulToneEntry &= (~( 0x1 << ( 31 - ( f_ulToneEventNumber % 32 ))));
/* Copy back the new value. */
pEchoChanEntry->aulToneConf[ f_ulToneEventNumber / 32 ] = ulToneEntry;
}
else /* if ( f_fDisableAll == TRUE ) */
{
/* Clear all events. */
Oct6100UserMemSet( pEchoChanEntry->aulToneConf, 0x00, sizeof( pEchoChanEntry->aulToneConf ) );
}
}
/* Re-enable the SS7 tones */
for ( ulToneEventNumber = 0; ulToneEventNumber < cOCT6100_MAX_TONE_EVENT; ulToneEventNumber++ )
{
/* Check if the current tone is a SS tone. */
ulResult = Oct6100ApiIsSSTone(
f_pApiInstance,
f_pApiInstance->pSharedInfo->ImageInfo.aToneInfo[ ulToneEventNumber ].ulToneID,
&fSSTone );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
if ( fSSTone == TRUE )
{
/* Write to all resources needed to activate tone detection on this SS tone. */
ulResult = Oct6100ApiWriteToneDetectEvent(
f_pApiInstance,
f_ulChannelIndex,
ulToneEventNumber,
cOCT6100_INVALID_INDEX );
if ( ulResult != cOCT6100_ERR_OK )
return ulResult;
}
}
return cOCT6100_ERR_OK;
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
Function: Oct6100ApiIsSSTone
Description: Check if specified tone number is a special signaling
system tone.
-------------------------------------------------------------------------------
| 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_ulToneEventNumber Tone event number to be checked against.
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if !SKIP_Oct6100ApiIsSSTone
UINT32 Oct6100ApiIsSSTone(
IN OUT tPOCT6100_INSTANCE_API f_pApiInstance,
IN UINT32 f_ulToneEventNumber,
OUT PBOOL f_fSSTone )
{
*f_fSSTone = FALSE;
switch( f_ulToneEventNumber )
{
case cOCT6100_TONE_SIN_SYSTEM7_2000 :
case cOCT6100_TONE_SIN_SYSTEM7_1780 :
case cOCT6100_TONE_ROUT_G168_2100GB_ON :
case cOCT6100_TONE_ROUT_G168_2100GB_WSPR :
case cOCT6100_TONE_ROUT_G168_1100GB_ON :
case cOCT6100_TONE_ROUT_G168_2100GB_ON_WIDE_A :
case cOCT6100_TONE_ROUT_G168_2100GB_ON_WIDE_B :
case cOCT6100_TONE_ROUT_G168_2100GB_WSPR_WIDE :
case cOCT6100_TONE_SOUT_G168_2100GB_ON :
case cOCT6100_TONE_SOUT_G168_2100GB_WSPR :
case cOCT6100_TONE_SOUT_G168_1100GB_ON :
case cOCT6100_TONE_SOUT_G168_2100GB_ON_WIDE_A :
case cOCT6100_TONE_SOUT_G168_2100GB_ON_WIDE_B :
case cOCT6100_TONE_SOUT_G168_2100GB_WSPR_WIDE :
case cOCT6100_TONE_SIN_SYSTEM5_2400 :
case cOCT6100_TONE_SIN_SYSTEM5_2600 :
case cOCT6100_TONE_SIN_SYSTEM5_2400_2600 :
*f_fSSTone = TRUE;
break;
default:
break;
}
return cOCT6100_ERR_OK;
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
Function: Oct6100ApiIsSSTone
Description: Check if specified tone number is a 2100 special signaling
system tone.
-------------------------------------------------------------------------------
| 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_ulToneEventNumber Tone event number to be checked against.
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if !SKIP_Oct6100ApiIs2100Tone
UINT32 Oct6100ApiIs2100Tone(
IN OUT tPOCT6100_INSTANCE_API f_pApiInstance,
IN UINT32 f_ulToneEventNumber,
OUT PBOOL f_fIs2100Tone )
{
*f_fIs2100Tone = FALSE;
switch( f_ulToneEventNumber )
{
case cOCT6100_TONE_ROUT_G168_2100GB_ON :
case cOCT6100_TONE_ROUT_G168_2100GB_WSPR :
case cOCT6100_TONE_ROUT_G168_2100GB_ON_WIDE_A :
case cOCT6100_TONE_ROUT_G168_2100GB_ON_WIDE_B :
case cOCT6100_TONE_ROUT_G168_2100GB_WSPR_WIDE :
case cOCT6100_TONE_SOUT_G168_2100GB_ON :
case cOCT6100_TONE_SOUT_G168_2100GB_WSPR :
case cOCT6100_TONE_SOUT_G168_2100GB_ON_WIDE_A :
case cOCT6100_TONE_SOUT_G168_2100GB_ON_WIDE_B :
case cOCT6100_TONE_SOUT_G168_2100GB_WSPR_WIDE :
*f_fIs2100Tone = TRUE;
break;
default:
break;
}
return cOCT6100_ERR_OK;
}
#endif