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

📄 ac97.c

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