pcm4way.c assert问题
0赞[DESCRIPTION]
pcm4way.c assert ASSERT(I < 22); // wait 200ms
[SOLUTION]
主要原因是有可能客户在操作过程中,在尚未开启speech codec的时候就去开PCM4WAY,此时8K的voice clock尚未开启
,因此DSP的状态还没有切过来,此时就会因为等待超时而assert(此处设置了一个200ms的等待时间)。
具体见函数PCM4WAY_Start的assert语句。
void PCM4WAY_Start(void (*pcm4way_hdlr)(void), uint32 type)
{
uint32 I;
AM_PCM_EX_On(type);
ASSERT(DP_PCM_EX_CTRL == 0);
L1Audio_HookHisrHandler(DP_D2C_PCM_EX,(L1Audio_EventHandler)pcmEx_hisrHdlr, 0);
pcmEx.hdlr = pcm4way_hdlr;
pcmEx.state = PCM4WAY_STATE;
DP_PCM_EX_CTRL = 0x101;
for(I = 0; ;I ++)
{
if(DP_PCM_EX_CTRL == 0x102)
break;
#ifndef L1D_TEST
ASSERT(I < 22); // wait 200ms
kal_sleep_task(2);
#endif
}
}
为解决该问题,需要修改文件文件am.c中的如下两个函数:
1.
void AM_DSP_PCM_EX_On(uint32 type)
{
switch(type)
{
case 0: //PCM4WAY CTM
ASSERT(!(am.speech_state & SP_STATE_PCM4WAY));
#ifndef L1D_TEST
AFE_TurnOn8K();//加上这一句
am.speech_state |= SP_STATE_PCM4WAY;
L1Audio_Msg_AM_SetSpeech( AM_Speech_Feature_Name(2) , L1AUDIO_Str_onoff(1) );
#endif
//添加以下code
if(am.state == 0)
{
AM_Write_Idle_Delay(5);
VBI_Reset();
}
//添加以上code
break;
} … }
2.
void AM_DSP_PCM_EX_Off(uint32 type)
{
switch(type)
{
case 0: //PCM4WAY CTM
// add codes to stop VM log
//*E_CTRL_HO &= 0xFFF7; /* Disable DSP debugging information of VM */
//*DP_SC_FLAGS &= ~0x0800;
am.speech_state &= ~SP_STATE_PCM4WAY;
//添加以下code
if( am.state == 0 ) {
VBI_End();
AFE_TurnOff8K();
}
//添加以上code
L1Audio_Msg_AM_SetSpeech( AM_Speech_Feature_Name(2) , L1AUDIO_Str_onoff(0) );
break;
} … }
来自半导体社区
