rjw | 6c1fd8f | 2022-11-30 14:33:01 +0800 | [diff] [blame] | 1 | #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 | |
| 18 | static _DACA_EX_T dacaEx; |
| 19 | |
| 20 | void 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 | |
| 31 | void 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 | |
| 42 | void DACA_Init() |
| 43 | { |
| 44 | dacaEx.DACASpinLockID = kal_create_spinlock("DACA_LOCK"); |
| 45 | |
| 46 | } |
| 47 | |
| 48 | void 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 | |
| 118 | void 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 | |
| 162 | uint32 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 | |
| 180 | void 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 | |
| 190 | void 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 | |