blob: bc2ba7a28adf4b667770759a543ef57a719208e3 [file] [log] [blame]
/*****************************************************************************
* 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:
* ---------
* l1ctm.c
*
* Project:
* --------
* MAUI
*
* Description:
* ------------
* L1Ctm interface
*
* 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!
* removed!
* removed!
* removed!
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*==============================================================================
*******************************************************************************/
#ifdef __CTM_SUPPORT__
int dsp_tch_bfi; // temp solution
#include "kal_public_api.h"
#include "kal_trace.h"
#include "reg_base.h"
#include "sync_data.h"
#include "l1audio.h"
#include "speech_def.h"
#include "pcm4way.h"
#include "l1sp_trc.h"
#include "am.h"
#include "ctm_drv.h"
#include "ctm_params.h"
#include "ctm_modem.h"
#include "afe_def.h"
#include "sal_def.h"
#include "sal_exp.h"
#include "bli_exp.h"
#include "sp_enhance.h"
#include "sp_drv.h"
#include "audio_msgid.h"
#include "drv_sap.h"
#include "audio_ringbuf.h" // "audio_def.h" // for ring buffer
#include "media.h"
#include "spc_io.h"
// Catcher trace
/*#define L1CTM_TRACE_FUNC(X) kal_trace(TRACE_FUNC, X)
*/
/*#define L1CTM_TRACE_STATE(X) kal_trace(TRACE_STATE, X)
*/
/*#define L1CTM_TRACE_INFO(X,Y) kal_trace(TRACE_INFO, X, Y)
*/
//4g TTY
#define TTY_QUEUE_SIZE 512
#define NUM_DELAY_FRAME 10
#define NUM_UL_SEND_FRAME 10
int ctm_hco_vco_state = 0; // 0 - disable; 1 - HCO enable; 2 - VCO enable;
__attribute__((aligned(4)))
static uint16 zero_dl_pcm[160] =
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
#define MORE_ENQUIRY 8
static uint32 more_enquiry_times;
static int16 cprm_debug_flag = 0;
#ifdef __SMART_PHONE_MODEM__
#define UL_IN_PCM_RECORD_MD
#define UL_OUT_PCM_RECORD_MD
#define DL_IN_PCM_RECORD_MD
#define DL_OUT_PCM_RECORD_MD
#endif // __SMART_PHONE_MODEM__
#define UL_TTY_BUF_LEN 64
#define UL_CTM_BUF_LEN 256
#define DL_TTY_BUF_LEN 1024
#define DL_CTM_BUF_LEN 256
#define PCM_FIFO_LEN 2 // could be 1 ~ N
#define CTM_SWB_BUF_LEN 640 // 32k*20ms = 640
#define CTM_WB_BUF_LEN 320 // 16k*20ms = 320
#define CTM_NB_BUF_LEN 160 // 8k*20ms = 160
#define BLI_SRC_BUFFER_SIZE 2184 // fixed value
typedef struct{
void (*callback_handler)(L1Ctm_Event event, void *data);
#if defined(__SMART_PHONE_MODEM__)
void (*debugCallback)(uint16 pos, uint16 *buffer, uint16 len, bool isDone);
#endif
// speech-channel PCM buffer
uint16 ul_pcm_fifo[PCM_FIFO_LEN][CTM_NB_BUF_LEN]; // input buffer size = 160
uint16 dl_pcm_fifo[PCM_FIFO_LEN][CTM_NB_BUF_LEN];
uint16 ul_pcm_input[PCM_FIFO_LEN][CTM_SWB_BUF_LEN]; // input buffer size = 640
uint16 dl_pcm_input[PCM_FIFO_LEN][CTM_SWB_BUF_LEN];
uint16 ul_pcm_input2[PCM_FIFO_LEN][CTM_SWB_BUF_LEN]; // input buffer size = 640
uint16 ul_pcm_output2[PCM_FIFO_LEN][CTM_SWB_BUF_LEN]; // output buffer size = 640
uint16 ul_pcm_output[PCM_FIFO_LEN][CTM_NB_BUF_LEN]; //160
uint16 ul_pcm_output_wb[PCM_FIFO_LEN][CTM_WB_BUF_LEN]; //320
uint16 ul_pcm_output_swb[PCM_FIFO_LEN][CTM_SWB_BUF_LEN]; //640
uint16 dl_pcm_output[PCM_FIFO_LEN][CTM_NB_BUF_LEN]; //160
uint16 dl_pcm_output_wb[PCM_FIFO_LEN][CTM_WB_BUF_LEN]; //320
uint16 dl_pcm_output_swb[PCM_FIFO_LEN][CTM_SWB_BUF_LEN]; //640
uint16 ul_pcm_input_len[PCM_FIFO_LEN];
uint16 dl_pcm_input_len[PCM_FIFO_LEN];
uint8 internal_buf_ul_in[2184]; // internal buffer for src
uint8 internal_buf_ul_out[2184]; // internal buffer for src
uint8 internal_buf_dl_in[2184]; // internal buffer for src
uint8 internal_buf_dl_out[2184]; // internal buffer for src
uint8 internal_buf_ul_in2[2184]; // internal buffer for src
uint8 internal_buf_ul_out2[2184]; // internal buffer for src
uint8 internal_buf_dl_in2[2184]; // internal buffer for src
uint8 internal_buf_dl_out2[2184]; // internal buffer for src
BLI_HANDLE * ul_downsample_16_8;
BLI_HANDLE * dl_downsample_16_8;
BLI_HANDLE * ul_downsample_32_8;
BLI_HANDLE * dl_downsample_32_8;
BLI_HANDLE * ul_upsample_8_16;
BLI_HANDLE * dl_upsample_8_16;
BLI_HANDLE * ul_upsample_8_32;
BLI_HANDLE * dl_upsample_8_32;
// text buffer
uint8 ul_tty_buf[UL_TTY_BUF_LEN];
uint8 ul_ctm_buf[UL_CTM_BUF_LEN];
uint8 dl_tty_buf[DL_TTY_BUF_LEN];
uint8 dl_ctm_buf[DL_CTM_BUF_LEN];
// buffer read write pointer
uint16 ul_tty_buf_read; // buf_read == buf_write , means buffer empty
uint16 ul_tty_buf_write; // buffer could be filled at most (BUF_LEN - 1) data
uint16 ul_ctm_buf_read;
uint16 ul_ctm_buf_write;
uint16 dl_tty_buf_read;
uint16 dl_tty_buf_write;
uint16 dl_ctm_buf_read;
uint16 dl_ctm_buf_write;
// control relative
uint16 next_to_process;
uint16 pcm_fifo_write;
uint16 pcm_fifo_read;
uint16 aud_id;
uint16 FLAGS;
uint16 ul_mute_flags;
uint16 dl_mute_flags;
uint8 bfi_info[PCM_FIFO_LEN];
uint8 l1d_bfi_info[PCM_FIFO_LEN];
uint8 interface;
uint8 state;
uint8 next_ack_timeout;
int8 enquiry_count;
uint8 enquiry_timeout1;
uint8 enquiry_timeout2;
uint8 transition_mute;
uint8 debug_function;
// 2g/3g TTY variables
bool dl_isTTY;
bool ul_isTTY;
bool ul_isSending;
uint16 ul_send_count;
// 4g TTY variables
uint16 dl_put_count;
kal_spinlockid lockId;
bool skip_hisr;
bool stop;
}L1Ctm_Module;
static L1Ctm_Module *l1ctm;
static RTT_Module rtt;
//extern UNSIGNED TMD_System_Clock;
//***** UTF8 special character
#define ENQUIRY_CHAR 0x5
#define IDLE_CHAR 0x16
#define NON_UTF8_CHAR 0xFF
#define NO_CHAR 0xFF
//***** LCF : L1CTM Control Flag
// CTM Negotiation relative
#define LCF_NEGOTIATION_REQ 0x1
#define LCF_NEGOTIATION 0x2
#define LCF_SEND_ENQUIRY 0x4
#define LCF_SEND_ACK 0x8
#define LCF_FAR_END_DETECTED 0x10
// speech-channel output relative
#define LCF_UL_CTM_TRANSMITTING 0x20
#define LCF_UL_MUTE 0x40
#define LCF_DL_CTM_RECEIVING 0x80
#define LCF_DL_BAUDOT_TRANSMITTING 0x100
#define LCF_DL_MUTE 0x200
#define LCF_ACKING 0x400
#define LCF_DL_ACKING 0x800
//***** time-out setting
#define ENQUIRY_TIMEOUT1 21 // 20 (400 ms) + 1
#define ENQUIRY_TIMEOUT2 67 // 66 (1320 ms) + 1
#define NEXT_ACK_TIMEOUT 26 // 25 (500 ms) + 1
#define DL_TRANSITION_MUTE_TIMEOUT 2 // 40 ms
//***** L1CTM state
#define L1CTM_READY_STATE 0xAB
#define L1CTM_CONNECTED_STATE 0xCD
//***** text buffer operation used in l1ctm_in_task
#define UL_TTY_BUF_CHAR_READY() (l1ctm->ul_tty_buf_read != l1ctm->ul_tty_buf_write)
#define UL_TTY_BUF_GET_CHAR(tty_code) { \
tty_code = l1ctm->ul_tty_buf[l1ctm->ul_tty_buf_read ++]; \
l1ctm->ul_tty_buf_read &= (UL_TTY_BUF_LEN-1); \
}
#define UL_TTY_BUF_PUT_CHAR(tty_code) \
{ \
l1ctm->ul_tty_buf[l1ctm->ul_tty_buf_write ++] = tty_code; \
l1ctm->ul_tty_buf_write &= (UL_TTY_BUF_LEN-1); \
if(l1ctm->ul_tty_buf_write == l1ctm->ul_tty_buf_read) \
{ \
l1ctm->ul_tty_buf_read ++; \
l1ctm->ul_tty_buf_read &= (UL_TTY_BUF_LEN-1); \
} \
}
#define DL_TTY_BUF_CHAR_READY() (l1ctm->dl_tty_buf_read != l1ctm->dl_tty_buf_write)
#define DL_TTY_BUF_GET_CHAR(tty_code) { \
tty_code = l1ctm->dl_tty_buf[l1ctm->dl_tty_buf_read++]; \
l1ctm->dl_tty_buf_read &= (DL_TTY_BUF_LEN-1); \
}
#define DL_TTY_BUF_PUT_CHAR(tty_code) \
{ \
l1ctm->dl_tty_buf[l1ctm->dl_tty_buf_write ++] = tty_code; \
l1ctm->dl_tty_buf_write &= (DL_TTY_BUF_LEN-1); \
if(l1ctm->dl_tty_buf_write == l1ctm->dl_tty_buf_read) \
{ \
l1ctm->dl_tty_buf_read ++; \
l1ctm->dl_tty_buf_read &= (DL_TTY_BUF_LEN-1); \
} \
}
#define UL_CTM_BUF_CHAR_READY() (l1ctm->ul_ctm_buf_read != l1ctm->ul_ctm_buf_write)
#define UL_CTM_BUF_GET_CHAR(ctm_code) { \
ctm_code = l1ctm->ul_ctm_buf[l1ctm->ul_ctm_buf_read++]; \
l1ctm->ul_ctm_buf_read &= (UL_CTM_BUF_LEN - 1); \
}
#define DL_CTM_BUF_PUT_CHAR(ctm_code) { \
l1ctm->dl_ctm_buf[l1ctm->dl_ctm_buf_write++] = ctm_code; \
l1ctm->dl_ctm_buf_write &= (DL_CTM_BUF_LEN - 1); \
ASSERT(l1ctm->dl_ctm_buf_write != l1ctm->dl_ctm_buf_read);\
}
/*==============================================================================*/
/*==== begin of 4G TTY Queue====*/
RINGBUFFER_T(kal_uint8, TTY_QUEUE_SIZE) ul_tty_queue;
RINGBUFFER_T(kal_uint8, TTY_QUEUE_SIZE) dl_tty_queue;
RINGBUFFER_T(kal_uint8, TTY_QUEUE_SIZE) ul_rtt_queue[8]; // cid: 0~7
RINGBUFFER_T(kal_uint8, TTY_QUEUE_SIZE) dl_rtt_queue[8]; // cid: 0~7
void ctm_init(void)
{
int i;
for(i = 0; i < 8; i++){
RB_INIT(ul_rtt_queue[i]);
RB_INIT(dl_rtt_queue[i]);
}
rtt.isRttOn = false;
}
/* TTY Queue*/
void TTY_LTE_PSR_UL_Queue_Init(void)
{
RB_INIT(ul_tty_queue);
}
kal_uint8 TTY_LTE_PSR_UL_Get(void)
{
kal_uint8 tty_char;
RB_GET(ul_tty_queue, tty_char);
MD_TRC_L1CTM_TTY_LTE_UL_GET(tty_char);
return tty_char;
}
kal_uint16 TTY_LTE_PSR_UL_GetChar(kal_uint8 call_id, kal_uint8 *buf){
uint8 ch;
kal_prompt_trace(MOD_L1SP, "[TTY_LTE_PSR_UL_GetChar] Enter");
if(getRttStatus()==true){
if(!RB_EMPTY(ul_rtt_queue[call_id])){
RB_GET(ul_rtt_queue[call_id], ch);
*buf = ch;
kal_prompt_trace(MOD_L1SP, "[TTY_LTE_PSR_UL_GetChar] ch = %x", ch);
return 1;
}
}
else{
if(!TTY_LTE_PSR_UL_isEmpty()){
*buf = TTY_LTE_PSR_UL_Get();
kal_prompt_trace(MOD_L1SP, "[TTY_LTE_PSR_UL_GetChar] ch = %x", *buf);
return 1;
}
}
return 0;
}
kal_uint16 TTY_LTE_PSR_UL_GetString(kal_uint8 call_id, kal_uint8 *buf, kal_uint16 *length)
{
return 0;
}
void TTY_LTE_PSR_UL_Put(kal_uint8 tty_char)
{
RB_PUT(ul_tty_queue, tty_char);
MD_TRC_L1CTM_TTY_LTE_UL_PUT(tty_char);
}
kal_bool TTY_LTE_PSR_UL_isEmpty(void)
{
return RB_EMPTY(ul_tty_queue);
}
kal_bool TTY_LTE_PSR_UL_isFull(void)
{
return RB_FULL(ul_tty_queue);
}
kal_uint16 TTY_LTE_PSR_UL_Queue_Size(void)
{
kal_uint16 size = RB_COUNT(ul_tty_queue);
MD_TRC_L1CTM_TTY_LTE_UL_QUEUE_SIZE(size);
return size;
}
void TTY_LTE_PSR_DL_Queue_Init(void)
{
RB_INIT(dl_tty_queue);
}
void TTY_LTE_PSR_DL_Put(kal_uint8 tty_char)
{
RB_PUT(dl_tty_queue, tty_char);
MD_TRC_L1CTM_TTY_LTE_DL_PUT(tty_char);
}
void TTY_LTE_PSR_DL_PutString(kal_uint8 call_id, kal_uint8 string[256], kal_uint16 length)
{
int i;
if(getRttStatus()==true){
for(i = 0; i < length; i++){
if(!RB_FULL(dl_rtt_queue[call_id])){
RB_PUT(dl_rtt_queue[call_id], string[i]);
kal_prompt_trace(MOD_L1SP, "[TTY_LTE_PSR_DL_PutString] cid = %d, ch = %x", call_id, string[i]);
}
else{
break;
}
}
SP_L4C_SendERTTSTR(call_id);
}
else{
for(i = 0; i < length; i++){
if(!TTY_LTE_PSR_DL_isFull()){
TTY_LTE_PSR_DL_Put(string[i]);
}
else{
break;
}
}
}
kal_prompt_trace(MOD_L1SP, "[TTY_LTE_PSR_DL_PutString] call_id= %d, length = %d", call_id, length);
}
kal_uint8 TTY_LTE_PSR_DL_Get()
{
kal_uint8 tty_char;
RB_GET(dl_tty_queue, tty_char);
MD_TRC_L1CTM_TTY_LTE_DL_GET(tty_char);
return tty_char;
}
kal_uint16 TTY_LTE_PSR_DL_Queue_Size(void)
{
kal_uint16 size = RB_COUNT(dl_tty_queue);
MD_TRC_L1CTM_TTY_LTE_DL_QUEUE_SIZE(size);
return size;
}
kal_bool TTY_LTE_PSR_DL_isEmpty(void)
{
return RB_EMPTY(dl_tty_queue);
}
kal_bool TTY_LTE_PSR_DL_isFull(void)
{
return RB_FULL(dl_tty_queue);
}
/*=====end of 4G TTY queue=====*/
void SP_L4C_SetERTTSTR(kal_uint8 call_id, kal_uint8 string[256], kal_uint16 length){
int i;
for(i = 0; i < length; i++){
if(!RB_FULL(ul_rtt_queue[call_id])){
RB_PUT(ul_rtt_queue[call_id], string[i]);
kal_prompt_trace(MOD_L1SP, "[SP_L4C_SetERTTSTR] call_id = %d, char = %x ", call_id, string[i]);
}
}
kal_prompt_trace(MOD_L1SP, "[SP_L4C_SetERTTSTR] call_id = %d, length = %d ", call_id, length);
}
void SP_L4C_SendERTTSTR(uint8 call_id){
ilm_L4C_ERTT_STRING_t *local_para;
int i;
uint8 ch;
uint16 len = RB_COUNT(dl_rtt_queue[call_id]);
local_para = (ilm_L4C_ERTT_STRING_t *) construct_local_para( sizeof(ilm_L4C_ERTT_STRING_t), TD_CTRL);
local_para -> call_id = call_id;
local_para -> length = len;
for(i = 0; i < len; i++){
if(!RB_EMPTY(dl_rtt_queue[call_id])){
RB_GET(dl_rtt_queue[call_id], ch);
local_para -> string[i] = ch;
kal_prompt_trace(MOD_L1SP, "[SP_L4C_SendERTTSTR] cid = %d, ch = %x", call_id, ch);
}
}
msg_send6(MOD_MED, MOD_L4C, AUDIO_SAP, MSG_ID_AUDIO_L4C_ERTTSTR, (local_para_struct *)local_para, NULL);
kal_prompt_trace(MOD_L1SP, "[SP_L4C_SendERTTSTR] cid = %d, length = %d", call_id, local_para -> length);
}
void l1ctm_init(void)
{
l1ctm = (L1Ctm_Module*) 0;
}
#define PCM_BFI_SHIFT 1
void l1ctm_in_hisr()
{
MD_TRC_L1CTM_IN_HISR_ENTER();
if(l1ctm->skip_hisr)
return;
uint16 buf_idx, bfi_data, bfi_rec, bfi_store_idx;
buf_idx = l1ctm->pcm_fifo_read;
if(buf_idx >= PCM_FIFO_LEN)
buf_idx -= PCM_FIFO_LEN;
bfi_store_idx = buf_idx + PCM_BFI_SHIFT;
if(bfi_store_idx >= PCM_FIFO_LEN)
bfi_store_idx -= PCM_FIFO_LEN;
if(l1ctm->pcm_fifo_read == l1ctm->next_to_process){
MD_TRC_L1CTM_BUF_OVFLOW();
if(l1ctm->stop){
l1ctm->skip_hisr = true;
SpcIO_MsgQueuePut(SPC_ID_AUDIO_CONTROL_CTM_CLOSE, 0, 0, SPC_MSG_FROM_AUDHISR);
}
return;
}
// uplink-path
if(l1ctm->ul_mute_flags & (1 << l1ctm->pcm_fifo_read))
PCM4WAY_FillSE(0);
else
{
uint16 bufLen = SAL_PcmEx_GetBufLen(SAL_PCMEX_PNW_BUF_M2D_UL1);
PCM4WAY_PutToSE2((const uint16*)(l1ctm->ul_pcm_output2[buf_idx]));
if(CTM_NB_BUF_LEN == bufLen){
PCM4WAY_PutToSE((const uint16*)(l1ctm->ul_pcm_output[buf_idx]));
}
else if(CTM_WB_BUF_LEN == bufLen){
PCM4WAY_PutToSE((const uint16*)(l1ctm->ul_pcm_output_wb[buf_idx]));
}
else{
PCM4WAY_PutToSE((const uint16*)(l1ctm->ul_pcm_output_swb[buf_idx]));
}
}
l1ctm->ul_pcm_input_len[buf_idx] = PCM4WAY_GetFromMic((uint16*)(l1ctm->ul_pcm_input[buf_idx]));
PCM4WAY_GetFromMic2((uint16*)(l1ctm->ul_pcm_input2[buf_idx]));
kal_prompt_trace(MOD_L1SP, "l1ctm->ul_pcm_input_len[buf_idx] = %d", l1ctm->ul_pcm_input_len[buf_idx]);
// downlink-path
if(l1ctm->dl_mute_flags & (1 << l1ctm->pcm_fifo_read))
PCM4WAY_FillSpk(0);
else{
uint16 bufLen = SAL_PcmEx_GetBufLen(SAL_PCMEX_PNW_BUF_M2D_DL1);
if(CTM_NB_BUF_LEN == bufLen){
PCM4WAY_PutToSpk((const uint16*)(l1ctm->dl_pcm_output[buf_idx]));
}
else if(CTM_WB_BUF_LEN == bufLen){
PCM4WAY_PutToSpk((const uint16*)(l1ctm->dl_pcm_output_wb[buf_idx]));
}
else{
PCM4WAY_PutToSpk((const uint16*)(l1ctm->dl_pcm_output_swb[buf_idx]));
}
}
l1ctm->dl_pcm_input_len[buf_idx] = PCM4WAY_GetFromSD((uint16*)(l1ctm->dl_pcm_input[buf_idx]));
bfi_data = SAL_CTM_GetValue(SAL_CTM_VALUE_TYPE_FACCH_REPORT);
bfi_rec = (bfi_data&0x1)|(((bfi_data&0x10)>>4)<<1)|(((bfi_data&0x100)>>8)<<2)|(((bfi_data&0x1000)>>12)<<3)|(((bfi_data&0x4000)>>14)<<4);
l1ctm->bfi_info[buf_idx] = bfi_rec;
if(dsp_tch_bfi > 0)
l1ctm->l1d_bfi_info[bfi_store_idx] = 1;
else
l1ctm->l1d_bfi_info[bfi_store_idx] = 0;
l1ctm->pcm_fifo_write++;
if(l1ctm->pcm_fifo_write == 2 * PCM_FIFO_LEN)
l1ctm->pcm_fifo_write = 0;
l1ctm->pcm_fifo_read++;
if(l1ctm->pcm_fifo_read == 2 * PCM_FIFO_LEN)
l1ctm->pcm_fifo_read = 0;
if(l1ctm->stop){
l1ctm->skip_hisr = true;
SpcIO_MsgQueuePut(SPC_ID_AUDIO_CONTROL_CTM_CLOSE, 0, 0, SPC_MSG_FROM_AUDHISR);
}
else{
L1Audio_SetEvent(l1ctm->aud_id, (void*)0); // involve L1Audio task to run CTM modem
}
MD_TRC_L1CTM_IN_HISR_LEAVE();
}
//uint8 A[20]={'A','B', 'C','D','E','F','G','H','I','J','1','2','3','4','5','6','7','8','9','0'};
//uint8 B[20]={'1','2', '3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0'};
int ind = 0;
int indA = 0;
int indB = 0;
int wc = 0;
int sz = 0;
void l1ctm_in_task_2g_3g()
{
uint16 l1ctmFlags, ctmFlags, interface, buf_idx;
uint32 ul_ds_inLen, ul_ds_outLen, dl_ds_inLen, dl_ds_outLen;
uint32 ul_us_inLen, ul_us_outLen, dl_us_inLen, dl_us_outLen;
uint16 *p_ul_ds_inBuf, *p_ul_ds_outBuf;
uint16 *p_dl_ds_inBuf, *p_dl_ds_outBuf;
uint16 *p_ul_us_inBuf, *p_ul_us_outBuf;
uint16 *p_dl_us_inBuf, *p_dl_us_outBuf;
uint8 utf8_code;
kal_bool bfi_flag;
if(l1ctm == (L1Ctm_Module*) 0)
return;
while(l1ctm->next_to_process != l1ctm->pcm_fifo_write)
{
buf_idx = l1ctm->next_to_process;
if(buf_idx >= PCM_FIFO_LEN)
buf_idx -= PCM_FIFO_LEN;
/******************************************************
* ul_pcm_input -> ul_pcm_fifo -> ul_pcm_output *
* 32k 8k 32k *
* [BAUDOT] -> [CTM] *
******************************************************/
/*[CTM blisrc] UL downsample start*/
p_ul_ds_inBuf = l1ctm->ul_pcm_input[buf_idx];
p_ul_ds_outBuf = l1ctm->ul_pcm_fifo[buf_idx];
if(CTM_WB_BUF_LEN == l1ctm->ul_pcm_input_len[buf_idx]){
ul_ds_inLen = CTM_WB_BUF_LEN << 1;
ul_ds_outLen = CTM_NB_BUF_LEN << 1;
BLI_Convert(l1ctm->ul_downsample_16_8, (short *)p_ul_ds_inBuf, &ul_ds_inLen, (short *)p_ul_ds_outBuf, &ul_ds_outLen);
}
else if(CTM_SWB_BUF_LEN ==l1ctm->ul_pcm_input_len[buf_idx]){
ul_ds_inLen = CTM_SWB_BUF_LEN << 1;
ul_ds_outLen = CTM_NB_BUF_LEN << 1;
BLI_Convert(l1ctm->ul_downsample_32_8, (short *)p_ul_ds_inBuf, &ul_ds_inLen, (short *)p_ul_ds_outBuf, &ul_ds_outLen);
}
else{
memcpy(p_ul_ds_outBuf, p_ul_ds_inBuf, CTM_NB_BUF_LEN << 1);
}
/*[CTM blisrc] UL downsample end*/
/*[CTM blisrc] DL downsample start*/
p_dl_ds_inBuf = l1ctm->dl_pcm_input[buf_idx];
p_dl_ds_outBuf = l1ctm->dl_pcm_fifo[buf_idx];
if(CTM_WB_BUF_LEN == l1ctm->dl_pcm_input_len[buf_idx]){
dl_ds_inLen = CTM_WB_BUF_LEN << 1;
dl_ds_outLen = CTM_NB_BUF_LEN << 1;
BLI_Convert(l1ctm->dl_downsample_16_8, (short *)p_dl_ds_inBuf, &dl_ds_inLen, (short *)p_dl_ds_outBuf, &dl_ds_outLen);
}
else if(CTM_SWB_BUF_LEN ==l1ctm->dl_pcm_input_len[buf_idx]){
dl_ds_inLen = CTM_SWB_BUF_LEN << 1;
dl_ds_outLen = CTM_NB_BUF_LEN << 1;
BLI_Convert(l1ctm->dl_downsample_32_8, (short *)p_dl_ds_inBuf, &dl_ds_inLen, (short *)p_dl_ds_outBuf, &dl_ds_outLen);
}
else{
memcpy(p_dl_ds_outBuf, p_dl_ds_inBuf, CTM_NB_BUF_LEN << 1);
}
/*[CTM blisrc] DL downsample end*/
bfi_flag = (kal_bool)(l1ctm->l1d_bfi_info[buf_idx]);
#ifdef UL_IN_PCM_RECORD_MD
if( l1ctm->debugCallback != NULL ){
l1ctm->debugCallback(UL_IN_WRITE_FILE_REQUEST, l1ctm->ul_pcm_fifo[buf_idx], CTM_NB_BUF_LEN, false);
}
#endif
#ifdef DL_IN_PCM_RECORD_MD
if( l1ctm->debugCallback != NULL ){
l1ctm->debugCallback(DL_IN_WRITE_FILE_REQUEST, l1ctm->dl_pcm_fifo[buf_idx], CTM_NB_BUF_LEN, false);
}
#endif
l1ctmFlags = l1ctm->FLAGS;
interface = l1ctm->interface;
ctmFlags = ctm_modem_get_flags();
// up-link path input : Baudot Demodulator
if(interface != DIRECT_MODE)
{
#if !defined(DUPLEX_BAUDOT)
if(ctmFlags & CMF_BAUDOT_OUT_BITS_READY && l1ctm->enquiry_count != -2)
l1ctmFlags |= LCF_UL_MUTE;
else
#endif
{
baudot_demod((const uint16*)l1ctm->ul_pcm_fifo[buf_idx],&ctmFlags, &utf8_code);
if(ctmFlags & CMF_BAUDOT_IN_DETECTED && l1ctm->enquiry_count != -2)
l1ctmFlags |= LCF_UL_MUTE;
else if(ctmFlags & CMF_BAUDOT_IN_CHAR)
{
UL_TTY_BUF_PUT_CHAR(utf8_code);
MD_TRC_L1CTM_UL_GET_DECODED_TTY_CHAR(utf8_code);
}
}
}
// down-link path input : CTM receiver
if( l1ctm->interface != DIRECT_MODE ) // Half-duplex CTM for BAUDOT_MODE //mtk01407, 2006-05-22
{
if( (!(ctmFlags & CMF_CTM_TX_BITS_READY)) || (l1ctmFlags & (LCF_NEGOTIATION | LCF_ACKING)) )
{ ctm_receiver((const uint16*)l1ctm->dl_pcm_fifo[buf_idx], bfi_flag, &ctmFlags, &utf8_code); }
else
{ // If CTM is transmitting, dump zero patter to CTM receiver that means disable receiving function of CTM
// Set bfi = 0 to avoid const zero_dl_pcm[] being modified //mtk01407, 2006-05-17
ctm_receiver((const uint16*)zero_dl_pcm, 0, &ctmFlags, &utf8_code);
}
}else // Full-duplex CTM for DIRECT_MODE
{
ctm_receiver((const uint16*)l1ctm->dl_pcm_fifo[buf_idx], bfi_flag, &ctmFlags, &utf8_code);
}
if(ctmFlags & CMF_CTM_RX_DETECTED)
{
if(!(l1ctmFlags & LCF_DL_CTM_RECEIVING))
{
l1ctmFlags |= LCF_DL_CTM_RECEIVING;
MD_TRC_L1CTM_DL_DETECT_CTM_SYNC();
SAL_CTM_Switch(true);
l1ctm->dl_isTTY = 1;
if(!(l1ctmFlags & LCF_FAR_END_DETECTED))
{
l1ctmFlags |= LCF_FAR_END_DETECTED;
MD_TRC_L1CTM_FAR_END_CTM_DETECTED();
l1ctm->state = L1CTM_CONNECTED_STATE;
// first detect far-end CTM
if(l1ctmFlags & LCF_NEGOTIATION)
{
MD_TRC_L1CTM_NEGOTIATION_SUCCESS();
l1ctmFlags &= ~LCF_NEGOTIATION;
l1ctmFlags |= LCF_DL_ACKING;
l1ctm->enquiry_timeout1 = 0;
l1ctm->enquiry_timeout2 = 0;
if(interface != DIRECT_MODE)
l1ctm->enquiry_count = -1; //0;
else if(interface == DIRECT_MODE)
{
l1ctm->callback_handler(CTM_MO_SUCCESS, (void*) 0);
l1ctm->enquiry_count = 3;
}
}
else
{
MD_TRC_L1CTM_DEMAND_CTM_ACK();
l1ctmFlags |= LCF_SEND_ACK;
l1ctm->next_ack_timeout = NEXT_ACK_TIMEOUT;
if(interface == DIRECT_MODE)
l1ctm->callback_handler(CTM_MT_DETECTED, (void*) 0);
}
}
} // end of if(!(l1ctmFlags & LCF_DL_CTM_RECEIVING))
if(ctmFlags & CMF_CTM_RX_CHAR)
{
MD_TRC_L1CTM_DL_GET_RECEIVED_CTM_CHAR(utf8_code);
if(l1ctmFlags & LCF_DL_ACKING)
{
}
else if(utf8_code == ENQUIRY_CHAR)
{
if(l1ctm->next_ack_timeout == 0)
{
l1ctmFlags |= LCF_SEND_ACK;
l1ctm->next_ack_timeout = NEXT_ACK_TIMEOUT;
}
}
else // receive a normal character
{
if(interface !=DIRECT_MODE)
{
DL_TTY_BUF_PUT_CHAR(utf8_code);
}
else if(interface == DIRECT_MODE)
{
DL_CTM_BUF_PUT_CHAR(utf8_code);
l1ctm->callback_handler(CTM_CHAR_RECEIVED, (void *)(uint32)utf8_code);
}
}
} // end of if(ctmFlags & CMF_CTM_RX_CHAR)
}
else
{
if(l1ctmFlags & LCF_DL_CTM_RECEIVING)
{
MD_TRC_L1CTM_DL_CTM_BURST_END();
l1ctmFlags &= ~LCF_DL_CTM_RECEIVING;
l1ctmFlags &= ~LCF_DL_ACKING;
// command DSP to change to normal speech codec
SAL_CTM_Switch(false);
l1ctm->dl_isTTY = 0;
l1ctm->transition_mute = DL_TRANSITION_MUTE_TIMEOUT;
}
}
// judge RX mute case
if(ctmFlags & CMF_CTM_RX_EARLY_MUTE || l1ctmFlags & LCF_DL_CTM_RECEIVING)
l1ctmFlags |= LCF_DL_MUTE;
if(SAL_CTM_IsOff())
l1ctmFlags |= LCF_DL_MUTE;
if(SAL_CTM_IsIdle() && l1ctm->transition_mute > 0)
{
l1ctm->transition_mute --;
l1ctmFlags |= LCF_DL_MUTE;
}
// down-link path output
if(interface !=DIRECT_MODE)
{
if(ctmFlags & CMF_BAUDOT_OUT_BITS_READY)
{
utf8_code = NON_UTF8_CHAR;
if(ctmFlags & CMF_BAUDOT_OUT_NEAR_EMPTY)
if(DL_TTY_BUF_CHAR_READY())
{
DL_TTY_BUF_GET_CHAR(utf8_code);
MD_TRC_L1CTM_DL_SEND_TTY_CHAR(utf8_code);
}
baudot_mod(utf8_code, l1ctm->dl_pcm_fifo[buf_idx], &ctmFlags);
}
else
{
if(l1ctmFlags & LCF_DL_BAUDOT_TRANSMITTING)
l1ctmFlags &= ~LCF_DL_BAUDOT_TRANSMITTING;
if(DL_TTY_BUF_CHAR_READY())
{
DL_TTY_BUF_GET_CHAR(utf8_code);
MD_TRC_L1CTM_DL_SEND_TTY_CHAR(utf8_code);
baudot_mod(utf8_code, l1ctm->dl_pcm_fifo[buf_idx], &ctmFlags);
#if !defined(DUPLEX_BAUDOT)
baudot_demod_reset();
l1ctmFlags |= LCF_UL_MUTE; // mute for baudot_out is modulating
#endif
l1ctmFlags |= LCF_DL_BAUDOT_TRANSMITTING;
}
}
}
// up-link path output
if(ctmFlags & CMF_CTM_TX_BITS_READY)
{
utf8_code = NON_UTF8_CHAR;
l1ctmFlags &= ~LCF_SEND_ACK;
if(ctmFlags & CMF_CTM_TX_NEAR_EMPTY)
{
utf8_code = IDLE_CHAR;
if(l1ctmFlags & LCF_NEGOTIATION)
{
// Yuan comment out to test the ul nego fail problem in LA.
//if(interface !=DIRECT_MODE && l1ctm->enquiry_timeout1 > 0)
// if(UL_TTY_BUF_CHAR_READY())
// UL_TTY_BUF_GET_CHAR(utf8_code);
//if(interface !=DIRECT_MODE && l1ctm->enquiry_timeout1 > 0)
//utf8_code = ENQUIRY_CHAR;
}
else
{
if(interface !=DIRECT_MODE && UL_TTY_BUF_CHAR_READY())
{
UL_TTY_BUF_GET_CHAR(utf8_code);
}
else if(interface == DIRECT_MODE && UL_CTM_BUF_CHAR_READY())
{
UL_CTM_BUF_GET_CHAR(utf8_code);
l1ctm->callback_handler(CTM_CHAR_SENT, (void *)(uint32)utf8_code);
}
}
MD_TRC_L1CTM_UL_SEND_CTM_CHAR(utf8_code);
l1ctm->ul_send_count = NUM_UL_SEND_FRAME;
l1ctm->ul_isSending = 1;
}
ctm_transmitter(utf8_code, l1ctm->ul_pcm_fifo[buf_idx], &ctmFlags);
}
else
{
if(l1ctmFlags & LCF_UL_CTM_TRANSMITTING)
{
l1ctmFlags &= ~LCF_UL_CTM_TRANSMITTING;
if(l1ctmFlags & LCF_ACKING){
l1ctmFlags &= ~LCF_ACKING;
l1ctm->ul_isTTY = 0;
}
if(interface == DIRECT_MODE)
l1ctm->callback_handler(CTM_TX_BURST_END, (void*) 0);
}
if(l1ctm->enquiry_timeout2 == 0 && l1ctm->enquiry_count == 0)
{
l1ctmFlags &= ~LCF_NEGOTIATION;
MD_TRC_L1CTM_NEGOTIATION_FAIL();
if(interface == DIRECT_MODE)
{
l1ctm->callback_handler(CTM_MO_FAIL, (void*)0);
l1ctm->enquiry_count = 3; // reset enquiry_count to allow next negotiation
}
else // BAUDOT_MODE
l1ctm->enquiry_count = -2;
}
// judge if has character to send
if(l1ctmFlags & LCF_FAR_END_DETECTED)
{
utf8_code = NO_CHAR;
if(interface !=DIRECT_MODE && UL_TTY_BUF_CHAR_READY())
{
UL_TTY_BUF_GET_CHAR(utf8_code);
}
else if(interface == DIRECT_MODE && UL_CTM_BUF_CHAR_READY())
{
UL_CTM_BUF_GET_CHAR(utf8_code);
l1ctm->callback_handler(CTM_CHAR_SENT, (void *)(uint32)utf8_code);
}
else if(l1ctmFlags & LCF_SEND_ACK)
{
MD_TRC_L1CTM_UL_SEND_IDLE_AS_ACK();
utf8_code = IDLE_CHAR;
}
if(utf8_code != NO_CHAR)
{
if(l1ctmFlags & LCF_SEND_ACK)
{
l1ctmFlags &= ~LCF_SEND_ACK;
l1ctmFlags |= LCF_ACKING;
}
MD_TRC_L1CTM_UL_SEND_CTM_CHAR(utf8_code);
ctm_transmitter(utf8_code, l1ctm->ul_pcm_fifo[buf_idx], &ctmFlags);
l1ctmFlags |= LCF_UL_CTM_TRANSMITTING;
l1ctm->ul_send_count = NUM_UL_SEND_FRAME;
l1ctm->ul_isSending = 1;
}
}
else
{
if(l1ctm->enquiry_count > 0)
{
//if(l1ctm->enquiry_count == 3) // Adam : mark for more enquiry
if(l1ctm->enquiry_count == more_enquiry_times)
{
if((interface !=DIRECT_MODE && UL_TTY_BUF_CHAR_READY()) ||
(interface == DIRECT_MODE && (l1ctmFlags & LCF_NEGOTIATION_REQ)))
l1ctmFlags |= (LCF_SEND_ENQUIRY + LCF_NEGOTIATION);
}
else
{
if(l1ctm->enquiry_timeout2 == 0)
l1ctmFlags |= LCF_SEND_ENQUIRY;
}
if(l1ctmFlags & LCF_SEND_ENQUIRY)
{
l1ctm->enquiry_count --;
l1ctm->enquiry_timeout1 = ENQUIRY_TIMEOUT1;
l1ctm->enquiry_timeout2 = ENQUIRY_TIMEOUT2;
MD_TRC_L1CTM_UL_SEND_ENQUIRY_CHAR(3 - l1ctm->enquiry_count);
ctm_transmitter(ENQUIRY_CHAR, l1ctm->ul_pcm_fifo[buf_idx], &ctmFlags);
l1ctmFlags |= LCF_UL_CTM_TRANSMITTING;
l1ctmFlags &= ~(LCF_SEND_ENQUIRY + LCF_NEGOTIATION_REQ);
}
}
}
}
// calculate time out
if(l1ctm->next_ack_timeout > 0)
l1ctm->next_ack_timeout --;
if(l1ctm->enquiry_timeout1 > 0)
l1ctm->enquiry_timeout1 --;
if(l1ctm->enquiry_timeout2 > 0)
l1ctm->enquiry_timeout2 --;
// process output for MUTE case
if(!(l1ctmFlags & LCF_UL_CTM_TRANSMITTING) && (l1ctmFlags & LCF_UL_MUTE))
l1ctm->ul_mute_flags |= 1 << l1ctm->next_to_process;
else
l1ctm->ul_mute_flags &= ~(1 << l1ctm->next_to_process);
if(!(l1ctmFlags & LCF_DL_BAUDOT_TRANSMITTING) && (l1ctmFlags & LCF_DL_MUTE))
l1ctm->dl_mute_flags |= 1 << l1ctm->next_to_process;
else
l1ctm->dl_mute_flags &= ~(1 << l1ctm->next_to_process);
l1ctmFlags &= ~(LCF_UL_MUTE + LCF_DL_MUTE);
l1ctm->FLAGS = l1ctmFlags;
#ifdef UL_OUT_PCM_RECORD_MD
if( l1ctm->debugCallback != NULL ){
if(l1ctm->ul_mute_flags & (1 << l1ctm->next_to_process)) {
l1ctm->debugCallback(UL_OUT_WRITE_FILE_REQUEST, zero_dl_pcm, CTM_NB_BUF_LEN, false);
} else {
l1ctm->debugCallback(UL_OUT_WRITE_FILE_REQUEST, l1ctm->ul_pcm_fifo[buf_idx], CTM_NB_BUF_LEN, false);
}
}
#endif
#ifdef DL_OUT_PCM_RECORD_MD
if( l1ctm->debugCallback != NULL ){
if(l1ctm->dl_mute_flags & (1 << l1ctm->next_to_process)) {
l1ctm->debugCallback(DL_OUT_WRITE_FILE_REQUEST, zero_dl_pcm, CTM_NB_BUF_LEN, false);
} else {
l1ctm->debugCallback(DL_OUT_WRITE_FILE_REQUEST, l1ctm->dl_pcm_fifo[buf_idx], CTM_NB_BUF_LEN, false);
}
}
#endif
#if defined(UL_IN_PCM_RECORD_MD) || defined(DL_IN_PCM_RECORD_MD) || defined(UL_OUT_PCM_RECORD_MD) || defined(DL_OUT_PCM_RECORD_MD)
{
if( l1ctm->debugCallback != NULL ){
l1ctm->debugCallback(0, NULL, 0, true);
}
}
#endif
l1ctm->next_to_process ++;
if(l1ctm->next_to_process == 2 * PCM_FIFO_LEN)
l1ctm->next_to_process = 0;
/*****************************************************
* dl_pcm_output <- dl_pcm_fifo <- dl_pcm_input *
* 32k 8k 32k *
* [CTM] <- [BAUDOT] *
*****************************************************/
/*[CTM blisrc] UL up sampling start*/
p_ul_us_inBuf = l1ctm->ul_pcm_fifo[buf_idx];
p_ul_us_outBuf = l1ctm->ul_pcm_output[buf_idx];
memcpy(p_ul_us_outBuf, p_ul_us_inBuf, CTM_NB_BUF_LEN << 1);
ul_us_inLen = CTM_NB_BUF_LEN << 1;
ul_us_outLen = CTM_WB_BUF_LEN << 1;
p_ul_us_outBuf = l1ctm->ul_pcm_output_wb[buf_idx];
BLI_Convert(l1ctm -> ul_upsample_8_16, (short *)p_ul_us_inBuf, &ul_us_inLen, (short *)p_ul_us_outBuf, &ul_us_outLen);
ul_us_inLen = CTM_NB_BUF_LEN << 1;
ul_us_outLen = CTM_SWB_BUF_LEN << 1;
p_ul_us_outBuf = l1ctm->ul_pcm_output_swb[buf_idx];
BLI_Convert(l1ctm -> ul_upsample_8_32, (short *)p_ul_us_inBuf, &ul_us_inLen, (short *)p_ul_us_outBuf, &ul_us_outLen);
/*[CTM blisrc] UL up sampling end*/
/*[CTM blisrc] DL up sampling start*/
p_dl_us_inBuf = l1ctm->dl_pcm_fifo[buf_idx];
p_dl_us_outBuf = l1ctm->dl_pcm_output[buf_idx];
memcpy(p_dl_us_outBuf, p_dl_us_inBuf, CTM_NB_BUF_LEN << 1);
dl_us_inLen = CTM_NB_BUF_LEN << 1;
dl_us_outLen = CTM_WB_BUF_LEN << 1;
p_dl_us_outBuf = l1ctm->dl_pcm_output_wb[buf_idx];
BLI_Convert(l1ctm -> dl_upsample_8_16, (short *)p_dl_us_inBuf, &dl_us_inLen, (short *)p_dl_us_outBuf, &dl_us_outLen);
dl_us_inLen = CTM_NB_BUF_LEN << 1;
dl_us_outLen = CTM_SWB_BUF_LEN << 1;
p_dl_us_outBuf = l1ctm->dl_pcm_output_swb[buf_idx];
BLI_Convert(l1ctm -> dl_upsample_8_32, (short *)p_dl_us_inBuf, &dl_us_inLen, (short *)p_dl_us_outBuf, &dl_us_outLen);
/*[CTM blisrc] DL up sampling end*/
if(l1ctm->ul_isSending){
l1ctm->ul_isTTY = 1;
l1ctm->ul_send_count --;
}
if(l1ctm->ul_send_count == 0){
l1ctm->ul_isTTY = 0;
l1ctm->ul_isSending = 0;
}
uint16 *ptrSrc;
uint16 *ptrDest;
if(VCO_MODE == l1ctm->interface && (!l1ctm->ul_isTTY)){
ptrSrc = l1ctm->ul_pcm_input[buf_idx];
if(CTM_SWB_BUF_LEN == l1ctm->ul_pcm_input_len[buf_idx]){
ptrDest = l1ctm->ul_pcm_output_swb[buf_idx];
}
else if(CTM_WB_BUF_LEN == l1ctm->ul_pcm_input_len[buf_idx]){
ptrDest = l1ctm->ul_pcm_output_wb[buf_idx];
}
else{
ptrDest = l1ctm->ul_pcm_output[buf_idx];
}
memcpy(ptrDest, ptrSrc, l1ctm->ul_pcm_input_len[buf_idx] * sizeof(uint16));
}
if(HCO_MODE == l1ctm->interface && (!l1ctm->dl_isTTY)){
ptrSrc = l1ctm->dl_pcm_input[buf_idx];
if(CTM_SWB_BUF_LEN == l1ctm->dl_pcm_input_len[buf_idx]){
ptrDest = l1ctm->dl_pcm_output_swb[buf_idx];
}
else if(CTM_WB_BUF_LEN == l1ctm->dl_pcm_input_len[buf_idx]){
ptrDest = l1ctm->dl_pcm_output_wb[buf_idx];
}
else{
ptrDest = l1ctm->dl_pcm_output[buf_idx];
}
memcpy(ptrDest, ptrSrc, l1ctm->dl_pcm_input_len[buf_idx] * sizeof(uint16));
}
//copy 2nd mic data directly
ptrSrc = l1ctm->ul_pcm_input2[buf_idx];
ptrDest = l1ctm->ul_pcm_output2[buf_idx];
memcpy(ptrDest, ptrSrc, l1ctm->ul_pcm_input_len[buf_idx] * sizeof(uint16));
}
}
void l1ctm_in_task_4g()
{
uint16 l1ctmFlags, ctmFlags, interface, buf_idx;
uint32 ul_ds_inLen, ul_ds_outLen, dl_ds_inLen, dl_ds_outLen;
uint32 ul_us_inLen, ul_us_outLen, dl_us_inLen, dl_us_outLen;
uint16 *p_ul_ds_inBuf, *p_ul_ds_outBuf;
uint16 *p_dl_ds_inBuf, *p_dl_ds_outBuf;
uint16 *p_ul_us_inBuf, *p_ul_us_outBuf;
uint16 *p_dl_us_inBuf, *p_dl_us_outBuf;
uint8 utf8_code;
if(l1ctm == (L1Ctm_Module*) 0)
return;
while(l1ctm->next_to_process != l1ctm->pcm_fifo_write)
{
buf_idx = l1ctm->next_to_process;
if(buf_idx >= PCM_FIFO_LEN)
buf_idx -= PCM_FIFO_LEN;
/******************************************************
* ul_pcm_input -> ul_pcm_fifo -> ul_pcm_output *
* 32k 8k 32k *
* [BAUDOT] -> [CTM] *
******************************************************/
/*[CTM blisrc] UL downsample start*/
p_ul_ds_inBuf = l1ctm->ul_pcm_input[buf_idx];
p_ul_ds_outBuf = l1ctm->ul_pcm_fifo[buf_idx];
if(CTM_WB_BUF_LEN == l1ctm->ul_pcm_input_len[buf_idx]){
ul_ds_inLen = CTM_WB_BUF_LEN << 1;
ul_ds_outLen = CTM_NB_BUF_LEN << 1;
BLI_Convert(l1ctm->ul_downsample_16_8, (short *)p_ul_ds_inBuf, &ul_ds_inLen, (short *)p_ul_ds_outBuf, &ul_ds_outLen);
}
else if(CTM_SWB_BUF_LEN ==l1ctm->ul_pcm_input_len[buf_idx]){
ul_ds_inLen = CTM_SWB_BUF_LEN << 1;
ul_ds_outLen = CTM_NB_BUF_LEN << 1;
BLI_Convert(l1ctm->ul_downsample_32_8, (short *)p_ul_ds_inBuf, &ul_ds_inLen, (short *)p_ul_ds_outBuf, &ul_ds_outLen);
}
else{
memcpy(p_ul_ds_outBuf, p_ul_ds_inBuf, CTM_NB_BUF_LEN << 1);
}
/*[CTM blisrc] UL downsample end*/
/*[CTM blisrc] DL downsample start*/
p_dl_ds_inBuf = l1ctm->dl_pcm_input[buf_idx];
p_dl_ds_outBuf = l1ctm->dl_pcm_fifo[buf_idx];
if(CTM_WB_BUF_LEN == l1ctm->dl_pcm_input_len[buf_idx]){
dl_ds_inLen = CTM_WB_BUF_LEN << 1;
dl_ds_outLen = CTM_NB_BUF_LEN << 1;
BLI_Convert(l1ctm->dl_downsample_16_8, (short *)p_dl_ds_inBuf, &dl_ds_inLen, (short *)p_dl_ds_outBuf, &dl_ds_outLen);
}
else if(CTM_SWB_BUF_LEN ==l1ctm->dl_pcm_input_len[buf_idx]){
dl_ds_inLen = CTM_SWB_BUF_LEN << 1;
dl_ds_outLen = CTM_NB_BUF_LEN << 1;
BLI_Convert(l1ctm->dl_downsample_32_8, (short *)p_dl_ds_inBuf, &dl_ds_inLen, (short *)p_dl_ds_outBuf, &dl_ds_outLen);
}
else{
memcpy(p_dl_ds_outBuf, p_dl_ds_inBuf, CTM_NB_BUF_LEN << 1);
}
/*[CTM blisrc] DL downsample end*/
l1ctmFlags = l1ctm->FLAGS;
interface = l1ctm->interface;
ctmFlags = ctm_modem_get_flags();
// up-link path input : Baudot Demodulator
if(interface != DIRECT_MODE)
{
#if !defined(DUPLEX_BAUDOT)
if(ctmFlags & CMF_BAUDOT_OUT_BITS_READY && l1ctm->enquiry_count != -2){
l1ctmFlags |= LCF_UL_MUTE;
}
else
#endif
{
baudot_demod((const uint16*)l1ctm->ul_pcm_fifo[buf_idx],&ctmFlags, &utf8_code);
if(ctmFlags & CMF_BAUDOT_IN_DETECTED && l1ctm->enquiry_count != -2)
l1ctmFlags |= LCF_UL_MUTE;
else if(ctmFlags & CMF_BAUDOT_IN_CHAR)
{
//UL_TTY_BUF_PUT_CHAR(utf8_code);
if(!TTY_LTE_PSR_UL_isFull())
TTY_LTE_PSR_UL_Put(utf8_code);
MD_TRC_L1CTM_4G_PUT_UL(utf8_code);
MD_TRC_L1CTM_UL_GET_DECODED_TTY_CHAR(utf8_code);
}
}
}
if(l1ctm->dl_put_count == 0){
if(!TTY_LTE_PSR_DL_isEmpty()){
uint8 ch = TTY_LTE_PSR_DL_Get();
DL_TTY_BUF_PUT_CHAR(ch);
MD_TRC_L1CTM_4G_GET_DL(ch);
}
l1ctm->dl_put_count = NUM_DELAY_FRAME;
}
l1ctm->dl_put_count--;
// down-link path output
if(interface !=DIRECT_MODE)
{
if(ctmFlags & CMF_BAUDOT_OUT_BITS_READY)
{
utf8_code = NON_UTF8_CHAR;
if(ctmFlags & CMF_BAUDOT_OUT_NEAR_EMPTY)
if(DL_TTY_BUF_CHAR_READY())
{
DL_TTY_BUF_GET_CHAR(utf8_code);
MD_TRC_L1CTM_DL_SEND_TTY_CHAR(utf8_code);
}
baudot_mod(utf8_code, l1ctm->dl_pcm_fifo[buf_idx], &ctmFlags);
}
else
{
if(l1ctmFlags & LCF_DL_BAUDOT_TRANSMITTING)
l1ctmFlags &= ~LCF_DL_BAUDOT_TRANSMITTING;
if(DL_TTY_BUF_CHAR_READY())
{
DL_TTY_BUF_GET_CHAR(utf8_code);
MD_TRC_L1CTM_DL_SEND_TTY_CHAR(utf8_code);
baudot_mod(utf8_code, l1ctm->dl_pcm_fifo[buf_idx], &ctmFlags);
#if !defined(DUPLEX_BAUDOT)
baudot_demod_reset();
l1ctmFlags |= LCF_UL_MUTE; // mute for baudot_out is modulating
#endif
l1ctmFlags |= LCF_DL_BAUDOT_TRANSMITTING;
}
}
}
// calculate time out
if(l1ctm->next_ack_timeout > 0)
l1ctm->next_ack_timeout --;
if(l1ctm->enquiry_timeout1 > 0)
l1ctm->enquiry_timeout1 --;
if(l1ctm->enquiry_timeout2 > 0)
l1ctm->enquiry_timeout2 --;
// process output for MUTE case
if(!(l1ctmFlags & LCF_UL_CTM_TRANSMITTING) && (l1ctmFlags & LCF_UL_MUTE))
l1ctm->ul_mute_flags |= 1 << l1ctm->next_to_process;
else
l1ctm->ul_mute_flags &= ~(1 << l1ctm->next_to_process);
if(!(l1ctmFlags & LCF_DL_BAUDOT_TRANSMITTING) && (l1ctmFlags & LCF_DL_MUTE))
l1ctm->dl_mute_flags |= 1 << l1ctm->next_to_process;
else
l1ctm->dl_mute_flags &= ~(1 << l1ctm->next_to_process);
l1ctmFlags &= ~(LCF_UL_MUTE + LCF_DL_MUTE);
l1ctm->FLAGS = l1ctmFlags;
l1ctm->next_to_process ++;
if(l1ctm->next_to_process == 2 * PCM_FIFO_LEN)
l1ctm->next_to_process = 0;
/*****************************************************
* dl_pcm_output <- dl_pcm_fifo <- dl_pcm_input *
* 32k 8k 32k *
* [CTM] <- [BAUDOT] *
*****************************************************/
/*[CTM blisrc] UL up sampling start*/
p_ul_us_inBuf = l1ctm->ul_pcm_fifo[buf_idx];
p_ul_us_outBuf = l1ctm->ul_pcm_output[buf_idx];
memcpy(p_ul_us_outBuf, p_ul_us_inBuf, 160 << 1);
ul_us_inLen = CTM_NB_BUF_LEN << 1;
ul_us_outLen = CTM_WB_BUF_LEN << 1;
p_ul_us_outBuf = l1ctm->ul_pcm_output_wb[buf_idx];
BLI_Convert(l1ctm -> ul_upsample_8_16, (short *)p_ul_us_inBuf, &ul_us_inLen, (short *)p_ul_us_outBuf, &ul_us_outLen);
ul_us_inLen = CTM_NB_BUF_LEN << 1;
ul_us_outLen = CTM_SWB_BUF_LEN << 1;
p_ul_us_outBuf = l1ctm->ul_pcm_output_swb[buf_idx];
BLI_Convert(l1ctm -> ul_upsample_8_32, (short *)p_ul_us_inBuf, &ul_us_inLen, (short *)p_ul_us_outBuf, &ul_us_outLen);
/*[CTM blisrc] UL up sampling end*/
/*[CTM blisrc] DL up sampling start*/
p_dl_us_inBuf = l1ctm->dl_pcm_fifo[buf_idx];
p_dl_us_outBuf = l1ctm->dl_pcm_output[buf_idx];
memcpy(p_dl_us_outBuf, p_dl_us_inBuf, 160 << 1);
dl_us_inLen = CTM_NB_BUF_LEN << 1;
dl_us_outLen = CTM_WB_BUF_LEN << 1;
p_dl_us_outBuf = l1ctm->dl_pcm_output_wb[buf_idx];
BLI_Convert(l1ctm -> dl_upsample_8_16, (short *)p_dl_us_inBuf, &dl_us_inLen, (short *)p_dl_us_outBuf, &dl_us_outLen);
dl_us_inLen = CTM_NB_BUF_LEN << 1;
dl_us_outLen = CTM_SWB_BUF_LEN << 1;
p_dl_us_outBuf = l1ctm->dl_pcm_output_swb[buf_idx];
BLI_Convert(l1ctm -> dl_upsample_8_32, (short *)p_dl_us_inBuf, &dl_us_inLen, (short *)p_dl_us_outBuf, &dl_us_outLen);
/*[CTM blisrc] DL up sampling end*/
uint16 *ptrSrc;
uint16 *ptrDest;
if(VCO_MODE == l1ctm->interface){
ptrSrc = l1ctm->ul_pcm_input[buf_idx];
if(CTM_SWB_BUF_LEN == l1ctm->ul_pcm_input_len[buf_idx]){
ptrDest = l1ctm->ul_pcm_output_swb[buf_idx];
}
else if(CTM_WB_BUF_LEN == l1ctm->ul_pcm_input_len[buf_idx]){
ptrDest = l1ctm->ul_pcm_output_wb[buf_idx];
}
else{
ptrDest = l1ctm->ul_pcm_output[buf_idx];
}
memcpy(ptrDest, ptrSrc, l1ctm->ul_pcm_input_len[buf_idx] * sizeof(uint16));
}
else if(HCO_MODE == l1ctm->interface){
ptrSrc = l1ctm->dl_pcm_input[buf_idx];
if(CTM_SWB_BUF_LEN == l1ctm->dl_pcm_input_len[buf_idx]){
ptrDest = l1ctm->dl_pcm_output_swb[buf_idx];
}
else if(CTM_WB_BUF_LEN == l1ctm->dl_pcm_input_len[buf_idx]){
ptrDest = l1ctm->dl_pcm_output_wb[buf_idx];
}
else{
ptrDest = l1ctm->dl_pcm_output[buf_idx];
}
memcpy(ptrDest, ptrSrc, l1ctm->dl_pcm_input_len[buf_idx] * sizeof(uint16));
}
else{
memset(l1ctm->ul_pcm_output[buf_idx], 0, CTM_NB_BUF_LEN << 1);
memset(l1ctm->ul_pcm_output_wb[buf_idx], 0, CTM_WB_BUF_LEN << 1);
memset(l1ctm->ul_pcm_output_swb[buf_idx], 0, CTM_SWB_BUF_LEN << 1);
}
}
}
void l1ctm_in_task(void *data){
if(L1SP_STATE_4G_SPEECH_ON == L1SP_GetState()){
l1ctm_in_task_4g();
}
else{
l1ctm_in_task_2g_3g();
}
}
/*============================== L1Ctm APIs ====================================*/
uint32 L1Ctm_GetMemReq(void)
{
uint32 mem_size = 0;
mem_size = sizeof(L1Ctm_Module) + ctm_modem_mem_req();
return mem_size;
}
void L1Ctm_Open(L1Ctm_Interface a, L1Ctm_Callback handler, uint8 *buf, uint32 buf_len, L1Ctm_DebugCallback debugCallback)
{
uint8 *buf_ptr;
CTM_Param *ctm_param, CTM_param;
#if defined(__DSP_FCORE4__)
CTM_param.cprm_tone_demod_down_samp = 0x7D;
#else
CTM_param.cprm_tone_demod_down_samp = 0x05;
#endif
ctm_param = &CTM_param;
MD_TRC_L1CTM_OPEN();
ASSERT(buf_len >= L1Ctm_GetMemReq());
// allocate memory to L1CTM and CTM modem , and init CTM modem
l1ctm = (L1Ctm_Module*) buf;
buf_ptr = buf + sizeof(L1Ctm_Module);
buf_len -= sizeof(L1Ctm_Module);
ctm_modem_init(buf_ptr, buf_len, ctm_param);
if(ctm_param != NULL)
{
cprm_debug_flag = ctm_param->cprm_tone_demod_down_samp;
MD_TRC_L1CTM_OPEN_PARAM(cprm_debug_flag);
}
else
{
cprm_debug_flag = CPRM_MASK_DOWN_SAMP | CPRM_MASK_REC_DL_PCM_IN | CPRM_MASK_REC_DL_PCM_OUT | CPRM_MASK_REC_UL_PCM_IN | CPRM_MASK_REC_UL_PCM_OUT;
}
l1ctm->interface = a;
{
uint16 bit;
for(bit=0; bit<PCM_FIFO_LEN; bit++) {
l1ctm->ul_mute_flags |= (1<<bit);
l1ctm->dl_mute_flags |= (1<<bit);
}
}
// open BLI Src for ctm
l1ctm -> ul_downsample_32_8 = BLI_Open( 32000, 1, 8000, 1, (signed char*)l1ctm -> internal_buf_ul_in, 0); // open UL down sampling src
l1ctm -> dl_downsample_32_8 = BLI_Open( 32000, 1, 8000, 1, (signed char*)l1ctm -> internal_buf_dl_in, 0); // open DL down sampling src
l1ctm -> ul_upsample_8_32 = BLI_Open( 8000, 1, 32000, 1, (signed char*)l1ctm -> internal_buf_ul_out, 0); // open UL up sampling src
l1ctm -> dl_upsample_8_32 = BLI_Open( 8000, 1, 32000, 1, (signed char*)l1ctm -> internal_buf_dl_out, 0); // open DL up sampling src
l1ctm -> ul_downsample_16_8 = BLI_Open( 16000, 1, 8000, 1, (signed char*)l1ctm -> internal_buf_ul_in2, 0); // open UL down sampling src
l1ctm -> dl_downsample_16_8 = BLI_Open( 16000, 1, 8000, 1, (signed char*)l1ctm -> internal_buf_dl_in2, 0); // open DL down sampling src
l1ctm -> ul_upsample_8_16 = BLI_Open( 8000, 1, 16000, 1, (signed char*)l1ctm -> internal_buf_ul_out2, 0); // open UL up sampling src
l1ctm -> dl_upsample_8_16 = BLI_Open( 8000, 1, 16000, 1, (signed char*)l1ctm -> internal_buf_dl_out2, 0); // open DL up sampling src
// init l1ctm variables
l1ctm -> aud_id = L1Audio_GetAudioID();
// init 2g_3g tty variables
l1ctm->ul_isTTY = 0;
l1ctm->dl_isTTY = 0;
l1ctm->ul_isSending = 0;
l1ctm->ul_send_count = NUM_UL_SEND_FRAME;
// init 4g tty variables
TTY_LTE_PSR_UL_Queue_Init();
TTY_LTE_PSR_DL_Queue_Init();
l1ctm->dl_put_count = NUM_DELAY_FRAME;
L1Audio_SetEventHandler(l1ctm->aud_id , l1ctm_in_task);
L1Audio_SetFlag(l1ctm->aud_id);
l1ctm->callback_handler = handler;
#if defined(__SMART_PHONE_MODEM__)
l1ctm->debugCallback = debugCallback;
#endif
l1ctm->next_to_process = PCM_FIFO_LEN;
l1ctm->pcm_fifo_write = PCM_FIFO_LEN;
l1ctm->pcm_fifo_read = 0;
l1ctm->ul_tty_buf_read = 0;
l1ctm->ul_tty_buf_write = 0;
l1ctm->ul_ctm_buf_read = 0;
l1ctm->ul_ctm_buf_write = 0;
l1ctm->dl_tty_buf_read = 0;
l1ctm->dl_tty_buf_write = 0;
l1ctm->dl_ctm_buf_read = 0;
l1ctm->dl_ctm_buf_write = 0;
l1ctm->FLAGS = 0;
l1ctm->state = L1CTM_READY_STATE;
l1ctm->next_ack_timeout = 0;
l1ctm->enquiry_count = 3;
l1ctm->debug_function = 0;
if(cprm_debug_flag & CPRM_MASK_MORE_ENQUIRY) // Adam : for more enquiry
{
l1ctm->enquiry_count = MORE_ENQUIRY;
more_enquiry_times = MORE_ENQUIRY;
}
else
more_enquiry_times = 3; // the same setting as Spec
if(cprm_debug_flag & CPRM_MASK_ALWAYS_NEGO_SUC) // Adam : for non-Negotiation test
{
l1ctm->FLAGS = LCF_FAR_END_DETECTED;
if(l1ctm->interface !=DIRECT_MODE)
l1ctm->enquiry_count = -1;
}
l1ctm->enquiry_timeout1 = 0;
l1ctm->enquiry_timeout2 = 0;
l1ctm->transition_mute = 0;
l1ctm->l1d_bfi_info[0] = 0;
SAL_CTM_Switch(false);
l1ctm->dl_isTTY = 0;
SAL_CTM_SetGain(CPRM_CODEBOOK_GAIN_THRESHOLD, CPRM_CODEBOOK_GAIN_VALUE);
l1ctm->interface = a;
if(VCO_MODE == l1ctm->interface){
l1sp_setCtmSpeStatus(1);
SetSPEnhancePath(SpeechEnh_UL);
}
else if(HCO_MODE == l1ctm->interface){
l1sp_setCtmSpeStatus(1);
SetSPEnhancePath(SpeechEnh_DL);
}
else{
l1sp_setCtmSpeStatus(1);
SetSpeechEnhancement(false);
l1sp_setCtmSpeStatus(0);
}
MD_TRC_L1CTM_TTY_MODE((int)l1ctm->interface);
if(DIRECT_MODE != l1ctm->interface)
PCM4WAY_Start(l1ctm_in_hisr, P4W_APP_CTM);
l1ctm->skip_hisr = false;
l1ctm->stop = false;
} // End of L1Ctm_open(~)
void L1Ctm_Stop(void){
MD_TRC_L1CTM_STOP_ENTER();
l1ctm-> stop = true;
MD_TRC_L1CTM_STOP_LEAVE();
}
void L1Ctm_Close(void)
{
MD_TRC_L1CTM_CLOSE();
ASSERT(l1ctm != (L1Ctm_Module*) 0);
PCM4WAY_Stop(0);
L1Audio_ClearFlag(l1ctm->aud_id);
L1Audio_FreeAudioID(l1ctm->aud_id);
l1sp_setCtmSpeStatus(1);
SetSPEnhancePath(SpeechEnh_All); // remember to turn on SPE while TTY off
BLI_Close( l1ctm->ul_downsample_16_8, 0); // Close UL down sampling src
BLI_Close( l1ctm->dl_downsample_16_8, 0); // Close DL down sampling src
BLI_Close( l1ctm->ul_downsample_32_8, 0); // Close UL down sampling src
BLI_Close( l1ctm->dl_downsample_32_8, 0); // Close DL down sampling src
BLI_Close( l1ctm->ul_upsample_8_16, 0); // Close UL up sampling src
BLI_Close( l1ctm->dl_upsample_8_16, 0); // Close DL up sampling src
BLI_Close( l1ctm->ul_upsample_8_32, 0); // Close UL up sampling src
BLI_Close( l1ctm->dl_upsample_8_32, 0); // Close DL up sampling src
// l1ctm = (L1Ctm_Module*) 0;
} // end of L1Ctm_Close(~)
void L1Ctm_RTTOpen(){
kal_prompt_trace(MOD_L1SP, "[L1Ctm_RTTOpen] Enter");
TTY_LTE_PSR_UL_Queue_Init();
TTY_LTE_PSR_DL_Queue_Init();
rtt.isRttOn = true;
kal_prompt_trace(MOD_L1SP, "[L1Ctm_RTTOpen] Leave");
}
void L1Ctm_RTTClose(){
if(rtt.isRttOn) {
ctm_init();
}
}
bool getRttStatus(){
return rtt.isRttOn;
}
/*===========================MED_L1Audio_Integrate_Handler===========================================*/
#else
char dummy_l1ctm_c; /* define a dummy variable to avoid warning message */
#endif // __CTM_SUPPORT__