Beispiel #1
0
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 );

}
Beispiel #4
0
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;
}
Beispiel #8
0
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");
}
Beispiel #11
0
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;
			}

      }
   }
}
Beispiel #18
0
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 );
}
Beispiel #20
0
void L1Audio_ExeEventHandler( uint32 event )
{
   ASSERT_REBOOT( event < MAX_AUDIO_FUNCTIONS );
   l1audio.evHandler[event]( l1audio.evData[event] );
}