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

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

?? codecs.c

?? 2.4G無線音箱的接收程序,采用ATMEGA8單片機和STS公司的無線模塊完成
?? C
?? 第 1 頁 / 共 2 頁
字號:
/******************************************************************************
*
* Purpose:      CODEC Functions
*
* Comment:	 	Type of codec can be set with the defines : CODEC_PCM3002 or
*				CODEC_WM8731
*				USE_DUAL_CODEC : if this define is set the interface B will also
*				be enabled.
*		 		VOLUME_DARR and VOLUME_CODEC defines if the volume on mu is
*				control using the codec or using the DARR79 volume registers.
*
* Creator:      Rob Lansbergen
*
* Version:		$Revision: 9 $
*
* File Name:	$Workfile: codecs.c $
*
* Author:		Rob Lansbergen
*
* Check in:		$Author: Chong.cheeleong $
*
* The information is provided 揳s is?without any express or implied warranty
* of any kind, * including warranties of merchantability, noninfringement of
* intellectual property, or fitness for any particular purpose. In no event sha
* Wireless Sound Solutions and/or its affiliate companies, or its suppliers be
* liable for any damages whatsoever arising out of the use of or inability to
* use the information or the materials. Wireless Sound Solutions, its affiliate
* companies, and its suppliers further do not warrant the accuracy or
* completeness of information, text, graphics, or other items contained within
* materials. Wireless Sound Solutions, Inc., may make changes to materials, or
* the products described within, at any time, without notice.
* ?007 Wireless Sound Solutions. All rights reserved. Wireless Sound Solutions
* STS and STS-wireless are trademarks of Wireless Sound Solutions.
******************************************************************************/
#include "defines.h"

unsigned char Wolfson_Slave_Address;
unsigned char Wireless_Codec_Select;
unsigned char prev_Sync_Stat = 0;

/* Local function declarations */
unsigned char 	Config_Codec_PCM3002	(void);
unsigned char 	Config_Codec_WM8731		(void);
unsigned char 	Config_Codec_CS4251 	(void);
unsigned char 	ConfigCodecSingle_WM8731(unsigned char Codec_A_B);
unsigned char 	Config_Codec_CS4341 	(void);

void          	Set_PCM3003       		(unsigned char address, int data);
unsigned char 	Set_WM8731        		(unsigned char address, int data);
unsigned char 	Set_CS4251       		(unsigned char address, int data);
unsigned char 	Set_CS4341       		(unsigned char address, int data);

void 			SetInVolume_PCM3002		(unsigned char Left_Right, unsigned char Volume);
void 			SetInVolume_WM8731		(unsigned char Left_Right, unsigned char Volume);
void 			SetInVolume_CS4251		(unsigned char Left_Right, unsigned char Volume);
void 			SetInVolume_CS4341		(unsigned char Left_Right, unsigned char Volume);

void 			SetVolume_PCM3002		(unsigned char Left_Right, unsigned char Volume);
void 			SetVolume_WM8731		(unsigned char Left_Right, unsigned char Volume);
void 			SetVolume_DARR80		(unsigned char Left_Right, unsigned char Volume);
void 			SetVolume_CS4251		(unsigned char Left_Right, unsigned char Volume);
void 			SetVolume_CS4341		(unsigned char Left_Right, unsigned char Volume);

extern char key_state; 
/******************************************************************************
*
* Function Name : Config Codec
*
* Purpose       : Config the codec to I2S 48 Khz
*
* Return value  : none
*
******************************************************************************/
unsigned char Config_Codec(void)
{
#ifdef CODEC_PCM3002
	return(Config_Codec_PCM3002());
#endif

#ifdef CODEC_WM8731
	return(Config_Codec_WM8731());
#endif

#ifdef CODEC_CS5341_WM8728
	return(0);
#endif

#ifdef CODEC_CS5368
	return(0);
#endif

#ifdef CODEC_CS4251
	return(Config_Codec_CS4251());
#endif
#ifdef CODEC_CS4341
	return(Config_Codec_CS4341());
#endif
}

/******************************************************************************
*
* Function Name : SetVolume
*
* Purpose       : Set Volume
*
* arguments	: Left_Right
*		  0 is Left
*         1 is Right
*		  Volume is a value from 0 to 0xFF
* Return value  : none
*
******************************************************************************/
void SetVolume(unsigned char Left_Right, unsigned char Volume)
{
#ifdef VOLUME_DARR
	SetVolume_DARR80(Left_Right, Volume);
#endif

#ifdef CODEC_PCM3002
	#ifdef VOLUME_CODEC
		SetVolume_PCM3002(Left_Right, Volume);
	#endif
#endif

#ifdef CODEC_WM8731
	#ifdef VOLUME_CODEC
		SetVolume_WM8731(Left_Right, Volume);
	#endif
#endif

#ifdef CODEC_CS5341_WM8728
#endif

#ifdef CODEC_CS5368
#endif

#ifdef CODEC_WM8731
	#ifdef VOLUME_CODEC
		SetVolume_CS4251(Left_Right, Volume);
	#endif
#endif

#ifdef CODEC_CS4251
	#ifdef VOLUME_CODEC
		SetVolume_CS4251(Left_Right, Volume);
	#endif
#endif
#ifdef CODEC_CS4341
	#ifdef VOLUME_CODEC
		SetVolume_CS4341(Left_Right, 0x00);
	#endif
#endif

}


/******************************************************************************
*
* Function Name : SetInVolume
*
* Purpose       : Set Volume
*
* arguments	: Left_Right
*		  0 is Left
*         1 is Right
*		  Volume is a value from 0 to 0xff
* Return value  : none
*
******************************************************************************/
void SetInVolume(unsigned char Left_Right, unsigned char Volume)
{
#ifdef CODEC_PCM3002
	SetInVolume_PCM3002(Left_Right, Volume);
#endif

#ifdef CODEC_WM8731
	SetInVolume_WM8731(Left_Right, Volume);
#endif

#ifdef CODEC_CS5341_WM8728
#endif

#ifdef CODEC_CS5368
#endif

#ifdef CODEC_CS4251
	SetInVolume_CS4251(Left_Right, Volume);
#endif

#ifdef CODEC_CS4341
	SetInVolume_CS4341(Left_Right, 0x00);
#endif

}


//==============================================================================================

/*********************/
/*** CODEC_PCM3002 ***/
/*********************/
void Set_PCM3003 (unsigned char address, int data)
{
#ifdef CODEC_PCM3002
	unsigned char i;
	unsigned int tmp16;

	tmp16 = ((address & 0x03) << 9) + (data & 0x1FF); /* set Registers Address */

	PCM_ML_HIGH;
	PCM_MC_HIGH;
	PCM_ML_LOW;

	for (i = 0; i < 16; i++)
	{
		PCM_MC_LOW;

		if (tmp16 & 0x8000) {PCM_MD_HIGH;}
		else                {PCM_MD_LOW;}

		tmp16 = tmp16 << 1;
		PCM_MC_HIGH;
	}

	PCM_MC_LOW;
	PCM_ML_HIGH;
#endif
}

void SetInVolume_PCM3002(unsigned char Left_Right, unsigned char Volume)
{
	//Set_PCM3003(Left_Right & 0x01, Volume | 0x100);
}

void SetVolume_PCM3002(unsigned char Left_Right, unsigned char Volume)
{
	//Set_PCM3003(Left_Right & 0x01, Volume | 0x100);
}

unsigned char Config_Codec_PCM3002(void)
{
#ifdef CODEC_PCM3002
	RESET_CODEC_OFF;

	if (Use_ModuleMode == MU)
		Set_PCM3003(2, 0x100 | 2);
	else
		Set_PCM3003(2, 0x40 | 2);

	Set_PCM3003(0x03, 0x0000E); /* Set to I2S */
	//Set_PCM3003(0x00, 0x100 | START_UP_VOLUME);
	//Set_PCM3003(0x01, 0x100 | START_UP_VOLUME);

#endif
	return (0);
}

//==============================================================================================

/********************/
/*** CODEC_WM8731 ***/
/********************/
unsigned char Set_WM8731 (unsigned char address, int data)
{
	unsigned char I2C_error = 0;

	/* Warning, disable unit before configuring */

	/* Wolfson register map */
	/* address part 7 bits  */
	/* data part 9 bits     */

	/* i2c_map = 7 bits address + MSB bit of Wolfson data */
	/* i2c_data = lower 8 bits of Wolfson data            */

	if (Wireless_Codec_Select == 0)
	{
		i2cSlaveAddress	= Wolfson_Slave_Address; /* Address of Wolfson */
		I2C_error = I2C_Write_Byte((address << 1) + ((data >> 8) & 0x01), data & 0xFF);
		/* switch back to org i2c slave address */
		i2cSlaveAddress = I2C_SLAVE_ADDRESS;
	}
	else /* codec on MU side is programm by CU using the wireless I2C mechanism */
	{
		TX_Data_send_array[0] = MSG_TYPE_WRITE_WITHOUT_ACK + 4;
		TX_Data_send_array[1] = IMSL_ADDR;
		TX_Data_send_array[2] = Wolfson_Slave_Address;		// Slave Address
		TX_Data_send_array[3] = (address << 1) + ((data >> 8) & 0x01);
		TX_Data_send_array[4] = 1;		// Amount of I2C Words
		TX_Data_send_array[5] = data & 0xff;
		Send_Message(STR_A, 2049); /* Magic number!!! */
	}
	return (I2C_error);
}


void SetInVolume_WM8731(unsigned char Left_Right, unsigned char Volume)
{
	if ((Left_Right == 0x00) || (Left_Right == 0x01))
	{
		Wolfson_Slave_Address = 0x34;
		Set_WM8731(0x00 + (Left_Right), Volume >> 3); /* volume is 8->5 bit */
	}
	#ifdef USE_DUAL_CODEC
	else /* 0x02 & 0x03 stript down to 0x00 and 0x01 */
	{
		Wolfson_Slave_Address = 0x36; /* Codec B */
		Set_WM8731(0x00 + (Left_Right & 0x01), Volume >> 3); /* volume is 8->5 bit */
		Wolfson_Slave_Address = 0x34;
	}
	#endif /* USE_DUAL_CODEC */
}


void SetVolume_WM8731(unsigned char Left_Right, unsigned char Volume)
{
	if ((Left_Right == 0x00) || (Left_Right == 0x01))
	{
		Wolfson_Slave_Address = 0x34;
		Set_WM8731(0x02 + (Left_Right & 0x01), Volume >> 1); /* volume is 8->7 bit */
	}
	#ifdef USE_DUAL_CODEC
		else
		{
			Wolfson_Slave_Address = 0x36; /* Codec B */
			Set_WM8731(0x02 + (Left_Right & 0x01), Volume >> 1); /* volume is 8->7 bit */
			Wolfson_Slave_Address = 0x34;
		}
	#endif /* END USE_DUAL_CODEC */	
}


unsigned char Config_Codec_WM8731(void)
{
	unsigned char I2C_error = 0;

	I2C_error = ConfigCodecSingle_WM8731(0); /* Inteface A */
	#ifdef USE_DUAL_CODEC
		I2C_error = ConfigCodecSingle_WM8731(1); /* Inteface B */
	#endif

	#ifdef VOLUME_DARR
		/* set darr to start-up volume, with IB the max setting is 126 because of clipping signals */
		SetVolume_DARR80(0, START_UP_VOLUME);
		SetVolume_DARR80(1, START_UP_VOLUME);
		SetVolume_DARR80(2, START_UP_VOLUME);
		SetVolume_DARR80(3, START_UP_VOLUME);
	#endif

	return (I2C_error);
}

/* Power down Registers bit address */
#define LINEIN_ON   0x00
#define LINEIN_OFF  0x01
#define MIC_ON      0x00
#define MIC_OFF     0x02
#define ADC_ON      0x00
#define ADC_OFF     0x04
#define DAC_ON      0x00
#define DAC_OFF     0x08
#define LINEOUT_ON  0x00
#define LINEOUT_OFF 0x10
#define OSC_ON      0x00
#define OSC_OFF     0x20
#define CLKOUT_ON   0x00
#define CLKOUT_OFF  0x40
#define POWER_ON    0x00
#define POWER_OFF   0x80

unsigned char ConfigCodecSingle_WM8731(unsigned char Codec_A_B)
{
	unsigned char I2C_error = 0;

	if (Codec_A_B == 0) Wolfson_Slave_Address = 0x34;
	else                Wolfson_Slave_Address = 0x36;

	I2C_error += Set_WM8731(0, 0x17); /* LinVol Left  17 is 0 db versterking */
	I2C_error += Set_WM8731(1, 0x17); /* LinVol Right 17 is 0 db versterking */
	I2C_error += Set_WM8731(2, 0x7F); /* HPVol Left */
	I2C_error += Set_WM8731(3, 0x7F); /* HPVol Right */
	I2C_error += Set_WM8731(4, 0x12); /* Analog audio path control */
	I2C_error += Set_WM8731(5, 0x01); /* Digital audio path control */

	if (Use_ModuleMode == MU)
	{
		if (Codec_A_B == 0)
		{
			#ifdef USE_DUAL_CODEC
				I2C_error += Set_WM8731(6, POWER_ON|OSC_ON|CLKOUT_ON|MIC_OFF|DAC_ON|ADC_ON|LINEOUT_ON|LINEIN_ON);
			#else
				I2C_error += Set_WM8731(6, POWER_ON|OSC_ON|CLKOUT_OFF|MIC_OFF|DAC_ON|ADC_OFF|LINEOUT_ON|LINEIN_OFF);
			#endif
		}
		if (Codec_A_B != 0)
			I2C_error += Set_WM8731(6, OSC_OFF|POWER_ON|CLKOUT_OFF|MIC_OFF|DAC_ON|ADC_ON|LINEOUT_ON);
	}
	else
	{
		/* if bit 6 is set the ADC does not work anymore (according to the data sheet this bit should be set. */
		/* Keep LINEOUT_ON also on CU because this helps VMID to get to the correct value faster */
		if (Codec_A_B == 0)
		{
			#ifdef	USE_DUAL_CODEC
				I2C_error += Set_WM8731(6, POWER_ON|OSC_ON|CLKOUT_ON|ADC_ON|DAC_ON|LINEOUT_ON);
			#else
				I2C_error += Set_WM8731(6, POWER_ON|OSC_ON|CLKOUT_OFF|ADC_ON|DAC_OFF|LINEOUT_ON|LINEIN_ON);
			#endif
		}
		if (Codec_A_B != 0)
			I2C_error += Set_WM8731(6, OSC_OFF|POWER_ON|CLKOUT_OFF|MIC_OFF|DAC_ON|ADC_ON|LINEOUT_ON);
	}

	if (Codec_A_B == 0) I2C_error += Set_WM8731(7, 0x4A); /* Master */
	else                I2C_error += Set_WM8731(7, 0x0A); /* Slave  */

	
	if (Use_SPDIF) I2C_error += Set_WM8731(8, 0x00); /* codecs are not used, set 12MHz clock undivided to DARR79 */
	else
	{
		#ifdef USE_WM8731_12Mhz
			I2C_error += Set_WM8731(8, 0x5D); /* half Sampling control : use USB mode (12MHZ/250=48KHz) */
		#else
			if (Codec_A_B == 0) I2C_error += Set_WM8731(8, 0x5c); /* half Clock output(Div intclock) */
		  	else                I2C_error += Set_WM8731(8, 0x1c); /* receive halve clock but still use 96 kHZ   */
		#endif
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕成人网| 日韩视频免费观看高清完整版在线观看 | 成人欧美一区二区三区视频网页 | 天天影视网天天综合色在线播放 | 国产乱对白刺激视频不卡| 国产婷婷色一区二区三区四区| 国产一区二区三区在线观看免费| 久久久精品tv| 成人动漫中文字幕| 亚洲人一二三区| 欧美日韩国产小视频| 美脚の诱脚舐め脚责91| 久久久久国产精品麻豆| 91在线视频免费观看| 亚洲成人av在线电影| 欧美tickling挠脚心丨vk| 成人在线一区二区三区| 亚洲精品乱码久久久久久黑人| 欧美三级电影在线看| 另类小说欧美激情| 国产精品免费av| 欧美日韩久久一区二区| 国产在线视频一区二区| 亚洲欧洲韩国日本视频| 6080亚洲精品一区二区| 国产aⅴ综合色| 亚洲一二三四区| 精品国产一区二区三区忘忧草| 成人精品小蝌蚪| 日韩高清欧美激情| 国产欧美一区二区在线观看| 欧美羞羞免费网站| 国产一区二区三区最好精华液| 亚洲精品国产第一综合99久久 | 亚洲国产精品久久人人爱蜜臀| 7777精品伊人久久久大香线蕉最新版| 国产一区二区日韩精品| 一区二区三区在线观看动漫| 亚洲精品一区二区三区福利| 91久久精品国产91性色tv| 久久99精品久久久久婷婷| 一二三区精品视频| 国产精品午夜在线观看| 91麻豆精品国产自产在线| 波多野结衣在线一区| 青娱乐精品视频| 一区二区在线看| 亚洲国产成人自拍| 日韩亚洲欧美高清| 欧美日韩免费不卡视频一区二区三区 | 国产一区二区三区高清播放| 午夜精品在线看| 亚洲欧洲韩国日本视频| 精品国产一区二区三区久久久蜜月| 91理论电影在线观看| 国产一区二区视频在线| 免费观看在线综合色| 一区二区视频免费在线观看| 国产精品视频一二三| 欧美成人国产一区二区| 欧美日韩国产一级片| 91久久精品一区二区三| av电影天堂一区二区在线观看| 精品综合久久久久久8888| 亚洲va国产天堂va久久en| 国产精品电影一区二区| 久久久99精品久久| 久久综合999| 日韩欧美国产系列| 51久久夜色精品国产麻豆| 一本到不卡免费一区二区| 国产mv日韩mv欧美| 国产福利精品导航| 国产一区二区免费在线| 经典三级视频一区| 精品一区二区三区在线播放| 日本不卡123| 青青草国产成人av片免费| 婷婷综合另类小说色区| 亚洲成av人片在www色猫咪| 亚洲一区二区黄色| 性感美女久久精品| 一区二区三区精品视频| 亚洲一级片在线观看| 亚洲午夜久久久久久久久电影院| 一区二区激情小说| 亚洲午夜电影在线观看| 午夜视频在线观看一区二区 | 亚洲黄色av一区| 亚洲激情av在线| 亚洲v日本v欧美v久久精品| 五月婷婷另类国产| 日本vs亚洲vs韩国一区三区| 激情综合一区二区三区| 国产裸体歌舞团一区二区| 国产99久久久国产精品潘金| 东方aⅴ免费观看久久av| 北条麻妃国产九九精品视频| 91天堂素人约啪| 欧美日本韩国一区| 日韩一区二区免费在线观看| 欧美精品一区二区三区蜜臀 | 欧美变态凌虐bdsm| 久久精品一区二区三区四区| 国产精品麻豆久久久| 亚洲免费伊人电影| 日日夜夜免费精品| 国产精品亚洲综合一区在线观看| 高清国产一区二区| 欧美亚洲免费在线一区| 日韩欧美视频一区| 中文字幕不卡在线观看| 亚洲自拍都市欧美小说| 乱一区二区av| 972aa.com艺术欧美| 欧美电影在哪看比较好| 国产亚洲成av人在线观看导航 | 亚洲成av人片在线观看| 国产麻豆视频一区| 欧美性极品少妇| 欧美mv日韩mv国产网站| 自拍偷拍亚洲综合| 秋霞成人午夜伦在线观看| 国产传媒欧美日韩成人| 在线欧美日韩精品| 精品国产伦理网| 亚洲一区在线视频观看| 国产成人精品aa毛片| 在线观看免费一区| 久久久久久电影| 午夜影视日本亚洲欧洲精品| 国产一区二区三区av电影 | 欧美一区二区三区小说| 国产精品全国免费观看高清| 日本亚洲最大的色成网站www| 丰满放荡岳乱妇91ww| 欧美一级片在线观看| 一区二区三区视频在线看| 国产美女主播视频一区| 欧美人xxxx| 依依成人综合视频| 成人黄色av网站在线| 精品日韩一区二区| 同产精品九九九| 欧美性感一类影片在线播放| 中文字幕一区二区三| 国产乱子轮精品视频| 91精品啪在线观看国产60岁| 亚洲天堂精品在线观看| 福利一区在线观看| 久久影院视频免费| 久久成人av少妇免费| 777亚洲妇女| 日韩专区一卡二卡| 欧美日韩在线电影| 亚洲靠逼com| 99r国产精品| 亚洲精品一区二区三区香蕉| 制服丝袜一区二区三区| 亚洲一区二区视频在线观看| 粉嫩高潮美女一区二区三区| 欧美精品在线一区二区三区| 亚洲日本成人在线观看| 成人免费观看视频| 欧美成人性福生活免费看| 青青草国产成人av片免费| 欧美性生活大片视频| 国产精品看片你懂得| 激情五月激情综合网| 精品国产亚洲在线| 日韩精品福利网| 欧美性猛交xxxx乱大交退制版| 中文字幕视频一区二区三区久| 不卡的av在线播放| 国产精品你懂的| 国产69精品久久久久777| 精品日韩成人av| 国产一区欧美一区| 日韩精品资源二区在线| 欧美aⅴ一区二区三区视频| 精品欧美一区二区久久| 精品一区二区av| 精品第一国产综合精品aⅴ| 亚洲精品自拍动漫在线| 欧美视频日韩视频在线观看| 尤物在线观看一区| 在线视频一区二区免费| 亚洲www啪成人一区二区麻豆| 欧美喷潮久久久xxxxx| 午夜影视日本亚洲欧洲精品| 欧美日韩高清一区二区不卡| 久草在线在线精品观看| 欧美成人a在线| 国产精品中文字幕一区二区三区| 精品国产欧美一区二区| 日韩电影在线免费| 久久一区二区三区国产精品| 国产.欧美.日韩| 亚洲mv在线观看| 欧美大片日本大片免费观看|