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

📄 ac97.org.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
📖 第 1 页 / 共 3 页
字号:
    	getchar();
   	printf("Recording...\n");

	ClearPending(BIT_PCM_AC97);	
	rSUBSRCPND=(BIT_SUB_AC97);

   	rINTMSK=~(BIT_PCM_AC97);			
   	rINTSUBMSK=~(BIT_SUB_AC97);
		
	rAC_GLBCTRL = 0x2040C;	//PCM In channel threshold INT enable, PIO Mode On
	
	while(1)
	{
	       if(PCM_In_INT_Exit == 1)
		break;	
	}

	rAC_GLBCTRL &= ~(1<<10); //PCM In Transfer PIO Mode Off
		
	rINTSUBMSK|=(BIT_SUB_AC97);
	rINTMSK|=(BIT_PCM_AC97);

	printf("\nEnd of Record!\n");	
}

void AC97_MICin_DMA3(unsigned int MIC_Size)
{
	Rec_AC97_BUF   = (unsigned int *)(DOWN_BUF);  

	ClearPending(BIT_DMA_SBUS);	
	rSUBSRCPND=(BIT_SUB_DMA3);

	//IRQ Initialize	
	pISR_DMA_SBUS  = (unsigned)DMA3_Rec_Done;
	rINTMSK=~(BIT_DMA_SBUS);
	rINTSUBMSK=~(BIT_SUB_DMA3);
	
       //DMA3 Initialize
	rDISRC3  = ((unsigned int)0x4500001C);         //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   = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(1<<22)+(2<<20)+(MIC_Size/4);
	rDMAREQSEL3 = (8<<1) + (1<<0);

	printf("Are you ready to record voice via MIC on SMDK2460?\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);
       }
    		
       AC97_Rec_Done = 0;

       ClearPending(BIT_DMA_SBUS);	
	rSUBSRCPND=(BIT_SUB_DMA3);
	
       rDMASKTRIG3 = (1<<2);     //DMA3 stop
     
       rINTMSK |= (BIT_DMA_SBUS);
	rINTSUBMSK |=(BIT_SUB_DMA3);

       //AC97 MIC In Channel Finish 
       rAC_GLBCTRL &= ~(1<<9); //MIC In Transfer Mode Off
 
  	printf("\nEnd of Record!\n");	
}

void AC97_MICin_INT(unsigned int PCM_Size)
{
	//Record AC97_BUF initialize
       Rec_AC97_BUF   = (unsigned int *)(DOWN_BUF);
	Play_AC97_BUF = Rec_AC97_BUF;
	End_AC97_BUF = (Rec_AC97_BUF + PCM_Size/4);

	//IRQ Initialization
	pISR_PCM_AC97= (unsigned)Irq_AC97_MICin;	

	printf("Are you ready to record voice via MIC on SMDK2460?\n");
       printf("Press any key to start record.\n");
    	getchar();
   	printf("Recording...\n");

	ClearPending(BIT_PCM_AC97);	
	rSUBSRCPND=(BIT_SUB_AC97);

   	rINTMSK=~(BIT_PCM_AC97);			
   	rINTSUBMSK=~(BIT_SUB_AC97);
		
	rAC_GLBCTRL = 0x1010C;	//MIC In channel threshold INT enable, PIO Mode On
	
	while(1)
	{
	       if(PCM_In_INT_Exit == 1)
		break;	
	}

	rAC_GLBCTRL &= ~(1<<8); //MIC In Transfer PIO Mode Off
		
	rINTSUBMSK|=(BIT_SUB_AC97);
	rINTMSK|=(BIT_PCM_AC97);

	printf("\nEnd of Record!\n");
}

void AC97_CodecExit_PCMOut(void)
{
	//DACs off
	printf("\n\n=>DACs off PR1\n");
	AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9));
	AC97_Controller_State();
	printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 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 0x26 Reg.: 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));	

}

void AC97_CodecExit_PCMIn(unsigned short DACs_off)
{
	//ADCs off
	printf("\n\n=>ADCs off PR0\n");
	AC97_Codec_Cmd(0,0x26,(1<<8));
	AC97_Controller_State();
	printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));

	if(DACs_off == 1)
	{
		//DACs off
		printf("\n\n=>DACs off PR1\n");
		AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9));
		AC97_Controller_State();
		printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 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 0x26 Reg.: 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));	
}

void AC97_CodecExit_MICIn(unsigned short DACs_off)
{
	//ADCs off
	printf("\n\n=>ADCs off PR0\n");
	AC97_Codec_Cmd(0,0x26,(1<<8));
	AC97_Controller_State();
	printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));

	if(DACs_off == 1)
	{
		//DACs off
		printf("\n\n=>DACs off PR1\n");
		AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9));
		AC97_Controller_State();
		printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 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 0x26 Reg.: 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));	

}

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\n");
	i = GetIntNum();	

	   switch(i)
       {
		case 0:
              return 8000;
       	break;
       	
		case 1:
              return 22050;
       	break;
       	
       	case 2:
       	return 44100;
       	break;

       	case 3:
       	return 48000;
       	break;
       
       	default:
       	return 48000;
       	break;
	}      
}

void AC97_Controller_State(void)
{
	unsigned char state;
    
    	state=(unsigned char)(rAC_GLBSTAT);

     	switch(state)
    	{
		case 0:
		printf("AC97 Controller State: Idle\n"); 
		break;
	
		case 1:
			printf("AC97 Controller State: Init\n"); 
		break;

		case 2:
		       printf("AC97 Controller State: Ready\n"); 
		break;
		
		case 3:
			printf("AC97 Controller State: Active\n"); 
		break;

		case 4:
			printf("AC97 Controller State: LP\n"); 
		break;

		case 5:
			printf("AC97 Controller State: Warm\n"); 
		break;

		default:
		break;
     	}
}

float delay_func(unsigned short num_delay)
{
	int divider=0, count;

	pISR_TIMER34_WDT=(unsigned int)IsrWatchdog;

	ClearPending(BIT_TIMER34_WDT);
	rSUBSRCPND=BIT_SUB_WDT;
	
	rINTMSK&=~(BIT_TIMER34_WDT);
	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));
}

	
/* ISRs */
void __irq AC97_Codec_Ready(void)
{ 

	if ( (rAC_GLBSTAT& 0x400000))
	{
		Codec_Ready_Irq=1;
		printf("Codec Ready!\n");	
		rAC_GLBCTRL &= ~(0x400000);	// codec ready interrupt disable
	}

	rSUBSRCPND=(BIT_SUB_AC97);
	ClearPending(BIT_PCM_AC97);

	rINTSUBMSK &= ~(BIT_SUB_AC97);
	rINTMSK &=~(BIT_PCM_AC97);
}

void __irq DMA1_Play_Done(void)
{
	rINTMSK = ~(BIT_DMA_SBUS);
	rINTSUBMSK=~(BIT_SUB_DMA2);

      	ClearPending(BIT_DMA_SBUS);	
	rSUBSRCPND=(BIT_SUB_DMA1);      
	
	printf("\n~~~");

	rINTMSK |= (BIT_DMA_SBUS);
	rINTSUBMSK |=(BIT_SUB_DMA2);
}

void __irq DMA2_Rec_Done(void)
{
    	ClearPending(BIT_DMA_SBUS);	
	rSUBSRCPND=(BIT_SUB_DMA2);
	               
    	AC97_Rec_Done = 1;
}

void __irq DMA3_Rec_Done(void)
{
	ClearPending(BIT_DMA_SBUS);	
	rSUBSRCPND=(BIT_SUB_DMA3);                

    	AC97_Rec_Done = 1;	    	
}

