📄 mt6189a1_drv.c
字号:
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 + -