[Feature]Upload Modem source code

Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/driver/audio/src32_inc/ctm_modem.h b/mcu/driver/audio/src32_inc/ctm_modem.h
new file mode 100644
index 0000000..93e39ef
--- /dev/null
+++ b/mcu/driver/audio/src32_inc/ctm_modem.h
@@ -0,0 +1,90 @@
+/*******************************************************************************
+*  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) 2001
+*
+*******************************************************************************/
+
+/*******************************************************************************
+ *
+ * Filename:
+ * ---------
+ *	   ctm_modem.h
+ *
+ * Project:
+ * --------
+ *   
+ *
+ * Description:
+ * ------------
+ *   
+ *
+ * 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!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ *******************************************************************************/
+ 
+#ifdef __CTM_SUPPORT__
+
+#ifndef __CTM_MODEM_H
+#define __CTM_MODEM_H
+
+uint32 ctm_modem_mem_req(void);
+void ctm_modem_init(uint8 *buf, uint32 buf_len, CTM_Param *ctm_param);
+uint16 ctm_modem_get_flags(void);
+
+void baudot_demod(const uint16 *pcm_in_buf, uint16 *ctmFlags, uint8 *utf8_code);
+void ctm_receiver(const uint16 *pcm_in_buf, uint8 bfi, uint16 *ctmFlags, uint8 *utf8_code);
+void baudot_mod(uint8 utf8_code, uint16 *pcm_in_buf,uint16 *ctmFlags);
+void ctm_transmitter(uint8 utf8_code, uint16 *pcm_in_buf,uint16 *ctmFlags);
+void baudot_demod_reset(void);
+
+//*** CMF(CTM Modem Flags)
+
+// Baudot Demodulator
+#define CMF_BAUDOT_IN_DETECTED      0x1
+#define CMF_BAUDOT_IN_CHAR          0x2
+
+// CTM Receiver
+#define CMF_CTM_RX_EARLY_MUTE       0x4
+#define CMF_CTM_RX_DETECTED         0x8
+#define CMF_CTM_RX_CHAR             0x10
+
+// Baudot Modulator
+#define CMF_BAUDOT_OUT_BITS_READY   0x40
+#define CMF_BAUDOT_OUT_NEAR_EMPTY   0x80
+
+// CTM Transmitter
+#define CMF_CTM_TX_BITS_READY       0x100
+#define CMF_CTM_TX_NEAR_EMPTY       0x200
+
+#endif // __CTM_MODEM_H
+
+#endif // __CTM_SUPPORT__
diff --git a/mcu/driver/audio/src32_inc/ctm_params.h b/mcu/driver/audio/src32_inc/ctm_params.h
new file mode 100644
index 0000000..303f03b
--- /dev/null
+++ b/mcu/driver/audio/src32_inc/ctm_params.h
@@ -0,0 +1,207 @@
+/*******************************************************************************
+*  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) 2001
+*
+*******************************************************************************/
+
+/*******************************************************************************
+ *
+ * Filename:
+ * ---------
+ *	   ctm_params.h
+ *
+ * Project:
+ * --------
+ *
+ *
+ * Description:
+ * ------------
+ *
+ *
+ * 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!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ *******************************************************************************/
+
+#ifdef __CTM_SUPPORT__
+
+#ifndef _CTM_PARAMS_H_
+#define _CTM_PARAMS_H_
+
+//--------------------------------------------------------------------
+//#define L1CTM_DEBUG_MODE    // used in ep_engine\ctm\*.*
+                              // used in l1audio\l1ctm.c
+
+   #if defined(L1CTM_DEBUG_MODE)
+#define SAVE_ONLY_TTY_CHAR
+      #ifdef SAVE_ONLY_TTY_CHAR
+#define BURST_START_CHAR   '#'
+#define BURST_END_CHAR     '*'
+      #endif
+   #endif /* L1CTM_DEBUG_MODE */
+
+//--------------------------------------------------------------------
+// Count number of continuous symblos burst without IDLE
+// for detection of test case 7-2 (2006-06-15 Jinfa)
+#define DYNAMIC_IDLE_MISS_HNDL_BIT7_CHEAT                // used in ctm_receiver.c
+#define THRESHOLD_IDLE_MISS_HNDL_BIT7_CHEAT     20
+//--------------------------------------------------------------------
+// If handover happened, disable the IDLE MISS HANDLE mechanism ## 
+// CTM characters
+#define HANDOVER_DISABLE_IDLEMISS_HANDLE_NO     20       // Number of CTM characters
+
+//--------------------------------------------------------------------
+// Map all UTF code into Baudot code set (2006-06-28 Jinfa)
+#define SUPER_BIT_CHEAT                                  // used in ctm_receiver.c
+//--------------------------------------------------------------------
+#define CPRM_MASK_DOWN_SAMP                     0x01
+#define CPRM_MASK_BIT7_CHEAT                    0x02
+#define CPRM_MASK_IDLE_MISS_HNDL                0x04
+
+#define CPRM_MASK_REC_DL_PCM_OUT                0x08     // used in l1ctm.c
+#define CPRM_MASK_REC_DL_PCM_IN                 0x10     // used in l1ctm.c
+#define CPRM_MASK_REC_UL_PCM_OUT                0x20     // used in l1ctm.c
+#define CPRM_MASK_REC_UL_PCM_IN                 0x40     // used in l1ctm.c
+#define CPRM_MASK_REC_RX_BUF                    0x80     // used in l1ctm.c
+#define CPRM_MASK_ALWAYS_NEGO_SUC               0x100    // used in l1ctm.c
+#define CPRM_MASK_MORE_ENQUIRY                  0x200    // used in l1ctm.c
+
+////////////////////////////////////////////
+#define CPRM_BAUDOT_BIT_DURATION                176
+#define CPRM_BFI_SHIFT                          2
+#define CPRM_TH_RELIABILITY                     100
+#define CPRM_NUM_MUTE_BIT                       25
+
+#define CPRM_ALPHA                              32113
+#define CPRM_ONE_MINUS_ALPHA                    655
+#define CPRM_ALPHA2                             32440
+#define CPRM_TH_A                               (8 + (10 << 8))
+#define CPRM_AVE_EARLY_MUTED_BIT                250
+
+#define CPRM_SCAL_FACTOR                        23170
+#define CPRM_WAIT_SYNC_REL_THRESHOLD2           25265
+#define CPRM_WAIT_SYNC_REL_THRESHOLD1           17500
+#define CPRM_RESYNC_REL_THRESHOLD               26542
+
+#define CPRM_THRESHOLD_RELIABILITY_FOR_XCORR    800
+#define CPRM_THRESHOLD_RELIABILITY_FOR_XCORR2   8
+#define CPRM_NUM_BITS                           (40 + (48 << 8))
+#define CPRM_SEARCH_RANGE_PREAMBLE              80
+
+#define CPRM_SEARCH_RANGE_RESYNC                40
+#define CPRM_TH_SAMPLING_CORRECTION             40
+#define CPRM_TONE_DEMOD_DOWN_SAMP               (CPRM_MASK_DOWN_SAMP)
+
+   #if defined(MT6225)
+#define CPRM_NULL_TH                            16500
+#define CPRM_WAIT_SYNC_REL_THRESHOLD0           18500
+#define CPRM_DELAY_SYNC_REL_THRESHOLD           12100
+#define CPRM_CODEBOOK_GAIN_THRESHOLD            3000
+#define CPRM_CODEBOOK_GAIN_VALUE                2300
+   #elif defined(MT6229) || defined(MT6268T) || defined(TK6516) 
+#define CPRM_NULL_TH                            20480
+#define CPRM_WAIT_SYNC_REL_THRESHOLD0           20316
+#define CPRM_DELAY_SYNC_REL_THRESHOLD           11796
+#define CPRM_CODEBOOK_GAIN_THRESHOLD            4000
+#define CPRM_CODEBOOK_GAIN_VALUE                2000
+   #else
+/*For BB which support SAIC*/
+#define CPRM_NULL_TH                            20480
+#define CPRM_WAIT_SYNC_REL_THRESHOLD0           20316
+#define CPRM_DELAY_SYNC_REL_THRESHOLD           11796
+#define CPRM_CODEBOOK_GAIN_THRESHOLD            3000
+#define CPRM_CODEBOOK_GAIN_VALUE                2800
+   #endif
+////////////////////////////////////////////
+
+#endif // _CTM_PARAMS_H_
+#endif // __CTM_SUPPORT__
+
diff --git a/mcu/driver/audio/src32_inc/ecall_control.h b/mcu/driver/audio/src32_inc/ecall_control.h
new file mode 100644
index 0000000..a364128
--- /dev/null
+++ b/mcu/driver/audio/src32_inc/ecall_control.h
@@ -0,0 +1,143 @@
+/*============================================================================*/
+/* eCall ANSI C fixed-point reference source code                             */
+/*                                                                            */
+/* File:         ecall_control.h                                              */
+/* Version:      8.6.0 (Rel8) / 9.4.0 (Rel9)                                  */
+/* Date:         2011-02-08                                                   */
+/* Description:  control message functions (header file)                      */
+/*----------------------------------------------------------------------------*/
+
+#ifndef ECALL_CONTROL_H_
+#define ECALL_CONTROL_H_
+
+#include "ecall_defines.h"
+#include "ecall_sync.h"
+
+
+typedef enum {
+  DlMsgNoop = -2,
+  DlMsgReset,
+  DlMsgStart, // 0
+  DlMsgNack,  // 1
+  DlMsgAck,   // 2
+  DlMsgSend,  // 3
+  DlMsgUndef04,
+  DlMsgUndef05,
+  DlMsgUndef06,
+  DlMsgUndef07,
+  DlMsgUndef08,
+  DlMsgUndef09,
+  DlMsgUndef10,
+  DlMsgUndef11,
+  DlMsgUndef12,
+  DlMsgUndef13,
+  DlMsgUndef14,
+  DlMsgUndef15,
+  DlMsgUndef16,
+  DlMsgUndef17,
+  DlMsgUndef18,
+  DlMsgUndef19,
+  DlMsgUndef20,
+  DlMsgUndef21,
+  DlMsgUndef22,
+  DlMsgUndef23,
+  DlMsgUndef24,
+  DlMsgUndef25,
+  DlMsgUndef26,
+  DlMsgUndef27,
+  DlMsgUndef28,
+  DlMsgUndef29,
+  DlMsgUndef30,
+  DlMsgUndef31,
+  DlMsgHlack = SET_LLMSG + SET_HLMSG
+} DlData;
+
+#ifdef ECALL_ENUM2STR
+#define DLMSG_PAD (-DlMsgNoop)
+#define NUM_DLMSGS (DlMsgHlack - DlMsgNoop + 1)
+extern const char* const __DLMSG2STR[NUM_DLMSGS];
+#define DLDATA2STR(DLDATA) __DLMSG2STR[DLMSG_PAD + DLDATA]
+#endif
+
+typedef enum {
+  CtrlRxIdle,
+  CtrlRxSync,
+  CtrlRxLock,
+  CtrlTxIdle,
+  CtrlTxSend,
+  NUM_PORTSTATES
+} PortState;
+
+#ifdef ECALL_ENUM2STR
+extern const char* const __PORTSTATE2STR[NUM_PORTSTATES];
+#define PORTSTATE2STR(PORTSTATE) __PORTSTATE2STR[PORTSTATE]
+#endif
+
+typedef enum {
+  PortUndef,
+  PortIvs,
+  PortPsap,
+  NUM_PORTOWNERS
+} PortOwner;
+
+#ifdef ECALL_ENUM2STR
+extern const char* const __PORTOWNER2STR[NUM_PORTOWNERS];
+#define PORTOWNER2STR(PORTOWNER) __PORTOWNER2STR[PORTOWNER]
+#endif
+
+/*============================================================================*/
+/* Control structures                                                         */
+/*----------------------------------------------------------------------------*/
+
+typedef struct {
+  Int16 dlData;           /* message symbol */
+  Int16 dlIndex;          /* message frame counter */
+} CtrlTxPort;
+
+typedef struct {
+  Int16 dlData;           /* detected message symbol */
+  Int16 dlMetric;         /* receiver metric */
+} CtrlRxPort;
+
+typedef struct {
+  union {
+    CtrlTxPort tx;        /* port control transmitter */
+    CtrlRxPort rx;        /* port control receiver */
+  } u;
+  PortState state;        /* port state */
+  PortOwner owner;        /* port owner identification */
+  Bool invert;            /* port inversion flag */
+} CtrlPort;
+
+typedef struct {
+  CtrlPort port;          /* port struct */
+} CtrlTxData;
+
+typedef struct {
+  CtrlPort port;          /* port struct */
+
+  SyncState *sync;        /* pointer to sync struct */
+  Int16 *buffer;          /* pointer to control receiver buffer */
+
+  Tern  dlRead;           /* sync indication (ternary variable) */
+  Int16 dlIndex;          /* internal frame counter */
+  Int16 dlSyncLock;       /* number of sync events required */
+} CtrlRxData;
+
+
+/*============================================================================*/
+/* Control functions                                                          */
+/*----------------------------------------------------------------------------*/
+
+const char* CtrlPortName(PortOwner);
+void CtrlSync(CtrlRxData*, const Int16*);
+
+void CtrlTxReset(CtrlTxData*, PortOwner);
+void CtrlTxProcess(CtrlTxData*, Int16*);
+void CtrlTxMod(Int16*, Int16, Int16);
+
+void CtrlRxReset(CtrlRxData*, PortOwner, SyncState*, Int16*, Int16);
+void CtrlRxProcess(CtrlRxData*, const Int16*);
+Int16 CtrlRxDemod(const Int16*, Int16*);
+
+#endif
diff --git a/mcu/driver/audio/src32_inc/ecall_defines.h b/mcu/driver/audio/src32_inc/ecall_defines.h
new file mode 100644
index 0000000..8bb9df5
--- /dev/null
+++ b/mcu/driver/audio/src32_inc/ecall_defines.h
@@ -0,0 +1,130 @@
+/*============================================================================*/
+/* eCall ANSI C fixed-point reference source code                             */
+/*                                                                            */
+/* File:         ecall_defines.h                                              */
+/* Version:      8.6.0 (Rel8) / 9.4.0 (Rel9)                                  */
+/* Date:         2011-02-08                                                   */
+/* Description:  constants and common data structures                         */
+/*----------------------------------------------------------------------------*/
+
+#ifndef ECALL_DEFINES_H_
+#define ECALL_DEFINES_H_
+
+#include <limits.h>
+
+//#define __ECALL_MODEM_SUPPORT_PSAP__
+#define ECALL_ENUM2STR
+
+/*============================================================================*/
+/* General conventions                                                        */
+/*----------------------------------------------------------------------------*/
+
+typedef enum { False, True } Bool;
+typedef enum { Minus = -1, Zero, Plus } Tern;
+
+typedef signed char          Int8;        /*  8 bit signed variable           */
+typedef signed short int     Int16;       /* 16 bit signed variable           */
+typedef signed int           Int32;       /* 32 bit signed variable           */
+
+typedef unsigned char        Ord1;        /*  1 bit variable                  */
+typedef unsigned char        Ord8;        /*  8 bit unsigned variable         */
+typedef unsigned short int   Ord16;       /* 16 bit unsigned variable         */
+typedef unsigned int         Ord32;       /* 32 bit unsigned variable         */
+
+#define MAX(a,b) ((a)>(b) ? (a) : (b))    /* macro: maximum                   */
+#define MIN(a,b) ((a)<(b) ? (a) : (b))    /* macro: minimum                   */
+#define ABS(a)   ((a)< 0 ? -(a) : (a))    /* macro: absolute value            */
+#define SIGN(a)  ((a)< 0 ? (-1) : (1))    /* macro: sign                      */
+
+#ifndef PCM_LENGTH
+#define PCM_LENGTH        (160)           /* length of PCM frame in samples   */
+#endif
+#ifndef ECALL_MSD_MAX_LENGTH
+#define ECALL_MSD_MAX_LENGTH    (140)           /* length of MSD message in bytes   */
+#endif
+#ifndef PCM_MIN
+#define PCM_MIN           (SHRT_MIN)      /* minimum PCM value                */
+#endif
+#ifndef PCM_MAX
+#define PCM_MAX           (SHRT_MAX)      /* maximum PCM value                */
+#endif
+
+/*============================================================================*/
+/* Synchronization                                                            */
+/*----------------------------------------------------------------------------*/
+
+#define SYNC_BADCHECK     (3)             /* sync consecutive bad check       */
+#define SYNC_BADTRACK     (4)             /* sync consecutive bad track       */
+#define SYNC_IDXLEN       (75)            /* sync index length                */
+#define SYNC_THRESHOLD    (10e6)          /* sync threshold                   */
+
+#define LOCK_RESYNC       (2)             /* messages to lock after sync loss */
+#define LOCK_START_UL     (2)             /* START messages to lock sync (UL) */
+#define LOCK_START_DL     (3)             /* START messages to lock sync (DL) */
+#define FAIL_RESTART      (3)             /* START messages to restart        */
+
+#define NRF_WAKEUP        (3)             /* number of wakeup frames          */
+#define NRF_SYNC          (13)            /* number of sync frames            */
+#define NRF_OBSERVE       (10)            /* number of sync observer frames   */
+#define NRF_RESYNC        (60)            /* resync frames after sync loss    */
+
+#define NRS_CHECK         (480)           /* number of samples to check       */
+#define NRS_TRACK         (240)           /* number of samples to track       */
+#define NRS_CP            (2)             /* number of samples next to peaks  */
+
+#define PNSEQ_OSF         (22)            /* oversampling of PN sequence      */
+#define PEAK_DIST_PP      (30*PNSEQ_OSF)  /* distance outer positive peaks    */
+#define PEAK_DIST_NN      (54*PNSEQ_OSF)  /* distance negative peaks          */
+#define PEAK_DIST_PN      (12*PNSEQ_OSF)  /* distance positive to negative    */
+
+/*============================================================================*/
+/* Uplink/Downlink format                                                     */
+/*----------------------------------------------------------------------------*/
+
+#define ARQ_MAX           (8)             /* number of redundancy versions    */
+#define NRB_TAIL          (3)             /* number of encoder tail bits      */
+#define NRB_CRC           (28)            /* order of CRC polynomial          */
+
+#define NRB_INFO          (8*ECALL_MSD_MAX_LENGTH)
+#define NRB_INFO_CRC      (8*ECALL_MSD_MAX_LENGTH + NRB_CRC)
+#define NRB_CODE_ARQ      (1380)
+#define NRB_CODE_BUFFER   (3*(8*ECALL_MSD_MAX_LENGTH + NRB_CRC) + 4*NRB_TAIL)
+
+#define SET_LLMSG         (16)            /* set size lower-layer messages    */
+#define SET_HLMSG         (16)            /* set size higher-layer messages   */
+
+#define NRF_DLDATA        (3)             /* downlink data frames             */
+#define NRF_DLMUTE1LL     (3)             /* 1st muting lower-layer message   */
+#define NRF_DLMUTE1HL     (1)             /* 1st muting higher-layer message  */
+#define NRF_DLCHUNK       (NRF_SYNC + NRF_DLMUTE1HL + 2*NRF_DLDATA)
+
+/*============================================================================*/
+/* IVS/PSAP processing                                                        */
+/*----------------------------------------------------------------------------*/
+
+#define NRF_MEMCTRL       (7)
+#define NRS_MEMSYNC       (508 + 38*NRS_CP)
+
+#define IVS_NUMSEND       (5)             /* number of SEND messages          */
+#define IVS_THRESHOLD     (40000)         /* threshold for control messages   */
+#define IVS_GOSTART       (6)             /* threshold for unreliable START   */
+#define IVS_TXFAST        (10)            /* fast modulator NACK condition    */
+#define IVS_TXINC         (87)            /* sample increment at restart      */
+
+#define PSAP_NUMSTART     (500)           /* number of START messages         */
+#define PSAP_NUMACK       (5)             /* number of ACK messages           */
+#define PSAP_NUMHLACK     (5)             /* number of HLACK messages         */
+#define PSAP_THRESHOLD    (40)            /* threshold for modulator type     */
+
+#define FEC_VAR           (30206)         /* variance: 1/4550000 in Q37       */
+#define FEC_MEAN          (0xB9999A)      /* mean: 5.8 in Q21                 */
+#define FEC_ITERATIONS    (8)             /* number of decoder iterations     */
+#define FEC_STATES        (8)             /* number of decoder states         */
+
+#define IntLLR            Int16
+#define LLR_MAX           ((Int32)(0x7fff-1))
+#define LOGEXP_RES        (401)           /* resolution of logexp table       */
+#define LOGEXP_DELTA      (-6)            /* internal Q-factor                */
+#define LOGEXP_QIN        (8)             /* input Q-factor of LLR values     */
+
+#endif
diff --git a/mcu/driver/audio/src32_inc/ecall_fec.h b/mcu/driver/audio/src32_inc/ecall_fec.h
new file mode 100644
index 0000000..d251217
--- /dev/null
+++ b/mcu/driver/audio/src32_inc/ecall_fec.h
@@ -0,0 +1,50 @@
+/*============================================================================*/
+/* eCall ANSI C fixed-point reference source code                             */
+/*                                                                            */
+/* File:         ecall_fec.h                                                  */
+/* Version:      8.6.0 (Rel8) / 9.4.0 (Rel9)                                  */
+/* Date:         2011-02-08                                                   */
+/* Description:  Turbo encoder and decoder (header file)                      */
+/*----------------------------------------------------------------------------*/
+
+#ifndef ECALL_FEC_H_
+#define ECALL_FEC_H_
+
+#include "ecall_defines.h"
+#include "ecall_rom.h"
+
+
+/*============================================================================*/
+/* Encoder functions                                                          */
+/*----------------------------------------------------------------------------*/
+
+void FecEncode(Ord1*);
+
+void AttachCrc(const Ord1*, Ord1*);
+void Scramble(const Ord1*, Ord1*);
+void EncodeTwo(Ord1*);
+void EncodeOne(Ord1*, Int16);
+
+/*============================================================================*/
+/* Decoder functions                                                          */
+/*----------------------------------------------------------------------------*/
+
+Bool FecDecode(const IntLLR*, Int16, Ord1*);
+
+void UpdateBuffer(IntLLR*, const IntLLR*, Int16);
+void DecodeBuffer(const IntLLR*, const IntLLR*,
+                  const IntLLR*, const IntLLR*, Ord1*);
+
+Bool DecodeCrc(const Ord1*);
+void Interleave(const IntLLR*, IntLLR*);
+void Deinterleave(IntLLR*);
+void Descramble(Ord1*);
+void Bcjr(const IntLLR*, IntLLR*);
+
+IntLLR GammaQ(Int16, Int16, const IntLLR*, const IntLLR*);
+IntLLR JacLog(Int32, Int32);
+
+void FecInit(void *addr);
+void FecDeinit(void);
+
+#endif
diff --git a/mcu/driver/audio/src32_inc/ecall_modem.h b/mcu/driver/audio/src32_inc/ecall_modem.h
new file mode 100644
index 0000000..e1d296a
--- /dev/null
+++ b/mcu/driver/audio/src32_inc/ecall_modem.h
@@ -0,0 +1,61 @@
+/*============================================================================*/
+/* eCall ANSI C fixed-point reference source code                             */
+/*                                                                            */
+/* File:         ecall_modem.h                                                */
+/* Version:      8.6.0 (Rel8) / 9.4.0 (Rel9)                                  */
+/* Date:         2011-02-08                                                   */
+/* Description:  modulator and demodulator functions (header file)            */
+/*----------------------------------------------------------------------------*/
+
+#ifndef ECALL_MODEM_H_
+#define ECALL_MODEM_H_
+
+#include "ecall_defines.h"
+
+
+typedef enum {
+  ModUndef,
+  Mod3bit4smp,
+  Mod3bit8smp
+} ModType;
+
+typedef struct {
+  ModType type;      /* identifies modulator type */
+
+  Int16 bpsym;       /* bits per symbol */
+  Int16 spmf;        /* samples per modulation frame */
+  Int16 mfpf;        /* modulation frames per frame = PCM_LENGTH/spmf */
+  Int16 decpos1;     /* position 1st decoding trial */
+  Int16 decpos2;     /* position 2nd decoding trial */
+  Int16 wutperiod;   /* wakeup tone period in samples */
+  Int16 nfmute1;     /* number of muting frames 1st interval */
+  Int16 nfmute4;     /* number of muting frames 4th interval */
+  Int16 nfmuteall;   /* number of muting frames total */
+  Int16 nfdata;      /* number of data frames = NRB_CODE_ARQ/(mfpf*bpsym) */
+
+  const Int16 *ulPulse;
+  const Int16 *ulPulseMatch;
+  const Int16 *mgTable;
+  const Int16 *wakeupSin;
+  const Int16 *wakeupCos;
+} ModState;
+
+
+/*============================================================================*/
+/* Modem functions                                                            */
+/*----------------------------------------------------------------------------*/
+
+void SetModState(ModState*, ModType);
+
+void IvsTransmitter(const ModState*, const Ord1*, Int16*, Int16, Int16);
+void PsapReceiver(const ModState*, const Int16*, IntLLR*);
+
+void SymbolMod(const ModState*, Int16, Int16*);
+void SymbolDemod(const ModState*, const Int16*, IntLLR*);
+
+void Byte2Bit(const Ord8*, Ord1*, Int16);
+void Bit2Byte(const Ord1*, Ord8*, Int16);
+
+Int32 MpyLacc(Int32, Int16);
+
+#endif
diff --git a/mcu/driver/audio/src32_inc/ecall_rom.h b/mcu/driver/audio/src32_inc/ecall_rom.h
new file mode 100644
index 0000000..d54ddc0
--- /dev/null
+++ b/mcu/driver/audio/src32_inc/ecall_rom.h
@@ -0,0 +1,62 @@
+/*============================================================================*/
+/* eCall ANSI C fixed-point reference source code                             */
+/*                                                                            */
+/* File:         ecall_rom.h                                                  */
+/* Version:      8.6.0 (Rel8) / 9.4.0 (Rel9)                                  */
+/* Date:         2011-02-08                                                   */
+/* Description:  ROM data arrays (header file)                                */
+/*----------------------------------------------------------------------------*/
+
+#ifndef ECALL_ROM_H_
+#define ECALL_ROM_H_
+
+#include "ecall_defines.h"
+
+
+/*============================================================================*/
+/* Synchronization                                                            */
+/*----------------------------------------------------------------------------*/
+
+extern const Int16 wakeupSin500[16];
+extern const Int16 wakeupCos500[16];
+extern const Int16 wakeupSin800[10];
+extern const Int16 wakeupCos800[10];
+
+extern const Int16 syncPulseForm[5];
+extern const Int16 syncSequence[15];
+extern const Int16 syncIndexPreamble[SYNC_IDXLEN];
+extern const Int16 syncFrame[10*PCM_LENGTH];
+
+/*============================================================================*/
+/* Uplink/Downlink format                                                     */
+/*----------------------------------------------------------------------------*/
+
+extern const Int16 indexBits[24];
+
+extern const Int16 m4smp_ulPulse[16];
+extern const Int16 m8smp_ulPulse[32];
+extern const Int16 m4smp_ulPulseMatch[64];
+extern const Int16 m8smp_ulPulseMatch[128];
+
+extern const Int16 m4smp_mgTable[66];
+extern const Int16 m8smp_mgTable[116];
+
+extern const Int16 dlPcmData[4][NRF_DLDATA*PCM_LENGTH];
+extern const Int16 dlPcmDataMatch[4][NRF_DLDATA*PCM_LENGTH];
+
+/*============================================================================*/
+/* FEC encoder/decoder                                                        */
+/*----------------------------------------------------------------------------*/
+
+extern const Ord16 stateTrans[16];
+extern const Ord16 revStateTrans[16];
+extern const Ord1  outputParity[16];
+
+extern const Ord1  crcPolynomial[NRB_CRC+1];
+extern const Ord1  scramblingSeq[NRB_INFO_CRC];
+extern const Ord16 interleaverSeq[NRB_INFO_CRC];
+extern const Ord16 redVerIndex[8][NRB_CODE_ARQ];
+
+extern const IntLLR logExpTable[LOGEXP_RES];
+
+#endif
diff --git a/mcu/driver/audio/src32_inc/ecall_sync.h b/mcu/driver/audio/src32_inc/ecall_sync.h
new file mode 100644
index 0000000..0200543
--- /dev/null
+++ b/mcu/driver/audio/src32_inc/ecall_sync.h
@@ -0,0 +1,83 @@
+/*============================================================================*/
+/* eCall ANSI C fixed-point reference source code                             */
+/*                                                                            */
+/* File:         ecall_sync.h                                                 */
+/* Version:      12.0.0 (Rel12)                                               */
+/* Date:         2014-09-11                                                   */
+/* Description:  synchronization functions (header file)                      */
+/*----------------------------------------------------------------------------*/
+
+#ifndef ECALL_SYNC_H_
+#define ECALL_SYNC_H_
+
+#include "ecall_defines.h"
+
+
+typedef struct {
+  Int32 amplitude[2];       /* amplitudes (average, maximum) */
+  Int32 shape[2*NRS_CP+1];  /* shape of peak causing a sync event */
+  Int32 sign;               /* sync sign marker */
+
+  Bool  flag;               /* indicates sync success */
+  Int16 delay;              /* synchronization delay */
+  Int16 npeaks;             /* number of sync peaks detected */
+  Int16 npeaksChk;          /* number of sync peaks detected by sync check */
+} SyncSub;
+
+typedef struct {
+  Int32 *mem;               /* memory for sync */
+  Int32 *memWakeup;         /* memory for wakeup tone detector */
+
+  SyncSub syncPos;          /* regular sync (non-inverted) */
+  SyncSub syncNeg;          /* inverted sync */
+
+  Int32 amplitude[3];       /* amplitudes (average, maximum, memory) */
+  Int32 shape[2*NRS_CP+1];  /* shape of peak causing a sync event */
+  Int32 sign;               /* sync sign marker */
+
+  Bool flag;                /* indicates sync success */
+  Bool invert;              /* indicates sync inversion */
+  Bool resync;              /* indicates resynchronization event */
+
+  Int16 delay;              /* synchronization delay */
+  Int16 delayMem;           /* synchronization delay (memory) */
+  Int16 npeaks;             /* number of sync peaks detected */
+  Int16 npeaksMem;          /* number of sync peaks detected (memory) */
+  Int16 events;             /* number of subsequent equal sync events */
+
+  Tern  check;              /* indicates sync check result (ternary variable) */
+  Int16 checkCnt;           /* counter for subsequent sync check failures */
+  Int16 index;              /* frame reference for sync evaluation */
+} SyncState;
+
+
+/*============================================================================*/
+/* Sync functions                                                             */
+/*----------------------------------------------------------------------------*/
+
+void SyncReset(SyncState*, Int32*, Int32*);
+void SyncSubReset(SyncSub*);
+
+void Sync(SyncState*, const Int16*, const char*, Bool);
+void SyncCheck(SyncState*, const Int16*, const char*);
+void SyncTrack(SyncState*, Bool);
+
+void SyncFilter(SyncState*, const Int16*, Bool);
+
+void SyncSubPut(const SyncState*, SyncSub*);
+void SyncSubGet(SyncState*, const SyncSub*);
+void SyncSubCpy(const SyncSub*, SyncSub*);
+
+void SyncSubRun(SyncSub*, const char*,
+                const Int32*, const Int32*, const Int32*, const Int32*);
+void SyncSubChk(SyncSub*, const char*,
+                const Int32*, const Int32*, const Int32*, const Int32*, Int16);
+
+Int16 PeakUpdate(const Int32*, const Int32*, Int16);
+void PeakCheck(SyncSub*, const char*, const Bool*, const Int16*,
+               const Int32*, const Int32*, const Int32*,
+               Int16, Int16, Int16, Int16);
+
+void ToneDetect(SyncState*, const Int16*);
+
+#endif
diff --git a/mcu/driver/audio/src32_inc/modemx.h b/mcu/driver/audio/src32_inc/modemx.h
new file mode 100644
index 0000000..6696396
--- /dev/null
+++ b/mcu/driver/audio/src32_inc/modemx.h
@@ -0,0 +1,238 @@
+/*============================================================================*/
+/* eCall ANSI C fixed-point reference source code                             */
+/*                                                                            */
+/* File:         modemx.h                                                     */
+/* Version:      8.6.0 (Rel8) / 9.4.0 (Rel9)                                  */
+/* Date:         2011-02-08                                                   */
+/* Description:  IVS and PSAP structures and functions (header file)          */
+/*----------------------------------------------------------------------------*/
+
+#ifndef MODEMX_H_
+#define MODEMX_H_
+
+#include <stdio.h>
+#include <string.h>
+
+#include "ecall_defines.h"
+#include "ecall_control.h"
+#include "ecall_modem.h"
+#include "ecall_sync.h"
+#include "ecall_fec.h"
+#include "ecall_rom.h"
+
+#include "kal_public_api.h"
+#include "kal_trace.h"
+#include "l1sp_trc.h"
+
+/* callback functions: to be implemented by the user application */
+
+void Abort(const char *format, ...);
+void LogInfo(const char *format, ...);
+
+/*============================================================================*/
+/* IVS declarations                                                           */
+/*----------------------------------------------------------------------------*/
+
+typedef enum {
+  IVSEVENT_SENDINGSTART,
+  IVSEVENT_SENDINGMSD,
+  IVSEVENT_RESTARTMSD,
+  IVSEVENT_CONTROLSYNC,
+  IVSEVENT_CONTROLLOCK,
+  IVSEVENT_LLACKRECEIVED,
+  IVSEVENT_HLACKRECEIVED,
+  IVSEVENT_IDLEPOSTRESET,
+  IVSEVENT_IDLEPOSTSTART,
+  IVSEVENT_TIMEOUT,
+  IVSEVENT_NACKRECEIVED,
+  IVSEVENT_RECEIVESTART     //self defined
+} IvsEvent;
+
+/* callback functions: to be implemented by the user application */
+
+void IvsCatchEvent(IvsEvent ie);
+void IvsReceiveHlack(const Ord8 data);
+
+/*----------------------------------------------------------------------------*/
+
+void IvsReset(const Ord8 *msd, int length);
+void IvsProcess(Int16 *pcm);
+void IvsSendStart(void);
+
+void IvsRxReset(void);
+void IvsRxProcess(const Int16 *pcm);
+
+void IvsTxReset(const Ord8 *msd, int length);
+void IvsTxProcess(Int16 *pcm);
+void IvsTxState(Int16 msg, Int16 metric, Bool syncLock);
+
+/*----------------------------------------------------------------------------*/
+
+typedef enum {
+  IvsIdle,
+  IvsTrigger,
+  IvsStart,
+  IvsSendMsd,
+  IvsAck,
+  IvsHlack
+} IvsState;
+
+typedef struct {
+  IvsState   state;       /* IVS transmitter state */
+  CtrlTxData ctrl;        /* IVS control struct */
+  ModState   mod;         /* IVS modulator struct */
+
+  Int16 rv;               /* redundancy version */
+  Int16 ulN;              /* uplink number of frames */
+  Int16 ulIndex;          /* uplink frame counter */
+  Int16 ulDelay;          /* uplink transmit offset in samples */
+  Int16 dlMsgOld;         /* previous control message */
+
+  Bool  pendingStart;     /* indicates pending START message */
+  Int16 overallNack;      /* cumulative NACK count */
+
+  Int16 stateCnt[SET_LLMSG + SET_HLMSG+1];
+  Int16 stateIgn[SET_LLMSG + SET_HLMSG+1];
+
+  Ord1  memCode[NRB_CODE_BUFFER];
+  Int16 memDelay[2*PCM_LENGTH];
+  
+  Int8 Ivs_eCall_LIB_Status;
+} IvsTxData;
+
+typedef struct {
+  IvsState   state;       /* IVS receiver state */
+  CtrlRxData ctrl;        /* IVS control struct */
+  SyncState  sync;        /* IVS sync struct */
+
+  Int16 dlData;           /* downlink message symbol */
+  Int16 dlIndex;          /* donwlink frame counter */
+  Int16 dlMsgCnt;         /* downlink message counter */
+
+  Int16 memCtrl[NRF_MEMCTRL*PCM_LENGTH];
+  Int32 memSync[NRS_MEMSYNC];
+} IvsRxData;
+
+typedef struct {
+  IvsRxData rx;           /* IVS receiver struct */
+  IvsTxData tx;           /* IVS transmitter struct */
+} IvsData;
+
+// KH: add for integration
+void IvsInit(void *addr);
+void IvsDeinit(void);
+int IvsGetMemSize(void);
+IvsState IvsTxGetState(void);
+IvsState IvsRxGetState(void);
+
+void PsapInit(void *addr);
+void PsapDeinit(void);
+int PsapGetMemSize(void);
+
+void Ivs_Set_Ecall_Lib_Status(Int8 status);
+Int8 Ivs_Get_Ecall_Lib_Status(void);
+
+
+
+
+typedef enum{
+	Ivs_ECALL_DISABLE = 0,
+	Ivs_ECALL_SDT_ONLY,
+	Ivs_ECALL_ENABLE,
+	Ivs_ECALL_MAX = 3 
+} Ivs_ECALL_STATUS;
+
+/*============================================================================*/
+/* PSAP declarations                                                          */
+/*----------------------------------------------------------------------------*/
+
+typedef enum {
+  PSAPEVENT_SENDINGSTART,
+  PSAPEVENT_SENDINGRESTART,
+  PSAPEVENT_SENDINGLLACK,
+  PSAPEVENT_SENDINGHLACK,
+  PSAPEVENT_CONTROLSYNC,
+  PSAPEVENT_CONTROLLOCK,
+  PSAPEVENT_MSDSYNC,
+  PSAPEVENT_MSDRECEIVED,
+  PSAPEVENT_IDLEPOSTRESET,
+  PSAPEVENT_IDLEPOSTSTART,
+  PSAPEVENT_IDLEPOSTLLACK,
+  PSAPEVENT_IDLEPOSTHLACK,
+  PSAPEVENT_TIMEOUT
+} PsapEvent;
+
+/* callback functions: to be implemented by the user application */
+
+void PsapCatchEvent(PsapEvent pe);
+void PsapReceiveMsd(const Ord8 *msd, int length);
+
+/*----------------------------------------------------------------------------*/
+
+void PsapReset(void);
+void PsapProcess(Int16 *pcm);
+void PsapSendStart(void);
+void PsapSendHlack(const Ord8 data);
+
+void PsapRxReset(void);
+void PsapRxProcess(const Int16 *pcm);
+void PsapRxUplink(const Int16 *pcm);
+void PsapRxDownlink(void);
+void PsapRxSetMod(const SyncState *sync, ModState *mod);
+
+void PsapTxReset(void);
+void PsapTxProcess(Int16 *pcm);
+
+/*----------------------------------------------------------------------------*/
+
+typedef enum {
+  PsapIdle,
+  PsapTrigger,
+  PsapStart,
+  PsapNack,
+  PsapAck,
+  PsapHlack
+} PsapState;
+
+typedef struct {
+  PsapState  state;       /* PSAP receiver state */
+  CtrlRxData ctrl;        /* PSAP control struct */
+  SyncState  sync;        /* PSAP sync struct */
+  ModState   mod;         /* PSAP modulator struct */
+
+  Int16 rv;               /* redundancy version */
+  Int16 ulN;              /* uplink number of frames without muting */
+  Int16 ulIndex;          /* uplink frame counter */
+  Int16 mgIndex;          /* uplink position in muting gap table */
+  Int16 ulTrials;         /* uplink decoding trails */
+  Int16 ulSyncTail;       /* sync observation counter after sync success */
+
+  Ord8  dlHlackData;      /* downlink higher-layer message (4 bits) */
+  Int16 dlData;           /* downlink message symbol */
+  Int16 dlIndex;          /* donwlink frame counter */
+  Int16 dlMsgCnt;         /* downlink message counter */
+
+  Ord8   *msd;            /* MSD in byte representation */
+  Ord1   *msdBin;         /* MSD in binary representation */
+  Int16  *memCtrl;        /* buffer for control and data demodulation */
+  IntLLR *memCode;        /* soft bit buffer for decoding */
+
+  char buffer[0
+    + sizeof(IntLLR)* NRB_CODE_ARQ
+    + sizeof(Int16) * NRF_MEMCTRL*PCM_LENGTH
+    + sizeof(Int32) * NRS_MEMSYNC
+    + sizeof(Int32) * 2*(NRF_SYNC+1)];
+} PsapRxData;
+
+typedef struct {
+  CtrlTxData ctrl;        /* PSAP control struct */
+} PsapTxData;
+
+typedef struct {
+  PsapRxData rx;          /* PSAP receiver struct */
+  PsapTxData tx;          /* PSAP transmitter struct */
+} PsapData;
+
+PsapData* PsapGetData(void);
+
+#endif