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

📄 fmschedule.c

📁 三洋FM模块的原代码,调试通过了的,很好用的,欢迎大家下载
💻 C
字号:
/*
********************************************************************************
*          Copyright (C),2004-2005, tonyzyz, Fuzhou Rockchip Co.,Ltd.
*                             All Rights Reserved
*                                    V1.00
* FileName   : FmSchedule.c
* Author     : tonyzyz
* Description: 
* History    :        
*           <author>        <time>     <version>       <desc>
*            tonyzyz       06/01/11       1.0            ORG
********************************************************************************
*/


#include <Creg.h>
#include "Macro.h"
#include "Memap.h"
#include "MsgDef.h"
#include "Resource.h"
#include "Global.h"
#include "KeyMacro.h"
#include "KeyGlobal.h"
#include "Lcd.h"

#ifdef FM_MODULE

    #define _IN_FMSCHEDULE
    #include "FmMacro.h"
    #include "FmStruct.h"
    #include "FmGlobal.h"
    #include "tuner_drv.h"




void FmCPUInit(void);
void FmModuleInitial(void);
void FmPlayStart(void);
void FmPlay(void);
void FmVariableInit(void);
void FmCodecInit(void);

/*------------------------------------------------------------------------------
Function:
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void FmTimerDec(void)
{
    if (FmTimerCount != 0) {
        FmTimerCount -- ;
    }
}
/*------------------------------------------------------------------------------
Function:
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void FmModuleProc(void)
{
    unsigned int i, j;
    
    switch(Fun1MsgArray[1])
    {
    case MSG_FUNCTION1_FM_INIT:             //Fm Cpu / Variable / Codec Init
        FmModuleInitial();
        break;
        
    case MSG_FUNCTION1_FM_PLAY:             //收音机调台处理
        FmPlay();
        break;
        
    case MSG_FUNCTION1_FM_MENU:
        break;

    case MSG_FUNCTION1_FM_DEL:
    case MSG_FUNCTION1_FM_SAVE:
     //   DelFmFunc();
        break;

    default:
        break;
    }
    
    //从设置菜单返回到FM时需要做的处理
    //1、改变频段,检查当前电台及保存的电台是否超越边界
    //2、修改立体声状态,重新启动PLL时会做立体声的检测,所以这里不需要处理,只发送消息出去即可
    if (SystemInfo.bc.bMusicMenuSet == 1) {     
        SystemInfo.bc.bMusicMenuSet = 0;
        
        //Tuner_StereoControl();
        if (GlobalFmVar.FmArea == FM_AREA_JAPAN) {
            FmFreqMaxVal = 9000;
            FmFreqMinVal = 7600;
        } else {
            FmFreqMaxVal = 10800;
            FmFreqMinVal = 8700;
        }
        j = 0;
        for (i = 0; i < FREQMAXNUMBLE; i++) {
            if ((GlobalFmVar.FmFreqArray[i] < FmFreqMinVal) || (GlobalFmVar.FmFreqArray[i] > FmFreqMaxVal)) {
                GlobalFmVar.FmFreqArray[i] = 0;
                j ++ ;
            }
        }
        if ((GlobalFmVar.FmFreq < FmFreqMinVal) || (GlobalFmVar.FmFreq > FmFreqMaxVal)) {
            GlobalFmVar.FmFreq = FmFreqMinVal;
        }
        FmGuageVal = (unsigned int)((unsigned long)(FM_GUAGE_CONST) * (GlobalFmVar.FmFreq - FmFreqMinVal) / (FmFreqMaxVal - FmFreqMinVal));
        FmGuageX = FmGuageVal;
        
        PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_START,0,0,0,0,0,0);
    }
    
    if (DisplayFlag == DISP_FM) {
        if (SystemInfo.bc.bBackLightOffStart) {
            bitclear_creg(%imask,5);
            SystemInfo.bc.bBackLightOffStart = 0;
            LcdBackLightOff();
            bitset_creg(%imask,5);
        }
        
        if (SystemInfo.bc.bBackLightOnStart == 0) {
            FmKeyProc();
        } else {
            bitclear_creg(%imask,5);
            SystemInfo.bc.bBackLightOnStart = 0;
            bitset_creg(%imask,5);
            SystemInfo.bc.bBackLightOnStart1 = 1;
            LCD_SDRAM_Standby_Return();
        }
        
        if (SystemInfo.bc.bHoldDisplay) {
            bitclear_creg(%imask,5);
            SystemInfo.bc.bHoldDisplay = 0;
            bitset_creg(%imask,5);
            
            DisplayRecoveryTime = 0;
            PreDisplayFlag = DisplayFlag;
            DisplayFlag = DISP_HOLD;
            
            DisplayPicture(0, 0, MAX_PIC_XSIZE, MAX_PIC_YSIZE, HOLD_OFF_PIC + (unsigned long)(SystemInfo.bc.bHoldOn) * MAX_PIC_SIZE);
            return;
        }
            
        if (SysBatteryFlag.bc.bBatteryDisplay) {
            SysBatteryFlag.bc.bBatteryDisplay = 0;
            FmDisplayFlag |= FM_DISPFLAG_BATT;
        }
        
        if (SystemInfo.bc.bDisplayRecovery) {           //add by zyz
            SystemInfo.bc.bDisplayRecovery = 0;
            if (Fun1MsgArray[1] != MSG_FUNCTION1_FM_PLAY) Fun1MsgArray[1] = MSG_FUNCTION1_FM_PLAY;
            
            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 ((FmDisplayFlag != FM_DISPFLAG_NULL) && (SystemInfo.bc.bBackLightStatus != 2)) {
            if (Fun1MsgArray[1] == MSG_FUNCTION1_FM_MENU) {
                DisplayFmMenu();
            } else if ((Fun1MsgArray[1] == MSG_FUNCTION1_FM_SAVE) || (Fun1MsgArray[1] == MSG_FUNCTION1_FM_DEL)) {
                DisplayFmList();
//            } else if (Fun1MsgArray[1] == MSG_FUNCTION1_FM_DIALOG) {
//                DisplayFmDialog();
            } else {
                DISP_Fm();
            }
        }
        
        if (SystemInfo.bc.bBackLightOnStart1) {
            SystemInfo.bc.bBackLightOnStart1 = 0;
            DmaFillImage2Lcd();
            LcdBackLightOn();
            KeyReset();
        }
    }
}

/*------------------------------------------------------------------------------
Function:
Input:
Output:
------------------------------------------------------------------------------*/
extern unsigned int TunerRegTab[14] __attribute__((section(".fm_data,\"aw\"")));
__attribute__((section(".fm_text,\"ax\"")))
void FmModuleInitial(void)
{
    if (Sys1InitFlag.bc.bFmSysInitEnable) {
        FmCPUInit();
        LCD_Init(0);
        AmplifierOff();
        FmCodecInit();
        FmVariableInit();
        Tuner_PowerOnInitial();
        PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_MUTE_ON,MSG_FUNCTION1_FM_FREQ_SET,0);
    } else {
        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);
        FmStereoCount = 0;
        FmStereoCount1 = 0;
        PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_READ_ST,0,0);
    }
    KeyReset();
}
/*------------------------------------------------------------------------------
Function:
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void FmCPUInit(void)
{
    unsigned int temp;
    
    bitclear_creg(%imask,15);
    
//    SysCpuSetFreq(SYS_IDLE_FREQ);
//    SysTimer0Set(SYS_IDLE_FREQ,25000);
    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);
}

/*------------------------------------------------------------------------------
Function:
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void FmVariableInit(void)
{
    unsigned int i,j;
    
    Sys1InitFlag.word = 0xffff;
    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 = 9000;
        FmFreqMinVal = 7600;
    } else {
        FmFreqMaxVal = 10800;
        FmFreqMinVal = 8700;
    }
    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;
}

/*------------------------------------------------------------------------------
Function:
Input:
Output:
------------------------------------------------------------------------------*/
__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
}

#endif /* 如果没有定义 FM 模块代码不进行编译*/
//******************************************************************************

⌨️ 快捷键说明

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