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

📄 l2_adsp.c

📁 凌阳MP3 spSPCA755yuanma
💻 C
字号:
//===========================================================================
//=     Project:    PA8591.prj                                              =
//=     Module name: L2_DSP.c                                                  =
//=     Copyright (c) 1999-2000 Sunplus Technology Co., Ltd.                =
//=     brief desc.: main program of SPCA514 project                        =
//=     Created Date : 2002/8/5                                             =
//=     modified history:                                                   =
//=     uncompleted part:                                                   =
//===========================================================================
#include "general.h"
#include "main.h"
#include "initio.h"
#include "timer.h"
#include "DSPUI.h"
#include "L2_ADSP.h"

//---define global variable-------------------------------------------------------
//--------------------------------------------------------------------------------------------
//data  UCHAR CardDat0, CardDat1;
//data  UCHAR CKBus0, CKBus1;
data    USHORT BSOffset;
xdata   UCHAR  G_DSP_MIPSClock; 
extern data UCHAR  G_TMintervalMSB, G_TMintervalLSB;
//*****************************************************************//
extern void dump_G_ucStorData(void);
/*****************************************************/
//-----------------------------------------------------------------------------
//L2_DSP_MIPSSelect
//-----------------------------------------------------------------------------
/* 
routine description:
        Set The Speed of DSP, Caution:: The MCU Speed will be changed !!
arguments:
        G_DSP_MIPSClock 
return value: 
        In Buffer status
*/
void L2_DSP_MIPSSelect(UCHAR DSP_MIPS)
{
//    UCHAR DT;

    switch(DSP_MIPS)
    {
        case L2K_DSP42MIPS:
                XBYTE[0x2006] = 0x58;   //PLL select 84 MHz
                XBYTE[0x2026] = 0x00;   //DSP select 42MHz(Pass through)
                XBYTE[0x2025] = 0x10;   // MCU and FLASH I/F select 42MHz;
                XBYTE[0x2024] = 0x02;   // MCU seletc div 2 = 21 MHz;
                TH1 = 0xF5; //
                G_TMintervalLSB = K_Timer0_21MHzLo;
                G_TMintervalMSB = K_Timer0_21MHzHi;     

                M_DSP_Printf("MCU clock modified to 21MHz /DSP is 42 MIPS!!\n");
                break;                          
        case L2K_DSP36MIPS:
                XBYTE[0x2006] = 0x49;   //PLL select 72 MHz
                XBYTE[0x2026] = 0x00;   //DSP select 36MHz(Pass through)
                XBYTE[0x2025] = 0x10;   // MCU and FLASH I/F select 36MHz;
                XBYTE[0x2024] = 0x02;   // MCU seletc div 2 = 18 MHz;
                TH1 = 0xF6;             //
                G_TMintervalLSB = K_Timer0_18MHzLo;
                G_TMintervalMSB = K_Timer0_18MHzHi;     

/*
                XBYTE[0x2024] = 0x03;   // MCU seletc div 3 = 24 MHz;
                TH1 = 0xF8;             //
//              TH1 = 0xF3;             //
                G_TMintervalLSB = K_Timer0_24MHzLo;
                G_TMintervalMSB = K_Timer0_24MHzHi;     
*/
                M_DSP_Printf("MCU clock modified to 18MHz /DSP is 36 MIPS!!\n");
                break;                          
        case L2K_DSP30MIPS:
                XBYTE[0x2006] = 0x50;   //PLL select 60 MHz
                XBYTE[0x2026] = 0x00;   //DSP select 30MHz(Pass through)
                XBYTE[0x2025] = 0x10;   // MCU and FLASH I/F select 30MHz;
//                XBYTE[0x2024] = 0x00;   // MCU seletc passing = 30 MHz;   
//                TH1 = 0xF0;                        

                XBYTE[0x2024] = 0x02;   // MCU seletc div 2 = 15 MHz;
                TH1 = 0xF8;             //

                G_TMintervalLSB = K_Timer0_30MHzLo;
                G_TMintervalMSB = K_Timer0_30MHzHi;     
                M_DSP_Printf("MCU clock modified to 30MHz /DSP is 30 MIPS!!\n");
                break;                          
        case L2K_DSP24MIPS:
        default:
                XBYTE[0x2024] = 0x02;   // MCU seletc div 2 = 24 MHz; //@@chchang_020603
                                           
                XBYTE[0x2006] = 0x4D;   //PLL select 96 MHz

                XBYTE[0x2026] = 0x01;   //DSP select 48MHz(Div 2)
                XBYTE[0x2025] = 0x10;   // MCU and FLASH I/F select 48MHz;

                TH1 = 0xF3;

                G_TMintervalLSB = K_Timer0_24MHzLo;
                G_TMintervalMSB = K_Timer0_24MHzHi;     
                M_DSP_Printf("MCU clock modified to 24MHz /DSP is 24 MIPS!!\n");
                break;                          
    }
}


