📄 l2_adsp.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 + -