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

📄 rda5820_drv.c

📁 国产fm收发一体芯片锐迪科RDA5820在MTK平台上面的驱动程序
💻 C
字号:

#include "l1audio_def.h"

#define READ	1
#define WRITE	0

#define ADRW 0x22
#define ADRR 0x23

/***************************************************
Extern Definitions and Types
****************************************************/
/***************************************************
Serial communication interfaces 
****************************************************/
void SerialCommInit(void);
void SerialCommCryClkOn(void);
void SerialCommCryClkOff(void);
void SerialCommRxByte(uint8 *data, uint8 ack);
uint8 SerialCommTxByte(uint8 data);
void SerialCommStop(void);
void SerialCommStart(void);
uint8 OperationRDAFM_2w(uint8 operation, uint8 adr, uint8 *data, uint8 numBytes);

/***************************************************
Local Definitions and Types
****************************************************/
/***************************************************
RDA5802 interfaces
****************************************************/
void  RDA5820_PowerOnReset(void);
void  RDA5820_PowerOffProc(void);
void	RDA5820_ChipInit(void);
void	RDA5820_Mute(uint8 mute);
//uint16	RDA5820_FreqToChan(uint16 frequency);
void	RDA5820_SetFreq( int16 curf );
uint8 RDA5820_ValidStop(int16 freq);
uint8 RDA5820_GetSigLvl( int16 curf );
void	RDA5820_SetVolumeLevel(uint8 level);
bool  RDA5820_Intialization(void);
bool  RDA5820_RX_Intialization(void);
extern const char gpio_camera_cmpdn_pin;
extern void pmic_vasw_enable(kal_bool enable);
extern void pmic_vibrator_enable_ext(kal_bool enable);

/***************************************************
Local variables
****************************************************/
static uint16 RDAFMChipID;
/***************************************************
MTK API
****************************************************/
void  FMDrv_PowerOnReset(void)
{
	RDA5820_PowerOnReset();
	RDA5820_RX_Intialization();
}

void  FMDrv_PowerOffProc(void)
{
	RDA5820_PowerOffProc();
}

void FMDrv_ChipInit()
{
	RDA5820_ChipInit();	
}

void  FMDrv_Mute(uint8 mute)
{
	//RDA5820_Mute(mute);	 
}
void  FMDrv_SetFreq( int16 curf )
{ 
	RDA5820_SetFreq(curf);
}

uint8 FMDrv_ValidStop(int16 freq, int8 signalvl, bool is_step_up)  /* 自动搜索时,作为判定条件,再从中选择信号最强的9个台*/
{
	bool result;

	kal_prompt_trace(MOD_MED, "liujin freq = %d", freq);
	
	
	result = RDA5820_ValidStop(freq);	

	kal_prompt_trace(MOD_MED, "liujin result = %d", result);

	return result;
}

uint8 FMDrv_GetSigLvl( int16 curf )  /*当满足rssi 的条件时,将信号记录,再选最强的9个频段*/
{  
	uint8 result;	
	result=RDA5820_GetSigLvl(curf);
	return result;
}

bool  FMDrv_IsChipValid(void)
{
	bool result=0;
  	SerialCommCryClkOn();
  	 SerialCommInit();
   	result = RDA5820_Intialization();
   	SerialCommCryClkOff();
   	FMDrv_PowerOffProc();//add  by fujia 20080310

	result=1;
	return result;
}

void  FMDrv_SetVolumeLevel(uint8 level)   /*一般不调用,即不用芯片来调节音量。*/
{
	//RDA5820_SetVolumeLevel(level);	
}
/*
typedef struct{
	uint8 addr;
	uint8 value_H;
	uint8 value_L;
	
}reg;
*/
uint8 RDA5820_reg_addr[]={
0x05,	//seek threshold, LNA port, volume,
0x07,
0x13,
0x15,	//vco
0x16,
0x1c,
0x22, //FM_TRUE
0x47, //tx rds
};

uint8 RDA5820_reg_data[] = {
0x88,0x4f,	//05h register
0x78,0x00,	//07h register
0x00,0x08,	//13h register
0x17,0xa0,	//15h register
0xc0,0x00,	//16h reg...
0x31,0x26,	//1ch reg...
0x9c,0x24,	//22h reg... 		// 0x9624,
0xf6,0x60, 	//47h register 	// tx rds
};

void  RDA5820_PowerOnReset(void)
{
	pmic_vasw_enable(KAL_TRUE); 
	pmic_vibrator_enable_ext(KAL_TRUE);      //edit by wenchangrong 20080721
	GPIO_ModeSetup(gpio_camera_cmpdn_pin, 0);
    	GPIO_InitIO(1, gpio_camera_cmpdn_pin);
   	 GPIO_WriteIO(1, gpio_camera_cmpdn_pin);


	SerialCommCryClkOn();
	kal_sleep_task(1);
	SerialCommInit(); 
	RDA5820_Intialization(); 
}

void  RDA5820_PowerOffProc(void)
{
	uint8 RDA5820_poweroff[] ={0x00,0x00};  
	OperationRDAFM_2w(WRITE,0x02,RDA5820_poweroff,2);
	SerialCommCryClkOff();

   //ADD BY WENCHANGRONG 20081201
	pmic_vasw_enable(KAL_FALSE); 
	pmic_vibrator_enable_ext(KAL_FALSE);      //edit by wenchangrong 20080721
	GPIO_ModeSetup(gpio_camera_cmpdn_pin, 0);
    GPIO_InitIO(1, gpio_camera_cmpdn_pin);
    GPIO_WriteIO(0, gpio_camera_cmpdn_pin);
	//ADD END

}

void RDA5820_ChipInit(void)
{
	SerialCommCryClkOn();
	kal_sleep_task(1);
	SerialCommInit();
	RDA5820_Intialization();
	FMDrv_PowerOffProc();
}

void RDA5820_Mute(uint8 mute)
{
	//uint8 RDA5820_mute[2] ={0};
	//OperationRDAFM_2w(READ,0x02,&(RDA5820_mute[0]),2);
	//if(mute)
	//    RDA5820_mute[0] &= 0xbf;
	//else
	//	RDA5820_mute[0] |=  0x40;
	//    OperationRDAFM_2w(WRITE,0x02,&(RDA5820_mute[0]),2);
}

void RDA5820_SetFreq( int16 curFreq )
{   
	uint8 RDA5820_channel_tune[2] ={0}; 
	uint8 band_space;
	uint16 curChan;

 //    	OperationRDAFM_2w(READ,0x03,&(RDA5820_channel_tune[0]),2);
//     	band_space = (RDA5820_channel_tune[1]&0x0F);
     	
 //    	curChan=RDA5820_FreqToChan(curFreq);

 	curChan = curFreq-760;
	RDA5820_channel_tune[0]=curChan>>2;
	RDA5820_channel_tune[1]=(((curChan&0x0003)<<6)|0x18) ;	//set tune bit
	
	OperationRDAFM_2w(WRITE, 0x03, &(RDA5820_channel_tune[0]),2);
	kal_sleep_task(5);
}

uint8 RDA5820_ValidStop(int16 freq)  /* 自动搜索时,作为判定条件,再从中选择信号最强的9个台*/
{
	uint8 RDA5820_data[4]={0};	
	uint8 falseStation = 0;
	uint16 curChan;
	
	//curChan=RDA5820_FreqToChan(freq);
	curChan=freq-760;
	
	RDA5820_data[0]=curChan>>2;
	RDA5820_data[1]=(((curChan&0x0003)<<6)|0x18);
	OperationRDAFM_2w(WRITE,0x03,&(RDA5820_data[0]), 2);
	
	kal_sleep_task(10);   	

	//read REG0A&0B	
	OperationRDAFM_2w(READ, 0x0A, &(RDA5820_data[0]), 2);			
	OperationRDAFM_2w(READ, 0x0b, &(RDA5820_data[2]), 2);		
	
	//check whether STC=1
	if((RDA5820_data[0]&0x40)==0) falseStation=1;
	//check FM_TURE
	if((RDA5820_data[2] &0x01)==0) falseStation=1;
	
	if(freq==960) falseStation=1;
		
	if (falseStation==1)
		return 0;   
	else 
		return 1;
}

uint8 RDA5820_GetSigLvl( int16 curf )  /*当满足rssi 的条件时,将信号记录,再选最强的9个频段*/
{    
	uint8 RDA5820_data[2]={0};	
	
	OperationRDAFM_2w(READ, 0x0b, &(RDA5820_data[0]), 2);
	return  (RDA5820_data[0]>>1);  /*返回rssi*/
}

void RDA5820_SetVolumeLevel(uint8 level)   /*一般不调用,即不用芯片来调节音量。*/
{
 //   uint8 RDA5820_data[2]={0};
	
  //  OperationRDAFM_2w(READ, 0x03, &(RDA5820_data[0]), 2);
	
	//RDA5820_data[1]=(RDA5820_data[1] & 0x0F) | level;
	//OperationRDAFM_2w(WRITE, 0x05, &(RDA5820_data[0]), 2);
}

bool  RDA5820_Intialization(void)
{
	uint8 error_ind = 0;
	uint8 RDA5820_data_1[]={0x00,0x02};
	uint8 RDA5820_data_2[]={0xC0,0x01};
	
	error_ind = OperationRDAFM_2w(WRITE, 0x02, (uint8 *)&RDA5820_data_1[0], 2);
	kal_sleep_task(1);
	error_ind = OperationRDAFM_2w(WRITE, 0x02, (uint8 *)&RDA5820_data_2[0], 2);
	#if (defined(XTAL))
		kal_sleep_task(120);
	#else
		kal_sleep_task(5);	
	#endif
	
	
	if (error_ind )
	   return 0;
	else
	   return 1;
}

bool  RDA5820_TX_Intialization(void)
{
    int i=0;
	uint8 RDA5820_data[2]={0};
	
    	RDA5820_Intialization();
	for(i=0; i<sizeof(RDA5820_reg_addr); i++)
	{
		OperationRDAFM_2w(WRITE, RDA5820_reg_addr[i], &(RDA5820_reg_data[i*2]), 2);
	}
	
	OperationRDAFM_2w(READ, 0x40, &(RDA5820_data[0]), 2);
	RDA5820_data[1]&=0xf0;
	RDA5820_data[1]|= 0x01;
	OperationRDAFM_2w(WRITE, 0x40, &(RDA5820_data[0]), 2);
}

bool  RDA5820_RX_Intialization(void)
{
    int i=0;
	
    RDA5820_Intialization();
	for(i=0; i<sizeof(RDA5820_reg_addr); i++)
	{
		OperationRDAFM_2w(WRITE, RDA5820_reg_addr[i], &(RDA5820_reg_data[i*2]), 2);
	}
}

void RDA5820_TxPaGain(uint8 pagain) 
{
    uint8 RDA5820_data[2]={0};
	OperationRDAFM_2w(READ, 0x42, &(RDA5820_data[0]), 2);
	RDA5820_data[1]&= ~0x3f;
	RDA5820_data[1]|= pagain;
	OperationRDAFM_2w(WRITE, 0x42, &(RDA5820_data[0]), 2);
}

void RDA5820_TxSigGain(uint8 siggain) 
{
    uint8 RDA5820_data[2]={0};
	OperationRDAFM_2w(READ, 0x42, &(RDA5820_data[0]), 2);
	RDA5820_data[0]&= ~0x07;
	RDA5820_data[0]|= siggain;
	OperationRDAFM_2w(WRITE, 0x42, &(RDA5820_data[0]), 2);
}










⌨️ 快捷键说明

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