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

📄 ac97.c

📁 samsung 最新芯片2450 的测试程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
			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 + -