📄 radio_rda5800.c
字号:
/**
* @file radio.c
* @brief radio driver, define radio APIs.
* This file provides radio APIs: radio initialization,
* play radio, etc..
* @date 2005-03-07
* @version 1.0
*/
#if (RADIO_TYPE == 1)
#include "Apl_Public.h"
#include "ctl_msgbox.h"
#include "radio.h"
#include "vtimer.h"
#include "gpio.h"
#define RADIO_I2C_ADDR 0x20
#define END_PARAMETER 0xff
#define FREQ_BASE_87M 87500000
#define FREQ_BASE_76M 76000000
#define FREQ_MAX_108M 108000000
static T_U32 Freq2Pll(T_U32 Freq);
static T_U32 Pll2Freq(T_U32 Pll);
static T_U16 radio_get_space(T_VOID);
static T_U8 radio_get_band(T_VOID);
T_U32 Freq_Base = FREQ_BASE_87M;
T_U32 Freq_Space = 100; //100k
static const T_U8 initTable[] = {
0xd8, 0x81, //0x02
0x63, 0x00, //0x03
0x44, 0x00, //0x04
0x00, 0xff, //0x05
0x00, 0x00, //0x06
0x00, 0xcd, //0x07
0x00, 0x96, //0x08
0x00, 0x20, //0x09
0x41, 0x63, //0x0a
0x08, 0x06, //0x0b
0x58, 0x00, //0x0c
0x58, 0x00, //0x0d
0x58, 0x00, //0x0e
0x58, 0x00, //0x0f
0x4c, 0x08, //0x10
0x20, 0xa2, //0x11
0x00, 0x00, //0x12
0x00, 0x0f, //0x13
0x06, 0xde, //0x14
0xec, 0xc0, //0x15
0x02, 0x00, //0x16
0x53, 0x83, //0x17
0x95, 0xa4, //0x18
0xe8, 0x48, //0x19
0x05, 0x00, //0x1a
0x00, 0xa4, //0x1b
0x88, 0x9b, //0x1c
0x0d, 0x84, //0x1d
0x4f, 0x04, //0x1e
0x88, 0x32, //0x1f
0x7f, 0x71, //0x20
0x06, 0x60, //0x21
0x40, 0x10, //0x22
0x60, 0x02, //0x23
0x18, 0x08, //0x24
0x64, 0x58, //0x25
0x78, 0x7f, //0x26
0x01, 0x00, //0x27
0xc0, 0x40, //0x28
0xc0, 0x20, //0x29
0x00, 0x24, //0x2a
0x04, 0x00, //0x2b
0x00, 0x20 //0x2c
};
#ifdef OS_EMBEDED
T_BOOL radio_get_status(T_RADIO_STATUS *Status, T_U32 FreqMin, T_U32 FreqMax)
{
T_U8 i = 0;
T_U8 DataTmp[4];
T_U32 Pll0 = 0, Pll1 = 0;
T_U32 curFreq = 0;
T_BOOL ReadSuccess = AK_FALSE;
T_RADIO_STATUS tmpStatus;
for (i=0; i<3; i++)
{
memset(&tmpStatus, 0, sizeof(tmpStatus));
ReadSuccess = AK_FALSE;
if (i2c_read_data2(RADIO_I2C_ADDR, DataTmp, 4) == AK_FALSE)
{
printf("radio_get_tmpStatus(): radio read fail\r\n");
continue;
}
if (!(DataTmp[0] & 0x20))
{
tmpStatus.SearchOk = AK_TRUE;
}
tmpStatus.Rssi = DataTmp[2] & 0x3f;
tmpStatus.ReadyFlag = AK_TRUE;
tmpStatus.LimitFlag = AK_FALSE;
Pll0 = DataTmp[1];
if (Freq_Space == 50) //if is 50k step mode
{
Pll1 = (DataTmp[0] & 0x06) >> 1;
}
curFreq = Pll2Freq((Pll1 << 8) | Pll0);
tmpStatus.CurFreq = curFreq;
tmpStatus.Stereo = (DataTmp[0] & 0x01);
if ((curFreq < FreqMin) || (curFreq > FreqMax))
{
printf("radio_get_tmpStatus(): Pll error\r\n");
}
ReadSuccess = AK_TRUE;
#if 0
printf("\nPll0: %d\n", Pll0);
printf("Radio realtime freq: %d\n", curFreq);
printf("ReadyFlag: %d\r\n", tmpStatus.ReadyFlag);
printf("Rssi: %d\r\n", tmpStatus.Rssi);
printf("SearchOk: %d\r\n", tmpStatus.SearchOk);
printf("Freq_Base: %d\n", Freq_Base);
printf("Freq_Space: %d\n\n", Freq_Space);
#endif
*Status = tmpStatus;
break;
}
if (ReadSuccess)
{
*Status = tmpStatus;
return AK_TRUE;
}
else
{
return AK_FALSE;
}
}
T_BOOL radio_set_param (T_RADIO_PARM *Param)
{
T_U32 i = 0;
T_U32 Pll;
T_BOOL ret = AK_FALSE, ret1 = AK_FALSE;
T_U8 DataTmp[8] = {0xd8, 0x81, 0x00, 0x00, 0x44, 0x16, 0x00, 0xf0};
AK_ASSERT_PTR(Param, "radio_set_param: Param", AK_FALSE);
if (Param->MuteFlag)
{
DataTmp[0] &= (~0x40);
}
if (Param->SearchFlag)
{
DataTmp[0] |= 0x01;
}
if (Param->SearchDir)
{
DataTmp[0] |= 0x02;
}
if (Param->MonoStereo)
{
DataTmp[0] |= 0x20;
}
if (Param->StopLevel)
{
DataTmp[6] |= (Param->StopLevel & 0x3f) << 8;
}
if (Param->Volume)
{
DataTmp[7] |= (Param->Volume & 0x0f);
}
if (Param->Freq)
{
Pll = Freq2Pll(Param->Freq);
DataTmp[2] = Pll & 0xff;
DataTmp[3] &= 0x3f;
DataTmp[3] |= (Pll & 0x300) >> 2;
}
if (Param->BandLimit)
{
DataTmp[3] |= (1 << 1);
Freq_Base = FREQ_BASE_76M;
}
else
{
Freq_Base = FREQ_BASE_87M;
}
if (Param->FreqStep)
{
if (Param->FreqStep == 50*1000)
{
DataTmp[3] |= 0x04;
Freq_Space = 50;
}
else if (Param->FreqStep == 100*1000)
{
DataTmp[3] &= (~(1 << 1));
Freq_Space = 100;
}
else if (Param->FreqStep == 200*1000)
{
DataTmp[3] |= 0x01;
Freq_Space = 200;
}
}
if (Param->SearchFlag)
{
ret = i2c_write_data2(RADIO_I2C_ADDR, DataTmp, 2);
ret1 = AK_TRUE;
}
else
{
DataTmp[1] |= 0x10; //if write register 03h, need set the bit 1
ret = i2c_write_data2(RADIO_I2C_ADDR, DataTmp, 8);
DataTmp[1] &= 0xef; //then set the bit to 0
ret1 = i2c_write_data2(RADIO_I2C_ADDR, DataTmp, 2);
}
if (ret && ret1)
{
return AK_TRUE;
}
else
{
printf("radio_set_param(): radio write fail\r\n");
return AK_FALSE;
}
}
T_BOOL radio_check(T_VOID)
{
T_U8 data[2];
if (AK_FALSE == i2c_read_data2(RADIO_I2C_ADDR, data, 2))
{
printf("Radio read failed!\n");
return AK_FALSE;
}
return AK_TRUE;
}
T_BOOL radio_init(T_RADIO_INIT Init)
{
T_U32 i = 0;
T_U32 pll;
T_U8 data_tmp[2] = {0xd8, 0x81};
T_U8 init_tmp[86];
memcpy(init_tmp, initTable, 86);
gpio_set_pin_dir(GPIO_FM_RESET, GPIO_DIR_OUTPUT);
gpio_set_pin_level(GPIO_FM_RESET, 0);
vtimer_delayms(10);
gpio_set_pin_level(GPIO_FM_RESET, 1);
i2c_write_data2(RADIO_I2C_ADDR, data_tmp, 2);
vtimer_delayms(500);
Freq_Space = Init.FreqStep/1000;
if (RADIO_JAPAN == Init.Area)
{
init_tmp[3] |= 0x02; //band set
Freq_Base = FREQ_BASE_76M;
}
if (Init.FreqStep == 50*1000)
{
init_tmp[3] |= 0x04;
Freq_Space = 50;
}
else if (Init.FreqStep == 100*1000)
{
init_tmp[3] &= (~(1 << 1));
Freq_Space = 100;
}
else if (Init.FreqStep == 200*1000)
{
init_tmp[3] |= 0x01;
Freq_Space = 200;
}
init_tmp[6] = Init.Rssi; //RSSI 0~0x3f
init_tmp[7] = Init.Volume;
if (i2c_write_data2(RADIO_I2C_ADDR, init_tmp, 86) == AK_FALSE)
{
printf("radio init failed!\r\n");
return AK_FALSE;
}
else
{
printf("radio init success!\r\n");
return AK_TRUE;
}
}
T_BOOL radio_exit(T_VOID)
{
T_U8 DataTmp[2] = {0x00, 0x00};
if (i2c_write_data2(RADIO_I2C_ADDR, DataTmp, 2) == AK_FALSE)
{
return AK_FALSE;
}
else
{
return AK_TRUE;
}
}
static T_U32 Freq2Pll(T_U32 Freq)
{
return ((Freq - Freq_Base) / (Freq_Space * 1000));
}
static T_U32 Pll2Freq(T_U32 Pll)
{
return (Pll * Freq_Space * 1000 + Freq_Base);
}
T_VOID radio_line_in(T_BOOL enable)
{
_AKSD_StartLineIn(enable);
}
T_VOID radio_print(T_VOID)
{
T_U8 DataTmp[5];
T_RADIO_STATUS Status;
if (i2c_read_data2(RADIO_I2C_ADDR, DataTmp, 5))
{
printf("Radio Data: %x, %x, %x, %x, %x\n", DataTmp[0], DataTmp[1], DataTmp[2], DataTmp[3], DataTmp[4]);
}
else
printf("radio data read error!!!\n");
radio_get_status(&Status, 87500000, 108000000);
printf("ReadyFlag: %d\n", Status.ReadyFlag);
printf("LimitFlag: %d\n", Status.LimitFlag);
printf("CurFreq: %d\n", Status.CurFreq);
printf("IFCounter: %d\n", Status.IFCounter);
printf("AdcLevel: %d\n", Status.AdcLevel);
}
#endif
#endif /* end of RADIO_TYPE */
/* end of file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -