📄 ac97.c
字号:
AC97_FifoEmptyCntMICIN(1);
rAC_GLBCTRL &= ~AC97_MIC_IN_THRESHOLD; //MIC In channel threshold INT disable
}
else if (AC97_Stat & AC97_MIC_IN_OVERRUN)
{
printf("ISR MIC in overrun occured\n");
AC97_FifoEmptyCntMICIN(1);
rAC_GLBCTRL &= ~AC97_MIC_IN_OVERRUN; //MIC In channel overrun int disable
}
rSUBSRCPND=(BIT_SUB_AC97);
ClearPending(BIT_WDT_AC97);
rINTSUBMSK &= ~(BIT_SUB_AC97);
rINTMSK &= ~(BIT_WDT_AC97);
}
void __irq IsrWatchdog(void)
{
rWTCON=0;
rINTSUBMSK|=BIT_SUB_WDT;
rINTMSK|=BIT_WDT_AC97;
ClearPending(BIT_WDT_AC97);
rSUBSRCPND=BIT_SUB_WDT;
timer_exit=1;
}
void __irq RxInt(void)
{
rSUBSRCPND = BIT_SUB_RXD1;
rSUBSRCPND;
ClearPending(BIT_UART1);
*AC97_temp ++= RdURXH1();
}
unsigned short AC97_Select_SamplingRate(void)
{
int i;
printf("\nSelect ADC/DAC Rate\n");
printf("0:8kHz, 1:22.05kHz, 2:44.1kHz, 3:48kHz[D]\n");
printf("4:16kHz, 5:32KHz, 6:11.025kHz, 7:24kHz 8:12KHz\n");
i = GetIntNum();
switch(i)
{
case 0:
return 8000;
case 1:
return 22050;
case 2:
return 44100;
case 3:
return 48000;
case 4:
return 16000;
case 5:
return 32000;
case 6:
return 11025;
case 7:
return 24000;
case 8:
return 12000;
default:
return 48000;
}
}
float delay_func(unsigned short num_delay)
{
pISR_WDT_AC97=(unsigned int)IsrWatchdog;
ClearPending(BIT_WDT_AC97);
rSUBSRCPND=BIT_SUB_WDT;
rINTMSK&=~(BIT_WDT_AC97);
rINTSUBMSK&=~(BIT_SUB_WDT);
//Parameter setting of watchdog timer
rWTCON=((PCLK/1000000-1)<<8)|(0<<3)|(1<<2)|(0<<0); // 16us
rWTDAT=num_delay;
rWTCNT=num_delay;
// t_watchdog = 16 usec, interrupt enable, reset disable, watchdog enable
rWTCON=((PCLK/1000000-1)<<8)|(0<<3)|(1<<2)|(0<<0)|(1<<5);
while(!timer_exit);
timer_exit=0;
return ((float)num_delay*(16e-6));
}
//=================================== [ AC97 Test codes ] ==================================
void AC97_Demo(void)
{
Play_AC97_BUF = (unsigned int* )ptada;
AC97_size = 171008;//byte
AC97_fs =22050;
//arm : 800/2, pre:800/3=266 hclk:pre/2=133, pclk=hclk/2=66
//=> 800/12=66, pre:800/3=266, hclk:pre/4=66, pclk=hclk/2=33
// 13 2 3 1
//800=>66:66:33 (12:12:24)
//SetCLKDIV( 15, 3, 3, 1);
AC97_Port_Init();
AC97_Init();
if(Codec_Ready)
{
AC97_CodecInit_PCMOut( AC97_fs);
AC97_PCMout_DMA1((unsigned int)Play_AC97_BUF, AC97_size);
AC97_CodecExit_PCMOut();
}
Codec_Ready =1;
AC97_Port_Return();
}
void PCM_Out_Test_AC97(void)
{
int i;
unsigned short dummytotch;
unsigned short dummybitperch;
AC97_Rec_Done = 0;
AC97_Port_Init();
//printf("please download 44Khz, 16bit pcm file\n");
//Download_PCM_File();
//PCM_waveparser(0x32c00000, &dummytotch, &AC97_fs, &dummybitperch, &AC97_size, Play_AC97_BUF);
Play_AC97_BUF = (unsigned int *)0x31000000;
AC97_fs = AC97_Select_SamplingRate();
AC97_size = AC97_fs * 2 * 16 /8 * 20;//20sec.
AC97_Init();
if(Codec_Ready)
{
printf("\nSelect PCM Out Operation Mode\n");
printf("0: Polling, 1: Interrupt, 2: DMA[D]\n");
i = GetIntNum();
AC97_CodecInit_PCMOut(AC97_fs);
switch(i)
{
case 0: AC97_PCMout_Polling(AC97_size); break;
case 1: AC97_PCMout_INT(AC97_size); break;
default:
Play_AC97_BUF=(unsigned int *)PCM_TESTPLAYINGDATA_BASE;
AC97_PCMout_DMA1((unsigned int)Play_AC97_BUF, AC97_size); break;
}
AC97_CodecExit_PCMOut();
}
Codec_Ready =1;
AC97_mute = 1;
AC97_Out_INT_Exit = 0;
AC97_In_INT_Exit = 0;
AC97_Port_Return();
}
void PCM_In_Out_Test_AC97(void)
{
int i;
unsigned int Sampling_Rate;
unsigned int playingsize;
AC97_Rec_Done = 0;
AC97_Port_Init();
Sampling_Rate = AC97_Select_SamplingRate();
playingsize = Sampling_Rate * AC97_LINE_LEN * 16*2 /8;
playingsize = AC97_REC_LEN;
AC97_Init();
if(Codec_Ready)
{
printf("\nSelect PCM In/Out Operation Mode\n");
printf("0: Polling(dma in, polling out), 1: Polling(polling in, dma out), 2: Interrupt, 3: DMA[D]\n");
i = GetIntNum();
AC97_CodecInit_PCMIn(Sampling_Rate);
switch(i)
{
case 0:
AC97_PCMin_DMA2(playingsize);
//Play Recorded Data
AC97_CodecInit_PCMOut(Sampling_Rate);
AC97_PCMout_Polling(playingsize);
break;
case 1:
AC97_PCMin_Polling(playingsize);
//Play Recorded Data
AC97_CodecInit_PCMOut(Sampling_Rate);
Play_AC97_BUF=(unsigned int *)PCM_TESTPLAYINGDATA_BASE;
AC97_PCMout_DMA1((unsigned int)Play_AC97_BUF, playingsize);
break;
case 2:
AC97_PCMin_INT(playingsize);
//Play Recorded Data
AC97_CodecInit_PCMOut(Sampling_Rate);
AC97_PCMout_INT(playingsize);
break;
default:
AC97_PCMin_DMA2(playingsize);
//Play Recorded Data
AC97_CodecInit_PCMOut(Sampling_Rate);
Play_AC97_BUF=(unsigned int *)PCM_TESTPLAYINGDATA_BASE;
AC97_PCMout_DMA1((unsigned int)Play_AC97_BUF, playingsize);
break;
}
AC97_CodecExit_PCMIn(1);
}
Codec_Ready =1;
AC97_mute = 1;
AC97_Out_INT_Exit = 0;
AC97_In_INT_Exit = 0;
AC97_Port_Return();
}
void MICin_Test_AC97(void)
{
unsigned short i, Sampling_Rate;
unsigned int playingsize;
AC97_Rec_Done = 0;
AC97_Port_Init();
Delay(1000);
Sampling_Rate = AC97_Select_SamplingRate();
playingsize = Sampling_Rate*AC97_MIC_REC_LEN*16*2;//byte for 10sec.
playingsize = playingsize/8;//byte for 10sec.
playingsize = (playingsize > AC97_REC_LEN)? AC97_REC_LEN : playingsize ;
playingsize = AC97_REC_LEN;
AC97_Init();
if(Codec_Ready)
{
printf("\nSelect MIC In Operation Mode\n");
printf("0: Polling, 1: Interrupt, 2: DMA[D]\n");
i = GetIntNum();
AC97_CodecInit_MICIn(Sampling_Rate);
switch(i)
{
case 0:
printf("Polling mic in, playing dma pcm out\n");
AC97_MICin_Polling(playingsize);
//Play Recorded Data
AC97_CodecInit_PCMOut(Sampling_Rate);
Play_AC97_BUF=(unsigned int *)PCM_TESTPLAYINGDATA_BASE;
AC97_PCMout_DMA1((unsigned int)Play_AC97_BUF, playingsize);
break;
case 1:
printf("Int mic in, playing dma pcm out\n");
AC97_MICin_INT( playingsize);//byte
//Play Recorded Data
AC97_CodecInit_PCMOut(Sampling_Rate);
Play_AC97_BUF=(unsigned int *)PCM_TESTPLAYINGDATA_BASE;
AC97_PCMout_DMA1((unsigned int)Play_AC97_BUF, playingsize);//byte
break;
default:
printf("DMA mic in, playing dma pcm out\n");
AC97_MICin_DMA3(playingsize);
//Play Recorded Data
AC97_CodecInit_PCMOut(Sampling_Rate);
Play_AC97_BUF=(unsigned int *)PCM_TESTPLAYINGDATA_BASE;
AC97_PCMout_DMA1((unsigned int)Play_AC97_BUF, playingsize);
break;
}
AC97_CodecExit_MICIn(1);
}
Codec_Ready =1;
AC97_mute = 1;
AC97_In_INT_Exit = 0;
AC97_Port_Return();
}
void Powerdown_Test_AC97(void)
{
int i;
float temp;
AC97_Port_Init();
Delay(1000);
temp=delay_func(0xff);
printf("\n%f\n",temp);
AC97_Init();
if(Codec_Ready)
{
AC97_CodecInit_PD();
//Normal
printf("\nNormal\n");
AC97_Controller_State();
printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));
//ADCs off
printf("\n=>ADCs off PR0\n");
AC97_Codec_Cmd(0,0x26,(1<<8));
AC97_Controller_State();
printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));
//DACs off
printf("\n=>DACs off PR1\n");
AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9));
AC97_Controller_State();
printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));
//Analog off
printf("\n=>Analog off PR2\n");
AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10));
AC97_Controller_State();
printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));
//Digital I/F off
printf("\n=>Digital I/F off PR4\n");
AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10)|(1<<12));
AC97_Controller_State();
//printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));
//Shut off AC-Link
printf("\n=>Shut off AC-Link\n");
rAC_GLBCTRL &= ~(1<<2);
AC97_Controller_State();
//printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));
while(1)
{
printf("\nPress enter key for Warm Reset");
i = GetIntNum();
if(i==-1) break;
}
//Warm Reset
printf("\n=>Warm Reset\n");
rAC_GLBCTRL = (1<<1);
AC97_Controller_State();
rAC_GLBCTRL &= ~(1<<1);
rAC_GLBCTRL |= (1<<2);
AC97_Controller_State();
rAC_GLBCTRL |= (1<<3);
printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));
//Cold Reset
printf("\n=>Cold Reset\n");
rAC_GLBCTRL |= (1<<0);
AC97_Controller_State();
rAC_GLBCTRL &= ~(1<<0);
rAC_GLBCTRL |= (1<<2);
AC97_Controller_State();
rAC_GLBCTRL |= (1<<3);
AC97_Controller_State();
printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));
}
Codec_Ready =1;
AC97_Port_Return();
}
void Reset_Test_AC97(void)
{
int i;
AC97_Port_Init();
Delay(1000);
AC97_Init();
if(Codec_Ready)
{
AC97_CodecInit_PD();
//Normal
printf("\nNormal\n");
AC97_Controller_State();
printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));
//ADCs off
printf("\n=>ADCs off PR0\n");
AC97_Codec_Cmd(0,0x26,(1<<8));
AC97_Controller_State();
printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));
//DACs off
printf("\n=>DACs off PR1\n");
AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9));
AC97_Controller_State();
printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));
//Analog off
printf("\n=>Analog off PR2\n");
AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10));
AC97_Controller_State();
printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));
//Digital I/F off
printf("\n=>Digital I/F off PR4\n");
AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10)|(1<<12));
AC97_Controller_State();
//Shut off AC-Link
printf("\n=>Shut off AC-Link\n");
rAC_GLBCTRL &= ~(1<<2);
//AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10)|(1<<12));
AC97_Controller_State();
//Warm Reset Timing Check
printf("\nWarm Reset Timing Check...");
printf("\n Probe SYNC and BIT_CLK.");
printf("\n Trigger SYNC Rising Edge.");
while(1)
{
printf("\nPress enter key for Warm Reset Timing Check...");
i = GetIntNum();
if(i==-1) break;
}
printf("\n=>Warm Reset\n");
rAC_GLBCTRL = (1<<1);
AC97_Controller_State();
rAC_GLBCTRL &= ~(1<<1);
rAC_GLBCTRL |= (1<<2);
AC97_Controller_State();
rAC_GLBCTRL |= (1<<3);
//AC97_Controller_State();
printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));
//AC97_Controller_S
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -