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

📄 rda5800_drv.c

📁 一个基于MTK平台上的I2C协议的模拟驱动芯片.
💻 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);
uint16 RDAFM_GetChipID(void);
/***************************************************
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_rx_addr[]={
0x05,
0x07,
0x12,
0x18,
0x1A,
0x1C,
0x1D,
0x1E,
0x21,
0x24,
0x25,
0x5F,
0x45,
0x47,
0x4C,
0x4D,
0x4E,
0x34,
0x35,
0x38,
0x39,
0x3A,
0x3B,
0x3C,
0x36,
0x37,
0x51,
0x42,
0x57,
0x59,
0x5B,
0x5D,
0x6B,
};

uint8 RDA5820_rx_data[] = {
0x88,0x6f,
0x68,0x00,
0x10,0x00,
0x2A,0xA2,
0xC4,0x04,
0x31,0x24,
0x40,0x06,
0x07,0xBF,
0x7F,0x80,
0x12,0x8F,
0x09,0x0E,
0x00,0x00,
0x51,0x00,
0xF6,0x60,
0x3B,0x00,
0x06,0x2F,
0x00,0x00,
0x3A,0x7A,
0x02,0x05,
0x02,0x0A,
0x07,0x94,
0x0D,0x1E,
0x12,0x2A,
0x01,0xA0,
0x00,0xAC,
0xA8,0x00,
0x2A,0x3F,
0x01,0x7F,
0x00,0x00,
0x32,0x00,
0x7F,0xFF,
0x07,0xFF,
0x80,0x82,  
};

uint8 RDA5820_tx_addr[]= {
0x12,
0x18,
0x1A,
0x1B,
0x1C,
0x1D,
0x1E,
0x24,
0x5F,
0x47,
0x4C,
0x4D,
0x4E,
0x3C,
0x36,
0x37,
0x51,
0x42,
0x57,
0x59,
0x5B,
0x5D,
0x6B,
};

uint8 RDA5820_tx_data[] = {
0x10,0x00,
0x2B,0xA2,
0xC4,0x04,
0x17,0xDF,
0x31,0x24,
0x04,0x06,
0x07,0xBF,
0x12,0x8F,
0x00,0x00,
0xF6,0x60,
0x3B,0x00,
0x06,0x2F,
0x0F,0x8F,
0x01,0xA0,
0x00,0xAC,
0xA8,0x00,
0x2A,0x3F,
0x01,0x7F,
0x00,0x00,
0x32,0x00,
0x7F,0xFF,
0x07,0xFF,
0x80,0x82,  
};

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);
}
#if 0
uint16 RDA5820_FreqToChan(uint16 frequency) 
{
	uint8 channelSpacing;
	uint16 bottomOfBand;
	uint16 channel;
	
	uint8 RDA5820_freqtochan[2]={0};
	OperationRDAFM_2w(READ,0x03,&(RDA5820_freqtochan[0]),2);

	if ((RDA5820_freqtochan[1] & 0x0c) == 0x00) 
		bottomOfBand = 870;
	else if ((RDA5820_freqtochan[1] & 0x0c) == 0x04)	
		bottomOfBand = 760;
	else if ((RDA5820_freqtochan[1] & 0x0c) == 0x08)	
		bottomOfBand = 760;	
	
	if ((RDA5820_freqtochan[1] & 0x03) == 0x00) 
		channelSpacing = 1;
	else if ((RDA5820_freqtochan[1] & 0x03) == 0x01) 
		channelSpacing = 2;

	channel = (frequency - bottomOfBand) / channelSpacing;
	return (channel);
}
#endif

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-870;
	RDA5820_channel_tune[0]=curChan>>2;
	RDA5820_channel_tune[1]=(((curChan&0x0003)<<6)|0x10) ;	//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-870;
	
	RDA5820_data[0]=curChan>>2;
	RDA5820_data[1]=(((curChan&0x0003)<<6)|0x10);
	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<23; i++)
	{
		OperationRDAFM_2w(WRITE, RDA5820_tx_addr[i], &(RDA5820_tx_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<33; i++)
	{
		OperationRDAFM_2w(WRITE, RDA5820_rx_addr[i], &(RDA5820_rx_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 + -