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

📄 pac97.c

📁 VXWORKS操作系统下的S3C2440声卡驱动源程序
💻 C
字号:
/*
	单片机式的声卡测试程序
	功能:
	1、对硬件做最简单的初始化
	2、往调制芯片中不停发数据产生声音

*/
#define	AC97_INTERNAL_CLOCK_ENABLE	(1<<20)
#define	loop	4000
#define		AC97_READ_COMMAND			(1<<23)
#define		AC97_CMD_ADDR_SHIFT			(16)
#define		AC97_CMD_DATA_SHIFT			(0)
/* Defines for the STAC9766 registers*/
#define 	AC97_RESET				0x0000      	
#define 	AC97_MASTER_VOL_STEREO	0x0002  	
#define 	AC97_HEADPHONE_VOL		0x0004    	
#define 	AC97_PHONE_VOL			0x000c      	
#define 	AC97_PCMOUT_VOL			0x0018     
#define 	AC97_EXT_AUDIO_CONTROL	0x002A	
#define 	AC97_POWER_CONTROL		0x0026
/* useful power states*/
#define		AC97_PWR_D0             0x0000      /*everything on*/


	UINT32	*rCLKCON,*rAC_GLBCTRL;
	rCLKCON=0x4c00000c;		/*clock control register*/
	rAC_GLBCTRL=0x5b000000;		/*ac97 global control register*/

	UINT32	*rAC_PCMDATA;		/*ac97 pcm out fifo register*/
	rAC_PCMDATA=0x5b000018;	


AC97_GPIO_Init();
{
	UINT32	*rGPECON,*rGPEUP;
	rGPECON=0x56000040;		/*port e control rgister*/
	rGPEUP=0x56000048;
	(*rGPECON)|=0x3ff;
	(*rGPEUP) |= 0x1f;
}

void Delay(USHORT count)
{
	volatile int i, j;
	
	for(;count > 0;count--)
		for(i=0;i < loop; i++) { j++; }
}


ac97_controller_init()		/*ac97 控制器初始化*/
{
	(*rCLKCON )|= AC97_INTERNAL_CLOCK_ENABLE;		/*Enable the CPU clock to the AC97 controller*/
	
	AC97_GPIO_Init();
	
	*rAC_GLBCTRL=0;
	Delay();

	/*Cold Reset*/ 
	*rAC_GLBCTRL = 0x1; 
	Delay();
	*rAC_GLBCTRL = 0x0;
	Delay(); 

	/*AC-link On*/
	*rAC_GLBCTRL = (1<<2);
	Delay(); 

	/*Transfer data enable using AC-link*/
	(*rAC_GLBCTRL  )|= (1<<3);
	Delay(); 

	/*Disable the Codec ready Interrupt*/
	(*rAC_GLBCTRL) |= (1<<22);
	Delay(); 
	
	(*rAC_GLBCTRL) &= ~(0x400000);	/* codec ready interrupt disable*/

	Delay(); 
	
	(*rAC_GLBCTRL) |=(1<<12);
}


WriteCodecRegister(UCHAR Reg, USHORT Val)
{
	UINT32	*rAC_CODEC_CMD;
	rAC_CODEC_CMD=0x5b000008;
	*rAC_CODEC_CMD = (Reg << AC97_CMD_ADDR_SHIFT) | (Val << AC97_CMD_DATA_SHIFT);
	Delay(100);
}


ac97_codec_init()
{
	/* write the Codec software reset (00h)*/
	WriteCodecRegister(AC97_RESET, 0x01); 
	
	/* disable the VRA	(2Ah)*/
	WriteCodecRegister(AC97_EXT_AUDIO_CONTROL, 0);

	/* Turn Power on for sections	(26h)*/
	WriteCodecRegister( AC97_POWER_CONTROL, AC97_PWR_D0 );

	/*volume control*/
	WriteCodecRegister( AC97_MASTER_VOL_STEREO, 0x0101 );
	WriteCodecRegister( AC97_HEADPHONE_VOL, 0x0101 );
	WriteCodecRegister( AC97_PHONE_VOL, 0x0101 );
	WriteCodecRegister( AC97_PCMOUT_VOL, 0x0101 );
}

ac97_send()	/*send data to pcm_out fifo untill full*/
{
	int 	fcount, L_fifo[15]={},R_fifo[15]={};
	for(fcount=0;fcount<16;fcount++)
		{
			*rAC_PCMDATA=(L_fifo[fcount]<<16)|(R_fifo[fcount])
		}
	
	(*rAC_GLBCTRL  )|= (1<<21);		/*enable pcm out channel  empty interrupt*/
}

ac97_send_int()	/*send interrupt handle:send data to send data to pcm_out fifo untill full*/
{
	(*rAC_GLBCTRL  )&=(~ (1<<21));		/*disable interrupt*/
	
	int 	fcount, L_fifo[15]={},R_fifo[15]={};
	for(fcount=0;fcount<16;fcount++)
		{
			*rAC_PCMDATA=(L_fifo[fcount]<<16)|(R_fifo[fcount])
		}
	
	(*rAC_GLBCTRL  )|= (1<<21);		/*enable pcm out channel  empty interrupt*/
}

main()
{
	ac97_controller_init();
	ac97_codec_init();
	ac97_send();
	while(1);
}

⌨️ 快捷键说明

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