blob: 291fb9a878da150c3a48878d2779f6b81d8bbd89 [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2015
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36#include "l1aud_common_def.h"
37#include "lmd_audio.h"
38#include "sp_c2k.h"
39#include "sal_def.h"
40#include "sal_exp.h"
41#include "am.h"
42#include "audio_dsp_d2c_def.h"
43#include "l1sp_trc.h"
44#include "media.h"
45#include "lmd_msgid.h"
46#include "sp_drv.h"
47#include "val_msgid.h"
48
49
50static void CodReady( void );
51static void CodClose( void );
52static void CodHBLenGet( uint16 u2RS, IpcSpchSrvcOptRateT u2Rate, uint16 *p2HBLen );
53static void CodParse( IpcSpchSrvcOptT SO );
54static void DLFrameProc(IpcDsvSendSpkrVoiceFwdChPcktDataMsgT *MsgFLDataP);
55SPC2K_Struct spc2k;
56
57 IpcCpSpchDataRevChPacketMsgT MsgLbkUL;
58 IpcDsvSendSpkrVoiceFwdChPcktDataMsgT MsgLbkDL;
59
60uint16 au2ToneTab1K[C2K_COD_RS_1_FULL_LEN_WORD16] = {0x6eac, 0xe370, 0x4862, 0xf8f0, 0x0444, 0x7c16, 0x5e3a, 0x688f, 0x8ca0, 0xc171, 0x4a00};
61uint16 RateReduc_last = 0;
62
63static void CodParse( IpcSpchSrvcOptT SO)
64{
65 switch (SO)
66 {
67 case IPC_SPCH_SRVC_OPTION3:
68 spc2k.u2RS = C2K_COD_RS_1;
69 spc2k.u2Cod = C2K_COD_EVRCA;
70 break;
71
72 case IPC_SPCH_SRVC_OPTION68:
73 spc2k.u2RS = C2K_COD_RS_1;
74 spc2k.u2Cod = C2K_COD_EVRCB;
75 break;
76
77 case IPC_SPCH_SRVC_OPTION73:
78 spc2k.u2RS = C2K_COD_RS_1;
79 spc2k.u2Cod = C2K_COD_EVRCNW_NB;
80 break;
81
82 case IPC_SPCH_SRVC_OPTION73WB:
83 spc2k.u2RS = C2K_COD_RS_1;
84 spc2k.u2Cod = C2K_COD_EVRCNW_WB;
85 break;
86
87 case IPC_SPCH_SRVC_OPTION17:
88 spc2k.u2RS = C2K_COD_RS_2;
89 spc2k.u2Cod = C2K_COD_QCELP13K;
90 break;
91
92 default:
93 break;
94 }
95 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] RS=%d, Cod=%d", spc2k.u2RS, spc2k.u2Cod);
96 MD_TRC_C2K_SPH_RS_COD_PARSE(spc2k.u2RS, spc2k.u2Cod);
97 //MonTrace (MON_CP_SPH_LINK_PARSE, 2, spc2k.u2RS, spc2k.u2Cod);
98}
99
100static void CodHBLenGet( uint16 u2RS, IpcSpchSrvcOptRateT u2Rate, uint16 *p2HBLen )
101{
102 if (C2K_COD_RS_1 == u2RS)
103 {
104 switch (u2Rate)
105 {
106 case IPC_SPCH_BLANK:
107 *p2HBLen = C2K_COD_RS_1_BLANK_LEN_WORD16;
108 break;
109 case IPC_SPCH_EIGHTH:
110 *p2HBLen = C2K_COD_RS_1_EIGHTH_LEN_WORD16;
111 break;
112 case IPC_SPCH_QUARTER:
113 *p2HBLen = C2K_COD_RS_1_QUARTER_LEN_WORD16;
114 break;
115 case IPC_SPCH_HALF:
116 *p2HBLen = C2K_COD_RS_1_HALF_LEN_WORD16;
117 break;
118 case IPC_SPCH_FULL:
119 *p2HBLen = C2K_COD_RS_1_FULL_LEN_WORD16;
120 break;
121 case IPC_SPCH_ERASURE:
122 *p2HBLen = C2K_COD_RS_1_ERASURE_LEN_WORD16;
123 break;
124 case IPC_SPCH_FULL_LIKELY:
125 *p2HBLen = C2K_COD_RS_1_FULL_LIKELY_LEN_WORD16;
126 break;
127 default:
128 break;
129 }
130 }
131 else if(C2K_COD_RS_2 == u2RS)
132 {
133 switch (u2Rate)
134 {
135 case IPC_SPCH_BLANK:
136 *p2HBLen = C2K_COD_RS_2_BLANK_LEN_WORD16;
137 break;
138 case IPC_SPCH_EIGHTH:
139 *p2HBLen = C2K_COD_RS_2_EIGHTH_LEN_WORD16;
140 break;
141 case IPC_SPCH_QUARTER:
142 *p2HBLen = C2K_COD_RS_2_QUARTER_LEN_WORD16;
143 break;
144 case IPC_SPCH_HALF:
145 *p2HBLen = C2K_COD_RS_2_HALF_LEN_WORD16;
146 break;
147 case IPC_SPCH_FULL:
148 *p2HBLen = C2K_COD_RS_2_FULL_LEN_WORD16;
149 break;
150 case IPC_SPCH_ERASURE:
151 *p2HBLen = C2K_COD_RS_2_ERASURE_LEN_WORD16;
152 break;
153 default:
154 break;
155 }
156 }
157}
158
159void SPC2K_init( void )
160{
161 spc2k.u4HBFrmCountUL1 = 0;
162 spc2k.u4HBFrmCountUL2 = 0;
163 spc2k.u4HBFrmCountDL1 = 0;
164 spc2k.u4HBFrmCountDL2 = 0;
165 spc2k.bCodRdy = false;
166 spc2k.bSta = false;
167 spc2k.bFstDLFrm = false;
168 spc2k.bAppSta = false;
169 spc2k.bLMDLbk = false;
170 spc2k.bCAALLbk = false;
171 spc2k.u2Cod = C2K_COD_UNDEF;
172 spc2k.u2RS = C2K_COD_RS_UNDEF;
173#ifdef __FAKE_C2K_LOOPBACK__
174 spc2k.u2Dbg = C2K_DBG_BIT_U2D_LOOPBACK | C2K_DBG_BIT_NO_MODEM;
175#else
176 spc2k.u2Dbg = C2K_DBG_BIT_INIT;
177#endif
178#ifndef C2K_SDRV_DISABLE
179 L1Audio_HookHisrHandler(DP_D2C_C2K_DONE_UL,(L1Audio_EventHandler)SPC2K_UL_GetSpeechFrame, 0);
180 L1Audio_HookHisrHandler(DP_D2C_C2K_DONE_DL,(L1Audio_EventHandler)SPC2K_DL_PutSpeechFrame, 0);
181#endif
182}
183
184void SPC2K_ConSSO_Req( uint16 u2SO, uint16 u2MaxEncRate)
185{
186 //MonTrace (MON_CP_SPH_LINK_CON_SSO_REQ, 2, u2SO, u2MaxEncRate);
187 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link connect SSO req, SO=%d, MaxRate=%d", u2SO, u2MaxEncRate);
188 MD_TRC_C2K_SPH_LINK_CON_SSO_REQ(u2SO, u2MaxEncRate);
189 if(true == spc2k.bSta)
190 {
191 //MonTrace (MON_CP_SPH_LINK_WARN_SSO_REQ_REPEAT, 0);
192 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link SSO req repeat");
193 MD_TRC_C2K_SPH_LINK_CON_SSO_REQ_REPEAT();
194 return;
195 }
196 spc2k.bSta = true;
197 CodParse( u2SO );
198
199#ifndef C2K_SDRV_DISABLE
200 L1SP_C2K_Est(spc2k.u2Cod);
201#else
202 SPC2K_ConSSO_Done();
203#endif
204}
205
206void SPC2K_ConSSO_Done( void )
207{
208 //MonTrace (MON_CP_SPH_LINK_CON_SSO_DONE, 0);
209 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link connect SSO done");
210 MD_TRC_C2K_SPH_LINK_CON_SSO_DONE();
211 if(!(spc2k.u2Dbg & C2K_DBG_BIT_NO_MODEM))
212 {
213 msg_send5(MOD_L1SP ,MOD_SPCH ,0x0 ,MSG_ID_SDRV_SSO_CONN_DONE_MSG, NULL);
214 //ExeMsgSend (EXE_IPC_ID, IPC_MAILBOX_DSPV_ASYN, SDRV_SSO_CONN_DONE, NULL, 0);
215 }
216 else
217 {
218 SPC2K_ConSSO_Done_Rsp();
219 }
220}
221
222void SPC2K_ConSSO_Done_Rsp( void )
223{
224 #ifndef CAAL_DISABLE
225 //enum CAALMsgId MsgId;
226 #endif
227
228 CodReady();
229 spc2k.bFstDLFrm = true;
230 spc2k.u4HBFrmCountUL1 = 0;
231 spc2k.u4HBFrmCountUL2 = 0;
232 spc2k.u4HBFrmCountDL1 = 0;
233 spc2k.u4HBFrmCountDL2 = 0;
234 #ifndef CAAL_DISABLE
235 if(false == spc2k.bCAALLbk)
236 {
237 //MsgId = MSG_ID_CAAL_SSO_CONN_RSP_MSG;
238 if(!(spc2k.u2Dbg & C2K_DBG_BIT_NO_MODEM))
239 {
240 msg_send5(MOD_L1SP ,MOD_SPCH ,0x0 ,MSG_ID_CAAL_SSO_CONN_RSP_MSG, NULL);
241 //CAAL_ReadMsgsFromDsp(MsgId, NULL);
242 }
243 }
244 #endif
245}
246
247void SPC2K_DisconSSO_Req( void )
248{
249 //MonTrace (MON_CP_SPH_LINK_DISCON_SSO_REQ, 0);
250 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link disconnect SSO req");
251 MD_TRC_C2K_SPH_LINK_DISCON_SSO_REQ();
252 if(false == spc2k.bSta)
253 {
254 //MonTrace (MON_CP_SPH_LINK_WARN_DISCON_SSO_REQ_REPEAT, 0);
255 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link disconnect SSO req repeat");
256 MD_TRC_C2K_SPH_LINK_DISCON_SSO_REQ_REPEAT();
257 return;
258 }
259#ifndef C2K_SDRV_DISABLE
260 L1SP_C2K_DeEst();
261#else
262 SPC2K_DisconSSO_Done();
263#endif
264}
265
266void SPC2K_DisconSSO_Done( void )
267{
268 //MonTrace (MON_CP_SPH_LINK_DISCON_SSO_DONE, 0);
269 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link disconnect SSO done");
270 MD_TRC_C2K_SPH_LINK_DISCON_SSO_DONE();
271 if(!(spc2k.u2Dbg & C2K_DBG_BIT_NO_MODEM))
272 {
273 msg_send5(MOD_L1SP ,MOD_SPCH ,0x0 ,MSG_ID_SDRV_SSO_DISCONN_DONE_MSG, NULL);
274 //ExeMsgSend (EXE_IPC_ID, IPC_MAILBOX_DSPV_ASYN, SDRV_SSO_DISCONN_DONE, NULL, 0);
275 }
276 else
277 {
278 SPC2K_DisconSSO_Done_Rsp();
279 }
280}
281
282void SPC2K_DisconSSO_Done_Rsp( void )
283{
284 #ifndef CAAL_DISABLE
285 //enum CAALMsgId MsgId;
286 #endif
287
288 spc2k.bSta = false;
289 CodClose();
290 #ifndef CAAL_DISABLE
291 if(false == spc2k.bCAALLbk)
292 {
293 if(!(spc2k.u2Dbg & C2K_DBG_BIT_NO_MODEM))
294 {
295 //MsgId = MSG_ID_CAAL_SSO_DISCONN_RSP_MSG;
296 msg_send5(MOD_L1SP ,MOD_SPCH ,0x0 ,MSG_ID_CAAL_SSO_DISCONN_RSP_MSG, NULL);
297 //CAAL_ReadMsgsFromDsp(MsgId, NULL);
298 }
299 }
300 #endif
301}
302
303
304bool SPC2K_State( void )
305{
306 return spc2k.bSta;
307}
308
309static void CodReady( void )
310{
311 //MonTrace (MON_CP_SPH_LINK_COD_RDY, 1, spc2k.bCodRdy);
312 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link cod ready, CodRdy=%d", spc2k.bCodRdy);
313 MD_TRC_C2K_SPH_LINK_COD_RDY(spc2k.bCodRdy);
314 if(!spc2k.bCodRdy)
315 {
316 spc2k.bCodRdy = true;
317 }
318}
319
320static void CodClose( void )
321{
322 //MonTrace (MON_CP_SPH_LINK_COD_CLOSE, 1, spc2k.bCodRdy);
323 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link cod close, CodRdy=%d", spc2k.bCodRdy);
324 MD_TRC_C2K_SPH_LINK_COD_CLOSE(spc2k.bCodRdy);
325 if(spc2k.bCodRdy)
326 {
327 spc2k.bCodRdy = false;
328 }
329}
330
331static void DLFrameProc(IpcDsvSendSpkrVoiceFwdChPcktDataMsgT *MsgFLDataP)
332{
333#ifndef C2K_SAL_DISABLE
334 volatile uint16 *pu2Addr;
335#endif
336 uint16 u2HBLen;
337 uint16 i;
338
339 //check rate
340 if((MsgFLDataP->SpkrVoiceFwdChPcktRate != IPC_SPCH_BLANK) && (MsgFLDataP->SpkrVoiceFwdChPcktRate != IPC_SPCH_EIGHTH) &&
341 (MsgFLDataP->SpkrVoiceFwdChPcktRate != IPC_SPCH_QUARTER) && (MsgFLDataP->SpkrVoiceFwdChPcktRate != IPC_SPCH_HALF) &&
342 (MsgFLDataP->SpkrVoiceFwdChPcktRate != IPC_SPCH_FULL) && (MsgFLDataP->SpkrVoiceFwdChPcktRate != IPC_SPCH_ERASURE) &&
343 (MsgFLDataP->SpkrVoiceFwdChPcktRate != IPC_SPCH_FULL_LIKELY))
344 {
345 // MonFault (MON_IPC_FAULT_UNIT, C2K_LINK_DL_RATE_ERR, MsgFLDataP->SpkrVoiceFwdChPcktRate, MON_HALT);
346 }
347 CodHBLenGet(spc2k.u2RS, MsgFLDataP->SpkrVoiceFwdChPcktRate, &u2HBLen);
348 //check size
349 if(MsgFLDataP->SpkrVoiceFwdChPcktSize != u2HBLen)
350 {
351 //MonFault (MON_IPC_FAULT_UNIT, C2K_LINK_DL_HB_SIZE_ERR, MsgFLDataP->SpkrVoiceFwdChPcktSize, MON_HALT);
352 }
353 //LBK
354 //MsgLbk.MppSpchRate = MsgFLDataP->SpkrVoiceFwdChPcktRate;
355 //MsgLbk.NumMppSpchData = u2HBLen;
356 //for(i = 0; i < u2HBLen; i++)
357 //{
358 // MsgLbk.MppSpchData[i] = MsgFLDataP->SpkrVoiceFwdChPcktData[i];
359 //}
360 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link lbk DL, Rate=%d, len=%d", MsgLbk.MppSpchRate, MsgLbk.NumMppSpchData);
361 //kal_trace( TRACE_FUNC, C2K_SPH_LINK_LBK_DL, MsgLbk.MppSpchRate, MsgLbk.NumMppSpchData);
362 //
363 //SPC2K_UL_GetSpeechFrame();
364
365#ifndef C2K_SAL_DISABLE
366 SAL_C2K_SetValue(SAL_C2K_DL_RATE, MsgFLDataP->SpkrVoiceFwdChPcktRate);
367 pu2Addr = SAL_C2K_GetAddr(SAL_C2K_ADDR_RXHB);
368 for(i = 0; i < u2HBLen; i++)
369 {
370 *pu2Addr = MsgFLDataP->SpkrVoiceFwdChPcktData[i];
371 pu2Addr++;
372 }
373 SAL_C2K_SetDLReady();
374#endif
375}
376
377
378void SPC2K_DL_PutSpeechFrame_Do(IpcDsvSendSpkrVoiceFwdChPcktDataMsgT *MsgFLDataP)
379{
380 spc2k.u4HBFrmCountDL1++;
381 spc2k.u4HBFrmCountDL2++;
382 if(!spc2k.bCodRdy)
383 {
384 //MonTrace (MON_CP_SPH_LINK_WARN_COD_DL_UNRDY, 0);
385 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link cod DL unready");
386 MD_TRC_C2K_SPH_LINK_COD_DL_UNRDY();
387
388 return;
389 }
390
391#ifdef C2K_DTS_DISABLE
392 if(!(spc2k.u2Dbg & C2K_DBG_BIT_U2D_LOOPBACK))
393 {
394 if(spc2k.bFstDLFrm)
395 {
396 //MonTrace (MON_CP_SPH_LINK_COD_1ST_FRAME, 0);
397 spc2k.bFstDLFrm = false;
398 #ifndef C2K_SDRV_DISABLE
399 L1SP_C2K_IntraRAT(spc2k.u2Cod);
400 #endif
401 }
402 else
403 {
404 DLFrameProc(MsgFLDataP);
405 }
406 }
407 else
408 {
409 DLFrameProc(MsgFLDataP);
410 }
411#else
412 DLFrameProc(MsgFLDataP);
413#endif //C2K_DTS_DISABLE
414
415 MD_TRC_C2K_SPH_LINK_RATE_DL(MsgFLDataP->SpkrVoiceFwdChPcktRate);
416 MD_TRC_C2K_SPH_LINK_COD_DL(spc2k.u2Cod);
417 MD_TRC_C2K_SPH_LINK_HB_DL(MsgFLDataP->SpkrVoiceFwdChPcktData[0], MsgFLDataP->SpkrVoiceFwdChPcktData[1], MsgFLDataP->SpkrVoiceFwdChPcktData[2], MsgFLDataP->SpkrVoiceFwdChPcktData[3],
418 MsgFLDataP->SpkrVoiceFwdChPcktData[4], MsgFLDataP->SpkrVoiceFwdChPcktData[5], MsgFLDataP->SpkrVoiceFwdChPcktData[6], MsgFLDataP->SpkrVoiceFwdChPcktData[7], MsgFLDataP->SpkrVoiceFwdChPcktData[8],
419 MsgFLDataP->SpkrVoiceFwdChPcktData[9], MsgFLDataP->SpkrVoiceFwdChPcktData[10]);
420
421 //MonTrace (MON_CP_SPH_LINK_HB_DL1, 10, MsgFLDataP->SpkrVoiceFwdChPcktRate, spc2k.u2RS, spc2k.u4HBFrmCountDL1, MsgFLDataP->SpkrVoiceFwdChPcktData[0], MsgFLDataP->SpkrVoiceFwdChPcktData[1],
422 // MsgFLDataP->SpkrVoiceFwdChPcktData[2], MsgFLDataP->SpkrVoiceFwdChPcktData[3], MsgFLDataP->SpkrVoiceFwdChPcktData[4], MsgFLDataP->SpkrVoiceFwdChPcktData[5],
423 // MsgFLDataP->SpkrVoiceFwdChPcktData[6]);
424 //MonTrace (MON_CP_SPH_LINK_HB_DL2, 5, spc2k.u4HBFrmCountDL2, MsgFLDataP->SpkrVoiceFwdChPcktData[7], MsgFLDataP->SpkrVoiceFwdChPcktData[8], MsgFLDataP->SpkrVoiceFwdChPcktData[9], MsgFLDataP->SpkrVoiceFwdChPcktData[10]);
425}
426
427void SPC2K_SOCM_Set(IpcDsvSendSsoCtrlParamsMsgT *pMsg)
428{
429#ifndef C2K_SAL_DISABLE
430 uint16 u2SOCM;
431 uint16 u2ValId;
432
433 ilm_SP_C2K_RATE_REDUC_NOTI_t *local_para;
434
435 u2SOCM = (pMsg->AudioSsoCtrlRrmLevel << C2K_SOCM_RATE_REDUC_SHIFT) || (pMsg->AudioSsoCtrlM2mMode << C2K_SOCM_MOBILE_TO_MOBILE_SHIFT) || pMsg->AudioSsoCtrlInitCodecMode;
436
437 switch(spc2k.u2Cod)
438 {
439 case SAL_C2K_COD_QCELP13K:
440 u2ValId = SAL_C2K_SOCM_QCELP13K;
441 SAL_C2K_SetValue(u2ValId, u2SOCM);
442 break;
443
444 case SAL_C2K_COD_EVRCA:
445 u2ValId = SAL_C2K_SOCM_EVRCA;
446 SAL_C2K_SetValue(u2ValId, u2SOCM);
447 break;
448
449 case SAL_C2K_COD_EVRCB:
450 u2ValId = SAL_C2K_SOCM_EVRCB;
451 SAL_C2K_SetValue(u2ValId, u2SOCM);
452 break;
453
454 case SAL_C2K_COD_EVRCNW_NB:
455 u2ValId = SAL_C2K_SOCM_EVRCNW_NB;
456 SAL_C2K_SetValue(u2ValId, u2SOCM);
457 break;
458
459 case SAL_C2K_COD_EVRCNW_WB:
460 u2ValId = SAL_C2K_SOCM_EVRCNW_WB;
461 SAL_C2K_SetValue(u2ValId, u2SOCM);
462 break;
463
464 default:
465
466 break;
467 }
468
469 //Ask Sheila to check
470 //pu2RateReduc = (uint16 *)ExeMsgBufferGet(sizeof(uint16));
471 //*pu2RateReduc = pMsg->AudioSsoCtrlRrmLevel;
472
473 //ExeMsgSend (EXE_VAL_ID, VAL_MAILBOX , VAL_SPH_RATE_REDUCE_NOTIFY_MSG, (void *)pu2RateReduc, sizeof(uint16));
474
475 if (RateReduc_last - pMsg->AudioSsoCtrlRrmLevel != 0)
476 {
477 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] RateReduc_last=%d", RateReduc_last);
478 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] AudioSsoCtrlRrmLevel=%d", pMsg->AudioSsoCtrlRrmLevel);
479 RateReduc_last = pMsg->AudioSsoCtrlRrmLevel;
480 local_para = (ilm_SP_C2K_RATE_REDUC_NOTI_t *) construct_local_para( sizeof(ilm_SP_C2K_RATE_REDUC_NOTI_t), TD_CTRL/*TD_RESET*/ );
481 local_para->pu2RateReduc_EM = pMsg->AudioSsoCtrlRrmLevel;
482 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] pu2RateReduc_EM=%d", local_para->pu2RateReduc_EM);
483 msg_send6(MOD_L1SP, MOD_CVAL, 0 ,MSG_ID_VAL_IPC_RATE_REDUCTION_MSG, (local_para_struct *)local_para, NULL);
484 }
485
486#endif
487}
488
489void SPC2K_EncMaxRate_Set(IpcDsvSetMicVoiceEncMaxRateMsgT *pMsg)
490{
491 //MonTrace (MON_CP_SPH_LINK_ENC_MAX_RATE, 1, pMsg->MicVoiceEncMaxRate);
492 //Check ENC_MAX_RATE val
493 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))
494 {
495 //MonFault (MON_IPC_FAULT_UNIT, C2K_LINK_ENC_MAX_RATE_VAL_ERR, pMsg->MicVoiceEncMaxRate, MON_HALT);
496 }
497#ifndef C2K_SAL_DISABLE
498 SAL_C2K_SetValue(SAL_C2K_ENC_MAX_RATE, pMsg->MicVoiceEncMaxRate);
499#endif
500}
501
502void SPC2K_UL_GetSpeechFrame( void )
503{
504 uint16 u2SO;
505 uint16 u2HBLen;
506 uint16 i;
507#ifndef C2K_SAL_DISABLE
508 volatile uint16 *pu2Addr;
509 //volatile uint16 *pu2LbkDLAddr;
510#endif
511
512 lmd_tx_spch_msg_struct* MsgRevPktP;
513 //IpcCpSpchDataRevChPacketMsgT MsgRevPkt;
514 spc2k.u4HBFrmCountUL1++;
515 spc2k.u4HBFrmCountUL2++;
516 if(!spc2k.bCodRdy)
517 {
518 //MonTrace (MON_CP_SPH_LINK_WARN_COD_UL_UNRDY, 0);
519 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link cod UL unready");
520 MD_TRC_C2K_SPH_LINK_COD_UL_UNRDY();
521 return;
522 }
523
524#ifndef C2K_SAL_DISABLE
525 if (false == SAL_C2K_IsULReady())
526 {
527 //MonTrace (MON_CP_SPH_LINK_WARN_UL_UNSYNC, 0);
528 //kal_prompt_trace(MOD_L1SP, "[C2K][SPH] Link UL unsync");
529 MD_TRC_C2K_SPH_LINK_UL_UNSYNC();
530 SAL_C2K_SetULUnsync();
531 return;
532 }
533#endif
534
535#ifndef C2K_SAL_DISABLE
536 u2SO = SAL_C2K_GetValue(SAL_C2K_VALUE_SO);
537 //check SO
538 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))
539 {
540 //MonFault (MON_IPC_FAULT_UNIT, C2K_LINK_SO_ERR, u2SO, MON_HALT);
541 }
542 //check DSP & CAAL SO conflict
543 if(u2SO != spc2k.u2Cod)
544 {
545 //MonTrace (MON_CP_SPH_LINK_WARN_SO_CONFLICT, 0);
546 return;
547 }
548#endif
549
550if(!(spc2k.u2Dbg & C2K_DBG_BIT_NO_MODEM))
551{
552 MsgRevPktP = (lmd_tx_spch_msg_struct *)construct_local_para(sizeof(lmd_tx_spch_msg_struct),TD_RESET);
553 #ifndef C2K_SAL_DISABLE
554 MsgRevPktP->msg.MppSpchRate = SAL_C2K_GetValue(SAL_C2K_VALUE_UL_RATE);
555 #endif
556
557 //check rate
558 if((MsgRevPktP->msg.MppSpchRate != IPC_SPCH_BLANK) && (MsgRevPktP->msg.MppSpchRate != IPC_SPCH_EIGHTH) &&
559 (MsgRevPktP->msg.MppSpchRate != IPC_SPCH_QUARTER) && (MsgRevPktP->msg.MppSpchRate != IPC_SPCH_HALF) &&
560 (MsgRevPktP->msg.MppSpchRate != IPC_SPCH_FULL) && (MsgRevPktP->msg.MppSpchRate != IPC_SPCH_ERASURE) &&
561 (MsgRevPktP->msg.MppSpchRate != IPC_SPCH_FULL_LIKELY))
562 {
563 //MonFault (MON_IPC_FAULT_UNIT, C2K_LINK_UL_RATE_ERR, MsgRevPktP->MppSpchRate, MON_HALT);
564 }
565 CodHBLenGet(spc2k.u2RS, MsgRevPktP->msg.MppSpchRate, &u2HBLen);
566 MsgRevPktP->msg.NumMppSpchData = u2HBLen;
567 #ifndef C2K_SAL_DISABLE
568 pu2Addr = SAL_C2K_GetAddr(SAL_C2K_ADDR_TXHB);
569 for(i = 0; i < u2HBLen; i++)
570 {
571 MsgRevPktP->msg.MppSpchData[i] = *pu2Addr;
572 pu2Addr++;
573 }
574 #endif
575 msg_send5(MOD_L1SP ,MOD_SPCH ,0x0 ,MSG_ID_CAAL_SPH_DATA_UL_MSG, (local_para_struct *) MsgRevPktP);
576 MD_TRC_C2K_SPH_LINK_HB_UL(MsgRevPktP->msg.MppSpchData[0], MsgRevPktP->msg.MppSpchData[1], MsgRevPktP->msg.MppSpchData[2], MsgRevPktP->msg.MppSpchData[3],
577 MsgRevPktP->msg.MppSpchData[4], MsgRevPktP->msg.MppSpchData[5], MsgRevPktP->msg.MppSpchData[6], MsgRevPktP->msg.MppSpchData[7], MsgRevPktP->msg.MppSpchData[8],
578 MsgRevPktP->msg.MppSpchData[9], MsgRevPktP->msg.MppSpchData[10]);
579 MD_TRC_C2K_SPH_LINK_RATE_UL(MsgRevPktP->msg.MppSpchRate);
580}
581
582if(spc2k.u2Dbg & C2K_DBG_BIT_U2D_LOOPBACK)
583{
584 MsgLbkDL.SpkrVoiceFwdChPcktRate = SAL_C2K_GetValue(SAL_C2K_VALUE_UL_RATE);
585 //check rate
586 if((MsgLbkDL.SpkrVoiceFwdChPcktRate != IPC_SPCH_BLANK) && (MsgLbkDL.SpkrVoiceFwdChPcktRate != IPC_SPCH_EIGHTH) &&
587 (MsgLbkDL.SpkrVoiceFwdChPcktRate != IPC_SPCH_QUARTER) && (MsgLbkDL.SpkrVoiceFwdChPcktRate != IPC_SPCH_HALF) &&
588 (MsgLbkDL.SpkrVoiceFwdChPcktRate != IPC_SPCH_FULL) && (MsgLbkDL.SpkrVoiceFwdChPcktRate != IPC_SPCH_ERASURE) &&
589 (MsgLbkDL.SpkrVoiceFwdChPcktRate != IPC_SPCH_FULL_LIKELY))
590 {
591 //MonFault (MON_IPC_FAULT_UNIT, C2K_LINK_UL_RATE_ERR, MsgRevPktP->MppSpchRate, MON_HALT);
592 }
593 CodHBLenGet(spc2k.u2RS, MsgLbkDL.SpkrVoiceFwdChPcktRate, &u2HBLen);
594 MsgLbkDL.SpkrVoiceFwdChPcktSize = u2HBLen;
595 #ifndef C2K_SAL_DISABLE
596 pu2Addr = SAL_C2K_GetAddr(SAL_C2K_ADDR_TXHB);
597 for(i = 0; i < u2HBLen; i++)
598 {
599 MsgLbkDL.SpkrVoiceFwdChPcktData[i] = *pu2Addr;
600 pu2Addr++;
601 }
602 #endif
603 MD_TRC_C2K_SPH_LINK_LBK_UL(MsgLbkDL.SpkrVoiceFwdChPcktRate, MsgLbkDL.SpkrVoiceFwdChPcktSize);
604 SPC2K_DL_PutSpeechFrame_Do(&MsgLbkDL);
605}
606 SAL_C2K_SetULEmpty();
607
608 MD_TRC_C2K_SPH_LINK_COD_UL(spc2k.u2Cod);
609
610// MonTrace (MON_CP_SPH_LINK_HB_UL1, 10, MsgRevPktP->MppSpchRate, spc2k.u2RS, spc2k.u4HBFrmCountUL1, MsgRevPktP->MppSpchData[0], MsgRevPktP->MppSpchData[1],
611// MsgRevPktP->MppSpchData[2], MsgRevPktP->MppSpchData[3], MsgRevPktP->MppSpchData[4], MsgRevPktP->MppSpchData[5],
612// MsgRevPktP->MppSpchData[6]);
613// MonTrace (MON_CP_SPH_LINK_HB_UL2, 5, spc2k.u4HBFrmCountUL2, MsgRevPktP->MppSpchData[7], MsgRevPktP->MppSpchData[8], MsgRevPktP->MppSpchData[9], MsgRevPktP->MppSpchData[10]);
614
615#ifndef CAAL_DISABLE
616 //if(true == spc2k.bCAALLbk)
617 //{
618 // SAL_C2K_SetValue(SAL_C2K_DL_RATE, MsgRevPktP->msg.MppSpchRate);
619 // pu2LbkDLAddr = SAL_C2K_GetAddr(SAL_C2K_ADDR_RXHB);
620 // for(i = 0; i < u2HBLen; i++)
621 // {
622 // *pu2LbkDLAddr = MsgRevPktP->msg.MppSpchData[i];
623 // pu2LbkDLAddr++;
624 // }
625 // //ExeMsgBufferFree(MsgRevPktP);
626 // //MsgRevPktP = NULL;
627 //}
628 //else
629 //{
630 // MsgId = MSG_ID_CAAL_SPH_DATA_UL_MSG;
631 // msg_send5(MOD_L1SP ,MOD_SPCH ,0x0 ,MSG_ID_CAAL_SPH_DATA_UL_MSG, (local_para_struct *) MsgRevPktP);
632 // //CAAL_ReadMsgsFromDsp(MsgId, (void *)MsgRevPktP);
633 //}
634#endif
635}
636
637void SPC2K_DL_PutSpeechFrame(IpcDsvSendSpkrVoiceFwdChPcktDataMsgT *MsgFLDataP)
638{
639 if(true == spc2k.bCAALLbk)
640 {
641 SPC2K_DL_PutSpeechFrame_Do(MsgFLDataP);
642 }
643}
644
645void SPC2K_GetSyncDelayRW( uint16 *u2DelR, uint16 *u2DelW, uint16 *u2DelM)
646{
647 SAL_Get_Delay(SAL_DEALY_C2K, SAL_DELAY_NA, SAL_DELAY_NA, u2DelR, u2DelW, u2DelM);
648 //MonTrace (MON_CP_SPH_LINK_DELRWM, 3, *u2DelR, *u2DelW, *u2DelM);
649}
650
651void SPC2K_Link_Lbk(HwdSphLbkMsgT *pMsg)
652{
653 //MonTrace (MON_CP_SPH_LINK_LBK, 3, pMsg->u2Mode, pMsg->u2SO, pMsg->bStart);
654 //#ifndef CAAL_DISABLE
655 //if(C2K_LMD_LBK == pMsg->u2Mode)
656 //{
657 // CAAL_Loopback_LMD(pMsg->u2SO, pMsg->bStart);
658 //}
659 //else if(C2K_CAAL_LBK == pMsg->u2Mode)
660 //{
661 // CAAL_Loopback_CAAL(pMsg->u2SO, pMsg->bStart);
662 //}
663 //#endif
664}
665
666void SPC2K_Debug_Info(IpcDsvSendAudioChanQltyMsgT * pMsg)
667{
668#ifndef C2K_SAL_DISABLE
669 SAL_C2K_SetValue(SAL_C2K_EBNT, pMsg->EbNt);
670#endif
671}