void L1Audio_ClearFlag( uint16 audio_id ) { uint32 savedMask; if (!kal_if_hisr() && !kal_if_lisr()) kal_trace( TRACE_GROUP_AUD_MD2GCTRL, L1AUDIO_CLEARFLAG_A,audio_id,l1audio.runningState); else kal_dev_trace( TRACE_GROUP_AUD_MD2GCTRL, L1AUDIO_CLEARFLAG_A,audio_id,l1audio.runningState); kal_take_sem( l1audio.sema, KAL_INFINITE_WAIT ); ASSERT( l1audio.id_flag & (1 << audio_id) ); ASSERT( l1audio.runningState & (1 << audio_id) ); savedMask = SaveAndSetIRQMask(); l1audio.runningState &= ~(1 << audio_id); RestoreIRQMask( savedMask ); if(l1audio.runningState == 0 ) { SLEEP_UNLOCK(); } if( (l1audio.runningState == 0) && (l1audio.disallowSleepState == 0) ) { #if defined( __CENTRALIZED_SLEEP_MANAGER__ ) Audio_Wake_DSP(audio_id, KAL_FALSE); #endif } kal_give_sem( l1audio.sema ); }
static void I2S_DspIntHISR( void *data ) { kal_bool fValid = KAL_FALSE; kal_uint16 uEnableCheck, uFinishCheck, uControl, uMagicNo; uMagicNo = *I2S_PLAYERROR_INFO; uControl = *I2S_PLAYERROR_CONTROL; uEnableCheck = uControl & I2S_ENABLE_CHECK; uFinishCheck = uControl & I2S_FINISH_CHECK; kal_dev_trace( TRACE_FUNC, L1AUDIO_I2S_INTERRUPT, uControl, uEnableCheck, uFinishCheck, uMagicNo); if(uFinishCheck && uEnableCheck) { if(uMagicNo == I2S_FAIL_MAGINNO) { fValid = KAL_FALSE; } else { fValid = KAL_TRUE; } i2s.fCheckReady = KAL_TRUE; i2s.fCheckValid = fValid; } if(i2s.fCheckEnable == KAL_FALSE || uFinishCheck ) { *I2S_PLAYERROR_CONTROL &= ~(I2S_ENABLE_CHECK | I2S_FINISH_CHECK); *I2S_PLAYERROR_INFO = 0; } }
void bgsndDlHisr( void * param) { if(true == bgSnd.isDlHisrCome) { kal_dev_trace( TRACE_GROUP_SND, L1SND_REENTER_HISR, bgSnd.isDlHisrCome, bgSnd.isUlHisrCome); } else { bgSnd.isDlHisrCome = true; if(bgSnd.isUlHisrCome == bgSnd.isDlHisrCome) { bgsndHisr(param); bgSnd.isUlHisrCome = false; bgSnd.isDlHisrCome = false; } } }
void drv_trace4(trace_class_enum trc_class, kal_uint32 msg_index, const char *arg_type, kal_uint32 data1, kal_uint32 data2, kal_uint32 data3, kal_uint32 data4) { if (INT_QueryExceptionStatus()) return; if(kal_if_lisr() == KAL_TRUE) return; if(kal_if_hisr()) { kal_dev_trace(trc_class, msg_index, arg_type, data1, data2, data3, data4); } else { kal_trace(trc_class, msg_index, arg_type, data1, data2, data3, data4); } }
static void DCM_Trace(void) { static kal_uint32 src_sel; int timeout = 0; if (dbg_lpm_enable & DBG_L1_LPM_ENABLE) { DRV_ClrReg32(MD_L1_LPM_CON0, 1UL<<2); //Stop L1 LPM kal_dev_trace(DRIVER_GROUP_SYSTEM, LPM_L1, DRV_Reg32(MD_L1_LPM_CON0), DRV_Reg32(MD_L1_LPM_STATUS0), DRV_Reg32(MD_L1_LPM_STATUS1), DRV_Reg32(MD_L1_LPM_STATUS2)); src_sel = (DRV_Reg32(MD_L1_LPM_CON0) & (0x0f<<4)) >> 4; src_sel = ((src_sel+1) & 0x0f) << 4; #if 1 //32k DRV_WriteReg32(MD_L1_LPM_CON0, 2|0); //assert reset for(timeout=500; timeout>0; timeout--) { if (DRV_Reg32(MD_L1_LPM_STATUS0) == 0) { DRV_WriteReg32(MD_L1_LPM_CON0, 2|1); //deassert reset break; } } timeout = 0; #else //pll /* under construction !*/ /* under construction !*/ /* under construction !*/ #endif //debug only LPM_REG_CLR_SET(MD_L1_LPM_CON0, (0xffff<<16), timeout<<16); LPM_REG_CLR_SET(MD_L1_LPM_CON0, (0xf<<4), (src_sel)); DRV_SetReg32_NPW(MD_L1_LPM_CON0, 1<<2); }
/* static kal_int16 tone1k_16kSR[320] = { 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05, 0x0000, 0x30FC, 0x5A82, 0x7641, 0x7FFF, 0x7641, 0x5A82, 0x30FB, 0x0001, 0xCF05, 0xA57E, 0x89C0, 0x8001, 0x89BF, 0xA57E, 0xCF05 }; */ static void bgsnd_WriteToDSP(void) { uint16 dsp_buf_len, dsp_buf_len_Ul; uint16 *dataPtr; volatile uint16 *toPtr; volatile uint16 *toPtr_Ul; int32 count, segment, i; bool isWb, isWb_Ul; /* ¡VSph_Band_Flag ¡EBit 0: Sch band (0/1 : Nb/Wb) ¡EBit 1: Cod band (0/1 : Nb/Wb) ¡EBit 2: VBI band (0/1 : Nb/Wb) ¡EBit 3: BT band (0/1 : Nb/Wb) MT6280 0x2FBF MT6589 0x32F1 dm5 */ // get current buffer data length in two sample alight. (16k sampling rate) count = bgsndGetDataCount(); //set up the DSP address and pointers dsp_buf_len = SAL_Bgsnd_GetDataLen_DL(); #ifdef DSP_BGS_UP_DOWN_INT_SEPERATE dsp_buf_len_Ul = SAL_Bgsnd_GetDataLen_UL(); #else dsp_buf_len_Ul = dsp_buf_len; #endif if(dsp_buf_len == DSP_BUFFER_LEN_WB) isWb = true; else if(dsp_buf_len == DSP_BUFFER_LEN_NB){ isWb = false; // count >>= 1; } else { ASSERT_REBOOT(0); isWb = false; } if(dsp_buf_len_Ul == DSP_BUFFER_LEN_WB) isWb_Ul= true; else if(dsp_buf_len_Ul == DSP_BUFFER_LEN_NB){ isWb_Ul= false; } else { ASSERT_REBOOT(0); isWb_Ul = false; } toPtr = SAL_Bgsnd_GetBuf_DL(); #ifdef DSP_BGS_UP_DOWN_INT_SEPERATE toPtr_Ul = SAL_Bgsnd_GetBuf_UL(); #else toPtr_Ul = toPtr; #endif kal_dev_trace(TRACE_INFO, L1SND_DSP_BUFFER_INFO, count, toPtr, dsp_buf_len); #ifdef DSP_BGS_UP_DOWN_INT_SEPERATE kal_dev_trace(TRACE_INFO, L1SND_DSP_BUFFER_INFO, -1, toPtr_Ul, dsp_buf_len_Ul); #else kal_dev_trace(TRACE_INFO, L1SND_DSP_BUFFER_INFO, count, toPtr_Ul, dsp_buf_len_Ul); #endif if (count > DSP_BUFFER_LEN_MAX) count = DSP_BUFFER_LEN_MAX; if(count > 0) { /* First Segemnt */ if(bgSnd.bufWrite < bgSnd.bufRead) { segment = (bgSnd.bufSize - bgSnd.bufRead); } else { segment = (bgSnd.bufWrite - bgSnd.bufRead); } if(segment&1){ // keep two sample alight segment =segment - 1; } /* if(isNb){ // 8k if (segment > (count<<1)) segment = (count<<1); }else { // 16 k if (segment > count) segment = count; } */ if (segment > count) segment = count; if (segment > 0) { // kal_dev_trace(TRACE_STATE, L1SND_FILLBUFFER, segment); dataPtr = &(bgSnd.pBuf[bgSnd.bufRead]); for (i=segment; i>0; (i-=2)) { // first sample *toPtr++ = *dataPtr; *toPtr_Ul++ = *dataPtr++; // second sample if(isWb) { *toPtr++ = *dataPtr; } if(isWb_Ul) { *toPtr_Ul++ = *dataPtr; } dataPtr++; } bgSnd.dspLastSample = *(toPtr-1); bgSnd.bufRead += segment; if (bgSnd.bufRead >= bgSnd.bufSize) bgSnd.bufRead = (bgSnd.bufRead-bgSnd.bufSize); kal_dev_trace(TRACE_STATE, L1SND_FILLBUFFER, 1, segment, bgSnd.bufRead, bgSnd.bufWrite); } /* Second Segment */ /* if(isNb){ // 8k segment = (count<<1) - segment; } else { segment = count - segment; } */ segment = count - segment; if (segment > 0) { // kal_dev_trace(TRACE_STATE, L1SND_FILLBUFFER, segment); // dataPtr = bgSnd.pBuf; dataPtr = &(bgSnd.pBuf[bgSnd.bufRead]); for (i=segment; i>0; (i-=2)) { // first sample *toPtr++ = *dataPtr; *toPtr_Ul++ = *dataPtr++; // second sample if(isWb) { *toPtr++ = *dataPtr; } if(isWb_Ul) { *toPtr_Ul++ = *dataPtr; } dataPtr++; } bgSnd.dspLastSample = *(toPtr-1); bgSnd.bufRead += segment; if (bgSnd.bufRead >= bgSnd.bufSize) bgSnd.bufRead = (bgSnd.bufRead-bgSnd.bufSize); kal_dev_trace(TRACE_STATE, L1SND_FILLBUFFER, 2, segment, bgSnd.bufRead, bgSnd.bufWrite); } } /* Put silence (last sample) if MCU buffer is empty */ if (count < DSP_BUFFER_LEN_MAX) { kal_uint16 last_sample; last_sample = bgSnd.dspLastSample; // segment = dsp_buf_len - count; segment = DSP_BUFFER_LEN_MAX - count; kal_dev_trace(TRACE_STATE, L1SND_PUT_SILENCE, segment, last_sample); /* for (i=segment; i>0; i--) { *toPtr++ = last_sample; } */ for (i=segment; i>0; (i-=2)) { // first sample *toPtr++ = last_sample; *toPtr_Ul++ = last_sample; // second sample if(isWb) { *toPtr++ = last_sample; } if(isWb_Ul) { *toPtr_Ul++ = last_sample; } } } }
static void Audio_Wake_DSP(uint16 audio_id, kal_bool flag) { if (!kal_if_hisr() && !kal_if_lisr()) kal_trace( TRACE_GROUP_AUD_MD2GCTRL, L1AUDIO_MD2G_PWR_CTRL, audio_id, flag); else kal_dev_trace( TRACE_GROUP_AUD_MD2GCTRL, L1AUDIO_MD2G_PWR_CTRL, audio_id, flag); if(flag) { #if defined(MT6260) RM_Resource_Control (RM_MODEM_DSP_1, flag); #else Audio_SW_CPD_Event_Setting(flag); Audio_SW_CPD_Eevent_ChangeMode(flag); #endif #if defined(MTK_SLEEP_ENABLE) #if defined(__AUDIO_POWERON_RESET_DSP__) { extern void AFE_RegisterStore(void); AFE_RegisterStore(); //restore AFE register } { unsigned short DSP_status; DSP_status = L1D_Audio_RestartDSP(); ASSERT(!DSP_status); } #else L1SM_IntSleepDisable( l1audio.l1sm_handle ); L1SM_Multi_SW_WakeUp(); L1D_MD2G_PWD_Disable(l1audio.md2g_pdn_handle); L1SM_IntSleepEnable( l1audio.l1sm_handle ); #endif #endif Audio_DSP_Wakeup_Eevent_Setting(flag); l1audio.audio_cpd_count++; l1audio.audio_cpd_count_current++; } else { Audio_DSP_Wakeup_Eevent_Setting(flag); #if defined(MTK_SLEEP_ENABLE) #if defined(__AUDIO_POWERON_RESET_DSP__) L1D_Audio_NoNeedDSP(); AFE_RegisterBackup(); //Backup AFE register #else L1D_MD2G_PWD_Enable(l1audio.md2g_pdn_handle); #endif #endif #if defined(MT6260) RM_Resource_Control (RM_MODEM_DSP_1, flag); #else Audio_SW_CPD_Eevent_ChangeMode(flag); #endif l1audio.audio_cpd_count_current--; #if __DSP_WAKEUP_EVENT__ Audio_DSP_Wakeup_Eevent_clean(); #endif } if (!kal_if_hisr() && !kal_if_lisr()) kal_trace( TRACE_GROUP_AUD_MD2GCTRL, L1AUDIO_MD2G_PWR_CTRL_DONE, audio_id, flag); else kal_dev_trace( TRACE_GROUP_AUD_MD2GCTRL, L1AUDIO_MD2G_PWR_CTRL_DONE, audio_id, flag); }