[Feature]Upload Modem source code

Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/driver/audio/src/v1/sp_c2k.c b/mcu/driver/audio/src/v1/sp_c2k.c
new file mode 100644
index 0000000..291fb9a
--- /dev/null
+++ b/mcu/driver/audio/src/v1/sp_c2k.c
@@ -0,0 +1,671 @@
+/*****************************************************************************
+*  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) 2015
+*
+*  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).
+*
+*****************************************************************************/
+
+#include "l1aud_common_def.h"
+#include "lmd_audio.h"
+#include "sp_c2k.h"
+#include "sal_def.h"
+#include "sal_exp.h"
+#include "am.h"
+#include "audio_dsp_d2c_def.h"
+#include "l1sp_trc.h"
+#include "media.h"
+#include "lmd_msgid.h"
+#include "sp_drv.h"
+#include "val_msgid.h"
+
+
+static void CodReady( void );
+static void CodClose( void );
+static void CodHBLenGet( uint16 u2RS, IpcSpchSrvcOptRateT u2Rate, uint16 *p2HBLen );
+static void CodParse( IpcSpchSrvcOptT SO );
+static void DLFrameProc(IpcDsvSendSpkrVoiceFwdChPcktDataMsgT *MsgFLDataP);
+SPC2K_Struct spc2k;
+
+    IpcCpSpchDataRevChPacketMsgT MsgLbkUL;
+    IpcDsvSendSpkrVoiceFwdChPcktDataMsgT MsgLbkDL;
+
+uint16 au2ToneTab1K[C2K_COD_RS_1_FULL_LEN_WORD16] = {0x6eac, 0xe370, 0x4862, 0xf8f0, 0x0444, 0x7c16, 0x5e3a, 0x688f, 0x8ca0, 0xc171, 0x4a00};
+uint16 RateReduc_last = 0;
+
+static void CodParse( IpcSpchSrvcOptT SO)
+{
+    switch (SO)
+    {
+        case IPC_SPCH_SRVC_OPTION3:
+            spc2k.u2RS = C2K_COD_RS_1;
+            spc2k.u2Cod = C2K_COD_EVRCA;
+        break;
+            
+        case IPC_SPCH_SRVC_OPTION68:
+            spc2k.u2RS = C2K_COD_RS_1;
+            spc2k.u2Cod = C2K_COD_EVRCB;
+        break;
+        
+        case IPC_SPCH_SRVC_OPTION73:
+            spc2k.u2RS = C2K_COD_RS_1;
+            spc2k.u2Cod = C2K_COD_EVRCNW_NB;
+        break;
+        
+        case IPC_SPCH_SRVC_OPTION73WB:
+            spc2k.u2RS = C2K_COD_RS_1;
+            spc2k.u2Cod = C2K_COD_EVRCNW_WB;
+        break;
+        
+        case IPC_SPCH_SRVC_OPTION17:
+            spc2k.u2RS = C2K_COD_RS_2;
+            spc2k.u2Cod = C2K_COD_QCELP13K;
+        break;
+
+        default:
+        break;
+    }
+    //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] RS=%d, Cod=%d", spc2k.u2RS, spc2k.u2Cod);
+    MD_TRC_C2K_SPH_RS_COD_PARSE(spc2k.u2RS, spc2k.u2Cod);
+    //MonTrace (MON_CP_SPH_LINK_PARSE, 2, spc2k.u2RS, spc2k.u2Cod);
+}
+
+static void CodHBLenGet( uint16 u2RS, IpcSpchSrvcOptRateT u2Rate, uint16 *p2HBLen )
+{
+    if (C2K_COD_RS_1 == u2RS)
+    {
+        switch (u2Rate)
+        {
+            case IPC_SPCH_BLANK:
+                *p2HBLen = C2K_COD_RS_1_BLANK_LEN_WORD16;
+                break;
+            case IPC_SPCH_EIGHTH:
+                *p2HBLen = C2K_COD_RS_1_EIGHTH_LEN_WORD16;
+                break;
+            case IPC_SPCH_QUARTER:
+                *p2HBLen = C2K_COD_RS_1_QUARTER_LEN_WORD16;
+                break;
+            case IPC_SPCH_HALF:
+                *p2HBLen = C2K_COD_RS_1_HALF_LEN_WORD16;
+                break;
+            case IPC_SPCH_FULL:
+                *p2HBLen = C2K_COD_RS_1_FULL_LEN_WORD16;
+                break;
+            case IPC_SPCH_ERASURE:
+                *p2HBLen = C2K_COD_RS_1_ERASURE_LEN_WORD16;
+                break;
+            case IPC_SPCH_FULL_LIKELY:
+                *p2HBLen = C2K_COD_RS_1_FULL_LIKELY_LEN_WORD16;
+                break;
+            default:
+                break;
+        }
+    }
+    else if(C2K_COD_RS_2 == u2RS)
+    {
+        switch (u2Rate)
+        {
+            case IPC_SPCH_BLANK:
+                *p2HBLen = C2K_COD_RS_2_BLANK_LEN_WORD16;
+                break;
+            case IPC_SPCH_EIGHTH:
+                *p2HBLen = C2K_COD_RS_2_EIGHTH_LEN_WORD16;
+                break;
+            case IPC_SPCH_QUARTER:
+                *p2HBLen = C2K_COD_RS_2_QUARTER_LEN_WORD16;
+                break;
+            case IPC_SPCH_HALF:
+                *p2HBLen = C2K_COD_RS_2_HALF_LEN_WORD16;
+                break;
+            case IPC_SPCH_FULL:
+                *p2HBLen = C2K_COD_RS_2_FULL_LEN_WORD16;
+                break;
+            case IPC_SPCH_ERASURE:
+                *p2HBLen = C2K_COD_RS_2_ERASURE_LEN_WORD16;
+                break;
+            default:
+                break;
+        }
+    }	 
+}
+
+void SPC2K_init( void )
+{
+   spc2k.u4HBFrmCountUL1 = 0;
+   spc2k.u4HBFrmCountUL2 = 0;
+   spc2k.u4HBFrmCountDL1 = 0;
+   spc2k.u4HBFrmCountDL2 = 0;
+   spc2k.bCodRdy = false;   
+   spc2k.bSta     = false;
+   spc2k.bFstDLFrm = false;
+   spc2k.bAppSta = false;
+   spc2k.bLMDLbk = false;
+   spc2k.bCAALLbk = false;
+   spc2k.u2Cod = C2K_COD_UNDEF;
+   spc2k.u2RS = C2K_COD_RS_UNDEF;
+#ifdef __FAKE_C2K_LOOPBACK__
+   spc2k.u2Dbg = C2K_DBG_BIT_U2D_LOOPBACK | C2K_DBG_BIT_NO_MODEM;
+#else   
+   spc2k.u2Dbg = C2K_DBG_BIT_INIT;
+#endif   
+#ifndef C2K_SDRV_DISABLE
+   L1Audio_HookHisrHandler(DP_D2C_C2K_DONE_UL,(L1Audio_EventHandler)SPC2K_UL_GetSpeechFrame, 0);
+   L1Audio_HookHisrHandler(DP_D2C_C2K_DONE_DL,(L1Audio_EventHandler)SPC2K_DL_PutSpeechFrame, 0);
+#endif
+}
+
+void SPC2K_ConSSO_Req( uint16 u2SO, uint16 u2MaxEncRate)
+{
+    //MonTrace (MON_CP_SPH_LINK_CON_SSO_REQ, 2, u2SO, u2MaxEncRate); 
+    //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link connect SSO req, SO=%d, MaxRate=%d", u2SO, u2MaxEncRate);
+    MD_TRC_C2K_SPH_LINK_CON_SSO_REQ(u2SO, u2MaxEncRate);
+    if(true == spc2k.bSta)
+    {
+        //MonTrace (MON_CP_SPH_LINK_WARN_SSO_REQ_REPEAT, 0);
+        //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link SSO req repeat");
+        MD_TRC_C2K_SPH_LINK_CON_SSO_REQ_REPEAT();
+        return;
+    }
+    spc2k.bSta = true;
+    CodParse( u2SO );
+    
+#ifndef C2K_SDRV_DISABLE
+    L1SP_C2K_Est(spc2k.u2Cod);
+#else
+    SPC2K_ConSSO_Done();
+#endif
+}
+
+void SPC2K_ConSSO_Done( void )
+{
+    //MonTrace (MON_CP_SPH_LINK_CON_SSO_DONE, 0);
+    //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link connect SSO done");
+    MD_TRC_C2K_SPH_LINK_CON_SSO_DONE();
+    if(!(spc2k.u2Dbg & C2K_DBG_BIT_NO_MODEM))
+    {
+        msg_send5(MOD_L1SP ,MOD_SPCH ,0x0 ,MSG_ID_SDRV_SSO_CONN_DONE_MSG, NULL);
+        //ExeMsgSend (EXE_IPC_ID, IPC_MAILBOX_DSPV_ASYN, SDRV_SSO_CONN_DONE, NULL, 0);    
+    }
+    else
+    {
+        SPC2K_ConSSO_Done_Rsp();
+    }
+}
+
+void SPC2K_ConSSO_Done_Rsp( void )
+{
+    #ifndef CAAL_DISABLE 
+    //enum CAALMsgId MsgId;
+    #endif
+    
+    CodReady();
+    spc2k.bFstDLFrm = true;
+    spc2k.u4HBFrmCountUL1 = 0;
+    spc2k.u4HBFrmCountUL2 = 0;
+    spc2k.u4HBFrmCountDL1 = 0;
+    spc2k.u4HBFrmCountDL2 = 0;
+   #ifndef CAAL_DISABLE
+   if(false == spc2k.bCAALLbk)
+   {    
+       //MsgId = MSG_ID_CAAL_SSO_CONN_RSP_MSG;
+       if(!(spc2k.u2Dbg & C2K_DBG_BIT_NO_MODEM))
+       {
+           msg_send5(MOD_L1SP ,MOD_SPCH ,0x0 ,MSG_ID_CAAL_SSO_CONN_RSP_MSG, NULL);
+           //CAAL_ReadMsgsFromDsp(MsgId, NULL);
+       }
+   }
+   #endif
+}
+
+void SPC2K_DisconSSO_Req( void )
+{
+    //MonTrace (MON_CP_SPH_LINK_DISCON_SSO_REQ, 0);
+    //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link disconnect SSO req");
+    MD_TRC_C2K_SPH_LINK_DISCON_SSO_REQ();
+    if(false == spc2k.bSta)
+    {
+        //MonTrace (MON_CP_SPH_LINK_WARN_DISCON_SSO_REQ_REPEAT, 0);
+        //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link disconnect SSO req repeat");
+        MD_TRC_C2K_SPH_LINK_DISCON_SSO_REQ_REPEAT();
+        return;
+    } 
+#ifndef C2K_SDRV_DISABLE
+    L1SP_C2K_DeEst();
+#else
+    SPC2K_DisconSSO_Done();
+#endif
+}
+
+void SPC2K_DisconSSO_Done( void )
+{
+    //MonTrace (MON_CP_SPH_LINK_DISCON_SSO_DONE, 0);
+    //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link disconnect SSO done");
+    MD_TRC_C2K_SPH_LINK_DISCON_SSO_DONE();
+    if(!(spc2k.u2Dbg & C2K_DBG_BIT_NO_MODEM))
+    {
+        msg_send5(MOD_L1SP ,MOD_SPCH ,0x0 ,MSG_ID_SDRV_SSO_DISCONN_DONE_MSG, NULL);
+        //ExeMsgSend (EXE_IPC_ID, IPC_MAILBOX_DSPV_ASYN, SDRV_SSO_DISCONN_DONE, NULL, 0);
+    }
+    else
+    {
+        SPC2K_DisconSSO_Done_Rsp();
+    }
+}
+
+void SPC2K_DisconSSO_Done_Rsp( void )
+{
+    #ifndef CAAL_DISABLE
+    //enum CAALMsgId MsgId;
+    #endif
+    
+    spc2k.bSta = false;
+    CodClose();
+    #ifndef CAAL_DISABLE
+    if(false == spc2k.bCAALLbk)
+    {
+        if(!(spc2k.u2Dbg & C2K_DBG_BIT_NO_MODEM))
+        {
+            //MsgId = MSG_ID_CAAL_SSO_DISCONN_RSP_MSG;
+            msg_send5(MOD_L1SP ,MOD_SPCH ,0x0 ,MSG_ID_CAAL_SSO_DISCONN_RSP_MSG, NULL);
+            //CAAL_ReadMsgsFromDsp(MsgId, NULL);
+        }
+    }
+    #endif
+}
+
+
+bool SPC2K_State( void )
+{
+   return spc2k.bSta;
+}
+
+static void CodReady( void )
+{
+    //MonTrace (MON_CP_SPH_LINK_COD_RDY, 1, spc2k.bCodRdy);
+    //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link cod ready, CodRdy=%d", spc2k.bCodRdy);
+    MD_TRC_C2K_SPH_LINK_COD_RDY(spc2k.bCodRdy); 
+    if(!spc2k.bCodRdy)
+   	{
+        spc2k.bCodRdy = true;
+    }
+}
+
+static void CodClose( void )
+{
+    //MonTrace (MON_CP_SPH_LINK_COD_CLOSE, 1, spc2k.bCodRdy);
+    //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link cod close, CodRdy=%d", spc2k.bCodRdy);
+    MD_TRC_C2K_SPH_LINK_COD_CLOSE(spc2k.bCodRdy); 
+    if(spc2k.bCodRdy)
+   	{ 
+        spc2k.bCodRdy = false;      
+    }
+}
+
+static void DLFrameProc(IpcDsvSendSpkrVoiceFwdChPcktDataMsgT *MsgFLDataP)
+{
+#ifndef C2K_SAL_DISABLE 
+    volatile uint16 *pu2Addr;
+#endif
+    uint16 u2HBLen;
+    uint16 i;
+    
+    //check rate
+    if((MsgFLDataP->SpkrVoiceFwdChPcktRate != IPC_SPCH_BLANK) && (MsgFLDataP->SpkrVoiceFwdChPcktRate != IPC_SPCH_EIGHTH) && 
+    	 (MsgFLDataP->SpkrVoiceFwdChPcktRate != IPC_SPCH_QUARTER) && (MsgFLDataP->SpkrVoiceFwdChPcktRate != IPC_SPCH_HALF) && 
+    	 (MsgFLDataP->SpkrVoiceFwdChPcktRate != IPC_SPCH_FULL) && (MsgFLDataP->SpkrVoiceFwdChPcktRate != IPC_SPCH_ERASURE) && 
+    	 (MsgFLDataP->SpkrVoiceFwdChPcktRate != IPC_SPCH_FULL_LIKELY))
+    {
+       // MonFault (MON_IPC_FAULT_UNIT, C2K_LINK_DL_RATE_ERR, MsgFLDataP->SpkrVoiceFwdChPcktRate, MON_HALT);
+    }       
+    CodHBLenGet(spc2k.u2RS, MsgFLDataP->SpkrVoiceFwdChPcktRate, &u2HBLen);
+    //check size
+    if(MsgFLDataP->SpkrVoiceFwdChPcktSize != u2HBLen)
+    {
+        //MonFault (MON_IPC_FAULT_UNIT, C2K_LINK_DL_HB_SIZE_ERR, MsgFLDataP->SpkrVoiceFwdChPcktSize, MON_HALT);
+    }
+    //LBK
+    //MsgLbk.MppSpchRate = MsgFLDataP->SpkrVoiceFwdChPcktRate;
+    //MsgLbk.NumMppSpchData = u2HBLen;
+    //for(i = 0; i < u2HBLen; i++)
+    //{
+    //    MsgLbk.MppSpchData[i] = MsgFLDataP->SpkrVoiceFwdChPcktData[i];
+    //}
+    //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link lbk DL, Rate=%d, len=%d", MsgLbk.MppSpchRate, MsgLbk.NumMppSpchData);
+    //kal_trace( TRACE_FUNC, C2K_SPH_LINK_LBK_DL, MsgLbk.MppSpchRate, MsgLbk.NumMppSpchData);
+    //
+    //SPC2K_UL_GetSpeechFrame();
+
+#ifndef C2K_SAL_DISABLE 
+    SAL_C2K_SetValue(SAL_C2K_DL_RATE, MsgFLDataP->SpkrVoiceFwdChPcktRate);
+    pu2Addr = SAL_C2K_GetAddr(SAL_C2K_ADDR_RXHB);
+    for(i = 0; i < u2HBLen; i++)
+    {
+        *pu2Addr = MsgFLDataP->SpkrVoiceFwdChPcktData[i];
+        pu2Addr++;
+    }       
+    SAL_C2K_SetDLReady();
+#endif
+}
+
+
+void SPC2K_DL_PutSpeechFrame_Do(IpcDsvSendSpkrVoiceFwdChPcktDataMsgT *MsgFLDataP)
+{
+    spc2k.u4HBFrmCountDL1++;
+    spc2k.u4HBFrmCountDL2++;
+    if(!spc2k.bCodRdy)
+    {
+        //MonTrace (MON_CP_SPH_LINK_WARN_COD_DL_UNRDY, 0);
+        //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link cod DL unready");
+        MD_TRC_C2K_SPH_LINK_COD_DL_UNRDY(); 
+        
+        return;
+    }
+
+#ifdef C2K_DTS_DISABLE
+    if(!(spc2k.u2Dbg & C2K_DBG_BIT_U2D_LOOPBACK))
+    {
+        if(spc2k.bFstDLFrm)
+        {
+            //MonTrace (MON_CP_SPH_LINK_COD_1ST_FRAME, 0);
+            spc2k.bFstDLFrm = false;
+        #ifndef C2K_SDRV_DISABLE 
+            L1SP_C2K_IntraRAT(spc2k.u2Cod);
+        #endif
+        }
+        else
+        {
+            DLFrameProc(MsgFLDataP);
+        }
+    }
+    else
+    {
+    	DLFrameProc(MsgFLDataP);
+    }
+#else
+    DLFrameProc(MsgFLDataP);
+#endif //C2K_DTS_DISABLE
+
+    MD_TRC_C2K_SPH_LINK_RATE_DL(MsgFLDataP->SpkrVoiceFwdChPcktRate);
+    MD_TRC_C2K_SPH_LINK_COD_DL(spc2k.u2Cod);
+    MD_TRC_C2K_SPH_LINK_HB_DL(MsgFLDataP->SpkrVoiceFwdChPcktData[0], MsgFLDataP->SpkrVoiceFwdChPcktData[1], MsgFLDataP->SpkrVoiceFwdChPcktData[2], MsgFLDataP->SpkrVoiceFwdChPcktData[3],
+               MsgFLDataP->SpkrVoiceFwdChPcktData[4], MsgFLDataP->SpkrVoiceFwdChPcktData[5], MsgFLDataP->SpkrVoiceFwdChPcktData[6], MsgFLDataP->SpkrVoiceFwdChPcktData[7], MsgFLDataP->SpkrVoiceFwdChPcktData[8],
+               MsgFLDataP->SpkrVoiceFwdChPcktData[9], MsgFLDataP->SpkrVoiceFwdChPcktData[10]);
+               
+    //MonTrace (MON_CP_SPH_LINK_HB_DL1, 10, MsgFLDataP->SpkrVoiceFwdChPcktRate, spc2k.u2RS, spc2k.u4HBFrmCountDL1, MsgFLDataP->SpkrVoiceFwdChPcktData[0], MsgFLDataP->SpkrVoiceFwdChPcktData[1], 
+    //          MsgFLDataP->SpkrVoiceFwdChPcktData[2], MsgFLDataP->SpkrVoiceFwdChPcktData[3], MsgFLDataP->SpkrVoiceFwdChPcktData[4], MsgFLDataP->SpkrVoiceFwdChPcktData[5], 
+    //          MsgFLDataP->SpkrVoiceFwdChPcktData[6]);
+    //MonTrace (MON_CP_SPH_LINK_HB_DL2, 5, spc2k.u4HBFrmCountDL2, MsgFLDataP->SpkrVoiceFwdChPcktData[7], MsgFLDataP->SpkrVoiceFwdChPcktData[8], MsgFLDataP->SpkrVoiceFwdChPcktData[9], MsgFLDataP->SpkrVoiceFwdChPcktData[10]);    
+}
+
+void SPC2K_SOCM_Set(IpcDsvSendSsoCtrlParamsMsgT *pMsg)
+{
+#ifndef C2K_SAL_DISABLE
+    uint16 u2SOCM;
+    uint16 u2ValId;
+    
+    ilm_SP_C2K_RATE_REDUC_NOTI_t *local_para;
+    
+    u2SOCM = (pMsg->AudioSsoCtrlRrmLevel << C2K_SOCM_RATE_REDUC_SHIFT) || (pMsg->AudioSsoCtrlM2mMode << C2K_SOCM_MOBILE_TO_MOBILE_SHIFT) || pMsg->AudioSsoCtrlInitCodecMode;
+
+    switch(spc2k.u2Cod)
+    {
+        case SAL_C2K_COD_QCELP13K:
+            u2ValId = SAL_C2K_SOCM_QCELP13K;
+            SAL_C2K_SetValue(u2ValId, u2SOCM);
+        break;
+        
+        case SAL_C2K_COD_EVRCA:
+            u2ValId = SAL_C2K_SOCM_EVRCA;
+            SAL_C2K_SetValue(u2ValId, u2SOCM);
+        break;
+        
+        case SAL_C2K_COD_EVRCB:
+            u2ValId = SAL_C2K_SOCM_EVRCB;
+            SAL_C2K_SetValue(u2ValId, u2SOCM);
+        break;
+        
+        case SAL_C2K_COD_EVRCNW_NB:
+            u2ValId = SAL_C2K_SOCM_EVRCNW_NB;
+            SAL_C2K_SetValue(u2ValId, u2SOCM);
+        break;
+        
+        case SAL_C2K_COD_EVRCNW_WB:
+            u2ValId = SAL_C2K_SOCM_EVRCNW_WB;
+            SAL_C2K_SetValue(u2ValId, u2SOCM);
+        break;
+        
+        default:
+            
+        break;
+    }
+    
+    //Ask Sheila to check
+    //pu2RateReduc = (uint16 *)ExeMsgBufferGet(sizeof(uint16));
+    //*pu2RateReduc = pMsg->AudioSsoCtrlRrmLevel;
+    
+    //ExeMsgSend (EXE_VAL_ID, VAL_MAILBOX , VAL_SPH_RATE_REDUCE_NOTIFY_MSG, (void *)pu2RateReduc, sizeof(uint16));
+    
+    if (RateReduc_last - pMsg->AudioSsoCtrlRrmLevel != 0)
+    {
+    	//kal_prompt_trace(MOD_L1SP, "[C2K][SPH] RateReduc_last=%d", RateReduc_last);
+    	//kal_prompt_trace(MOD_L1SP, "[C2K][SPH] AudioSsoCtrlRrmLevel=%d", pMsg->AudioSsoCtrlRrmLevel);
+    	RateReduc_last = pMsg->AudioSsoCtrlRrmLevel;
+    	local_para = (ilm_SP_C2K_RATE_REDUC_NOTI_t *) construct_local_para( sizeof(ilm_SP_C2K_RATE_REDUC_NOTI_t), TD_CTRL/*TD_RESET*/ );
+    	local_para->pu2RateReduc_EM = pMsg->AudioSsoCtrlRrmLevel;
+    	//kal_prompt_trace(MOD_L1SP, "[C2K][SPH] pu2RateReduc_EM=%d", local_para->pu2RateReduc_EM);
+      msg_send6(MOD_L1SP, MOD_CVAL, 0 ,MSG_ID_VAL_IPC_RATE_REDUCTION_MSG, (local_para_struct *)local_para, NULL); 
+    }   
+
+#endif
+}
+
+void SPC2K_EncMaxRate_Set(IpcDsvSetMicVoiceEncMaxRateMsgT *pMsg)
+{
+    //MonTrace (MON_CP_SPH_LINK_ENC_MAX_RATE, 1, pMsg->MicVoiceEncMaxRate); 
+    //Check ENC_MAX_RATE val
+    if((pMsg->MicVoiceEncMaxRate != IPC_SPCH_BLANK) && (pMsg->MicVoiceEncMaxRate != IPC_SPCH_EIGHTH) && (pMsg->MicVoiceEncMaxRate != IPC_SPCH_QUARTER) && (pMsg->MicVoiceEncMaxRate != IPC_SPCH_HALF) && (pMsg->MicVoiceEncMaxRate != IPC_SPCH_FULL))
+    {
+        //MonFault (MON_IPC_FAULT_UNIT, C2K_LINK_ENC_MAX_RATE_VAL_ERR, pMsg->MicVoiceEncMaxRate, MON_HALT);
+    }
+#ifndef C2K_SAL_DISABLE
+    SAL_C2K_SetValue(SAL_C2K_ENC_MAX_RATE, pMsg->MicVoiceEncMaxRate);
+#endif
+}
+
+void SPC2K_UL_GetSpeechFrame( void )
+{   
+    uint16 u2SO;
+    uint16 u2HBLen;
+    uint16 i;
+#ifndef C2K_SAL_DISABLE
+    volatile uint16 *pu2Addr;
+    //volatile uint16 *pu2LbkDLAddr;  
+#endif
+    
+    lmd_tx_spch_msg_struct* MsgRevPktP;
+    //IpcCpSpchDataRevChPacketMsgT MsgRevPkt;
+    spc2k.u4HBFrmCountUL1++;
+    spc2k.u4HBFrmCountUL2++;
+    if(!spc2k.bCodRdy)
+    {
+        //MonTrace (MON_CP_SPH_LINK_WARN_COD_UL_UNRDY, 0);
+        //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link cod UL unready");
+        MD_TRC_C2K_SPH_LINK_COD_UL_UNRDY(); 
+        return;
+    }
+
+#ifndef C2K_SAL_DISABLE 
+    if (false == SAL_C2K_IsULReady())
+    {
+        //MonTrace (MON_CP_SPH_LINK_WARN_UL_UNSYNC, 0);
+        //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link UL unsync");
+        MD_TRC_C2K_SPH_LINK_UL_UNSYNC();
+        SAL_C2K_SetULUnsync();
+        return;
+    }
+#endif
+
+#ifndef C2K_SAL_DISABLE     
+    u2SO = SAL_C2K_GetValue(SAL_C2K_VALUE_SO);
+    //check SO
+    if((u2SO != SAL_C2K_COD_QCELP8K) && (u2SO != SAL_C2K_COD_QCELP13K) && (u2SO != SAL_C2K_COD_EVRCA) && (u2SO != SAL_C2K_COD_EVRCB) && (u2SO != SAL_C2K_COD_EVRCNW_NB) && (u2SO != SAL_C2K_COD_EVRCNW_WB))
+    {
+        //MonFault (MON_IPC_FAULT_UNIT, C2K_LINK_SO_ERR, u2SO, MON_HALT);
+    }
+    //check DSP & CAAL SO conflict
+    if(u2SO != spc2k.u2Cod)
+    {
+        //MonTrace (MON_CP_SPH_LINK_WARN_SO_CONFLICT, 0);
+        return;
+    }
+#endif
+
+if(!(spc2k.u2Dbg & C2K_DBG_BIT_NO_MODEM))
+{
+    MsgRevPktP = (lmd_tx_spch_msg_struct *)construct_local_para(sizeof(lmd_tx_spch_msg_struct),TD_RESET);
+    #ifndef C2K_SAL_DISABLE 
+    MsgRevPktP->msg.MppSpchRate = SAL_C2K_GetValue(SAL_C2K_VALUE_UL_RATE);
+    #endif
+
+    //check rate
+    if((MsgRevPktP->msg.MppSpchRate != IPC_SPCH_BLANK) && (MsgRevPktP->msg.MppSpchRate != IPC_SPCH_EIGHTH) && 
+    	 (MsgRevPktP->msg.MppSpchRate != IPC_SPCH_QUARTER) && (MsgRevPktP->msg.MppSpchRate != IPC_SPCH_HALF) && 
+    	 (MsgRevPktP->msg.MppSpchRate != IPC_SPCH_FULL) && (MsgRevPktP->msg.MppSpchRate != IPC_SPCH_ERASURE) && 
+    	 (MsgRevPktP->msg.MppSpchRate != IPC_SPCH_FULL_LIKELY))
+    {
+        //MonFault (MON_IPC_FAULT_UNIT, C2K_LINK_UL_RATE_ERR, MsgRevPktP->MppSpchRate, MON_HALT);
+    }
+    CodHBLenGet(spc2k.u2RS, MsgRevPktP->msg.MppSpchRate, &u2HBLen);
+    MsgRevPktP->msg.NumMppSpchData = u2HBLen; 
+    #ifndef C2K_SAL_DISABLE 
+    pu2Addr = SAL_C2K_GetAddr(SAL_C2K_ADDR_TXHB);
+    for(i = 0; i < u2HBLen; i++)
+    {
+        MsgRevPktP->msg.MppSpchData[i] = *pu2Addr;
+        pu2Addr++;
+    }     
+    #endif
+    msg_send5(MOD_L1SP ,MOD_SPCH ,0x0 ,MSG_ID_CAAL_SPH_DATA_UL_MSG, (local_para_struct *) MsgRevPktP);
+    MD_TRC_C2K_SPH_LINK_HB_UL(MsgRevPktP->msg.MppSpchData[0], MsgRevPktP->msg.MppSpchData[1], MsgRevPktP->msg.MppSpchData[2], MsgRevPktP->msg.MppSpchData[3],
+               MsgRevPktP->msg.MppSpchData[4], MsgRevPktP->msg.MppSpchData[5], MsgRevPktP->msg.MppSpchData[6], MsgRevPktP->msg.MppSpchData[7], MsgRevPktP->msg.MppSpchData[8],
+               MsgRevPktP->msg.MppSpchData[9], MsgRevPktP->msg.MppSpchData[10]);
+    MD_TRC_C2K_SPH_LINK_RATE_UL(MsgRevPktP->msg.MppSpchRate);
+}
+
+if(spc2k.u2Dbg & C2K_DBG_BIT_U2D_LOOPBACK)
+{
+    MsgLbkDL.SpkrVoiceFwdChPcktRate = SAL_C2K_GetValue(SAL_C2K_VALUE_UL_RATE);
+    //check rate
+    if((MsgLbkDL.SpkrVoiceFwdChPcktRate != IPC_SPCH_BLANK) && (MsgLbkDL.SpkrVoiceFwdChPcktRate != IPC_SPCH_EIGHTH) && 
+    	 (MsgLbkDL.SpkrVoiceFwdChPcktRate != IPC_SPCH_QUARTER) && (MsgLbkDL.SpkrVoiceFwdChPcktRate != IPC_SPCH_HALF) && 
+    	 (MsgLbkDL.SpkrVoiceFwdChPcktRate != IPC_SPCH_FULL) && (MsgLbkDL.SpkrVoiceFwdChPcktRate != IPC_SPCH_ERASURE) && 
+    	 (MsgLbkDL.SpkrVoiceFwdChPcktRate != IPC_SPCH_FULL_LIKELY))
+    {
+        //MonFault (MON_IPC_FAULT_UNIT, C2K_LINK_UL_RATE_ERR, MsgRevPktP->MppSpchRate, MON_HALT);
+    }
+    CodHBLenGet(spc2k.u2RS, MsgLbkDL.SpkrVoiceFwdChPcktRate, &u2HBLen);
+    MsgLbkDL.SpkrVoiceFwdChPcktSize = u2HBLen; 
+    #ifndef C2K_SAL_DISABLE 
+    pu2Addr = SAL_C2K_GetAddr(SAL_C2K_ADDR_TXHB);
+    for(i = 0; i < u2HBLen; i++)
+    {
+        MsgLbkDL.SpkrVoiceFwdChPcktData[i] = *pu2Addr;
+        pu2Addr++;
+    }     
+    #endif
+    MD_TRC_C2K_SPH_LINK_LBK_UL(MsgLbkDL.SpkrVoiceFwdChPcktRate, MsgLbkDL.SpkrVoiceFwdChPcktSize);
+    SPC2K_DL_PutSpeechFrame_Do(&MsgLbkDL);
+}
+    SAL_C2K_SetULEmpty();
+    
+    MD_TRC_C2K_SPH_LINK_COD_UL(spc2k.u2Cod);
+    
+//    MonTrace (MON_CP_SPH_LINK_HB_UL1, 10, MsgRevPktP->MppSpchRate, spc2k.u2RS, spc2k.u4HBFrmCountUL1, MsgRevPktP->MppSpchData[0], MsgRevPktP->MppSpchData[1], 
+//              MsgRevPktP->MppSpchData[2], MsgRevPktP->MppSpchData[3], MsgRevPktP->MppSpchData[4], MsgRevPktP->MppSpchData[5], 
+//              MsgRevPktP->MppSpchData[6]);
+//    MonTrace (MON_CP_SPH_LINK_HB_UL2, 5, spc2k.u4HBFrmCountUL2, MsgRevPktP->MppSpchData[7], MsgRevPktP->MppSpchData[8], MsgRevPktP->MppSpchData[9], MsgRevPktP->MppSpchData[10]);
+
+#ifndef CAAL_DISABLE
+    //if(true == spc2k.bCAALLbk)
+    //{
+    //    SAL_C2K_SetValue(SAL_C2K_DL_RATE, MsgRevPktP->msg.MppSpchRate);
+    //    pu2LbkDLAddr = SAL_C2K_GetAddr(SAL_C2K_ADDR_RXHB);        
+    //    for(i = 0; i < u2HBLen; i++)
+    //    {
+    //        *pu2LbkDLAddr = MsgRevPktP->msg.MppSpchData[i];
+    //        pu2LbkDLAddr++;
+    //    }
+    //    //ExeMsgBufferFree(MsgRevPktP);
+    //    //MsgRevPktP = NULL;
+    //}
+    //else
+    //{
+    //    MsgId = MSG_ID_CAAL_SPH_DATA_UL_MSG;        
+    //    msg_send5(MOD_L1SP ,MOD_SPCH ,0x0 ,MSG_ID_CAAL_SPH_DATA_UL_MSG, (local_para_struct *) MsgRevPktP);  
+    //    //CAAL_ReadMsgsFromDsp(MsgId, (void *)MsgRevPktP);
+    //}
+#endif
+}
+
+void SPC2K_DL_PutSpeechFrame(IpcDsvSendSpkrVoiceFwdChPcktDataMsgT *MsgFLDataP)
+{
+    if(true == spc2k.bCAALLbk)
+    {
+        SPC2K_DL_PutSpeechFrame_Do(MsgFLDataP);
+    }
+}
+
+void SPC2K_GetSyncDelayRW( uint16 *u2DelR, uint16 *u2DelW, uint16 *u2DelM)
+{
+    SAL_Get_Delay(SAL_DEALY_C2K, SAL_DELAY_NA, SAL_DELAY_NA, u2DelR, u2DelW, u2DelM);
+    //MonTrace (MON_CP_SPH_LINK_DELRWM, 3, *u2DelR, *u2DelW, *u2DelM);
+}
+
+void SPC2K_Link_Lbk(HwdSphLbkMsgT *pMsg)
+{   	  
+    //MonTrace (MON_CP_SPH_LINK_LBK, 3, pMsg->u2Mode, pMsg->u2SO, pMsg->bStart);
+    //#ifndef CAAL_DISABLE
+    //if(C2K_LMD_LBK == pMsg->u2Mode)
+    //{
+    //    CAAL_Loopback_LMD(pMsg->u2SO, pMsg->bStart);
+    //}
+    //else if(C2K_CAAL_LBK == pMsg->u2Mode)
+    //{
+    //    CAAL_Loopback_CAAL(pMsg->u2SO, pMsg->bStart);
+    //}
+    //#endif
+}
+
+void SPC2K_Debug_Info(IpcDsvSendAudioChanQltyMsgT * pMsg)
+{
+#ifndef C2K_SAL_DISABLE 
+    SAL_C2K_SetValue(SAL_C2K_EBNT, pMsg->EbNt);
+#endif
+}