//-----------------------------------------------------------------------------
//L2_DSP_SetVolume
//-----------------------------------------------------------------------------
/*
routine description:
        Set Digital volume to DSP
arguments:
        Volume: Volume of Digital for DSP output
return value:
        0x00   - success
        others - error
*/
UCHAR L2_DSP_setVolume(UCHAR volume)
{
    	volume &=0x3F;  // Range = 0~63;
	if(volume) volume=volume+1;
  	L2_DSP_Write_DMem16(DSP_CmdReady,0);   
	L2_DSP_SendCommandSet(DCMD_VolCtrl, volume);
  	while(L2_DSP_Read_DMem16(DSP_CmdReady)!=1);
  	return LDSP_SUCCESS;

}

//-----------------------------------------------------------------------------
//L2_DSP_SetEQ
//-----------------------------------------------------------------------------
/* 
routine description:
        Set Sound Equilizer to DSP
arguments:
        EQtype: The Type of EQ Mode 
return value:
        None
*/
UCHAR L2_DSP_setEQ(UCHAR EQtype)
{
  L2_DSP_Write_DMem16(DSP_CmdReady,0);   
  L2_DSP_SendCommandSet(DCMD_EqCtrl, EQtype);
  while(L2_DSP_Read_DMem16(DSP_CmdReady)!=1);
  return LDSP_SUCCESS;
}
//--------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//L2_Data_MCU2DSP
//-----------------------------------------------------------------------------
/* 
routine description:
        provide the Audio/Speech Data to DSP 
arguments:
        None 
return value: 
            TRUE : EOF (End of File)
*/
UCHAR L2_Data_MCU2DSP(UCHAR DecoderMODE)
{
    USHORT BSCounter;   // Bit Stream in a FrameSize
    UCHAR sts;          // DSP return the status 
    UCHAR ErrorTry;
        //UCHAR DSPAddress;

    BSOffset = 0;
    sts = FALSE;
    ErrorTry = 0;

 
        for(BSCounter=0;BSCounter<0x100;BSCounter++)            
        {


            DSP_ADLSB=LOBYTE(BSCounter);
            DSP_ADMSB=MCUSTDAdress;
            DSP_DBusH=0x00;
            DSP_DBusM = G_ucStorData[BSOffset]; //--- Read Data from Card
            BSOffset ++;
//          DSP_DBusM=CardDat1; //--- Read Data from Card
            DSP_DBusL = G_ucStorData[BSOffset]; //--- Read Data From Card
            BSOffset ++;
//          DSP_DBusL=CardDat0; //--- Read Data From Card
            DSP_RWCtrl=0x01;    //write. after R/W, the addr will be incremented
        }

            MCUSTDAdress++;
            if((DecoderMODE==KDSP_DVRD_MODE)&&(MCUSTDAdress==4)) 
                MCUSTDAdress = 0;
            else
                if(MCUSTDAdress==8) MCUSTDAdress = 0;

        sts = 1;
        while(sts)
        {
            sts = L2_DSP_SendCommandSet(DCMD_DatIn);
        }
        return L2K_SUCCESS;
}
//================
//L2_Data_DSP2MCU
//================
/* 
routine description:
        provide the Audio/Speech Data to DSP 
arguments:
        None 
return value: 
            TRUE : EOF (End of File)
*/
UCHAR L2_Data_DSP2MCU(void) USING_0
{
    USHORT BSCounter;   // Bit Stream in a FrameSize
    UCHAR sts;          // DSP return the status 
    UCHAR ErrorTry;

    BSOffset = 0;
    sts = FALSE;
    ErrorTry = 0;


        for(BSCounter=0;BSCounter<0x100;BSCounter++)            
        {
//          CardDat1 = G_ucStorData[BSOffset]; //--- Read Data from Card
//          CardDat0 = G_ucStorData[BSOffset]; //--- Read Data From Card
            //-- Read Data 
            DSP_ADLSB=LOBYTE(BSCounter);
            DSP_ADMSB=MCUSTDAdress&0x0F;
            DSP_DBusH=0x00;
            DSP_RWCtrl=0x02;        //read, after R/W, the addr will be increment

            G_ucStorData[BSOffset] = DSP_DBusM;
            BSOffset ++;
            G_ucStorData[BSOffset] = DSP_DBusL; 
            BSOffset ++;
        }

        sts = 1;
        while(sts)
        {
            sts = L2_DSP_SendCommandSet(DCMD_DatOut);
            if(sts) 
            {
                ErrorTry ++;
                if(ErrorTry >=0x0A)
                    return L2K_ERROR_GENERAL;
            }
        }

                //increase the buffer address
                MCUSTDAdress++;
        if(MCUSTDAdress==4) MCUSTDAdress = 0;                

        return L2K_SUCCESS;
}
//**************************************************************************
//*  Description : Check and update MPX playing time.
//*        Register 0x3712 stores the number of audio frames decoded.
//*        1 audio frame = 1152 samples (MPEG 1)
//*                        576 samples  (MPEG 2, 2.5)
//*        Register 0x02 stores sampling rate index:
//*        0 = 44.1KHz, 1 = 48KHz, 2 = 32KHz, (MPEG 1)
//*        3 = 22KHz,   4 = 24KHz, 5 = 16KHz, (MPEG 2)
//*        6 = 11KHz,   7 = 12KHz, 8 = 8KHz   (MPEG 2.5)
//*                Register 0x09 stores MPEG type 
//*  Arguments   : none
//*  Return      : none
//**************************************************************************
USHORT code SampleRate[4][3]={{11000,12000,8000},{0,0,0},{22000,24000,16000},{44100,48000,32000} };
void L2_DSP_CheckSongTime(UCHAR DecoderMODE) 
//void L2_DSP_CheckSongTime(void)
{
    ULONG mdwTemp;
    //ULONG sts1;   //@@chchang_020703
    ULONG FrameNum;
    ULONG gwTmpSec;
    WORD  SEC;


	switch (DecoderMODE)
   {
		case KDSP_MP3_MODE:
      default:
          //sts1 = L2_DSP_Read_DMem24(DSP_FrameCnt); //@@chchang_020703
      	mdwTemp = L2_DSP_Read_DMem24(DSP_FrameCnt);
         if(mdwTemp>0x20)
         {
          	if((gbMPEGType==2)&&(gbLayer==0x2))   //add this four line
      	 	{
			   	mdwTemp=mdwTemp<<1;
				}
            gwTmpSec = mdwTemp*((gbMPEGType&0x01)?1152:576)/SampleRate[gbMPEGType][gbSampleRate];
            gwTmpSec = gwTmpSec + G_Currtotalsecond;
            G_DISPLAY_Sec =gwTmpSec%60;
            G_DISPLAY_Min =gwTmpSec/60;
         }
         else
         {
          	if(!(G_Currtotalsecond>0))
            {
            	G_Mpeg_Status = L2_DSP_Read_DMem24(DSP_MPEGSt);
               G_DISPLAY_Min=0;
               G_DISPLAY_Sec=0;
           	}
         }
         break;

#if (SPCA757_OPTION==0)
		case KDSP_WMA_MODE: //@@chchang_012803
        	//mdwTemp = L2_DSP_Read_DMem16(0x3fbd);
			//DbgPrint("WMA 3fbd mdwTemp value=%lx\n",mdwTemp);
         mdwTemp = L2_DSP_Read_DMem16(0x3fbc); //High byte
//DbgPrint("WMA 3fbc mdwTemp value=%lx\n",mdwTemp);

		   gwTmpSec = L2_DSP_Read_DMem24(0x3fbd)+(mdwTemp<<24);//union second
		   gwTmpSec = gwTmpSec / 1000;
         G_DISPLAY_Sec = (WORD)(gwTmpSec%60);
         G_DISPLAY_Min = (WORD)(gwTmpSec/60);
         break;
#endif

		case KDSP_DVRD_MODE:
         FrameNum = L2_DSP_Read_DMem24(DSP_PlayDvrFrac);
         if(_G723==TRUE)
         {//G723 //@@chchang_012303
         	SEC = (FrameNum*3)/100;                                                                          // 30ms/FrameNum
         }
         else
         {//ADPCM
         	SEC = FrameNum>>4;
         }
         SEC = SEC + G_Currtotalsecond;

         G_DISPLAY_Sec = SEC%60;
         G_DISPLAY_Min = SEC/60;
         break;
    } // end switch
}


//**********************************************
//* Description: count the record time
//* sec = FrameNum*256/4k
//* 32kbps = 4kBytePerSec
//* FrameNum = [0x3E50](encode)
//*            [0x3E54](decode)
//* /*chchang add*/
//**********************************************
void L2_DSP_EncTime_SecCount(void)
{
   ULONG FrameNum;
   USHORT  SEC;

   FrameNum = L2_DSP_Read_DMem24(DSP_EncDvrFrac);

   if(_G723==FALSE)
   {
   	SEC = FrameNum>>4;
   }
   else
   {//@@chchang_012303
   	SEC = (WORD)((FrameNum*3)/100);
   }
   G_DISPLAY_Sec = SEC%60;
   G_DISPLAY_Min = SEC/60;
}

//===============================
// WCL 12/25/2002 //
//====================
//L2_DSP_Multi_CMD_Get
//====================
/*
routine description:
        Read the Registers of DSP from Data Memory Mapping
        PackageNo:give DSP the data packets NUM
        ByteAddr,use to do the 24*24bits multiplication
arguments:
        twAddr : Data Memory Mapping Address.
return value:
 	twData : 16 bit Data Memory Value.

ByteAddr:
         0:get the result of Low  24 bit
         1:get the result of High 24 bit

DurationKind:
         0:play duration
         1:send duration
*/
//@@chchang_010303
ULONG L2_DSP_Multi_CMD_Get(ULONG PackageNo,BYTE ByteAddr,BYTE DurationKind) USING_0
{
  ULONG mwTemp;

  if(ByteAddr==0){
 	 L2_DSP_Write_DMem16(0x3f7b,0 );
 	 L2_DSP_Write_DMem24(0x3f46,PackageNo);
  	 L2_DSP_SendCommandSet(DCMD_Multiply);

  	while(L2_DSP_Read_DMem16(0x3f7b)!=1);
  }

  if(DurationKind==0)
  {//play duration
  	if(ByteAddr==0)
  	{
		  mwTemp=L2_DSP_Read_DMem24(0x3f64);	// Low  24 bit  //
  	}
  	else if(ByteAddr==1)
  	{
		  mwTemp=L2_DSP_Read_DMem24(0x3f65);	// High  24 bit  //
	}
  }
  else
  {//send duration
        if(ByteAddr==0)
  	{
		  mwTemp=L2_DSP_Read_DMem24(0x3f62);	// Low  24 bit  //
  	}
  	else if(ByteAddr==1)
  	{
		  mwTemp=L2_DSP_Read_DMem24(0x3f63);	// High  24 bit  //
	}
  }
  	return(mwTemp);
}

⌨️ 快捷键说明

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