void __irq Irq_AC97_PCMout(void)
{
	unsigned int i, AC97_Stat;
	
	rINTMSK |=(BIT_PCM_AC97);
	rINTSUBMSK|=(BIT_SUB_AC97);		

	AC97_Stat = rAC_GLBSTAT;
	
	if (AC97_Stat & AC97_PCM_OUT_THRESHOLD)
	{
			for(i=0; i<PCM_OUT_TRIGGER; i++)
		       {
			 	rAC_PCMDATA = *(Play_AC97_BUF++);			

				if(Play_AC97_BUF == End_AC97_BUF)  
				break;	
			}			
	}

	if(Play_AC97_BUF == End_AC97_BUF)
	{
		rAC_GLBCTRL &= ~(0x40000);	//PCM Out channel threshold INT disable
		PCM_Out_INT_Exit =1;	
	}
	
	rSUBSRCPND=(BIT_SUB_AC97);
	ClearPending(BIT_PCM_AC97);

	rINTSUBMSK &= ~(BIT_SUB_AC97);	
	rINTMSK &= ~(BIT_PCM_AC97);	 
	
}

void __irq Irq_AC97_PCMin(void)
{
	unsigned int AC97_Stat, i; 

	rINTMSK |=(BIT_PCM_AC97);
	rINTSUBMSK|=(BIT_SUB_AC97);	

	AC97_Stat = rAC_GLBSTAT;

	if (AC97_Stat & AC97_PCM_IN_THRESHOLD)
	{
			for(i=0; i<PCM_IN_TRIGGER; i++)
		       {
			 	 *(Play_AC97_BUF++) = rAC_PCMDATA;			

				if(Play_AC97_BUF == End_AC97_BUF)  
				break;	
			}			
	}

	if(Play_AC97_BUF == End_AC97_BUF)
	{
		rAC_GLBCTRL &= ~(1<<17);	//PCM In channel threshold INT disable
		PCM_In_INT_Exit =1;	
	}

	rSUBSRCPND=(BIT_SUB_AC97);
	ClearPending(BIT_PCM_AC97);

	rINTSUBMSK &= ~(BIT_SUB_AC97);	
	rINTMSK &= ~(BIT_PCM_AC97);	
}

void __irq Irq_AC97_MICin(void)
{
	unsigned int AC97_Stat, i; 

	rINTMSK |=(BIT_PCM_AC97);
	rINTSUBMSK|=(BIT_SUB_AC97);	

	AC97_Stat = rAC_GLBSTAT;

	if (AC97_Stat & AC97_MIC_IN_THRESHOLD)
	{
			for(i=0; i<PCM_IN_TRIGGER; i++)
		       {
			 	 *(Play_AC97_BUF++) = rAC_MICDATA;			

				if(Play_AC97_BUF == End_AC97_BUF)  
				break;	
			}			
	}

	if(Play_AC97_BUF == End_AC97_BUF)
	{
		rAC_GLBCTRL &= ~(1<<16);	//PCM In channel threshold INT disable
		PCM_In_INT_Exit =1;	
	}

	rSUBSRCPND=(BIT_SUB_AC97);
	ClearPending(BIT_PCM_AC97);

	rINTSUBMSK &= ~(BIT_SUB_AC97);	
	rINTMSK &= ~(BIT_PCM_AC97);	
}

void __irq RxInt(void)
{
	rUINTSP0 = 0x1;
    	rSUBSRCPND = BIT_SUB_UART0;         
    	rSUBSRCPND;
    	ClearPending(BIT_UART);

    	*AC97_temp ++= RdURXH0(); 
}

void __irq IsrWatchdog(void)
{
	rWTCON=0;
	
       rINTSUBMSK|=BIT_SUB_WDT;
       rINTMSK|=BIT_TIMER34_WDT;
       
	ClearPending(BIT_TIMER34_WDT);
	rSUBSRCPND=BIT_SUB_WDT;	

	timer_exit=1;	
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -