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

📄 fmschedule.c

📁 SI4702
💻 C
📖 第 1 页 / 共 3 页
字号:
void FmCPUInit(void)
{
	unsigned int temp;
    
	bitclear_creg(%imask,15);
    
	SysCpuSetFreq(48);
	SysTimer0Set(48,25000);
    
	write_mem(CLOCK_PWRCON,read_mem(CLOCK_PWRCON) | 0x0002);
    
	write_creg(%ip0,0x0000);
	write_creg(%ip1,0x0000);
	write_creg(%ireq,0x0000);
	bitset_creg(%imask,15);
}

/*
********************************************************************************
*  Copyright (C),2004-2007, Fuzhou Rockchip Electronics Co.,Ltd.
*  Function name :  FmVariableInit()
*  Author:          ZHengYongzhi
*  Description:     FM模块变量初始化
*                  
*  Input:   
*  Output:  
*  Return:  
*  Calls:    
*
*  History:     <author>         <time>         <version>       
*             ZhengYongzhi     2006/01/01         Ver1.0
*     desc: ORG
*    --------------------------------------------------------------------
*             ZhengYongzhi      2007-5-7          Ver1.9
*     desc: 添加注释
********************************************************************************
*/
__attribute__((section(".fm_text,\"ax\"")))
void FmVariableInit(void)
{
	unsigned int i,j;
    
	Sys1InitFlag.word = 0xffffffff;
	Sys1InitFlag.bc.bFmSysInitEnable = 0;
	Sys1InitFlag.bc.bFmModuleInitEnable = 0;
    
	SystemInfo.bc.bPowerOffDisable = 1;
    
	FmSensitive = 0;
	FmStereoState = 0;
	FmStereoCount = 0;
	FmStereoCount1 = 0;
                
	if (GlobalFmVar.FmArea == FM_AREA_JAPAN)
	{
		FmFreqMaxVal = 9100;
		FmFreqMinVal = 7600;
	}
	else
	{
		FmFreqMaxVal = 10800;
		FmFreqMinVal = 8750;
	}
	
	if ((GlobalFmVar.FmFreq < FmFreqMinVal) || (GlobalFmVar.FmFreq > FmFreqMaxVal))
	{
		GlobalFmVar.FmFreq = FmFreqMinVal;
	}

	j = 0;
	for (i = 0; i < FREQMAXNUMBLE; i++)
	{
		if ((GlobalFmVar.FmFreqArray[i] < FmFreqMinVal) || (GlobalFmVar.FmFreqArray[i] > FmFreqMaxVal))
		{
			GlobalFmVar.FmFreqArray[i] = 0;
			j ++ ;
		}
	}
	
	if (j >= FREQMAXNUMBLE -1 )
	{
		GlobalFmVar.FmSaveNum = 0;
	}
    
	FmGuageVal = (unsigned int)((unsigned long)(FM_GUAGE_CONST) * (GlobalFmVar.FmFreq - FmFreqMinVal) / (FmFreqMaxVal - FmFreqMinVal));
	FmGuageX = FmGuageVal;
	FmDisplayFlag = (FM_DISPFLAG_NULL | FM_DISPFLAG_BACKGROUND | FM_DISPFLAG_BATT | 
				FM_DISPFLAG_CH | FM_DISPFLAG_FREQ | FM_DISPFLAG_GUAGE | FM_DISPFLAG_REGION |
				FM_DISPFLAG_VOL | FM_DISPFLAG_SENS | FM_DISPFLAG_STEREO);
    
	if (GlobalFmVar.FmState != FM_STATE_PRESET)
	{
		GlobalFmVar.FmState = FM_STATE_MANUAL;
	}
	
	FmFunctionSele = GlobalFmVar.FmState;
}

/*
********************************************************************************
*  Copyright (C),2004-2007, Fuzhou Rockchip Electronics Co.,Ltd.
*  Function name :  FmCodecInit()
*  Author:          ZHengYongzhi
*  Description:     FM模块Codec初始化
*                  
*  Input:   
*  Output:  
*  Return:  
*  Calls:    
*
*  History:     <author>         <time>         <version>       
*             ZhengYongzhi     2006/01/01         Ver1.0
*     desc: ORG
*    --------------------------------------------------------------------
*             ZhengYongzhi      2007-5-7          Ver1.9
*     desc: 添加注释
********************************************************************************
*/
__attribute__((section(".fm_text,\"ax\"")))
void FmCodecInit(void)
{
	CodecIicInit();
#ifndef  _INSIDE_HPSENSE_USED_    
	CodecCommandSet(P_ADD_TR1,  0x0002);
#else 
	CodecCommandSet(P_ADD_TR1,  0x0000);
#endif
	CodecCommandSet(P_ADD_CR1,  0x0002);		//FM Bypass2
	Pre_CR1_Value = 0x0002;                 //2006-5-11 20:31
	CodecCommandSet(P_ADD_CR2,  0x0003);		//Mixer Output
#if(CPU_TYPE == _RK2608A_)
	CodecCommandSet(P_ADD_PMR1, 0x001b);		//All Power Down
#else
	CodecCommandSet(P_ADD_PMR1, 0x003b);		//All Power Down
#endif
	CodecCommandSet(P_ADD_PMR2, 0x0008);		//All Power Down
}

/*
********************************************************************************
*  Copyright (C),2004-2007, Fuzhou Rockchip Electronics Co.,Ltd.
*  Function name :  FmPlayStart()
*  Author:          ZHengYongzhi
*  Description:     FM工作开始,设置初始频率
*                  
*  Input:   
*  Output:  
*  Return:  
*  Calls:    
*
*  History:     <author>         <time>         <version>       
*             ZhengYongzhi     2006/01/01         Ver1.0
*     desc: ORG
*    --------------------------------------------------------------------
*             ZhengYongzhi      2007-5-7          Ver1.9
*     desc: 添加注释
********************************************************************************
*/
__attribute__((section(".fm_text,\"ax\"")))
void FmPlayStart(void)
{
	bitclear_creg(%imask,5);
	FmTimerCount = 5;
	bitset_creg(%imask,5);
	
	Tuner_FreqSet(GlobalFmVar.FmFreq);

	PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_MUTE_ON,0,0);
}

/*
********************************************************************************
*  Copyright (C),2004-2007, Fuzhou Rockchip Electronics Co.,Ltd.
*  Function name :  FmPlay()
*  Author:          ZHengYongzhi
*  Description:     FM工作处理程序,FM调频、中频检测、立体声状态获取等处理程序
*                  
*  Input:   
*  Output:  
*  Return:  
*  Calls:    
*
*  History:     <author>         <time>         <version>       
*             ZhengYongzhi     2006/01/01         Ver1.0
*     desc: ORG
*    --------------------------------------------------------------------
*             ZhengYongzhi      2007-5-7          Ver1.9
*     desc: 添加注释
********************************************************************************
*/
__attribute__((section(".fm_text,\"ax\"")))
void FmPlay(void)
{
	unsigned int temp,temp1;
    
	switch (Fun1MsgArray[2]) 
	{
		case MSG_FUNCTION1_FM_AUTO_START:
		{
			if (FmTimerCount > 0)
			{
				break;
			}

			Tuner_FreqSet(GlobalFmVar.FmFreq);

			bitclear_creg(%imask,5);
			FmTimerCount = 1;
			bitset_creg(%imask,5);
			

			FmGuageVal = (unsigned int)((unsigned long)(FM_GUAGE_CONST) * (GlobalFmVar.FmFreq - FmFreqMinVal) / (FmFreqMaxVal - FmFreqMinVal));
			FmDisplayFlag |= (FM_DISPFLAG_GUAGE | FM_DISPFLAG_FREQ | FM_DISPFLAG_CH);

			PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_AUTO_STC,0,0);
		}			

		case MSG_FUNCTION1_FM_AUTO_STC:
		{
			if (FmTimerCount > 0)
			{
				break;
			}

			if(FmWaitSTC()==1)
        		{
				bitclear_creg(%imask,5);
				FmTimerCount = 6;
				bitset_creg(%imask,5);

				PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_AUTO_STC,0,0);
        		}
			else
        		{	
        			bitclear_creg(%imask,5);
				FmTimerCount = 1;
				bitset_creg(%imask,5);
				
				FmClrSTC();

				PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_SEEK,0,0);
			}
		}

		case MSG_FUNCTION1_FM_SEEK:
		{
			if (FmTimerCount > 0)
			{
				break;
			}
            
			bitclear_creg(%imask,5);
			FmTimerCount=4;
			bitset_creg(%imask,5);
			
			FmSeek(UpDownFlag);

			PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_SEEK_STC,0,0);

			break;
		}

		case MSG_FUNCTION1_FM_SEEK_STC:
		{
			if (FmTimerCount > 0)
			{
				break;
			}

			if(FmWaitSTC()==1)
        		{
				bitclear_creg(%imask,5);
				FmTimerCount = 3;
				bitset_creg(%imask,5);

				PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_SEEK_STC,0,0);
        		}
			else
        		{	
        			bitclear_creg(%imask,5);
				FmTimerCount=4;
				bitset_creg(%imask,5);

				FmReadABReg();
				temp=(char)(RDA5800REG_IMG[10]&0x00ff);
				GlobalFmVar.FmFreq=FmChanToFreq(temp);

				temp=(char)((RDA5800REG_IMG[11]&0xff00)>>8);
				
				FmSeekClrSTC();

				if (GlobalFmVar.FmState == FM_STATE_AUTO)
				{
					FmGuageVal = (unsigned int)((unsigned long)(FM_GUAGE_CONST) * (GlobalFmVar.FmFreq - FmFreqMinVal) / (FmFreqMaxVal - FmFreqMinVal));
					FmDisplayFlag |= (FM_DISPFLAG_GUAGE | FM_DISPFLAG_FREQ | FM_DISPFLAG_CH);
				
					if(((RDA5800REG_IMG[10]&0x2000)==0)&&(temp>=(RDA5800REG_IMG[5]>>8)))
					{
						GlobalFmVar.FmFreqArray[GlobalFmVar.FmSaveNum] = GlobalFmVar.FmFreq;
						GlobalFmVar.FmSaveNum++;
					}

					PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_SEEK,0,0);

					if((GlobalFmVar.FmFreq == FmFreqMaxVal)||(GlobalFmVar.FmSaveNum >= (FREQMAXNUMBLE-1)))
					{
						GlobalFmVar.FmState = FM_STATE_PRESET;
                    
						GlobalFmVar.FmSaveNum = 0;
						GlobalFmVar.FmFreq = GlobalFmVar.FmFreqArray[GlobalFmVar.FmSaveNum];

						if((GlobalFmVar.FmFreq < FmFreqMinVal) || (GlobalFmVar.FmFreq > FmFreqMaxVal))
						{
							GlobalFmVar.FmFreq = FmFreqMinVal;
						}
								
						FmGuageVal = (unsigned int)((unsigned long)(FM_GUAGE_CONST) * (GlobalFmVar.FmFreq - FmFreqMinVal) / (FmFreqMaxVal - FmFreqMinVal));
						FmDisplayFlag |= (FM_DISPFLAG_GUAGE | FM_DISPFLAG_FREQ | FM_DISPFLAG_CH);

						PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_START,0,0,0);

						break;
					}
				}
				else
				{
					FmGuageVal = (unsigned int)((unsigned long)(FM_GUAGE_CONST) * (GlobalFmVar.FmFreq - FmFreqMinVal) / (FmFreqMaxVal - FmFreqMinVal));
					FmDisplayFlag |= (FM_DISPFLAG_GUAGE | FM_DISPFLAG_FREQ);
					
					if(((RDA5800REG_IMG[10]&0x2000)==0)&&(temp>=(RDA5800REG_IMG[5]>>8)))
					{
						PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_START,0,0,0);
					}
					else
					{
						PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_SEEK,0,0);
					}
				}
			}

			break;
		}
		
		case MSG_FUNCTION1_FM_MUTE_ON:
		{
			if (FmTimerCount > 0)
			{
				break;
			}
			
			if(FmWaitSTC()==1)
        		{
				bitclear_creg(%imask,5);
				FmTimerCount = 3;
				bitset_creg(%imask,5);
				
				PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_MUTE_ON,0,0);
        		}
        		else
        		{
				bitclear_creg(%imask,5);
				FmTimerCount = 4;
				bitset_creg(%imask,5);

				FmClrSTC();
				AmplifierOn();
				
				FmStereoCount = 0;
               		FmStereoCount1 = 0;

				PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_MUTE_OFF,0,0);
			}
		}

		case MSG_FUNCTION1_FM_MUTE_OFF:
		{
			if (FmTimerCount > 0)
			{
				break;
			}
			
			PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_READ_ST,0,0);
			
			break;
		}
		
		case MSG_FUNCTION1_FM_READ_ST:
		{
			if (FmTimerCount > 0)
			{
				break;
			}
            
			if (FmStereoCount1 < 32)
			{
				FmStereoCount1 ++ ;
				
				bitclear_creg(%imask,5);
				FmTimerCount = 2;
				bitset_creg(%imask,5);
				
				GetStereoStatus();
				
				if (FmStereoState == 1)
				{
					FmStereoCount++;
				}
				else
				{
					FmStereoCount = 0;
				}
			}
			else if (FmStereoCount1 == 32)
			{
				FmStereoCount1 ++ ;
				
				if(FmStereoCount > 20) 
				{
					FmStereoState = 1;
				}
				else
				{
					FmStereoState = 0;
				}
				FmDisplayFlag |= (FM_DISPFLAG_STEREO | FM_DISPFLAG_SENS);
			}
			break;
		}
		
		default:
			break;
    }
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -