[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/driver/audio/src/v1/tone_drv.c b/mcu/driver/audio/src/v1/tone_drv.c
new file mode 100644
index 0000000..1244f31
--- /dev/null
+++ b/mcu/driver/audio/src/v1/tone_drv.c
@@ -0,0 +1,1306 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*******************************************************************************
+ *
+ * Filename:
+ * ---------
+ * Tone_Drv.c
+ *
+ * Project:
+ * --------
+ * MTK Feature Phone
+ *
+ * Description:
+ * ------------
+ * DTMF tone driver
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ *******************************************************************************/
+
+#include "kal_public_api.h"
+#include "kal_general_types.h"
+#include "kal_trace.h"
+#include "dcl.h"
+#include "reg_base.h"
+#include "sync_data.h"
+
+//#include "l1d_reg.h"
+#include "l1aud_common_def.h"
+#include "l1audio.h"
+#include "media.h"
+#include "afe.h"
+#include "afe_def.h"
+#include "am.h"
+#include "speech_def.h"
+// #include "audio_def.h"
+#include "afe_def.h"
+#include "l1audio_trace_utmd.h"
+#include "l1sp_trc.h"
+#include "tone_drv.h"
+#include "sal_exp.h"
+
+#if defined(__CVSD_CODEC_SUPPORT__)
+#include "bt_sco_drv.h"
+#endif
+
+//#pragma arm section code="SECONDARY_ROCODE"
+
+typedef struct _st_DTMF_DSP
+{
+ kal_uint32 uGPT;
+ const L1SP_Tones *pToneList;
+ const L1SP_QTMF *pCurrQtmf;
+ kal_uint16 uCurrentNode;
+ DTMF_DSP_STATE uState;
+ kal_bool fIsQTMF;
+} st_DTMF_DSP;
+
+typedef struct _st_tone
+{
+ const L1SP_Tones *pToneList;
+ const L1SP_QTMF *pCurrQtmf;
+ kal_uint16 uAudId;
+ kal_uint16 amp;
+ void (*fpHandler)(void);
+ //kal_bool fDspToneRunning;
+ //kal_bool fMcuToneRunning;
+ kal_bool fToneRunning;
+#if 0
+/* under construction !*/
+/* under construction !*/
+#endif //#if 0
+ kal_int8 digital_gain_index;
+ TONE_TYPE type;
+ kal_bool fIsQTMF;
+} st_tone;
+
+typedef struct _st_keytone
+{
+ L1SP_Tones dtmf;
+ kal_uint16 uAudId;
+ kal_uint8 lock;
+#if 0
+/* under construction !*/
+/* under construction !*/
+#endif //#if 0
+ kal_int8 digital_gain_index;
+ kal_uint32 gain;
+ //kal_bool fDspToneRunning;
+ //kal_bool fMcuToneRunning;
+ kal_bool fToneRunning;
+
+ TONE_TYPE type;
+ kal_bool fIsQTMF;
+} st_keytone;
+
+static st_DTMF_DSP DTMF_DSP;
+static st_tone tone[TOTAL_TONE_NUM];
+static st_keytone keytone[TOTAL_TONE_NUM];
+
+
+#define DSP_TONE_IDLE 0
+#define DSP_TONE_START 1
+#define DSP_TONE_RUNING 2
+#define DSP_TONE_STOP 4
+
+#define DSP_WAIT_TIME 10 //ms
+#define DSP_STOP_AND_WAIT_MAX_TICK 40 //tick
+/*
+#define DSP_QTMF_FREQ(f1,f2,f3,f4) { SAL_KT2_FREQ1 = (f1); \
+ SAL_KT2_FREQ2 = (f2); \
+ SAL_KT1_FREQ1 = (DTMF_DSP.fIsQTMF)?(f3):0; \
+ SAL_KT1_FREQ2 = (DTMF_DSP.fIsQTMF)?(f4):0; \
+ Data_Sync_Barrier(); }
+*/
+// temp remove for fix build warning
+// static void dtmf_dsp_PlayOn( void *data );
+static void dtmf_dsp_PlayOff( void *data );
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#if defined(__MCU_DTMF_SUPPORT__) //&& !defined( MED_MODEM )
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#else
+/* under construction !*/
+#endif
+/* under construction !*/
+#endif
+/*
+// temp remove for fix build warning
+static const L1SP_QTMF *dtmf_dsp_GetNextTone(const L1SP_Tones *ppToneList, const L1SP_QTMF *pCurrQTMF, kal_bool fIsQTMF)
+{
+ const L1SP_QTMF *pNextQTMF;
+ if(fIsQTMF)
+ {
+ pNextQTMF = (L1SP_QTMF *)ppToneList + pCurrQTMF->next_tone;
+ }
+ else
+ {
+ pNextQTMF = (L1SP_QTMF *)(ppToneList + pCurrQTMF->next_tone);
+ }
+ return pNextQTMF;
+}
+*/
+
+
+static void dtmf_dsp_SetTimer(kal_uint32 uMsec, void(*fpCallback)( void *pData ))
+{
+ kal_uint16 uDur = uMsec / 10;
+ if(uDur)
+ {
+ SGPT_CTRL_START_T start;
+ start.u2Tick = uDur;
+ start.pfCallback = fpCallback;
+ start.vPara = NULL;
+ DclSGPT_Control( DTMF_DSP.uGPT, SGPT_CMD_START,(DCL_CTRL_DATA_T*)&start);
+ }
+}
+
+static void dtmf_dsp_StopTimer()
+{
+ DclSGPT_Control(DTMF_DSP.uGPT ,SGPT_CMD_STOP, 0);
+}
+
+static void dtmf_dsp_TurnOffDSP(kal_uint32 arg1, void* arg2)
+{
+
+ if(DTMF_DSP.uState != DTMF_DSP_STATE_ENDING)
+ {
+ return;
+ }
+ if(keytone[DSP_TONE].fToneRunning)
+ {
+ AM_KeyToneOff();
+// SAL_KT_ATT_GAIN = 0;
+// Data_Sync_Barrier();
+ keytone[DSP_TONE].fToneRunning = KAL_FALSE;
+ L1Audio_ClearFlag( keytone[DSP_TONE].uAudId );
+ }
+ else if(tone[DSP_TONE].fToneRunning)
+ {
+ AM_ToneOff();
+// SAL_KT_ATT_GAIN = 0;
+// Data_Sync_Barrier();
+ tone[DSP_TONE].fToneRunning = KAL_FALSE;
+ L1Audio_ClearFlag( tone[DSP_TONE].uAudId );
+ }
+ DTMF_DSP.uState = DTMF_DSP_STATE_IDLE;
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+}
+
+static void dtmf_dsp_end( void *fWait )
+{
+ if(DTMF_DSP.uState == DTMF_DSP_STATE_IDLE)
+ {
+ return;
+ }
+ dtmf_dsp_StopTimer();
+// if(SAL_KT1_FSM == DSP_TONE_RUNING)
+// {
+// SAL_KT1_FSM = DSP_TONE_STOP;
+// Data_Sync_Barrier();
+// }
+// if(SAL_KT2_FSM == DSP_TONE_RUNING)
+// {
+// SAL_KT2_FSM = DSP_TONE_STOP;
+// Data_Sync_Barrier();
+// }
+// if(SAL_KT1_FSM != DSP_TONE_IDLE || SAL_KT2_FSM != DSP_TONE_IDLE)
+// {
+// dtmf_dsp_SetTimer( DSP_WAIT_TIME, dtmf_dsp_end);
+// }
+// else
+// {
+// DTMF_DSP.uState = DTMF_DSP_STATE_ENDING;
+// }
+
+ if(fWait) //in task, stop and wait
+ {
+ kal_int32 I =0;
+ while(DTMF_DSP.uState != DTMF_DSP_STATE_ENDING && DTMF_DSP.uState != DTMF_DSP_STATE_IDLE )
+ {
+
+ //kal_uint16 TONE_CTRL1, TONE_CTRL2; //unused
+ //TONE_CTRL1 = SAL_KT1_FSM;
+ //TONE_CTRL2 = SAL_KT2_FSM;
+ kal_sleep_task( AUD_1TICK(1) );
+ //kal_prompt_trace(MOD_L1SP,"dtmf_dsp_end, TONE_CTRL1[%d]: %d, TONE_CTRL2[%d]: %d", (kal_uint32)DSP_TONE_CTRL1, TONE_CTRL1, (kal_uint32)DSP_TONE_CTRL2, TONE_CTRL2 );
+ ASSERT(I < DSP_STOP_AND_WAIT_MAX_TICK);
+ I++;
+ }
+ dtmf_dsp_TurnOffDSP(0, NULL);
+ }
+ else if(DTMF_DSP.uState == DTMF_DSP_STATE_ENDING) // in timer isr
+ {
+ L1Audio_InProcCall(dtmf_dsp_TurnOffDSP, 0, NULL);
+ }
+}
+
+/*
+// temp remove for fix build warning
+static void dtmf_dsp_PlayOn( void *data )
+{
+ MD_TRC_DTMF_DSP_PLAYON_ENTER();
+ if(DTMF_DSP.uState == DTMF_DSP_STATE_IDLE)
+ {
+ return;
+ }
+ DTMF_DSP.pCurrQtmf = dtmf_dsp_GetNextTone( DTMF_DSP.pToneList, DTMF_DSP.pCurrQtmf, DTMF_DSP.fIsQTMF);
+// if(SAL_KT1_FSM == DSP_TONE_IDLE && SAL_KT2_FSM == DSP_TONE_IDLE)
+// {
+// kal_trace( TRACE_FUNC,DTMF_DSP_PLAYON_1);
+// //DSP_QTMF_FREQ( DTMF_DSP.pCurrQtmf->freq1, DTMF_DSP.pCurrQtmf->freq2, DTMF_DSP.pCurrQtmf->freq3, DTMF_DSP.pCurrQtmf->freq4 );
+// SAL_KT1_FSM = DSP_TONE_START;
+// SAL_KT2_FSM = DSP_TONE_START;
+// Data_Sync_Barrier();
+// dtmf_dsp_SetTimer( DTMF_DSP.pCurrQtmf->on_duration, dtmf_dsp_PlayOff);
+// }
+// else
+// { kal_trace( TRACE_FUNC,DTMF_DSP_PLAYON_2);
+// dtmf_dsp_SetTimer( DSP_WAIT_TIME, dtmf_dsp_PlayOn);
+// }
+ MD_TRC_DTMF_DSP_PLAYON_LEAVE();
+}
+*/
+
+static void dtmf_dsp_PlayOff( void *data )
+{
+ MD_TRC_DTMF_DSP_PLAYOFF_ENTER();
+ if(DTMF_DSP.uState == DTMF_DSP_STATE_IDLE)
+ {
+ return;
+ }
+// if(SAL_KT1_FSM == DSP_TONE_RUNING && SAL_KT2_FSM == DSP_TONE_RUNING)
+// {
+// SAL_KT1_FSM = DSP_TONE_STOP;
+// SAL_KT2_FSM = DSP_TONE_STOP;
+// Data_Sync_Barrier();
+// if(DTMF_DSP.pCurrQtmf->off_duration)
+// {
+// kal_trace( TRACE_FUNC,DTMF_DSP_PLAYOFF_1);
+// dtmf_dsp_SetTimer( DTMF_DSP.pCurrQtmf->off_duration, dtmf_dsp_PlayOn);
+// DTMF_DSP.uCurrentNode = DTMF_DSP.pCurrQtmf->next_tone;
+// }
+// else
+// {
+// kal_trace( TRACE_FUNC,DTMF_DSP_PLAYOFF_2);
+// dtmf_dsp_SetTimer( DSP_WAIT_TIME, dtmf_dsp_end);
+// }
+// }
+// else
+// {
+// dtmf_dsp_SetTimer( DSP_WAIT_TIME, dtmf_dsp_PlayOff);
+// }
+ MD_TRC_DTMF_DSP_PLAYOFF_LEAVE();
+}
+
+static void dtmf_dsp_Start()
+{
+ MD_TRC_DTMF_DSP_START_ENTER();
+ dtmf_dsp_StopTimer();
+ ASSERT(DTMF_DSP.uState == DTMF_DSP_STATE_IDLE);
+ DTMF_DSP.uState = DTMF_DSP_STATE_PLAYING;
+ DTMF_DSP.uCurrentNode = 0;
+ //DSP_QTMF_FREQ( DTMF_DSP.pCurrQtmf->freq1, DTMF_DSP.pCurrQtmf->freq2, DTMF_DSP.pCurrQtmf->freq3, DTMF_DSP.pCurrQtmf->freq4 );
+// SAL_KT1_FSM = DSP_TONE_START;
+// SAL_KT2_FSM = DSP_TONE_START;
+// Data_Sync_Barrier();
+ dtmf_dsp_SetTimer( DTMF_DSP.pCurrQtmf->on_duration, dtmf_dsp_PlayOff);
+ MD_TRC_DTMF_DSP_START_LEAVE();
+}
+
+
+static void DTMF_DSP_Play( const L1SP_Tones *pToneList, kal_bool fIsQtmf, kal_bool fIsKeytone )
+{
+#if 1
+ MD_TRC_DTMF_DSP_PLAY_ENTER();
+ KT_StopAndWait();
+ TONE_StopAndWait();
+ DTMF_DSP.fIsQTMF = fIsQtmf;
+ DTMF_DSP.pCurrQtmf = (const L1SP_QTMF *)pToneList;
+ if(fIsKeytone)
+ {
+ L1Audio_SetFlag( keytone[DSP_TONE].uAudId );
+ }
+ else
+ {
+ L1Audio_SetFlag( tone[DSP_TONE].uAudId );
+ if( AM_IsSpeechOn() ) //only apply on tone
+ {
+// SAL_KT_ATT_GAIN = 0x4000;
+// Data_Sync_Barrier();
+ }
+ }
+
+#if defined(__BT_SUPPORT__)
+ if( L1SP_IsBluetoothOn() )
+ {
+// SAL_KT1_AMP = (TONE_INIT_AMP >> 2); /* degrade bluetooth tone volume by 12dB */
+// SAL_KT2_AMP = (TONE_INIT_AMP >> 2); /* degrade bluetooth tone volume by 12dB */
+// Data_Sync_Barrier();
+ // *DP_VSBT_CTRL |= 0x1; // output to both BT and voice DAC
+ }
+ else
+#endif
+ {
+// SAL_KT1_AMP = tone[DSP_TONE].amp;
+// SAL_KT2_AMP = tone[DSP_TONE].amp;
+// Data_Sync_Barrier();
+ }
+ if(fIsKeytone)
+ {
+ keytone[DSP_TONE].fToneRunning = KAL_TRUE;
+ AM_KeyToneOn();
+ }
+ else
+ {
+ tone[DSP_TONE].fToneRunning = KAL_TRUE;
+ AM_ToneOn();
+ }
+ dtmf_dsp_Start();
+ MD_TRC_DTMF_DSP_PLAY_LEAVE();
+#else
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#if defined(__BT_SUPPORT__)
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+}
+
+static void DTMF_DSP_Stop( kal_bool fWait)
+{
+ dtmf_dsp_end( (void*)fWait );
+}
+
+void toneInit( uint16 uAudId, uint16 id_num )
+{
+ ASSERT( id_num < TOTAL_TONE_NUM );
+
+ tone[id_num].type = id_num;
+
+ if(id_num == DSP_TONE)
+ {
+ DTMF_DSP.uGPT = DclSGPT_Open( DCL_GPT_CB ,0 );
+ tone[DSP_TONE].uAudId = uAudId;
+ tone[DSP_TONE].amp = TONE_INIT_AMP;
+// SAL_KT_ATT_GAIN = 0;
+// SAL_KT1_FSM = 0;
+// SAL_KT2_FSM = 0;
+// Data_Sync_Barrier();
+#if 0
+/* under construction !*/
+/* under construction !*/
+#endif //#if 0
+ }
+ else
+ {
+ tone[id_num].uAudId = uAudId;
+ tone[id_num].amp = TONE_INIT_AMP;
+ }
+/* DTMF_DSP.uGPT = DclSGPT_Open( DCL_GPT_CB ,0 );
+ tone.uAudId = uAudId;
+ tone.amp = TONE_INIT_AMP;
+ SAL_KT_ATT_GAIN = 0;
+ SAL_KT1_FSM = 0;
+ SAL_KT2_FSM = 0;
+ Data_Sync_Barrier();
+#ifdef ANALOG_AFE_PATH_EXIST
+ AFE_TurnOnFIR( L1SP_TONE );
+#endif */
+}
+
+void ktInit( uint16 uAudId, uint16 id_num )
+{
+ ASSERT( id_num < TOTAL_TONE_NUM );
+
+ keytone[id_num].type = id_num;
+
+ if(id_num == DSP_TONE)
+ {
+ keytone[DSP_TONE].uAudId = uAudId;
+ keytone[DSP_TONE].lock = 0;
+#if 0
+/* under construction !*/
+/* under construction !*/
+#endif //#if 0
+ keytone[DSP_TONE].gain = 0;
+ keytone[DSP_TONE].digital_gain_index = 0;
+// SAL_KT2_AMP = KT_INIT_AMP;
+// Data_Sync_Barrier();
+#if 0
+/* under construction !*/
+/* under construction !*/
+#endif //#if 0
+ }
+ else
+ {
+ keytone[id_num].uAudId = uAudId;
+ keytone[id_num].lock = 0;
+#if 0
+/* under construction !*/
+/* under construction !*/
+#endif //#if 0
+ keytone[id_num].gain = 0;
+ keytone[id_num].digital_gain_index = 0;
+ }
+/* keytone.uAudId = uAudId;
+ keytone.lock = 0;
+#ifdef ANALOG_AFE_PATH_EXIST
+ keytone.volume1 = 160;
+#endif
+ keytone.gain = 0;
+ keytone.digital_gain_index = 0;
+ SAL_KT2_AMP = KT_INIT_AMP;
+ Data_Sync_Barrier();
+#ifdef ANALOG_AFE_PATH_EXIST
+ AFE_TurnOnFIR( L1SP_KEYTONE );
+#endif */
+}
+
+void ktLock( void )
+{
+ ASSERT( keytone[DSP_TONE].lock < DTMF_KEYTONE_LOCK_MAX_COUNT );
+
+ keytone[DSP_TONE].lock++;
+}
+
+void ktUnlock( void )
+{
+ ASSERT( keytone[DSP_TONE].lock > 0 );
+
+ keytone[DSP_TONE].lock--;
+}
+
+void TONE_SetOutputDevice( uint8 device )
+{
+ //DTMF_MCU_StopAndWait();
+#if 0
+/* under construction !*/
+/* under construction !*/
+#endif //#if 0
+}
+
+void TONE_SetOutputVolume( uint8 volume1, int8 digital_gain_index )
+{
+#if 0
+/* under construction !*/
+/* under construction !*/
+#endif //#if 0
+ tone[DSP_TONE].digital_gain_index = digital_gain_index;
+}
+
+void TONE_SetOutputGainControl( uint32 gain )
+{
+#if defined(__GAIN_TABLE_SUPPORT__)
+ //AFE_SetOutputGainControl( L1SP_TONE, gain );
+#endif
+}
+
+kal_bool TONE_DspPlayable(void)
+{
+
+ // kal_uint8 iDigiGainIndex;
+
+ if(/*AM_IsAVsyncOn() || AM_IsDAIMode() ||*/ AM_IsAudioPlaybackOn() != -1)
+ return KAL_FALSE;
+ if(tone[DSP_TONE].fToneRunning || keytone[DSP_TONE].fToneRunning )
+ return KAL_FALSE;
+ if(keytone[DSP_TONE].lock)
+ return KAL_FALSE;
+
+ // RIMIND: if uVolume == 0 (mute, the function return KAL_FALSE;
+/*
+#ifdef ANALOG_AFE_PATH_EXIST
+{
+ kal_uint8 uVolume;
+ AFE_GetOutputVolume(L1SP_TONE, &uVolume, &iDigiGainIndex);
+}
+#else //#if 0
+ AFE_DigitalOnly_GetOutputVolume(L1SP_TONE, &iDigiGainIndex );
+#endif //#if 0
+
+#ifdef ANALOG_AFE_PATH_EXIST
+ if(0 == uVolume || tone[DSP_TONE].volume1 == 0)
+ return KAL_FALSE;
+#endif
+*/
+ return KAL_TRUE;
+}
+
+void TONE_Play( const L1SP_Tones *pToneList, TONE_TYPE type)
+{
+ ASSERT( type < TOTAL_TONE_NUM );
+
+#if defined(__AUDIO_NOT_SUPPORTED__)
+ return;
+#endif
+
+#ifndef __VOLTE_SUPPORT__
+ return;
+#endif //#ifndef __VOLTE_SUPPORT__
+
+
+// if(AM_IsAfeOn()) return;
+ MD_TRC_TONEPLAY(0);
+
+ if(type == DSP_TONE)
+ {
+
+ // [RIMIND]for idel DSP tone play, please remind to set digital gain
+ // AFE_DigitalOnly_SetDigitalGain( L1SP_TONE, tone[DSP_TONE].digital_gain_index );
+
+
+ MD_TRC_TONEPLAY(1);
+ if(!TONE_DspPlayable())
+ {
+ MD_TRC_TONEPLAY(2);
+ return;
+ }
+ DTMF_DSP.fIsQTMF = KAL_FALSE;
+ tone[DSP_TONE].fIsQTMF = KAL_FALSE;
+ DTMF_DSP.uCurrentNode = 0;
+ DTMF_DSP.pToneList = pToneList;
+ tone[DSP_TONE].fToneRunning = KAL_TRUE;
+ DTMF_DSP_Play((const L1SP_Tones *)pToneList, tone[DSP_TONE].fIsQTMF/*DTMF_DSP.fIsQTMF*/, KAL_FALSE);
+ MD_TRC_TONEPLAY(3);
+ }
+ else
+ {
+ tone[type].fIsQTMF = KAL_FALSE;
+
+ //tone[type].type = type;
+
+ MD_TRC_TONEPLAY(5);
+ tone[type].fToneRunning = KAL_TRUE;
+ DTMF_MCU_Play((const L1SP_Tones *)pToneList, tone[type].fIsQTMF/*DTMF_DSP.fIsQTMF*/, KAL_FALSE);
+
+ //AM_ToneOn();
+
+ MD_TRC_TONEPLAY(6);
+ }
+
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif /*#if 0*/
+}
+
+void TONE_PlayQTMF( const L1SP_QTMF *pToneList )
+{
+ //DTMF_DSP.fIsQTMF = KAL_TRUE;
+ //TONE_Play((const L1SP_Tones *)pToneList);
+}
+
+
+void TONE_Stop( TONE_TYPE type )
+{
+#ifndef __VOLTE_SUPPORT__
+ return;
+#endif //#ifndef __VOLTE_SUPPORT__
+
+ MD_TRC_TONESTOP();
+
+ if(type == DSP_TONE)
+ {
+ if(tone[DSP_TONE].fToneRunning)
+ {
+ DTMF_DSP_Stop(KAL_FALSE);
+ }
+ }
+ else
+ {
+ if(tone[type].fToneRunning)
+ {
+ DTMF_MCU_Stop(KAL_FALSE);
+ tone[type].fToneRunning = KAL_FALSE;
+ }
+ }
+/* if(tone.fDspToneRunning)
+ {
+ DTMF_DSP_Stop(KAL_FALSE);
+ }
+ else if(tone.fMcuToneRunning)
+ {
+ DTMF_MCU_Stop(KAL_FALSE);
+ tone.fMcuToneRunning = KAL_FALSE;
+ }*/
+}
+
+void TONE_StopAndWait( void )
+{
+#ifndef __VOLTE_SUPPORT__
+ return;
+#endif //#ifndef __VOLTE_SUPPORT__
+
+ if(!tone[DSP_TONE].fToneRunning)
+ {
+ return;
+ }
+ AM_FlushQFunction();
+ DTMF_DSP_Stop(KAL_TRUE);
+}
+
+void TONE_SetAmplitude( int16 amp )
+{
+ //tone.amp = (uint16)amp;
+ tone[DSP_TONE].amp = (uint16)amp;
+}
+
+void TONE_SetFIR( bool enable )
+{
+ if( enable )
+ {
+#if 0
+/* under construction !*/
+/* under construction !*/
+#endif //#if 0
+ }
+ else
+ {
+#if 0
+/* under construction !*/
+/* under construction !*/
+#endif //#if 0
+ }
+}
+
+void TONE_SetHandler( void (*fpHandler)(void), TONE_TYPE type )
+{
+ //tone.fpHandler = fpHandler; //callback when tone stop done
+ tone[type].fpHandler = fpHandler; //callback when tone stop done
+}
+
+kal_bool KT_DspPlayable(void)
+{
+
+ // kal_uint8 iDigiGainIndex;
+
+ if(/*AM_IsAVsyncOn() || AM_IsDAIMode() || */AM_IsAudioPlaybackOn() != -1)
+ return KAL_FALSE;
+ if(tone[DSP_TONE].fToneRunning || keytone[DSP_TONE].fToneRunning )
+ return KAL_FALSE;
+ if(keytone[DSP_TONE].lock)
+ return KAL_FALSE;
+
+
+ // REMIND, if keytone volume is 0 (mute). it should return KAL_FALSE
+
+/*
+ AFE_DigitalOnly_GetOutputVolume(L1SP_KEYTONE, &iDigiGainIndex );
+*/
+
+/*
+#ifdef ANALOG_AFE_PATH_EXIST
+ if(0 == uVolume || keytone[DSP_TONE].volume1 == 0)
+ return KAL_FALSE;
+#endif
+*/
+
+ return KAL_TRUE;
+}
+
+void KT_SetOutputDevice( uint8 device )
+{
+#ifndef __VOLTE_SUPPORT__
+ return;
+#endif //#ifndef __VOLTE_SUPPORT__
+
+ KT_StopAndWait();
+ if(DTMF_MCU_IsKeytonePlaying()) // && device != AFE_GetOutputDevice(L1SP_KEYTONE)) single output
+ {
+ DTMF_MCU_StopAndWait();
+ }
+#if 0
+/* under construction !*/
+/* under construction !*/
+#endif //#if 0
+}
+
+void KT_SetOutputVolume( uint8 volume1, int8 digital_gain_index )
+{
+#if 0
+/* under construction !*/
+/* under construction !*/
+#endif //#if 0
+ keytone[DSP_TONE].digital_gain_index = digital_gain_index;
+}
+
+bool PcmSink_IsAudioRuning()
+{
+ return false;
+}
+
+void KT_SetOutputGainControl( uint32 gain )
+{
+#if defined(__GAIN_TABLE_SUPPORT__)
+ //keytone.gain = gain;
+ keytone[DSP_TONE].gain = gain;
+ AFE_SetOutputGainControl(L1SP_KEYTONE, gain);
+#endif
+}
+
+void KT_Play( kal_uint16 freq1, kal_uint16 freq2, kal_uint16 duration, TONE_TYPE type) //duration in msec
+{
+#ifndef __VOLTE_SUPPORT__
+ return;
+#endif //#ifndef __VOLTE_SUPPORT__
+
+ MD_TRC_KTPLAY(0);
+#if defined(KEYTONE_DEBUG)
+ Keytone_Debug_Entry(freq1, freq2);
+ return;
+#endif
+#if defined(__AUDIO_NOT_SUPPORTED__)
+ return;
+#endif
+
+
+ if(type == DSP_TONE)
+ {
+ MD_TRC_KTPLAY(1);
+
+ // [RIMIND]for idel DSP tone play, please remind to set digital gain
+ // AFE_DigitalOnly_SetDigitalGain( L1SP_KEYTONE, keytone[DSP_TONE].digital_gain_index );
+
+ if(!KT_DspPlayable())
+ {
+ MD_TRC_KTPLAY(2);
+ return;
+ }
+
+ keytone[DSP_TONE].dtmf.freq1 = freq1;
+ keytone[DSP_TONE].dtmf.freq2 = freq2;
+ keytone[DSP_TONE].dtmf.on_duration = duration;
+ keytone[DSP_TONE].dtmf.off_duration = 0;
+ //keytone[DSP_TONE].type = type;
+ MD_TRC_KTPLAY(3);
+
+ DTMF_DSP_Play((const L1SP_Tones *)&keytone[DSP_TONE].dtmf, KAL_FALSE, KAL_TRUE);
+ MD_TRC_KTPLAY(4);
+ }
+ else
+ {
+#if defined(__MCU_DTMF_SUPPORT__) //&& !defined( MED_MODEM )
+ if(PcmSink_IsAudioRuning() || DTMF_MCU_IsTonePlaying() /*|| AM_IsAfeOn()*/)
+ {
+ return; //disable keytone during audio playback
+ }
+#endif //defined(__MCU_DTMF_SUPPORT__) //&& !defined( MED_MODEM )
+
+ MD_TRC_KTPLAY(5);
+ keytone[type].dtmf.freq1 = freq1;
+ keytone[type].dtmf.freq2 = freq2;
+ keytone[type].dtmf.on_duration = duration;
+ keytone[type].dtmf.off_duration = 0;
+ //keytone[DSP_TONE].type = type;
+
+ MD_TRC_KTPLAY(6);
+ keytone[type].fToneRunning = KAL_TRUE;
+ DTMF_MCU_Play((const L1SP_Tones *)&keytone[type].dtmf, KAL_FALSE, KAL_TRUE);
+
+ MD_TRC_KTPLAY(7);
+ }
+
+#if 0
+#if defined(__MCU_DTMF_SUPPORT__) //&& !defined( MED_MODEM )
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif //defined(__MCU_DTMF_SUPPORT__) //&& !defined( MED_MODEM )
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif /*#if 1*/
+}
+
+void KT_Stop( TONE_TYPE type )
+{
+#ifndef __VOLTE_SUPPORT__
+ return;
+#endif //#ifndef __VOLTE_SUPPORT__
+
+ MD_TRC_KTSTOP();
+
+ if(type == DSP_TONE)
+ {
+ if(keytone[DSP_TONE].fToneRunning)
+ {
+ DTMF_DSP_Stop(KAL_FALSE);
+ }
+ }
+ else
+ {
+ if(keytone[type].fToneRunning)
+ {
+ DTMF_MCU_Stop(KAL_TRUE);
+ keytone[type].fToneRunning = KAL_FALSE;
+ }
+ }
+ return;
+
+/* if(keytone.fDspToneRunning)
+ {
+ DTMF_DSP_Stop(KAL_FALSE);
+ }else
+ if(keytone.fMcuToneRunning)
+ {
+ DTMF_MCU_Stop(KAL_TRUE);
+ keytone.fMcuToneRunning = KAL_FALSE;
+ }
+ return;*/
+}
+
+void KT_StopAndWait()
+{
+
+
+#ifndef __VOLTE_SUPPORT__
+ return;
+#endif //#ifndef __VOLTE_SUPPORT__
+
+ //if(!keytone.fDspToneRunning)
+ if(!keytone[DSP_TONE].fToneRunning)
+ {
+ return;
+ }
+ AM_FlushQFunction();
+ DTMF_DSP_Stop(KAL_TRUE);
+}
+
+void KT_SetAmplitude( int16 amp )
+{
+// SAL_KT2_AMP = amp;
+// Data_Sync_Barrier();
+}
+
+void KT_SetFIR( bool enable )
+{
+ if( enable )
+ {
+#if 0
+/* under construction !*/
+/* under construction !*/
+#endif //#if 0
+ }
+ else
+ {
+#if 0
+/* under construction !*/
+/* under construction !*/
+#endif //#if 0
+ }
+}
+
+kal_bool KT_IsPlayable(void)
+{
+ // kal_uint8 uVolume;
+ // kal_int8 iDigiGainIndex;
+ if(keytone[DSP_TONE].fToneRunning)//(dtmf_dsp_DspToneCase())
+ {
+ return KT_DspPlayable();
+ }
+ else
+ {
+#if defined(__MCU_DTMF_SUPPORT__) //&& !defined( MED_MODEM )
+ if(PcmSink_IsAudioRuning() || tone[DSP_TONE].fToneRunning || keytone[DSP_TONE].fToneRunning)
+ {
+ return KAL_FALSE; //disable keytone during audio playback
+ }
+#endif
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif //#if 0
+ }
+ return KAL_FALSE;
+
+/*
+ kal_uint8 uVolume;
+ kal_int8 iDigiGainIndex;
+ if( DSP_TONE == keytone.type )//(dtmf_dsp_DspToneCase())
+ {
+ return KT_DspPlayable();
+ }
+ else
+ {
+#if defined(__MCU_DTMF_SUPPORT__) //&& !defined( MED_MODEM )
+ if(PcmSink_IsAudioRuning() || tone.fDspToneRunning || keytone.fDspToneRunning)
+ {
+ return KAL_FALSE; //disable keytone during audio playback
+ }
+
+#endif
+ AFE_GetOutputVolume(L1SP_KEYTONE, &uVolume, &iDigiGainIndex);
+#ifdef ANALOG_AFE_PATH_EXIST
+ if(0 == uVolume || keytone.volume1 == 0)
+ {
+ return KAL_FALSE;
+ }
+#endif
+ }
+*/
+}
+
+//#pragma arm section
+