#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
0x56, //sovle tx frequecy change
0x58,
0x59,
};
uint8 RDA5820_reg_data[] = {
0x88,0x4f, //05h register
0x78,0x00, //07h register
0x00,0x08, //13h register
0x14,0x20, //15h register
0xc0,0x00, //16h reg...
0x31,0x26, //1ch reg...
0x9c,0x24, //22h reg... // 0x9624,
0xf6,0x60, //47h register // tx rds
0xfc,0x00, //sovle tx frequecy change
0x07,0xff,
0x33,0xff,
};
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_dat
评论0