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

📄 mt6189a1_drv.c

📁 SI4702 FM收音机芯片应用在MTK手机上的
💻 C
📖 第 1 页 / 共 2 页
字号:
{
   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 + -