7833巴西ginga项目,客户反馈在信号读取界面换台,有概率导致信号丢失无法播放。    
   查看问题发现MxLWare608_API_CfgTunerChanTune有些寄存器没有设对,并且出现了IIC error。进一步分析发现设频点的过程概率被其他的定时器中断,而定时器又通过IIC读取信号强度和BER等信息,打乱了通信的正常时序。 
   添加mutex机制把设频点和读取的函数保护起来,修改如下。多次测试没有再发现问题。 
pthread_mutex_t m_mutexSetTune; 
…… 
MS_BOOL MDrv_Tuner_Init(void) 
{ 
    pthread_mutex_init(&m_mutexSetTune, NULL); 
    if(MxL608_init_main() == 0)  //0 is success 
…… 
} 
MAPI_BOOL device_tuner_MXL608: TV_SetTune( double Freq, RF_CHANNEL_BANDWIDTH eBandWidth, EN_TUNER_MODE eMode) 
{ 
    //UINT32 dwError=0; 
    //MAPI_BOOL bLock; 
    //if(InitTuner() == MAPI_FALSE) 
    //{ 
    //  printf("mxl InitTuner error \n"); 
    //} 
    pthread_mutex_lock(&m_mutexSetTune); 
    DBG_TUNER(printf("[device_tuner_MXL_5007t] (%d): Connect\n",__LINE__)); 
    MXL608_BW_E MsBandWidth; 
    switch(eBandWidth) 
    { 
        case E_RF_CH_BAND_6MHz: 
        { 
            MsBandWidth=MXL608_TERR_BW_6MHz; 
        } 
        break; 
        case E_RF_CH_BAND_7MHz: 
        { 
            MsBandWidth=MXL608_TERR_BW_7MHz; 
        } 
        break; 
        case E_RF_CH_BAND_8MHz: 
        { 
            MsBandWidth=MXL608_TERR_BW_8MHz; 
        } 
        break; 
        default: 
            MsBandWidth=MXL608_TERR_BW_8MHz; 
    } 
    if(MAPI_FALSE == MDrv_Tuner_SetTuner(Freq*1000,MsBandWidth)) 
    { 
        DBG_TUNER(printf("\r\n SetTuner failed")); 
        return MAPI_FALSE; 
    } 
    pthread_mutex_unlock(&m_mutexSetTune); 
    return MAPI_TRUE; 
} 
 
 |