📄 mt6189a1_drv.c
字号:
{
int32 CurIF = 0;
uint32 WaitingCounter = 0;
uint32 if_cnt;
uint16 rssi;
int32 i = (int32)count;
int32 rssi_consecutive_fail = 0;
int32 if_consecutive_fail = 0;
_valid_rssi = 0;
kal_prompt_trace(MOD_MMI,"enter MT6189_GetCurIFCnt");
}
/// level ranges from 0 to 12
void FMDrv_SetVolumeLevel(uint8 level)
{
uint8 data1,data2,data3,data4;
uint8 data5,data6,data7,data8;
uint8 audio_level ;
kal_prompt_trace(MOD_MMI,"enter FMDrv_SetVolumeLevel level = %x",level);
SerialCommInit();
// MT6189_SetVolumeLevel(level);
data1 = (FMshadowReg[2] >> 8);
data2 = (FMshadowReg[2]);
data3 = (FMshadowReg[3] >> 8);
data4 = (FMshadowReg[3]);
data5 = (FMshadowReg[4] >> 8);
data6 = (FMshadowReg[4]);
data7 = (FMshadowReg[5] >> 8);
audio_level = ((level*2) & 0x0f)|0xf0;
data8 = ( audio_level << 4 )|audio_level ;
SerialCommStart(); /// send the start sequence
SerialCommTxByte(MT6189_WRITE); /// device ID and R/W bit
SerialCommTxByte(data1); /// data to be written
SerialCommTxByte(data2); /// data to be written
SerialCommTxByte(data3); /// data to be written
SerialCommTxByte(data4); /// data to be written
SerialCommTxByte(data5); /// data to be written
SerialCommTxByte(data6); /// data to be written
SerialCommTxByte(data7); /// data to be written
SerialCommTxByte(data8); /// data to be written
SerialCommStop(); /// send the stop sequence
SerialCommRelease();
}
void FMDrv_Mute(uint8 mute)
{
SerialCommInit();
kal_prompt_trace(MOD_MMI,"enter FMDrv_Mute");
if (mute == 1)
{
SerialCommStart(); /// send the start sequence
SerialCommTxByte(MT6189_WRITE); /// device ID and R/W bit
SerialCommTxByte(0x98); /// data to be written
SerialCommTxByte(0x81); /// data to be written
SerialCommStop(); /// send the stop sequence
FMshadowReg[2] = 0x9881;
}
else
{
SerialCommStart(); /// send the start sequence
SerialCommTxByte(MT6189_WRITE); /// device ID and R/W bit
SerialCommTxByte(0xd0); /// data to be written
SerialCommTxByte(0x81); /// data to be written
SerialCommStop(); /// send the stop sequence
FMshadowReg[2] = 0xd081;
}
SerialCommRelease();
}
void FMDrv_PowerOnReset(void)
{
uint8 data1,data2,data3,data4;
kal_prompt_trace(MOD_MMI,"enter FMDrv_PowerOnReset");
SerialCommInit();
SerialCommCryClkOn();
Delay_ms(100);
SerialCommStart(); /// send the start sequence
SerialCommTxByte(MT6189_WRITE); /// device ID and R/W bit
SerialCommTxByte(0x90); /// data to be written
SerialCommTxByte(0x81); /// data to be written
SerialCommStop(); /// send the stop sequence
kal_prompt_trace(MOD_MMI,"enter PowerOnReset aaaaaaaa");
FMshadowReg[2] = 0x9081;
Delay_ms(100);
SerialCommRelease();
_is_fm_on = true;
_current_frequency = -1;
_rssi_threshold = FM_RADIO_INPUT_LEVEL_THRESHOLD;
//FMDrv_Search(0);
}
void FMDrv_PowerOffProc(void)
{
int32 i;
uint8 tmp_reg;
kal_prompt_trace(MOD_MMI,"enter FMDrv_PowerOffProc");
SerialCommInit();
SerialCommStart(); /// send the start sequence
SerialCommTxByte(MT6189_WRITE); /// device ID and R/W bit
SerialCommTxByte(0x90); /// data to be written
SerialCommTxByte(0x80); /// data to be written
SerialCommStop(); /// send the stop sequence
FMshadowReg[2] = 0x9080;
SerialCommCryClkOff();
SerialCommRelease();
_is_fm_on = false;
_current_frequency = -1;
}
void FMDrv_SetFreq( int16 curf ) /* input value: 875 - 1080 ( 87.5 MHz - 108.0 MHz)*/
{
FMDrv_Search(0);
uint8 data1,data2,data3,data4;
uint8 channel;
kal_prompt_trace(MOD_MMI,"enter FMDrv_SetFreq");
SerialCommInit();
FMDrv_Mute(1);
SerialCommInit();
channel = curf -875 ;
data1 = (FMshadowReg[2] >> 8);
data2 = (FMshadowReg[2]);
SerialCommStart(); /// send the start sequence
SerialCommTxByte(MT6189_WRITE); /// device ID and R/W bit
SerialCommTxByte(data1); /// data to be written
SerialCommTxByte(data2); /// data to be written
SerialCommTxByte(channel); /// data to be written
SerialCommTxByte(0x00); /// data to be written
SerialCommStop(); /// send the stop sequence
data3 = channel;
data4 = 0x00;
FMshadowReg[3] = data3 *0x100 + data4;
FmWaitSTC1();
//clear STC
SerialCommStart(); /// send the start sequence
SerialCommTxByte(MT6189_WRITE); /// device ID and R/W bit
SerialCommTxByte(0xd0); /// data to be written
SerialCommTxByte(0x81); /// data to be written
SerialCommStop(); /// send the stop sequence
SerialCommRelease();
FMDrv_Mute(0);
}
uint16 FMDrv_GetSigLvl( int16 curf )
{
uint16 rssi;
kal_prompt_trace(MOD_MMI,"enter FMDrv_GetSigLvl");
if (curf != _current_frequency)
FMDrv_SetFreq( curf );
SerialCommInit();
rssi = MT6189_GetCurRSSI();
SerialCommRelease();
return rssi;
}
uint8 FMDrv_ValidStop(int16 freq, int8 signalvl, bool is_step_up)
{
return 1;
}
void FMDrv_ChipInit(void)
{
/// power down the chip
int32 i;
int8 xbTemp;
//powerpin_on add bu guqing
GPIO_ModeSetup(FM_POWER_PIN, 0);
GPIO_InitIO(1, FM_POWER_PIN);
GPIO_WriteIO(1, FM_POWER_PIN);
Delay_ms(10);
// FM_SE_PIN_OUPUT_HIGH;
FM_RST_PIN_OUPUT_HIGH;
Delay_ms(1);
FM_RST_PIN_OUPUT_LOW;
Delay_ms(1);
FM_RST_PIN_OUPUT_HIGH;
Delay_ms(1);
SerialCommInit();
//kal_prompt_trace(MOD_MMI,"enter FMDrv_ChipInit");
for(xbTemp = 0; xbTemp < 45; xbTemp++)
FMshadowReg[xbTemp] = cwFMDefault[xbTemp];
//RDA5800 reg
//if (i2c_wr(I2C_FM,I2C_FM_WR_DATA,2,writeData8)==0) return(0);
SerialCommStart(); /// send the start sequence
SerialCommTxByte(MT6189_WRITE); /// device ID and R/W bit
SerialCommTxByte(0x98); /// data to be written
SerialCommTxByte(0x81); /// data to be written
SerialCommStop(); /// send the stop sequence
FMshadowReg[2] = 0x9881;
//lilin, for wait 0.1s after enable RCLK
GPIO_ModeSetup(FM_CLK_PIN,0x3);
GPIO_InitIO(1,FM_CLK_PIN);
Delay_ms(100);
SerialCommStart(); /// send the start sequence
SerialCommTxByte(MT6189_WRITE); /// device ID and R/W bit
for(xbTemp = 0; xbTemp < 43; xbTemp++)
{
SerialCommTxByte((FMshadowReg[xbTemp+2]&0xFF00)>>8); /// data to be written
SerialCommTxByte((FMshadowReg[xbTemp+2]&0xFF)); /// data to be written
}
SerialCommStop(); /// send the stop sequence
Delay_ms(200);
FMDrv_PowerOffProc();
}
void FMDrv_radio_item_info(kal_uint16 group_idx, kal_uint16 item_idx, kal_uint32 item_value)
{
}
int16 FMDrv_Search( uint8 search_direct)
{
int8 xbTemp;
uint8 data_1, data_2, data_3, data_4;
int16 curf ;
UINT8 writeData8[2];
UINT8 i= 0;
//set seek bit
SerialCommInit();
SerialCommCryClkOn();
if(search_direct == 0)
writeData8[0] =0xd1; // ((FMshadowReg[2]>>8) | 0x01); // seek down
else
writeData8[0] =0xd3; // ((FMshadowReg[2]>>8) | 0x03); // seek up
writeData8[1] = 0x81; //FMshadowReg[2];
for(i=0;i<=(1080-875);i++)
{
SerialCommStart(); // send the start sequence
SerialCommTxByte(MT6189_WRITE); // device ID and R/W bit
SerialCommTxByte(writeData8[0]);// data to be written
SerialCommTxByte(writeData8[1]);// data to be written
SerialCommStop(); //
//wait STC=1
if(FmWaitSTC1()==0) return(0);
//Delay_ms(500);
//read REG0A&0B
//if(i2c_rd(FM_READ,4,readData8)==0) return(0);
SerialCommStart(); // send the start sequence
SerialCommTxByte(MT6189_READ); // device ID and R/W bit
SerialCommRxByte(&data_1, 0); // read data and send ACK
SerialCommRxByte(&data_2, 0); // read data and send ACK
SerialCommRxByte(&data_3, 0); // read data and send ACK
SerialCommRxByte(&data_4, 1); // read data and send ACK
SerialCommStop(); // send the stop sequence
//check whether SF==1 STC==0 & RSSI value
//delay_1ms(1);
Delay_ms(10);
if(((data_1&0x20)==0)&&((data_1&0x40)!=0)&&((data_3&0x3f)>((FMshadowReg[5]>>8)&0x3f)))
{
//clear STC
SerialCommStart(); // send the start sequence
SerialCommTxByte(MT6189_WRITE); // device ID and R/W bit
SerialCommTxByte(0xd0); // data to be written
SerialCommTxByte(0x81); // data to be written
SerialCommStop();
//wait STC=0
//if(FmWaitSTC0()==0) return(0);
Delay_ms(200);
break;
}
}
}
void FMDrv_EvaluateRSSIThreshold(void) {
#if 0
#endif
}
bool FMDrv_IsChipValid( void )
{
/// anything to do?
return true;
}
#endif // defined(MT6189A1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -