📄 ac97.c
字号:
rINTSUBMSK|=(BIT_SUB_AC97);
}
else if(Volume_Control == '1')
{
rINTSUBMSK=~(BIT_SUB_AC97);
rAC_GLBCTRL = rAC_GLBCTRL | AC97_PCM_OUT_MODE_PIO | AC97_PCM_OUT_THRESHOLD;
//rAC_GLBCTRL = rAC_GLBCTRL | AC97_PCM_OUT_MODE_PIO;
}
PCM_Out_Volume(Volume_Control);
/*AC_PCMADDR = rAC_PCMADDR ;
AC97_Fifoaddr1 = (AC_PCMADDR &0x1f000000) >>24 ;//fifo index read
AC97_Fifoaddr2 = (AC_PCMADDR &0x1f00) >>8 ;//fifo index write
printf("fifo read%d, write%d\n", AC97_Fifoaddr1, AC97_Fifoaddr2);
*/
}
rAC_GLBCTRL &= ~(1<<12); //PCM Out Transfer PIO Mode Off
//rINTSUBMSK|=(BIT_SUB_WDT|BIT_SUB_AC97);
rINTSUBMSK|=(BIT_SUB_AC97);
rINTMSK|=(BIT_WDT_AC97);
printf("\nEnd of Play!\n");
}
void AC97_PCMout_PollingInterruptTest()
{
unsigned int i;
//AC97_BUF initialize
//Play_AC97_BUF = (Rec_AC97_BUF + 0x30);
Play_AC97_BUF=(unsigned int *)PCM_TESTPLAYINGDATA_BASE;
//IRQ Initialization
pISR_WDT_AC97= (unsigned)Irq_AC97_PCMoutIntTest;
printf("\nPlease kindly remove head-phone plug from smdk board to protect your ear... and Press any key.\n");
getchar();
printf("\nNow Test...\n");
ClearPending(BIT_WDT_AC97);
rSUBSRCPND=(BIT_SUB_AC97);
rINTMSK=~(BIT_WDT_AC97);
rINTSUBMSK=~(BIT_SUB_AC97);
//fifo first write
for(i=0; i<16; i++)
rAC_PCMDATA = *(Play_AC97_BUF++);
//rAC_GLBCTRL = 0x100C; //PIO Mode On
rAC_GLBCTRL = AC97_PCM_OUT_UNDERRUN | AC97_PCM_OUT_THRESHOLD | AC97_PCM_OUT_MODE_PIO |AC97_ACLINK_ON|AC97_TRANSFERDATA_EN;
while(1)
{
//Delay(10);//to make underrun.
if(i<24)rAC_PCMDATA = *(Play_AC97_BUF++);
AC97_FifoEmptyCntPCMOUT(1);
i++;
if(i>100) break;
}
rAC_GLBCTRL &= ~AC97_PCM_OUT_UNDERRUN; //PCM Out channel threshold INT disable
rAC_GLBCTRL &= ~AC97_PCM_OUT_THRESHOLD; //PCM Out channel threshold INT disable
rAC_GLBCTRL &= ~AC97_PCM_OUT_MODE_PIO; //PCM Out Transfer PIO Mode Off
rINTSUBMSK|=(BIT_SUB_WDT|BIT_SUB_AC97);
rINTMSK|=(BIT_WDT_AC97);
printf("\nEnd of Play!\n");
}
void AC97_PCMout_Polling(unsigned int PCM_Size)
{
unsigned int i, AC97_Fifoaddr,AC97_FifoaddrR,AC97_FifoaddrW,emptycnt;
//AC97_BUF initialize
Play_AC97_BUF = (Rec_AC97_BUF + 0x30);
End_AC97_BUF = (Rec_AC97_BUF + 0x30 + PCM_Size/4);
//End_AC97_BUF = (Play_AC97_BUF + PCM_Size/4);
//IRQ Initialization
//n/a
printf("\nConnect head-phone plug into speaker-out socket on SMDK2450 and Press any key.\n");
getchar();
printf("\nNow Play...\n");
printf("Headphone Volume Register = 0x%x\n", Output_Volume);
PCM_Out_Volume('u');
PCM_Out_Volume('u');
PCM_Out_Volume('u');
PCM_Out_Volume('u');
PCM_Out_Volume('u');
PCM_Out_Volume('u');
PCM_Out_Volume('u');
//fifo first write
for(i=0; i<8; i++) rAC_PCMDATA = *(Play_AC97_BUF++);
rAC_GLBCTRL = 0x100C; //PIO Mode On
while(1)
{
AC97_Fifoaddr = rAC_PCMADDR;
AC97_FifoaddrW = (AC97_Fifoaddr &0xf00) >>8 ;//fifo index write
AC97_FifoaddrR = (AC97_Fifoaddr &0xf000000) >>24 ;//fifo index read
if( AC97_FifoaddrW > AC97_FifoaddrR)
AC97_FifoaddrR+=16;
emptycnt = AC97_FifoaddrR - AC97_FifoaddrW;
//if(emptycnt<3) continue;
//if(!emptycnt)
{
//printf("read %d, write %d emptycnt%d\n",AC97_FifoaddrR,AC97_FifoaddrW, emptycnt );
}
if(emptycnt<7) continue;
for(i=0; i<emptycnt; i++)
{
rAC_PCMDATA = *(Play_AC97_BUF++);
if(Play_AC97_BUF == End_AC97_BUF) break;
}
if(Play_AC97_BUF == End_AC97_BUF)
{
printf("end\n");
break;
}
}
rAC_GLBCTRL &= ~(1<<12); //PCM Out Transfer PIO Mode Off
printf("\nEnd of Play!\n");
}
//////////////////////////////////////////////////////////////
// PCM in
void AC97_PCMin_DMA2(unsigned int PCM_Size)
{
Rec_AC97_BUF=(unsigned int *)PCM_TESTPLAYINGDATA_BASE;
//IRQ Initialize
pISR_DMA = (unsigned)DMA2_Rec_Done;
ClearPending(BIT_DMA);
rSUBSRCPND=(BIT_SUB_DMA2);
rINTMSK = ~(BIT_DMA);
rINTSUBMSK=~(BIT_SUB_DMA2);
//DMA2 Initialize
rDISRC2 = ((unsigned int)0x5B000018); //PCM Input Data FIFO
rDISRCC2 = (1<<1) + (1<<0); //APB, Fix
rDIDST2 = (int)Rec_AC97_BUF; //Record AC97_BUF initializ
rDIDSTC2 = (0<<1) + (0<<0); //AHB, Increment
rDCON2 = (U32)(1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(1<<22)+(2<<20)+(PCM_Size/4);
rDMAREQSEL2 = (28<<1) + (1<<0);
printf("Are you ready to record sound via Line-in socket on SMDK2450?\n");
printf("Press any key to start record.\n");
getchar();
printf("Recording...\n");
rDMASKTRIG2 = (0<<2) + (1<<1) + 0; //No-stop, DMA2 channel on, No-sw trigger
// Transfer data enable using AC-Link
rAC_GLBCTRL = 0x80C; // Transfer data enable using AC-Link
//printf("\nWrite Value to AC_GLBCTRL Reg. =>0x80C\n");
//printf("Read Value from AC_GLBCTRL Reg. =>0x%x\n", rAC_GLBCTRL);
while(AC97_Rec_Done ==0)
{
printf(".");
Delay(3000);
Volume_Control=Uart_GetKey();
if( (Volume_Control == 'x') | (Volume_Control == 'X'))
break;
else if(Volume_Control == '0')
{
rAC_GLBCTRL = rAC_GLBCTRL & ~(AC97_PCM_IN_MODE_DMA);
printf("paused");
}
else if(Volume_Control == '1')
{
rAC_GLBCTRL = rAC_GLBCTRL | AC97_PCM_IN_MODE_DMA;
printf("continued");
}
//printf("STAT2: 0x%x CURR_TC: 0x%x DCDST2: 0x%x\n", rDSTAT2&0x300000, rDSTAT2&0xfffff, rDCDST2);
}
AC97_Rec_Done = 0;
ClearPending(BIT_DMA);
rSUBSRCPND=(BIT_SUB_DMA2);
rDMASKTRIG2 = (1<<2); //DMA2 stop
rINTMSK |= (BIT_DMA);
rINTSUBMSK |=(BIT_SUB_DMA2);
//AC97 PCM In Channel Finish
rAC_GLBCTRL &= ~(1<<11); //PCM In Transfer Mode Off
Delay(1000);
printf("\nEnd of Record!\n");
}
void AC97_PCMin_INT(unsigned int PCM_Size)
{
//Record AC97_BUF initialize
//Rec_AC97_BUF = (unsigned int *)(DOWN_BUF);
//Play_AC97_BUF = Rec_AC97_BUF + 0x30;
//End_AC97_BUF = (Rec_AC97_BUF + 0x30 + PCM_Size/4);
Rec_AC97_BUF=(unsigned int *)PCM_TESTPLAYINGDATA_BASE;
End_Rec_AC97_BUF = (unsigned int *)(PCM_TESTPLAYINGDATA_BASE +PCM_Size);
Play_AC97_BUF = Rec_AC97_BUF;
End_AC97_BUF = End_Rec_AC97_BUF;
//IRQ Initialization
pISR_WDT_AC97= (unsigned)Irq_AC97_PCMin;
printf("Are you ready to record sound via Line-in socket on SMDK2450?\n");
printf("Press any key to start record.\n");
getchar();
printf("Recording...\n");
ClearPending(BIT_WDT_AC97);
rSUBSRCPND=(BIT_SUB_AC97);
rINTMSK=~(BIT_WDT_AC97);
rINTSUBMSK=~(BIT_SUB_AC97);
rAC_GLBCTRL = 0x2040C; //PCM In channel threshold INT enable, PIO Mode On
while(1)
{
if(AC97_In_INT_Exit == 1)
break;
}
rAC_GLBCTRL &= ~(1<<10); //PCM In Transfer PIO Mode Off
rINTSUBMSK|=(BIT_SUB_AC97);
rINTMSK|=(BIT_WDT_AC97);
printf("\nEnd of Record!\n");
}
void AC97_PCMin_PollingInterruptTest(unsigned int PCM_Size)
{
unsigned int i;
//Record AC97_BUF initialize
//Rec_AC97_BUF = (unsigned int *)(DOWN_BUF);
//Play_AC97_BUF = Rec_AC97_BUF + 0x30;
Rec_AC97_BUF = (unsigned int *)(PCM_TESTPLAYINGDATA_BASE);
Play_AC97_BUF = (unsigned int *)PCM_TESTPLAYINGDATA_BASE;
//IRQ Initialization
pISR_WDT_AC97= (unsigned)Irq_AC97_PCMinIntTest;
printf("Are you ready to record sound via Line-in socket on SMDK2450?\n");
printf("Press any key to start record.\n");
getchar();
printf("Recording...\n");
ClearPending(BIT_WDT_AC97);
rSUBSRCPND=(BIT_SUB_AC97);
rINTMSK=~(BIT_WDT_AC97);
rINTSUBMSK=~(BIT_SUB_AC97);
//rAC_GLBCTRL = 0x40C; // PIO Mode On
rAC_GLBCTRL = AC97_PCM_IN_OVERRUN | AC97_PCM_IN_THRESHOLD | AC97_PCM_IN_MODE_PIO |AC97_ACLINK_ON|AC97_TRANSFERDATA_EN;
for(i=0;i<20;i++)
{
*(Play_AC97_BUF++) = rAC_PCMDATA;
AC97_FifoEmptyCntPCMIN(1);
}
rAC_GLBCTRL &= ~AC97_PCM_IN_OVERRUN; //PCM Out channel threshold INT disable
rAC_GLBCTRL &= ~AC97_PCM_IN_THRESHOLD; //PCM Out channel threshold INT disable
rAC_GLBCTRL &= ~AC97_PCM_IN_MODE_PIO; //PCM Out Transfer PIO Mode Off
rINTSUBMSK|=(BIT_SUB_AC97);
rINTMSK|=(BIT_WDT_AC97);
printf("\nEnd of Record!\n");
}
void AC97_PCMin_Polling(unsigned int PCM_Size)
{
unsigned int i, AC97_Fifoaddr,AC97_FifoaddrR,AC97_FifoaddrW,emptycnt,fullcnt;
//Record AC97_BUF initialize
Rec_AC97_BUF=(unsigned int *)PCM_TESTPLAYINGDATA_BASE;
End_Rec_AC97_BUF = (unsigned int *)(PCM_TESTPLAYINGDATA_BASE +PCM_Size);
//IRQ Initialization
//n/a
printf("Are you ready to record sound via Line-in socket on SMDK2450?\n");
printf("Press any key to start record.\n");
getchar();
printf("Recording...\n");
rAC_GLBCTRL = 0x40C; // PIO Mode On
while(1)
{
AC97_Fifoaddr = rAC_PCMADDR;
AC97_FifoaddrW = (AC97_Fifoaddr &0xf) ;//fifo index write
AC97_FifoaddrR = (AC97_Fifoaddr &0xf0000) >>16 ;//fifo index read
if( AC97_FifoaddrW > AC97_FifoaddrR)
AC97_FifoaddrR+=16;
emptycnt = AC97_FifoaddrR - AC97_FifoaddrW;
//fullcnt = 16-emptycnt;
{
//printf("read %d, write %d emptycnt%d\n",AC97_FifoaddrR,AC97_FifoaddrW, emptycnt );
}
if(emptycnt>8) continue;//fifo cnt<9 continue.
for(i=0; i<emptycnt; i++)
{
*(Rec_AC97_BUF++) = rAC_PCMDATA;
if(Rec_AC97_BUF == End_Rec_AC97_BUF) break;
}
if(Rec_AC97_BUF == End_Rec_AC97_BUF)
{
break;
}
}
rAC_GLBCTRL &= ~(1<<10); //PCM In Transfer PIO Mode Off
printf("\nEnd of Record!\n");
}
////////////////////////////////////////////////////
// MIC in
//mic size - byte
void AC97_MICin_DMA3(unsigned int MIC_Size)
{
Rec_AC97_BUF = (unsigned int *)(PCM_TESTPLAYINGDATA_BASE);
ClearPending(BIT_DMA);
rSUBSRCPND=(BIT_SUB_DMA3);
//IRQ Initialize
pISR_DMA = (unsigned)DMA3_Rec_Done;
rINTMSK=~(BIT_DMA);
rINTSUBMSK=~(BIT_SUB_DMA3);
//DMA3 Initialize
rDISRC3 = ((unsigned int)0x5B00001C); //MIC Input Data FIFO
rDISRCC3 = (1<<1) + (1<<0); //APB, Fix
rDIDST3 = (int)Rec_AC97_BUF; //Record AC97_BUF initializ
rDIDSTC3 = (0<<1) + (0<<0); //AHB, Increment
rDCON3 = (U32)(1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(1<<22)+(2<<20)+(MIC_Size/4);//[28] 0 unit, [20] 2'b10 word. [19:0]count
rDMAREQSEL3 = (29<<1) + (1<<0);
printf("Are you ready to record voice via MIC on SMDK2450?\n");
printf("Press any key to start record.\n");
getchar();
printf("Recording...\n");
rDMASKTRIG3 = (0<<2) + (1<<1) + 0; //No-stop, DMA3 channel on, No-sw trigger
// Transfer data enable using AC-Link
rAC_GLBCTRL = 0x20C; // Transfer data enable using AC-Link
while(AC97_Rec_Done ==0)
{
// printf(".");
// Delay(3000);
//printf("STAT3: 0x%x CURR_TC: 0x%x, DCDST3: 0x%x\n", rDSTAT3&0x300000, rDSTAT3&0xfffff, rDCDST3);
Volume_Control=getchar();
if( (Volume_Control == 'x') | (Volume_Control == 'X'))
break;
}
AC97_Rec_Done = 0;
ClearPending(BIT_DMA);
rSUBSRCPND=(BIT_SUB_DMA3);
rDMASKTRIG3 = (1<<2); //DMA3 stop
rINTMSK |= (BIT_DMA);
rINTSUBMSK |=(BIT_SUB_DMA3);
//AC97 MIC In Channel Finish
rAC_GLBCTRL &= ~(1<<9); //MIC In Transfer Mode Off
printf("\nEnd of Record!\n");
}
//pcm size = byte
void AC97_MICin_INT(unsigned int PCM_Size)
{
//Record AC97_BUF initialize
Rec_AC97_BUF = (unsigned int *)(PCM_TESTPLAYINGDATA_BASE);
Play_AC97_BUF = Rec_AC97_BUF;
End_AC97_BUF = (Rec_AC97_BUF + PCM_Size/4);
//IRQ Initialization
pISR_WDT_AC97= (unsigned)Irq_AC97_MICin;
printf("Are you ready to record voice via MIC on SMDK2450?\n");
printf("Press any key to start record.\n");
getchar();
printf("Recording...\n");
ClearPending(BIT_WDT_AC97);
rSUBSRCPND=(BIT_SUB_AC97);
rINTMSK=~(BIT_WDT_AC97);
rINTSUBMSK=~(BIT_SUB_AC97);
//rAC_GLBCTRL = 0x1010C; //MIC In channel threshold INT enable, PIO Mode On
rAC_GLBCTRL = AC97_MIC_IN_THRESHOLD | AC97_MIC_IN_MODE_PIO |AC97_ACLINK_ON|AC97_TRANSFERDATA_EN;
while(1)
{
if(AC97_In_INT_Exit == 1)
break;
}
rAC_GLBCTRL &= ~(1<<8); //MIC In Transfer PIO Mode Off
rINTSUBMSK|=(BIT_SUB_AC97);
rINTMSK|=(BIT_WDT_AC97);
printf("\nEnd of Record!\n");
}
void AC97_MICin_PollingInterruptTest(unsigned int PCM_Size)
{
unsigned int i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -