static void pcmStrmCloseDevice( MHdl *hdl ) { uint16 I, ctl; pcmStrmMediaHdl *ihdl = (pcmStrmMediaHdl *)hdl; for ( I = 0; ; I++ ) { ctl = *DSP_PCM_CTRL; if ( ctl == 0 ) // DSP returns to idle state break; if ( ctl == 8 ) { *DSP_PCM_CTRL = WAV_ABORT_STATE; // give ABORT command to the DSP kal_trace( TRACE_STATE, L1AUDIO_STOP_STATE ); } ASSERT_REBOOT( I < 40 ); kal_sleep_task( 2 ); } kal_trace( TRACE_STATE, L1AUDIO_IDLE_STATE ); #if defined(MT6205B) if( ihdl->pcmStrm.freqType == 0x20 ) // sampling frequency: 16k AM_PCM16K_PlaybackOff( true ); else // sampling frequency: 8k AM_PCM8K_PlaybackOff( true ); #else #if !defined(__BT_AUDIO_VIA_SCO__) if ( ihdl->pcmStrm.is8KVoice ) AM_PCM8K_PlaybackOff( true ); else #endif AM_AudioPlaybackOff( true ); #endif mhdlAllowSleep( hdl ); }
void DSP_BGSND_Stop(void) { kal_prompt_trace(MOD_L1SP, "[DSP_BGSND_Stop] Enter"); DSP_BGSnd.state = DSP_BGSND_STATE_STOPPING; { //turn off DSP BGSND uint32 I; if(SAL_Bgsnd_IsRunning()) SAL_Bgsnd_SetFinal(); for ( I = 0; ; I++ ) { if ( SAL_Bgsnd_IsIdle()) /* DSP returns to idle state */ break; ASSERT_REBOOT( I < 20 ); kal_sleep_task( 2 ); } AM_SND_PlaybackOff( true ); } #ifdef DSP_BGS_UP_DOWN_INT_SEPERATE L1Audio_UnhookHisrHandler(D2C_SOUND_EFFECT_INT_ID_DL); L1Audio_UnhookHisrHandler(D2C_SOUND_EFFECT_INT_ID_UL); #else L1Audio_UnhookHisrHandler(D2C_SOUND_EFFECT_INT_ID_DL); #endif DSP_BGSnd.state = DSP_BGSND_STATE_IDLE; kal_prompt_trace(MOD_L1SP, "[DSP_BGSND_Stop] Leave"); }
void L1Audio_UnhookHisrHandler( kal_uint16 magic_no ) { int32 I; for( I = 0; I < MAX_HISR_HANDLER; I++ ) { if( l1audio.hisrMagicNo[I] == magic_no ) { l1audio.hisrMagicNo[I] = 0; break; } } ASSERT_REBOOT( I != MAX_HISR_HANDLER ); }
static void pcmStrmRecCloseDevice( MHdl *hdl ) { uint16 I, ctl; for ( I = 0; ; I++ ) { ctl = *DSP_PCM_REC_CTRL; if ( ctl == 0 ) // DSP returns to idle state break; if ( ctl == 0x400 ) *DSP_PCM_REC_CTRL = 0x800; // give ABORT command to the DSP ASSERT_REBOOT( I < 20 ); kal_sleep_task( 2 ); } AM_PCM8K_RecordOff( true ); mhdlAllowSleep( hdl ); }
static void toneStop( void *data ) { if (tone.state == TONE_STATE_NONE) return; if( !L1Audio_CheckFlag( tone.aud_id ) ) return; if (tone.isReentrance) return; else tone.isReentrance = true; tone.bQTMF = false; if (tone.state == TONE_STATE_INIT) { int I; for (I = 0; ; I++) { if (tone.state != TONE_STATE_INIT) break; ASSERT_REBOOT( I < 20 ); kal_sleep_task( 2 ); } } if (tone.state == TONE_STATE_PLAY) { tone.state = TONE_STATE_STOP; tone.isWait = true; L1Audio_FC_TonePlaybackOff(tone.fc_aud_id); tone.isWait = false; tone.state = TONE_STATE_IDLE; } if (tone.state == TONE_STATE_IDLE) { tone.state = TONE_STATE_NONE; L1Audio_FC_UnHookHandler(tone.fc_aud_id, 0); tone.fc_aud_id = 0xFFFF; } AM_ToneOff(); AFE_TurnOffSpeaker( L1SP_TONE ); L1Audio_ClearFlag( tone.aud_id ); tone.seqNum++; L1Audio_SetEvent( tone.aud_id, 0 ); }
void bgsndOnHandler(void) { AM_SND_PlaybackOn(); SAL_Bgsnd_SetInit(); //*DSP_SOUND_EFFECT_CTRL = DP_BGSND_STATE_READY; { uint32 I; for( I = 0; ; I++ ) { //if( *DSP_SOUND_EFFECT_CTRL == DP_BGSND_STATE_PLAYING) if(SAL_Bgsnd_IsRunning()) break; ASSERT_REBOOT( I < 20 ); kal_sleep_task( 2 ); } } }
uint16 L1Audio_GetAudioID( void ) { uint32 I; uint32 savedMask; savedMask = SaveAndSetIRQMask(); for( I = 0; I < MAX_AUDIO_FUNCTIONS; I++ ) { if( (l1audio.id_flag & (1<<I)) == 0 ) { l1audio.id_flag |= (1<<I); break; } } RestoreIRQMask( savedMask ); ASSERT( (l1audio.runningState & (1 << I)) == 0 ); ASSERT_REBOOT( I < MAX_AUDIO_FUNCTIONS ); return (uint16)I; }
static void pcmStrmRecOpenDevice( pcmStrmMediaHdl *ihdl ) { uint16 I; ihdl->end_status = MEDIA_NONE; mhdlDisallowSleep( (MHdl*)ihdl ); if (ihdl->pcmStrm.dedicated_mode) { // PCM recording in TCH mode/ AM_PCM8K_RecordOn(); } else { *DSP_PCM_REC_CTRL = 0x200; AM_PCM8K_RecordOn(); for ( I = 0; ; I++ ) { if ( *DSP_PCM_REC_CTRL == 0x400 ) break; ASSERT_REBOOT( I < 20 ); kal_sleep_task( 2 ); } } }
void bgsndOffHandler(void) { if(BGSND_STATE_STOP != bgSnd.state) { return; } uint32 I; if(SAL_Bgsnd_IsRunning()) SAL_Bgsnd_SetFinal(); for ( I = 0; ; I++ ) { if ( SAL_Bgsnd_IsIdle()) /* DSP returns to idle state */ break; ASSERT_REBOOT( I < 20 ); kal_sleep_task( 2 ); } AM_SND_PlaybackOff( true ); }
static void DSP_BGSND_Start(void (*Ext_DLHisr)(void), void (*Ext_ULHisr)(void)) { kal_prompt_trace(MOD_L1SP, "[DSP_BGSND_Start] Enter"); ASSERT(AM_IsSpeechOn() || AM_IsVoIPOn()); DSP_BGSnd.Ext_Hisr[BGSND_DL_PROCESS] = Ext_DLHisr; DSP_BGSnd.Ext_Hisr[BGSND_UL_PROCESS] = Ext_ULHisr; #ifdef DSP_BGS_UP_DOWN_INT_SEPERATE L1Audio_HookHisrHandler(D2C_SOUND_EFFECT_INT_ID_DL, DSP_BGSND_Hisr, BGSND_DL_PROCESS); L1Audio_HookHisrHandler(D2C_SOUND_EFFECT_INT_ID_UL, DSP_BGSND_Hisr, BGSND_UL_PROCESS); #else L1Audio_HookHisrHandler(D2C_SOUND_EFFECT_INT_ID_DL, DSP_BGSND_Shared_Hisr_DL_UL, 0); #endif // gain setting and update // Although these settings are allowed to modify during run time, // extended bgsnd should be fixed because the changes of volume from // each sources are calculated in MCU side. DSP_BGSND_ConfigMixer(KAL_TRUE, 7, BGSND_UL_PROCESS); DSP_BGSND_ConfigMixer(KAL_TRUE, 7, BGSND_DL_PROCESS); DSP_BGSND_UpdateMixer(); { //turn on DSP BGSND uint32 I; AM_SND_PlaybackOn(); SAL_Bgsnd_SetInit(); for( I = 0; ; I++ ) { if(SAL_Bgsnd_IsRunning()) break; ASSERT_REBOOT( I < 20 ); kal_sleep_task( 2 ); } } DSP_BGSnd.state = DSP_BGSND_STATE_RUN; kal_prompt_trace(MOD_L1SP, "[DSP_BGSND_Start] Leave"); }
static void pcmStrmOpenDevice( pcmStrmMediaHdl *ihdl ) { uint16 I; ihdl->end_status = MEDIA_NONE; ihdl->mh.dsp_rb_base = 0; mhdlDisallowSleep( (MHdl*)ihdl ); ASSERT(*DSP_PCM_CTRL == 0); #if defined(MT6205B) if ( ihdl->pcmStrm.freqType == 0x20 ) // sampling frequency: 16k AM_PCM16K_PlaybackOn(); else // sampling frequency: 8k AM_PCM8K_PlaybackOn(); #else *DSP_PCM_MS |= 0x0001; #if !defined(__BT_AUDIO_VIA_SCO__) if ( ihdl->pcmStrm.is8KVoice ) { AM_PCM8K_PlaybackOn(); } else #endif { #if defined( DSP_WT_SYN ) DSP_DynamicDownload( DDID_WAVETABLE ); #endif AM_AudioPlaybackOn( ASP_TYPE_PCM_HI, ihdl->pcmStrm.freqType ); } #endif *DSP_PCM_CTRL = 1; kal_trace( TRACE_STATE, L1AUDIO_INIT_STATE ); for ( I = 0; ; I++ ) { if ( *DSP_PCM_CTRL == 8 || ihdl->end_status == MEDIA_END ) break; ASSERT_REBOOT( I < 40 ); kal_sleep_task( 2 ); } }
void SAL_AGC4_Config(Sal_AGC_Config_t *cfg) { ASSERT_REBOOT(cfg != 0); SALI_AGC4_Config(cfg); }
void SAL_BT_Config(Sal_BT_Config *cfg) { ASSERT_REBOOT(cfg != 0); L1Audio_Msg_SAL_PROC(SAL_PROC_NAME(17), cfg->feed_cfg, cfg->mode, cfg->linear_ctrl, (cfg->linear_ul_gain<<8)+cfg->linear_reverse); SALI_BT_Config(cfg); }
void SAL_EPL_GetFrame(Sal_EPL_Frame *eplfrm) { ASSERT_REBOOT(eplfrm != 0); SALI_EPL_GetFrame(eplfrm); }
void SAL_VM_GetFrame3G(Sal_VM_Frame *vmfrm) { ASSERT_REBOOT(vmfrm != 0); SALI_VM_GetFrame(1, vmfrm); }
void SAL_PcmEx_Config(Sal_PCMEx_Config_t* cfg) { ASSERT_REBOOT(cfg != 0); L1Audio_Msg_SAL_PROC(SAL_PROC_NAME(14), cfg->swi, cfg->type, cfg->idle, cfg->band); SALI_PcmEx_Config(cfg); }
/* 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; } } } }
void L1SP_D2C_LISR( uint16 itype ) { l1audio.d2c_itype = itype; l1audio.d2c_l1FN = L1I_GetTimeStamp(); L1Audio_Msg_DSP_INT( itype ); #if __DSP_WAKEUP_EVENT__ Audio_DSP_Wakeup_Eevent_clean(); #endif #if defined(MT6268) //work around in 3G, there is DP_D2C_SE_DONE int. There might be error operate especially when InterRAT HO if( itype == DP_D2C_SE_DONE && AM_IsSpeechOn() ) return; #endif #if defined(MT6236) || defined(MT6236B) || defined(MT6256_S00) || defined(MT6256_S01) || defined(MT6251) || defined(MT6253E) || defined(MT6253L)|| defined(MT6252) || defined(MT6252H) || defined(MT6255) || defined(MT6250) || defined(MT6260) if(itype == D2C_DSP_DEAD_INT_ID){ #ifndef L1D_TEST { ASSERT_DUMP_PARAM_T dump_param; dump_param.addr[0] = (kal_uint32)(DPRAM_CPU_base +0x0A0*2); dump_param.len[0] = 70*2; dump_param.addr[1] = (kal_uint32)(DPRAM2_CPU_base+0x130*2); dump_param.len[1] = 180*2; dump_param.addr[2] = 0; //End of dump param EXT_ASSERT_DUMP(0, 0x20060622, 0, 0, &dump_param); } #else { extern void L1DTest_AssertFail(void); L1DTest_AssertFail(); } #endif } #endif // #if defined(MT6236) || defined(MT6236B) || defined(MT6256) #if defined(MT6260) { bool dsp_ok = false; uint32 sph_int = 0; bool from_sph = Pseudo_SAL_DSPINT_Resolve(itype, &sph_int); if (from_sph) { { kal_int16 i; for (i = 1; i < PSEUDO_SAL_DSPINT_PRIO_MAX; i++) { if (sph_int & (1 << i)) { if (PSEUDO_SAL_DSPINT_PRIO_3G_DL == i) { // Do nothing. Don't trigger LISR here. 3G driver will trigger HISR by it's timing } else { L1Audio_TrigD2CHisr(DP_D2C_INT_MAPPING_BASIC + i); } dsp_ok |= true; } } } // After DSP send D2C and turn on bit in DP_D2C_SPEECH_UL_INT, but MCU does not receive D2C. // Handover causes VBI reset which will clean DP_D2C_SPEECH_UL_INT if (sph_int != 0) { if (!dsp_ok) { extern void L1D_WIN_DisableAllEvents(uint16 except_irq_mask); DisableIRQ(); L1D_WIN_DisableAllEvents(0); // disable all TDMA events ASSERT_REBOOT(0); } } return; } } L1Audio_TrigD2CHisr(itype); #else // chip compile option #if defined(MT6236) || defined(MT6236B) || defined(MT6256_S00) || defined(MT6256_S01) || defined(MT6251) || defined(MT6253E) || defined(MT6253L)|| defined(MT6252) || defined(MT6252H) || defined(MT6255) || defined(MT6250) if(itype == D2C_INT6_MAGIC){ bool dsp_ok = false; #else if(itype == D2C_DSP_DEAD_INT_ID){ bool dsp_ok = false; itype = *DSP_DEAD_INTERRUPT; if( itype == D2C_DSP_DEAD_INT_ID ) { extern void L1D_WIN_DisableAllEvents(uint16 except_irq_mask); DisableIRQ(); *DP_D2C_TASK1 = 0; /* freeze DSP */ L1D_WIN_DisableAllEvents( 0 ); /* disable all TDMA events */ #ifndef L1D_TEST { ASSERT_DUMP_PARAM_T dump_param; /* Write DSP debug info to exception record */ #if defined(MT6235) || defined(MT6235B) || defined(MT6268) || defined(MT6251) dump_param.addr[0] = (kal_uint32)(DPRAM_CPU_base +0x0A0*2); dump_param.len[0] = 70*2; dump_param.addr[1] = (kal_uint32)(DPRAM2_CPU_base+0x130*2); dump_param.len[1] = 180*2; dump_param.addr[2] = 0; //End of dump param #else dump_param.addr[0] = (kal_uint32)(DPRAM_CPU_base +0x130*2); dump_param.len[0] = 250*2; dump_param.addr[1] = 0; //End of dump param #endif EXT_ASSERT_DUMP(0, 0x20060622, 0, 0, &dump_param); } #else { extern void L1DTest_AssertFail(void); L1DTest_AssertFail(); } #endif//#ifndef L1D_TEST } #endif // #if defind(MT6236)|| defined(MT6256) #if defined(MT6250) itype = *DSP_DACA_UL_INT; if(itype == DP_D2C_DACA_REQ_UL){ *DSP_DACA_UL_INT = 0; L1SP_D2C_LISR(itype); dsp_ok |= true; } itype = *DSP_DACA_DL_INT; if(itype == DP_D2C_DACA_REQ_DL){ *DSP_DACA_DL_INT = 0; L1SP_D2C_LISR(itype); dsp_ok |= true; } #endif itype = *DSP_PCM_REC_INT; if( itype == D2C_UL_DL_PCM_REC_INT_ID || itype == D2C_WAV_REC_REQ_ID ) { *DSP_PCM_REC_INT = 0; L1SP_D2C_LISR(itype); dsp_ok |= true; } itype = *DSP_SOUND_EFFECT_INT; if( itype == D2C_SOUND_EFFECT_INT_ID ) { *DSP_SOUND_EFFECT_INT = 0; L1SP_D2C_LISR(itype); dsp_ok |= true; } #if defined( __BT_AUDIO_VIA_SCO__ ) && !defined(__CVSD_CODEC_SUPPORT__) itype = *DP_AUDIO_VIA_8KBT_INT; if( itype == D2C_AUDIO_VIA_8KBT_ID ) { *DP_AUDIO_VIA_8KBT_INT = 0; L1SP_D2C_LISR(itype); dsp_ok |= true; } #endif #if _SPE_FOR_TEST_SIM_ itype = *DP2_ADAPT_VOL_INT; if( itype == DP_D2C_ADAPT_VOL ) { *DP2_ADAPT_VOL_INT = 0; L1SP_D2C_LISR(itype); dsp_ok |= true; } #endif if (!dsp_ok) { extern void L1D_WIN_DisableAllEvents(uint16 except_irq_mask); DisableIRQ(); #if !defined(MT6256_S01) && !defined(MT6255) && !defined(MT6250) && !defined(MT6260) *DP_D2C_TASK1 = 0; /* freeze DSP */ #endif L1D_WIN_DisableAllEvents( 0 ); /* disable all TDMA events */ ASSERT_REBOOT(0); } return; } if( (itype == DP_D2C_SE_SD_DONE) && (!AM_IsSpeechOn()) ) // when idle 16kPCM, AMR/AWB/VM record, the driver expects the D2C_SE_DONE interrupt triggered by DSP. If System's doing SMS, howerver, DSP triggers the D2C_SE_SD_DONE to MCU. Even if in this case, because the data provided by DSP is also available, the drive just easily modifies the interrupt ID to access data provide by DSP. itype = DP_D2C_SE_DONE; { int32 I; for (I = 0; I < MAX_HISR_HANDLER; I++) { if (itype == l1audio.hisrMagicNo[I]) { l1audio.hisrMagicFlag |= (1<<I); kal_activate_hisr(l1audio.hisr); return; } } } #endif // chip compile option #if defined(MT6235) || defined(MT6235B) || defined(MT6268) || defined(MT6253) || defined(MT6236) || defined(MT6236B) || defined(MT6256_S00)|| defined(MT6256_S01) || defined(MT6251) || defined(MT6253E) || defined(MT6253L)|| defined(MT6252) || defined(MT6252H) || defined(MT6255) || defined(MT6250) || defined(MT6260) if (itype == DP_D2C_AVSYNC) { Media_A2V_LISR(); } else #endif { l1audio.media_flag = itype; kal_activate_hisr(l1audio.hisr); } } void L1Audio_HookHisrHandler( kal_uint16 magic_no, L1Audio_EventHandler handler, void *userData ) { int32 I; for( I = 0; I < MAX_HISR_HANDLER; I++ ) { if( l1audio.hisrMagicNo[I] == 0 ) { l1audio.hisrMagicNo[I] = magic_no; l1audio.hisrHandler[I] = handler; l1audio.hisrUserData[I] = userData; break; } } ASSERT_REBOOT( I != MAX_HISR_HANDLER ); }
static void ktStop_blocking( void *data ) { int I; if (keytone.state == TONE_STATE_NONE) return; if( !L1Audio_CheckFlag( keytone.aud_id ) ) return; if (keytone.state == TONE_STATE_INIT) { for (I = 0; ; I++) { if (keytone.state != TONE_STATE_INIT) break; ASSERT_REBOOT( I < 120 ); kal_sleep_task( 2 ); } } if (keytone.state == TONE_STATE_PLAY) { keytone.state = TONE_STATE_STOP; keytone.isWait = true; L1Audio_FC_TonePlaybackOff(keytone.fc_aud_id); keytone.isWait = false; keytone.state = TONE_STATE_IDLE; } if (keytone.state == TONE_STATE_STOP) { for (I = 0; ; I++) { if (keytone.state == TONE_STATE_IDLE) break; ASSERT_REBOOT( I < 120 ); kal_sleep_task( 2 ); } } if (keytone.state == TONE_STATE_UNHOOKING) { for (I = 0; ; I++) { if (keytone.state == TONE_STATE_UNHOOKED) break; ASSERT_REBOOT( I < 120 ); kal_sleep_task( 2 ); } return; } if (keytone.state == TONE_STATE_UNHOOKED) { keytone.state = TONE_STATE_NONE; L1Audio_FC_UnHookHandler_WithoutWaitingClear(keytone.fc_aud_id, 0); keytone.fc_aud_id = 0xFFFF; } if (keytone.state == TONE_STATE_IDLE) { keytone.state = TONE_STATE_NONE; L1Audio_FC_UnHookHandler(keytone.fc_aud_id, 0); keytone.fc_aud_id = 0xFFFF; } AM_KeyToneOff(); L1Audio_ClearFlag( keytone.aud_id ); }
void L1Audio_ExeEventHandler( uint32 event ) { ASSERT_REBOOT( event < MAX_AUDIO_FUNCTIONS ); l1audio.evHandler[event]( l1audio.evData[event] ); }