📄 tuner_drv.c
字号:
/*
********************************************************************************
* Copyright (C),2005-2006, tonyzyz, Fuzhou Rockchip Co.,Ltd.
* All Rights Reserved
* V1.00
* FileName : NS953 FM Tuner Driver Prog
* Author : tonyzyz
* Description:
* History :
* <author> <time> <version> <desc>
* tonyzyz 06/12/12 1.0 ORG
********************************************************************************
*/
#include <Creg.h>
#include "Macro.h"
#include "Memap.h"
#include "MsgDef.h"
#include "Resource.h"
#include "Global.h"
#include "lcd.h"
#ifdef FM_MODULE
#define IN_TUNER_DRV
#include "FmMacro.h"
#include "FmStruct.h"
#include "FmGlobal.h"
//******************************************************************************
//------------------------------------------------------------------------------
#define RFF 0x10
#define RFNE 0x08
#define TFE 0x04
#define TFNF 0x02
#define ACTIVITY 0x01
/*------------------------------------------------------------------------------
Function: IIC System Set
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void Iic_Config(unsigned int bDevice, unsigned int bMode, unsigned int uAdr)
{
write_mem(IC_ENABLE, 0x0000); //IIC Disable
if (bDevice) {
write_mem(GPIO_PCON1,read_mem(GPIO_PCON1) | 0x003c);
delay_nops(100);
write_mem(I2C_EXT, 0x0001);
} else {
write_mem(GPIO_PCON1,read_mem(GPIO_PCON1) & 0xffc3);
delay_nops(100);
write_mem(I2C_EXT, 0x0000);
}
write_mem(IC_SAR, 0x55);
write_mem(IC_TAR, (uAdr >> 1)); //设备地址右移1位送入地址寄存器,读写控制位通过命令的第9位来控制
if (bMode) {
write_mem(IC_FS_HCNT, 0x0020); //SCL Hight Level Count
write_mem(IC_FS_LCNT, 0x0044); //SCL Low Level Count
write_mem(IC_CON, 0x0065); //Master Enable / Slave Disable / Fast Mode / 7bit Address / ReStart Enable
} else {
write_mem(IC_SS_HCNT, 0x0088);
write_mem(IC_SS_LCNT, 0x0066);
write_mem(IC_CON, 0x0063);
}
write_mem(IC_ENABLE, 0x0001);
delay_nops(1600);
}
/*------------------------------------------------------------------------------
Function: IIC System Set
Input:
Output:
Description: IIC单个数据传送
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
int Iic_Single_Write(unsigned int uCmd, unsigned int uData)
{
unsigned int TimeOut;
//------------------------------------------------
TimeOut = 0;
while ((read_XDATA(IC_STATUS) & TFE) == 0) { //等待IIC FIFO为空
if (++ TimeOut > 0x8000) return -1; //超时退出
}
//------------------------------------------------
write_mem(IC_DATA_CMD,uCmd);
TimeOut = 0;
while ((read_XDATA(IC_STATUS) & TFNF) == 0) { //等待IIC FIFO NotFull
if (++ TimeOut > 0x8000) return -2; //超时退出
}
write_mem(IC_DATA_CMD,uData);
//------------------------------------------------
TimeOut = 0;
while ((read_XDATA(IC_STATUS) & ACTIVITY) == 1) { //等待IIC通讯结束
if (++ TimeOut > 0x8000) return -3; //超时退出
}
return 0;
}
/*------------------------------------------------------------------------------
Function: IIC System Set
Input:
Output:
Description: IIC单个数据读取
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
int Iic_Single_Read(unsigned int uCmd)
{
unsigned int TimeOut, ReturnVal;
//------------------------------------------------
//如果IIC Tx FIFO 不为空,等待其为空
TimeOut = 0;
while ((read_XDATA(IC_STATUS) & TFE) == 0) { //等待IIC FIFO为空
if (++ TimeOut > 0x8000) return -1; //超时退出
}
//如果IIC Rx FIFO 不为空, 读取IIC数据,使其为空
while ((read_XDATA(IC_STATUS) & RFNE) == 1) { //清空IIC Rx FIFO
ReturnVal = read_mem(IC_DATA_CMD);
}
//------------------------------------------------
write_mem(IC_DATA_CMD,uCmd);
TimeOut = 0;
while ((read_XDATA(IC_STATUS) & TFNF) == 0) { //等待IIC FIFO NotFull
if (++ TimeOut > 0x8000) return -2; //超时退出
}
write_mem(IC_DATA_CMD,0x0100);
//------------------------------------------------
TimeOut = 0;
while ((read_XDATA(IC_STATUS) & RFNE) == 0) { //等待接收数据
if (++ TimeOut > 0x8000) return -3;
}
ReturnVal = read_mem(IC_DATA_CMD);
//------------------------------------------------
TimeOut = 0;
while ((read_XDATA(IC_STATUS) & ACTIVITY) == 1) { //等待IIC通讯结束
if (++ TimeOut > 0x8000) return -4; //超时退出
}
return (ReturnVal & 0x00ff);
}
/*------------------------------------------------------------------------------
Function: IIC System Set
Input:
Output:
Description: IIC单个数据传送
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
int Iic_Multi_Write(unsigned int uCmd, unsigned int *pData, unsigned int Count)
{
unsigned int TimeOut;
//------------------------------------------------
TimeOut = 0;
while ((read_XDATA(IC_STATUS) & TFE) == 0) { //等待IIC FIFO为空
if (++ TimeOut > 0x8000) return -1; //超时退出
}
//------------------------------------------------
write_mem(IC_DATA_CMD,uCmd); //IIC寄存器起始地址
while(Count > 0) {
TimeOut = 0;
while ((read_XDATA(IC_STATUS) & TFNF) == 0) { //等待IIC FIFO NotFull
if (++ TimeOut > 0x8000) return -2; //超时退出
}
write_mem(IC_DATA_CMD,(*pData++)&0xf0ff);
Count -- ;
}
//------------------------------------------------
TimeOut = 0;
while ((read_XDATA(IC_STATUS) & ACTIVITY) == 1) { //等待IIC通讯结束
if (++ TimeOut > 0x8000) return -3; //超时退出
}
return 0;
}
/*------------------------------------------------------------------------------
Function: IIC System Set
Input:
Output:
Description: IIC单个数据读取
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
int Iic_Multi_Read(unsigned int uCmd, unsigned int *pData, unsigned int Count)
{
unsigned int TimeOut, ReturnVal;
//------------------------------------------------
//如果IIC Tx FIFO 不为空,等待其为空
TimeOut = 0;
while ((read_XDATA(IC_STATUS) & TFE) == 0) { //等待IIC FIFO为空
if (++ TimeOut > 0x8000) return -1; //超时退出
}
//如果IIC Rx FIFO 不为空, 读取IIC数据,使其为空
while ((read_XDATA(IC_STATUS) & RFNE) == 1) { //清空IIC Rx FIFO
ReturnVal = read_mem(IC_DATA_CMD);
}
//------------------------------------------------
write_mem(IC_DATA_CMD,uCmd);
while(Count > 0) {
TimeOut = 0;
while ((read_XDATA(IC_STATUS) & TFNF) == 0) { //等待IIC FIFO NotFull
if (++ TimeOut > 0x8000) return -2; //超时退出
}
write_mem(IC_DATA_CMD,0x0100);
//------------------------------------------------
TimeOut = 0;
while ((read_XDATA(IC_STATUS) & RFNE) == 0) { //等待接收数据
if (++ TimeOut > 0x8000) return -3;
}
*pData++ = read_mem(IC_DATA_CMD);
Count -- ;
}
//------------------------------------------------
TimeOut = 0;
while ((read_XDATA(IC_STATUS) & ACTIVITY) == 1) { //等待IIC通讯结束
if (++ TimeOut > 0x8000) return -4; //超时退出
}
return (0);
}
//******************************************************************************
unsigned int TunerRegTab[14] __attribute__((section(".fm_data,\"aw\""))) = {
0x13, //Power Off, Mute On, IF Count Off, Stereo On, Stereo Judgement
0x00, //Pll
0xc0, //Xtal = 32768, SysFreq = 8192
0x26, //R3
0xc3, //R4
0x61, //R5
0x88, //R6
0x5d, //R7
0x0f, //R8
0x8d, //R9
0x28, //R10
0x8d, //R11
0x04, //R12
0x00 //R13
};
/*------------------------------------------------------------------------------
Function: Freq++
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void Tuner_FreqStepUp(unsigned int step)
{
GlobalFmVar.FmFreq += step;
if(GlobalFmVar.FmFreq > FmFreqMaxVal)
GlobalFmVar.FmFreq = FmFreqMinVal;
}
/*------------------------------------------------------------------------------
Function: Freq--
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void Tuner_FreqStepDown(unsigned int step)
{
GlobalFmVar.FmFreq -= step;
if(GlobalFmVar.FmFreq < FmFreqMinVal)
GlobalFmVar.FmFreq = FmFreqMaxVal;
}
/*------------------------------------------------------------------------------
Function: Get Next Saved Freq
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void GetNextStation(void)
{
unsigned int i;
for (i = 0; i < FREQMAXNUMBLE; i ++) {
if (++GlobalFmVar.FmSaveNum >= FREQMAXNUMBLE)
GlobalFmVar.FmSaveNum = 0;
GlobalFmVar.FmFreq = GlobalFmVar.FmFreqArray[GlobalFmVar.FmSaveNum];
if ((FmFreqMinVal <= GlobalFmVar.FmFreq) && (GlobalFmVar.FmFreq <= FmFreqMaxVal))
return;
}
GlobalFmVar.FmSaveNum = 0;
GlobalFmVar.FmFreq = FmFreqMinVal;
}
/*------------------------------------------------------------------------------
Function: Get Prev Saved Freq
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void GetPrevStation(void)
{
unsigned int i;
for (i = 0; i < FREQMAXNUMBLE; i ++) {
if (GlobalFmVar.FmSaveNum == 0)
GlobalFmVar.FmSaveNum = FREQMAXNUMBLE;
GlobalFmVar.FmSaveNum --;
GlobalFmVar.FmFreq = GlobalFmVar.FmFreqArray[GlobalFmVar.FmSaveNum];
if ((FmFreqMinVal <= GlobalFmVar.FmFreq) && (GlobalFmVar.FmFreq <= FmFreqMaxVal))
return;
}
GlobalFmVar.FmSaveNum = 0;
GlobalFmVar.FmFreq = FmFreqMinVal;
}
/*------------------------------------------------------------------------------
Function: PLL Count Set
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
unsigned int Tuner_FreqToPll(unsigned int TunerFrequency)
{
unsigned long tempL;
/*87.00MHz == 87000KHz == 8700*10KHz */
tempL = (((unsigned long)TunerFrequency * 10000 - 375000) + 4096) >> 13;
return ((unsigned int)(tempL & 0x3fff));
}
/*------------------------------------------------------------------------------
Function: PLL Count Set
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
int Tuner_CommandSet(unsigned int uCmd, unsigned int uData)
{
int ReturnVal;
Iic_Config(1, 0, TUNER_ADD_W);
ReturnVal = Iic_Single_Write(uCmd, uData);
return (ReturnVal);
}
/*------------------------------------------------------------------------------
Function: PLL Count Set
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
unsigned int Tuner_DataRead(unsigned int uCmd)
{
int ReturnVal;
Iic_Config(1, 0, TUNER_ADD_R); //TUNER_ADD_W
ReturnVal = Iic_Single_Read(uCmd);
return(ReturnVal);
}
/*------------------------------------------------------------------------------
Function: PLL Count Set
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -