亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ac97.c

?? MBA2440(s3c2440)的 源代碼文件 ARM920T內核。
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*******************************************************************************

	File Name: AC97.c
	Description: S3C2440A AC97 Controller Function Test Code
   	Version: 0.2 
   	History:
             0.0: First draft
             0.1: 2003. 12. 22, Following test codes were modified by Yoh-Han Lee           
                   - AC97 PCM Out in DMA mode
                   - AC97 PCM In in DMA mode
             0.2: 2004. 02. 12, Programmed and tested by Yoh-Han Lee
                   - Volume up/down and Mute on/off are available, when codec plays PCM data.
		     - AC97 power down mode test is supported.	
                   - AC97 reset timing check is added.
                   - Variable ADC/DAC Selection is supported. 
                   - AC97 PCM Out in the interrupt mode is supported. Thanks to Y. M. Lee.
                   - AC97 PCM In using interrupt mode is supported.
                   - AC97 MIC In using interrupt or DMA is added.
                   		 
********************************************************************************/

#include <stdlib.h>
#include <string.h>
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "def.h"
#include "ac97.h"

#define AC97_REC_LEN 0xfffff*4
#define DOWN_BUF _NONCACHE_STARTADDRESS
#define PCM_OUT_TRIGGER 8
#define PCM_IN_TRIGGER 8
#define AC97_PCM_OUT_THRESHOLD (1<<18)
#define AC97_PCM_IN_THRESHOLD (1<<17)
#define AC97_MIC_IN_THRESHOLD (1<<16)

U32 save_AC97_rGPECON, save_AC97_rGPEDAT, save_AC97_rGPEUP;
U32 AC97_size, AC97_fs;
U32 Output_Volume,Input_Volume;
U32 *Rec_AC97_BUF, *Play_AC97_BUF, *End_AC97_BUF;
static int delayLoopCount;

S16 PCM_Out_INT_Exit = 0;
S16 PCM_In_INT_Exit =0;

U8 *AC97_BUF,*AC97_temp;
U8 Up_Down_Volume;

char AC97_Rec_Done = 0;
char Codec_Ready_Irq;
char AC97_mute = 1;
char Codec_Ready = 1;

void AC97_Port_Init(void);
void AC97_Port_Return(void);
void AC97_Init(void);
void Download_PCM_File(void);
void AC97_CodecInit_PCMOut(U16 AC97_fs);
void AC97_CodecInit_PCMIn(U16 AC97_fs);
void AC97_CodecInit_MICIn(U16 AC97_fs);
void AC97_CodecInit_PD(void);
void AC97_CodecExit_PCMOut(void);
void AC97_CodecExit_PCMIn(U16 DACs_off);
void AC97_CodecExit_MICIn(U16 DACs_off);
void AC97_PCMout_DMA1(U32 PCM_Size);
void AC97_PCMout_INT(U32 PCM_Size);
void AC97_PCMin_DMA2(U32 PCM_Size);
void AC97_PCMin_INT(U32 PCM_Size);
void AC97_MICin_DMA3(U32 MIC_Size);
void AC97_MICin_INT(U32 PCM_Size);
void Delay_Init(void);

void PCM_In_Volume( U8 Up_Down_Volume);
void PCM_Out_Volume( U8 Up_Down_Volume);

void AC97_Controller_State(void);
void Delay_After_CommandWrite(int time);
U16 AC97_Select_SamplingRate(void);
U16 AC97_Codec_Cmd(U8 CMD_Read, U8 CMD_Offset, U16 CMD_Data);


static void __irq DMA1_Play_Done(void);
static void __irq DMA2_Rec_Done(void);
static void __irq DMA3_Rec_Done(void);
static void __irq RxInt(void);
static void __irq Muting(void);
void __irq AC97_Codec_Ready(void);
void __irq Irq_AC97_PCMout(void);
void __irq Irq_AC97_PCMin(void);
void __irq Irq_AC97_MICin(void);

void * func_ac97_test[][2]=
{	
	//AC97 Function Test Item
    	(void *)PCMout_Test_AC97,   		"Play Wave File    ",
    	(void *)PCMin_Test_AC97,     		"Record Sound via LineIn and Play it  ",   
    	(void *)MICin_Test_AC97,      		"Record Voice via MIC and Play it      ", 
       (void *)Powerdown_Test_AC97,    	"AC97 Power Down   ",      
       (void *)Reset_Test_AC97,      		"AC97 Reset Timing Check ",
	0,0
};

void AC97_Test(void)
{
	int i;

	AC97_Port_Init();
	
	while(1)
	{
		i=0;
		Uart_Printf("\n\n==================== AC97 Function Test ====================\n\n");
		while(1)
		{   //display menu
			Uart_Printf("%2d:%s",i,func_ac97_test[i][1]);
			i++;
			if((int)(func_ac97_test[i][0])==0)
			{
				Uart_Printf("\n");
				break;
			}
			if((i%2)==0)
			Uart_Printf("\n");
		}
		Uart_Printf("\n============================================================");
		Uart_Printf("\nSelect #Item or Press enter key to exit:");
		i = Uart_GetIntNum();
		if(i==-1) break;		// return.	
		if(i>=0 && (i<((sizeof(func_ac97_test)-1)/8)) )	// select and execute...
			( (void (*)(void)) (func_ac97_test[i][0]) )();
	}

	 rAC_GLBCTRL = 0;
}


void PCMout_Test_AC97(void)
{
    	int i;
    	//U8 Char;	

	AC97_Port_Init();
	Delay(1000);
		
       //Uart_Printf("Download PCM Wave File? (y/n)");
       //Char=Uart_Getch();
   
       //if( (Char == 'y') | (Char == 'Y') ) 
       Download_PCM_File();
   
       AC97_Init();

	if(Codec_Ready)
	{
       	Uart_Printf("\nSelect PCM Out Operation Mode\n");
		Uart_Printf("0: Interrupt, 1: DMA\n");
		i = Uart_GetIntNum();

		AC97_CodecInit_PCMOut(AC97_fs);
           
       	switch(i)
       	{
   			case 0:
			AC97_PCMout_INT(AC97_size);
   			break;
   	
   			case 1:
   			AC97_PCMout_DMA1(AC97_size);
   			break;
   
   			default:
   			AC97_PCMout_DMA1(AC97_size);
   			break;
       	}      
       
     		AC97_CodecExit_PCMOut();
	}
	
       AC97_mute = 1;
       Codec_Ready =1;
       PCM_Out_INT_Exit = 0;
       
       AC97_Port_Return();
}


void PCMin_Test_AC97(void)
{
	int i;
	U32 Sampling_Rate;
       AC97_Rec_Done = 0;
      
       AC97_Port_Init();
	   
       Sampling_Rate = AC97_Select_SamplingRate();
          
     	AC97_Init();	

       if(Codec_Ready)
	{
		Uart_Printf("\nSelect PCM In/Out Operation Mode\n");
		Uart_Printf("0: Interrupt, 1: DMA\n");
		i = Uart_GetIntNum();

       	AC97_CodecInit_PCMIn(Sampling_Rate);

		switch(i)
       	{
   			case 0:
       		AC97_PCMin_INT(AC97_REC_LEN);

			//Play Recorded Data
	    		AC97_CodecInit_PCMOut(Sampling_Rate);
			AC97_PCMout_INT(AC97_REC_LEN);
       		break;

			case 1:
         		AC97_PCMin_DMA2(AC97_REC_LEN);
			
         		//Play Recorded Data
	    		AC97_CodecInit_PCMOut(Sampling_Rate);
	   		AC97_PCMout_DMA1(AC97_REC_LEN);
	   		break;
  			
			default:
			AC97_PCMin_DMA2(AC97_REC_LEN);
         		
	    		//Play Recorded Data
	    		AC97_CodecInit_PCMOut(Sampling_Rate);
	   		AC97_PCMout_DMA1(AC97_REC_LEN);
   			break;
		}
		AC97_CodecExit_PCMIn(1);
       }	

   	Codec_Ready =1;
       AC97_mute = 1;
       PCM_Out_INT_Exit = 0;
       PCM_In_INT_Exit = 0;

   	AC97_Port_Return();
}

void MICin_Test_AC97(void)
{
	U16 i, Sampling_Rate;
	AC97_Rec_Done = 0;
	
	AC97_Port_Init();
       Delay(1000);

       Sampling_Rate = AC97_Select_SamplingRate();
       
	AC97_Init();	

	if(Codec_Ready)
	{
		Uart_Printf("\nSelect MIC In Operation Mode\n");
		Uart_Printf("0: Interrupt, 1: DMA\n");
		i = Uart_GetIntNum();

       	AC97_CodecInit_MICIn(Sampling_Rate);

		switch(i)
       	{
			case 0:
			AC97_MICin_INT(AC97_REC_LEN/2);

			//Play Recorded Data
	    		AC97_CodecInit_PCMOut(Sampling_Rate);
	   		AC97_PCMout_DMA1(AC97_REC_LEN/2);	
			break;

			case 1:
			AC97_MICin_DMA3(AC97_REC_LEN/2);

         		//Play Recorded Data
	    		AC97_CodecInit_PCMOut(Sampling_Rate);
	   		AC97_PCMout_DMA1(AC97_REC_LEN/2);
			break;	

			default:
			AC97_MICin_DMA3(AC97_REC_LEN/2);

         		//Play Recorded Data
	    		AC97_CodecInit_PCMOut(Sampling_Rate);
	   		AC97_PCMout_DMA1(AC97_REC_LEN/2);	
			break;
 		}	
		
  		AC97_CodecExit_MICIn(1);
	}

	Codec_Ready =1;
	AC97_mute = 1;
       PCM_In_INT_Exit = 0;

	AC97_Port_Return();
}

void Powerdown_Test_AC97(void)
{
	int i;

	AC97_Port_Init();
	Delay(1000);

	AC97_Init();

	if(Codec_Ready)
	{
	  	AC97_CodecInit_PD();
	 
	 	//Normal
	 	Uart_Printf("\nNormal\n");
	 	AC97_Controller_State();
	 	Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));
	 
	 	//ADCs off
	 	Uart_Printf("\n=>ADCs off PR0\n");
	 	AC97_Codec_Cmd(0,0x26,(1<<8));
	 	AC97_Controller_State();
	 	Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));
	 
	 	//DACs off
	 	Uart_Printf("\n=>DACs off PR1\n");
	 	AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9));
	 	AC97_Controller_State();
	 	Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));	
	 
	 	//Analog off
	 	Uart_Printf("\n=>Analog off PR2\n");
	 	AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10));
	 	AC97_Controller_State();
	 	Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));	
	 
	 	//Digital I/F off
	 	Uart_Printf("\n=>Digital I/F off PR4\n");
	 	AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10)|(1<<12));
	 	AC97_Controller_State();
	 	//Uart_Printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));	
	 
	 	//Shut off AC-Link
	 	Uart_Printf("\n=>Shut off AC-Link\n");
	 	rAC_GLBCTRL &= ~(1<<2);
	 	AC97_Controller_State();
	 	//Uart_Printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));	
	 	  	
	 	while(1)
	 	{
	 		Uart_Printf("\nPress enter key for Warm Reset");
	 		i = Uart_GetIntNum();
	 		if(i==-1) break;	
	 	}
	 
	 	//Warm Reset
	 	Uart_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);
	 	Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));	
	 
	 	//Cold Reset
	 	Uart_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();
	 	Uart_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
		Uart_Printf("\nNormal\n");
		AC97_Controller_State();
		Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));	
	
		//ADCs off
		Uart_Printf("\n=>ADCs off PR0\n");
		AC97_Codec_Cmd(0,0x26,(1<<8));
		AC97_Controller_State();
		Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));	
		
		//DACs off
		Uart_Printf("\n=>DACs off PR1\n");
		AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9));
		AC97_Controller_State();
		Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));	

		//Analog off
		Uart_Printf("\n=>Analog off PR2\n");
		AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10));
		AC97_Controller_State();
		Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));	
		
		//Digital I/F off
		Uart_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
		Uart_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
		Uart_Printf("\nWarm Reset Timing Check...");
		Uart_Printf("\n	Probe SYNC and BIT_CLK.");
		Uart_Printf("\n	Trigger SYNC Rising Edge.");
		
		while(1)
		{
			Uart_Printf("\nPress enter key for Warm Reset Timing Check...");
			i = Uart_GetIntNum();
			if(i==-1) break;	
		}

		Uart_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);
		Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%x\n", AC97_Codec_Cmd(1,0x26,0x0000));	

		Uart_Printf("\nPress any key.\n");
		Uart_Getch();
		
		//Cold Reset Timing Check
		Uart_Printf("\nCold Reset Timing Check...");
		Uart_Printf("\n	Probe RESET#, BIT_CLK and SDATA_IN.");
		Uart_Printf("\n	Trigger RESET# Rising Edge.");


		while(1)
		{
			Uart_Printf("\nPress enter key for Cold Reset Timing Check...");
			i = Uart_GetIntNum();
			if(i==-1) break;	
		}

		rAC_GLBCTRL = 0x1;	
		Delay(1000);			
		rAC_GLBCTRL = 0x0;	
		Delay(1000);		

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚一区二区| 国产一区二区三区在线观看免费| 国产成人精品一区二| 亚洲精品一区二区精华| 国产一区二三区好的| 久久久久国产一区二区三区四区 | 91黄色激情网站| 夜夜精品浪潮av一区二区三区| 欧美午夜片在线观看| 日韩成人av影视| 精品福利在线导航| 成人网在线播放| 亚洲国产视频一区二区| 91精品福利在线一区二区三区 | 在线观看免费一区| 天堂蜜桃91精品| 久久免费午夜影院| 色综合久久精品| 日韩国产欧美在线播放| 亚洲精品一区二区三区香蕉| 99re热视频这里只精品| 婷婷丁香久久五月婷婷| 久久免费视频一区| 在线中文字幕不卡| 国产精品一区二区久久不卡| 夜夜精品视频一区二区| 精品国产伦一区二区三区免费| 国产精品99久久久久久似苏梦涵| 亚洲精品国久久99热| 日韩一区和二区| 91蝌蚪porny| 韩国成人在线视频| 亚洲天堂网中文字| 精品日韩99亚洲| 欧美色欧美亚洲另类二区| 国产福利精品导航| 日本成人在线看| 日韩理论电影院| 久久网这里都是精品| 在线观看视频欧美| 国产成人综合网| 日本欧美加勒比视频| 国产日韩欧美精品在线| 6080国产精品一区二区| 97久久精品人人爽人人爽蜜臀| 九九视频精品免费| 婷婷久久综合九色综合伊人色| 中文字幕一区视频| 久久这里都是精品| 欧美一区二区三区日韩| 日本精品裸体写真集在线观看| 国产精品白丝jk黑袜喷水| 奇米色777欧美一区二区| 一区二区三区不卡在线观看| 国产女人aaa级久久久级 | 亚洲国产精品尤物yw在线观看| 国产日韩欧美不卡在线| 日韩欧美视频一区| 91精品视频网| 欧美色成人综合| 色偷偷久久人人79超碰人人澡| 国产激情偷乱视频一区二区三区 | 久久日韩精品一区二区五区| 欧美日韩dvd在线观看| 色哟哟在线观看一区二区三区| 成人亚洲精品久久久久软件| 国产精品一区二区三区网站| 麻豆成人av在线| 美女视频免费一区| 久久国产三级精品| 蜜桃在线一区二区三区| 污片在线观看一区二区| 亚洲国产综合91精品麻豆| 亚洲综合在线视频| 亚洲电影一级黄| 一区二区三区电影在线播| 亚洲精品日韩专区silk| 一区二区三区在线观看动漫| 亚洲精品国产精品乱码不99| 亚洲日本一区二区三区| 一区二区三区波多野结衣在线观看| 亚洲欧洲国产日韩| 亚洲美女电影在线| 亚洲精品国产一区二区三区四区在线| 一区二区三区中文在线观看| 一区二区三区不卡视频| 天天免费综合色| 日本不卡视频在线| 国产精品亚洲综合一区在线观看| 韩国v欧美v日本v亚洲v| 成人av资源站| 欧美日韩精品综合在线| 欧美日韩精品一区二区三区四区| 欧美日产国产精品| 精品久久久久久久久久久久包黑料| 精品国产乱码91久久久久久网站| 国产视频911| 亚洲视频电影在线| 天堂久久一区二区三区| 国产精品1区二区.| 91丨porny丨国产入口| 欧美日本一区二区三区| 久久综合九色综合欧美亚洲| 国产精品视频观看| 亚洲午夜电影在线| 国产毛片一区二区| 在线一区二区三区四区| 欧美一区二区三区电影| 国产精品免费网站在线观看| 亚洲国产视频a| 国产精品一区二区久久不卡| 在线观看日韩电影| 精品久久久久久无| 曰韩精品一区二区| 狠狠色综合色综合网络| 一本色道久久综合亚洲91| 91精品综合久久久久久| 国产精品入口麻豆原神| 视频在线观看91| 欧美日韩性生活| 亚洲欧洲日韩在线| 天天影视涩香欲综合网| 国产高清不卡一区| 欧美精品在线一区二区| 国产欧美精品在线观看| 亚洲成人中文在线| 成人99免费视频| 日韩欧美成人一区| 一区二区三区精品在线| 高清shemale亚洲人妖| 欧美老年两性高潮| 亚洲四区在线观看| 国产精品一线二线三线| 69堂国产成人免费视频| 亚洲激情第一区| 国产99精品国产| 精品999在线播放| 婷婷丁香久久五月婷婷| 色婷婷精品大在线视频| 欧美国产日韩一二三区| 久久精品国产精品青草| 欧美精三区欧美精三区| 中文字幕中文字幕中文字幕亚洲无线 | 一区二区激情小说| 国产成人午夜视频| 精品第一国产综合精品aⅴ| 亚洲www啪成人一区二区麻豆| 色综合久久综合中文综合网| 中文字幕免费在线观看视频一区| 免费的国产精品| 欧美精品1区2区3区| 亚洲一区日韩精品中文字幕| 99国产精品99久久久久久| 国产精品视频第一区| 国产成人亚洲精品青草天美| 久久影院午夜片一区| 蜜桃av一区二区三区电影| 欧美精品久久天天躁| 亚洲图片欧美色图| 欧美日韩中文字幕一区| 一二三区精品视频| 欧美系列在线观看| 亚洲最新视频在线观看| 欧美亚一区二区| 亚洲不卡av一区二区三区| 欧美日韩国产中文| 五月天婷婷综合| 99精品欧美一区| 欧美日韩成人综合在线一区二区| 九九九久久久精品| 1024成人网| 波多野结衣一区二区三区| 日本一区二区三区国色天香| 国产超碰在线一区| 国产精品久久看| 色综合久久久久网| 一区二区理论电影在线观看| 欧美色综合天天久久综合精品| 亚洲国产精品尤物yw在线观看| 欧美日本在线播放| 蜜臀av性久久久久蜜臀aⅴ | 樱桃视频在线观看一区| 在线中文字幕一区| 欧美aⅴ一区二区三区视频| 日韩视频永久免费| 激情综合网最新| 国产精品久久久久久久裸模 | 一区二区三区加勒比av| 欧美男同性恋视频网站| 麻豆精品久久精品色综合| 欧美国产欧美综合| 欧美在线视频不卡| 另类调教123区| 椎名由奈av一区二区三区| 欧美日韩日本视频| 国产成人综合在线| 亚洲国产精品一区二区www在线| 精品少妇一区二区三区在线播放| 国产成人亚洲精品狼色在线| 一区二区三区四区亚洲|