blob: 3a3a06815586c6673c154f8719e69bf0c735f040 [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001#include "kal_public_api.h"
2#include "reg_base.h"
3#include "sync_data.h"
4
5#include "l1audio.h"
6#include "am.h"
7// #include "audio_def.h"
8#include "afe_def.h"
9#include "media.h"
10#include "sp_daca.h"
11#include "sp_drv.h"
12#include "sal_def.h"
13#include "sal_exp.h"
14#include "l1sp_trc.h"
15#define DACA_STATE 0x4
16
17
18static _DACA_EX_T dacaEx;
19
20void Daca_hisrDlHdlr(void *param)
21{
22 kal_take_spinlock(dacaEx.DACASpinLockID, KAL_INFINITE_WAIT);
23 if(dacaEx.running == 0){
24 kal_give_spinlock(dacaEx.DACASpinLockID);
25 return;
26 }
27 dacaEx.daca_dl_hdlr();
28 kal_give_spinlock(dacaEx.DACASpinLockID);
29}
30
31void Daca_hisrUlHdlr(void *param)
32{
33 kal_take_spinlock(dacaEx.DACASpinLockID, KAL_INFINITE_WAIT);
34 if(dacaEx.running == 0){
35 kal_give_spinlock(dacaEx.DACASpinLockID);
36 return;
37 }
38 dacaEx.daca_ul_hdlr();
39 kal_give_spinlock(dacaEx.DACASpinLockID);
40}
41
42void DACA_Init()
43{
44 dacaEx.DACASpinLockID = kal_create_spinlock("DACA_LOCK");
45
46}
47
48void DACA_Start(void (*daca_dl_hdlr)(void), void (*daca_ul_hdlr)(void), DACA_APP_TYPE app_type)
49{
50 uint32 I;
51 //Sal_PCMEx_Config_t cfg_t;
52
53 //cfg_t.idle = false;//initialized;
54 dacaEx.aud_daca_id = L1Audio_GetAudioID();
55 L1Audio_SetFlag( dacaEx.aud_daca_id );
56
57 L1Audio_HookHisrHandler(DP_D2C_DACA_REQ_DL,(L1Audio_EventHandler)Daca_hisrDlHdlr, 0);
58 L1Audio_HookHisrHandler(DP_D2C_DACA_REQ_UL,(L1Audio_EventHandler)Daca_hisrUlHdlr, 0);
59 dacaEx.daca_dl_hdlr = daca_dl_hdlr;
60 dacaEx.daca_ul_hdlr = daca_ul_hdlr;
61
62 dacaEx.app_type = app_type;
63
64 if(app_type & DACA_IN_PHONE_CALL){
65 dacaEx.am_type = AM_PCMEX_TYPE_DACA_DEDICATION;
66 }else{
67 dacaEx.am_type = AM_PCMEX_TYPE_DACA_IDLE_WO_ENH;
68 }
69
70 if(app_type & DACA_USE_NB){
71 dacaEx.frame_size = 160;//PCMNWAY_BAND_INFO_NB;
72 // cfg_t.band = SAL_PCM_NARROWBAND;
73 }else if(app_type & DACA_USE_WB){
74 dacaEx.frame_size = 320;//PCMNWAY_BAND_INFO_WB;
75 // cfg_t.band = SAL_PCM_WIDEBAND;
76 }else if(app_type & DACA_USE_SWB){
77 dacaEx.frame_size = 640;//PCMNWAY_BAND_INFO_WB;
78 // cfg_t.band = SAL_PCM_WIDEBAND;
79 }else if(app_type & DACA_USE_FB){
80 dacaEx.frame_size = 960;//PCMNWAY_BAND_INFO_WB;
81 // cfg_t.band = SAL_PCM_WIDEBAND;
82 }else{
83 ASSERT(0);
84 }
85
86 /* the begining of configure the SAL */
87 if(app_type & DACA_USE_UL){
88 SAL_PcmEx_SetStateUL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_ON);
89 }
90
91 if(app_type & DACA_USE_DL){
92 SAL_PcmEx_SetStateDL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_ON);
93 }
94 //cfg_t.swi = SAL_PCMEX_SWITCH_ON;
95 //cfg_t.type = SAL_PCMEX_TYPE_DACA;
96 //cfg_t.band = (app_type & DACA_USE_NB) ? SAL_PCM_NARROWBAND : SAL_PCM_WIDEBAND;
97
98 AM_PCM_EX_On(dacaEx.am_type, (uint32)&dacaEx);
99 for(dacaEx.state = DACA_STATE, I = 0; ;I ++){
100 kal_bool is_ready = true;
101 if((dacaEx.app_type & DACA_USE_UL) && (!SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_RDY)))
102 is_ready = false;
103 if((dacaEx.app_type & DACA_USE_DL) && (!SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_RDY)))
104 is_ready = false;
105
106 if(is_ready)
107 break;
108 MD_TRC_DACA_DBG(I);
109 ASSERT(I < 25); // wait 250ms
110 kal_sleep_task( AUD_1TICK(2) );
111 }
112 kal_take_spinlock(dacaEx.DACASpinLockID, KAL_INFINITE_WAIT);
113 dacaEx.running = 1;
114 kal_give_spinlock(dacaEx.DACASpinLockID);
115 /* the end of configure the SAL */
116}
117
118void DACA_Stop(DACA_APP_TYPE app_type)
119{
120 // Sal_PCMEx_Config_t cfg_t;
121
122 // cfg_t.idle = false;//initialized
123 kal_take_spinlock(dacaEx.DACASpinLockID, KAL_INFINITE_WAIT);
124 dacaEx.running = 0;
125 kal_give_spinlock(dacaEx.DACASpinLockID);
126 ASSERT((dacaEx.app_type == app_type) && (dacaEx.state == DACA_STATE));
127
128 /* the begining of configure the SAL */
129 if(dacaEx.app_type & DACA_USE_UL){//either ready or off
130 ASSERT(SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_RDY));
131 }else{
132 ASSERT(SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_OFF));
133 }
134
135 if(dacaEx.app_type & DACA_USE_DL){//either ready or off
136 ASSERT(SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_RDY));
137 }else{
138 ASSERT(SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_OFF));
139 }
140
141 SAL_PcmEx_SetStateUL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_OFF);
142 SAL_PcmEx_SetStateDL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_OFF);
143
144 // cfg_t.swi = SAL_PCMEX_SWITCH_OFF;
145 // cfg_t.type = SAL_PCMEX_TYPE_DACA;
146 AM_PCM_EX_Off(dacaEx.am_type, (uint32)&dacaEx);
147 /* the end of configure the SAL */
148
149 L1Audio_UnhookHisrHandler(DP_D2C_DACA_REQ_DL);
150 L1Audio_UnhookHisrHandler(DP_D2C_DACA_REQ_UL);
151
152 L1Audio_ClearFlag( dacaEx.aud_daca_id );
153 L1Audio_FreeAudioID( dacaEx.aud_daca_id );
154
155 dacaEx.daca_dl_hdlr = dacaEx.daca_ul_hdlr = NULL;
156 dacaEx.state = 0;
157 dacaEx.app_type = DACA_APP_TYPE_UNDEFINE;
158 dacaEx.am_type = 0xFFFF;
159}
160
161
162uint32 DACA_GetFromSD(uint16 *dl_buf)
163{
164 uint32 I;
165 uint32 fsize = dacaEx.frame_size;
166
167 volatile int16* ptr = (int16 *)SAL_PcmEx_GetBuf(SAL_PCMEX_DACA_BUF_DL);
168 int16 *out_buf = (int16 *)dl_buf;
169
170 int32 gain = AM_DSP_GetSpeechDigitalGain();
171 ASSERT(gain > 0 && gain <= 4096);
172
173 for( I = 0 ; I < fsize; I++ ){
174 //*out_buf++ = (*ptr++ * gain) >> 12;
175 *out_buf++ = *ptr++;
176 }
177 return fsize;
178}
179
180void DACA_PutToSE(const uint16 *ul_data)
181{
182 uint32 I;
183 uint32 fsize = dacaEx.frame_size;
184 volatile uint16* ptr = SAL_PcmEx_GetBuf(SAL_PCMEX_DACA_BUF_UL);
185 for( I = fsize; I > 0; I-- )
186 *ptr++ = *ul_data++;
187 Data_Sync_Barrier();
188}
189
190void DACA_FillSE(uint16 value)
191{
192 uint32 I;
193 uint32 fsize = dacaEx.frame_size;
194 volatile uint16* ptr = SAL_PcmEx_GetBuf(SAL_PCMEX_DACA_BUF_UL);
195 for( I = fsize; I > 0; I-- )
196 *ptr++ = value;
197 Data_Sync_Barrier();
198}
199