📄 rda5800_drv.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 + -