⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mt6189a1_drv.c

📁 gemini0816 fm drv new
💻 C
📖 第 1 页 / 共 5 页
字号:
void FMDrv_SetFreq( int16 curf )  /* input value: 875 - 1080 ( 87.5 MHz - 108.0 MHz)*/
{
   int16 HiLo;
   int32 curFreq = (int32)curf * FM_TUNER_GRID;

#ifdef MT6189_DEBUG_DUMP_LOG
   uint32 start_t, duration_t;
   kal_sprintf((void*)_dbg_str, "\nFMDrv_SetFreq(%d);\n\0", curf);
   FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
   start_t = video_get_current_time();
#endif

   MT6189_Mute(1);
   SerialCommInit();
   HiLo = MT6189_HiLoInjectOptimizer(curFreq, 0);
   if (false == MT6189_SetFreq(curFreq, (uint8)HiLo)) {
      ASSERT(0);
   }
   SerialCommRelease();
   MT6189_Mute(0);
   
#ifdef USE_MT6189_AMP
   SwitchExtFMPath(1);
#endif

#ifdef MT6189_DEBUG_DUMP_LOG
   duration_t = video_get_duration_ms(start_t);
   kal_sprintf((void*)_dbg_str, "   time cost: %d ms.\n\0", duration_t);
   FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
#endif
}

uint16 FMDrv_GetSigLvl( int16 curf )
{
   uint16 rssi;

#ifdef MT6189_DEBUG_DUMP_LOG
   uint32 start_t, duration_t;
   kal_sprintf((void*)_dbg_str, "\nFMDrv_GetSigLvl(%d);\n\0", curf);
   FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
   start_t = video_get_current_time();
#endif

   if (curf != _current_frequency)
      FMDrv_SetFreq( curf );
   SerialCommInit();
   rssi = MT6189_GetCurRSSI();
   SerialCommRelease();

#ifdef MT6189_DEBUG_DUMP_LOG
   duration_t = video_get_duration_ms(start_t);
   kal_sprintf((void*)_dbg_str, "   time cost: %d ms.\n   RSSI returned: %d.\n\0", duration_t, rssi);
   FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
#endif
   return rssi;
}

uint16 FMDrv_GetIF( int16 curf)
{
   uint16 IF;

#ifdef MT6189_DEBUG_DUMP_LOG
   uint32 start_t, duration_t;
   kal_sprintf((void*)_dbg_str, "\nFMDrv_GetIF(%d);\n\0", curf);
   FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
   start_t = video_get_current_time();
#endif

   if (curf != _current_frequency)
      FMDrv_SetFreq( curf );
   SerialCommInit();
   IF = MT6189_GetCurIF();
   SerialCommRelease();

#ifdef MT6189_DEBUG_DUMP_LOG
   duration_t = video_get_duration_ms(start_t);
   kal_sprintf((void*)_dbg_str, "   time cost: %d ms.\n   IF returned: %d.\n\0", duration_t, IF );
   FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
#endif
   return IF;
}

void FMDrv_EvaluateRSSIThreshold(void) {
   int32 i = 12,j = 0;
   uint8 histogram[12] = {0};
   uint32 rnd;
   uint32 freq = 877,tarfreq;
   uint32 rssi_sum = 0;
   uint32 time_start;

#ifdef MT6189_DEBUG_DUMP_LOG
   uint32 start_t, duration_t;
   kal_sprintf((void*)_dbg_str, "\nFMDrv_EvaluateRSSIThreshold();\n   (freq, RSSI):\0");
   FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
   start_t = video_get_current_time();
#endif

        time_start = drv_get_current_time();
SerialCommInit();

        while (--i >= 0){
        uint16 rssi;
        rnd = drv_get_duration_ms(time_start);
        freq = 877;
        if (rnd > 200)
        rnd /= 4;
        freq += rnd ;
        if (freq > 1070) 
            freq = 1070;

         tarfreq = freq;
         tarfreq *= FM_TUNER_GRID;
      MT6189_SetFreq(tarfreq, LO_INJECTION);
      rssi = MT6189_GetCurRSSI();
#ifdef MT6189_DEBUG_DUMP_LOG
      kal_sprintf((void*)_dbg_str, " (%d, %d)\0", freq, rssi);
      FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
#endif
      rssi_sum += rssi;
      if (rssi >=0) {
         histogram[j++]=rssi;
      }
   }
SerialCommRelease();
   {
      uint8 min = 0;
      i = 12;
      while (--i >=0) {
         if (histogram[i] <= histogram[min])
            min = i;
      }
      if(histogram[min]>=3 && histogram[min]<=4)
      {
      	_rssi_threshold = histogram[min]+2;
      }
      else if(histogram[min]==5 || histogram[min]<=2)
      {
      	_rssi_threshold = histogram[min]+1;
      }
      else
      {	
      _rssi_threshold = 7;//FM_RADIO_INPUT_LEVEL_THRESHOLD;
      }
      if (RSSI_offset != 0)
        _rssi_threshold = RSSI_offset;
      if(_rssi_threshold > 7)
      	_rssi_threshold = 7;
      /// _rssi_threshold = rssi_sum / 12;

#ifdef MT6189_DEBUG_DUMP_LOG
      duration_t = video_get_duration_ms(start_t);
      kal_sprintf((void*)_dbg_str, "\n   time cost: %d ms. RSSI threshold returned: %d.\n\0", duration_t, _rssi_threshold);
      FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
#endif
   }
}
uint8 FMDrv_ValidStop(int16 freq, int8 signalvl, bool is_step_up)
{
   int32 targetFreq;
   int16 IF_cnt;
   int16 RSSI;

#ifdef MT6189_DEBUG_DUMP_LOG
   uint32 start_t, duration_t;
   kal_sprintf((void*)_dbg_str, "\nFMDrv_ValidStop(%d, %d, %d);\n\0", freq, signalvl, is_step_up);
   FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
   start_t = video_get_current_time();
#endif

   SerialCommInit();
   
   targetFreq = (int32)freq;
   targetFreq *= FM_TUNER_GRID;

	if (targetFreq == 87500 || targetFreq == 87600 || targetFreq == 87700)
   	{
   		return 0;
   	}
   /// check RSSI at low side
   MT6189_SetFreq(targetFreq, LO_INJECTION);
#ifdef MT6189_DEBUG_DUMP_LOG
   duration_t = video_get_duration_ms(start_t);
   kal_sprintf((void*)_dbg_str, "  Set_freq_Lo time cost: %d ms.\n\0", duration_t);
   FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
#endif

   if ((RSSI = (int16)MT6189_GetCurRSSI()) < _rssi_threshold) {
#ifdef MT6189_DEBUG_DUMP_LOG
      duration_t = video_get_duration_ms(start_t);
      kal_sprintf((void*)_dbg_str, "   time cost: %d ms.\n   #1 RSSI Check Fail! (%d < %d)\n\0", duration_t, RSSI, _rssi_threshold);
      FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
#endif
      SerialCommRelease();
      return 0;
   }

   IF_cnt = MT6189_GetCurIFCnt(IF_MEASURE_COUNT, 0);

#ifdef MT6189_DEBUG_DUMP_LOG
      duration_t = video_get_duration_ms(start_t);
      kal_sprintf((void*)_dbg_str, "  IF_RSSI check time cost: %d ms.\n   IF/RSSI Check (%d,%d)\n\0", duration_t, IF_cnt, _valid_rssi);
      FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
#endif
   if (IF_cnt > (PRESET_IF_CNT_PLUS + PRESET_IF_DELTA) ||
       IF_cnt < (PRESET_IF_CNT_PLUS - PRESET_IF_DELTA)) {
      SerialCommRelease();
#ifdef MT6189_DEBUG_DUMP_LOG
      duration_t = video_get_duration_ms(start_t);
      kal_sprintf((void*)_dbg_str, "  IF_RSSI check time cost: %d ms.\n   IF/RSSI Check Fail! (%d,%d)\n	IF range(%d,%d)\n\0", duration_t, IF_cnt, _valid_rssi,PRESET_IF_CNT_PLUS - PRESET_IF_DELTA,PRESET_IF_CNT_PLUS + PRESET_IF_DELTA);
      FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
#endif
      return 0;
   }

  
   MT6189_SetFreq(targetFreq, HI_INJECTION);

#ifdef MT6189_DEBUG_DUMP_LOG
   duration_t = video_get_duration_ms(start_t);
   kal_sprintf((void*)_dbg_str, "  Set_freq_Hi time cost: %d ms.\n\0", duration_t);
   FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
#endif

   if ((RSSI = (int16)MT6189_GetCurRSSI()) < _rssi_threshold) {
#ifdef MT6189_DEBUG_DUMP_LOG
      duration_t = video_get_duration_ms(start_t);
      kal_sprintf((void*)_dbg_str, "   time cost: %d ms.\n   #1 RSSI Check Fail! (%d < %d)\n\0", duration_t, RSSI, _rssi_threshold);
      FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
#endif
      SerialCommRelease();
      return 0;
   }
   IF_cnt = MT6189_GetCurIFCnt(IF_MEASURE_COUNT, 0);

#ifdef MT6189_DEBUG_DUMP_LOG
      duration_t = video_get_duration_ms(start_t);
      kal_sprintf((void*)_dbg_str, "  IF_RSSI time cost: %d ms.\n   IF/RSSI Check (%d,%d)\n\0", duration_t, IF_cnt, _valid_rssi);
      FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
#endif

   if (IF_cnt > (PRESET_IF_CNT_PLUS + PRESET_IF_DELTA) ||
       IF_cnt < (PRESET_IF_CNT_PLUS - PRESET_IF_DELTA)) {
      SerialCommRelease();
#ifdef MT6189_DEBUG_DUMP_LOG
      duration_t = video_get_duration_ms(start_t);
      kal_sprintf((void*)_dbg_str, "  IF_RSSI time cost: %d ms.\n   IF/RSSI Check Fail! (%d,%d)\n	IF range(%d,%d)\n\0", duration_t, IF_cnt, _valid_rssi,PRESET_IF_CNT_PLUS - PRESET_IF_DELTA,PRESET_IF_CNT_PLUS + PRESET_IF_DELTA);
      FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
#endif
      return 0;
   }
   if (_valid_rssi < _rssi_threshold) {
      SerialCommRelease();
      return 0;
   }

   FMDrv_SetVolumeLevel(_current_level);
   SerialCommRelease();
#ifdef MT6189_DEBUG_DUMP_LOG
      duration_t = video_get_duration_ms(start_t);
      kal_sprintf((void*)_dbg_str, "   time cost: %d ms.\n   Pass! (IF, RSSI) = (%d, %d)\n\0", duration_t, IF_cnt, RSSI);
      FS_Write(_file_handle, _dbg_str, strlen((void*)_dbg_str), &_data_written);
#endif
   return 1;
}

void FMDrv_ChipInit(void)
{
   /// power down the chip
   int32 i;
   SerialCommInit();
   for (i=0; i<POWER_OFF_COMMAND_COUNT; i++) {
      uint8 tmp_reg = MT6189_ReadCache(PowerOffProc[i].addr);
      tmp_reg &= PowerOffProc[i].and;
      tmp_reg |= PowerOffProc[i].or;
      MT6189_WriteByte(PowerOffProc[i].addr, tmp_reg);
   }
   SerialCommCryClkOff();
   SerialCommRelease();
#ifdef USE_MT6189_AMP
   ExtSwitchInit();
#endif
}

bool FMDrv_IsChipValid( void )
{
	/// anything to do?
	return true;
}

uint16 FMDrv_ReadByte(uint8 addr)
{
	uint16 Data;
	uint8 TmpReg1, TmpReg2;
	MT6189_ReadByte(CW(addr, 0), &TmpReg1);
	MT6189_ReadByte(CW(addr, 1), &TmpReg2);
	Data = ((TmpReg2<<8)|TmpReg1);
	return Data;
}

bool FMDrv_WriteByte(uint8 addr, uint16 data)
{
	uint8 Data_M, Data_L;
	Data_M = data>>8;
	Data_L = data&0xFF;
	MT6189_WriteByte(CW(addr,0), Data_L);
	MT6189_WriteByte(CW(addr,1), Data_M);
}

void FMDrv_SoftMuteOnOff(uint8 On_Off)
{
    
}

void FMDrv_SoftMuteStage(uint8 stage)
{
	
}

void FMDrv_StereoBlendStage(uint8 stage)
{
	
}

uint8 FMDrv_GetChipID(void)
{
	uint8 ChipID;
	MT6189_ReadByte(CW(0, 1), &ChipID);
    	ChipID &= 0x07;
    	
    	return ChipID;
}

uint8 FMDrv_Get_H_L_side(kal_int16 curf) /* input value: 875 - 1080 ( 87.5 MHz - 108.0 MHz)*/
{
	uint8 tempreg;
	MT6189_ReadByte(CW(4, 0), &tempreg);
	if (tempreg & 0x80)
		return 1;
	else
		return 0;	
}

uint8 FMDrv_Get_stereo_mono(void)
{
	uint8 tempreg;
	MT6189_ReadByte(CW(14, 0), &tempreg);
	if (tempreg & 0x01)
		return 1;
	else
		return 0;	
}


#endif // defined(MT6189A1)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -