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

📄 lh79524_sdk_audio_driver.c

📁 SHARP_ARM720T_LH79524/5软件开发包_支持TFT_LCD_NAND_FLASH_ETH_USB
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********************************************************************
 * Copyright (c) 2002 Sharp Microelectronics of the Americas
 *
 *        All rights reserved
 *      
 * $Workfile:   lh79524_sdk_audio_driver.c  $
 * $Revision:   1.0  $
 * $Author:   ZhangJ  $
 * $Date:   Oct 20 2004 09:38:42  $
 *
 * SHARP MICROELECTRONICS OF THE AMERICAS MAKES NO REPRESENTATION
 * OR WARRANTIES WITH RESPECT TO THE PERFORMANCE OF THIS SOFTWARE,
 * AND SPECIFICALLY DISCLAIMS ANY RESPONSIBILITY FOR ANY DAMAGES, 
 * SPECIAL OR CONSEQUENTIAL, CONNECTED WITH THE USE OF THIS SOFTWARE.
 *
 * SHARP MICROELECTRONICS OF THE AMERICAS PROVIDES THIS SOFTWARE SOLELY 
 * FOR THE PURPOSE OF SOFTWARE DEVELOPMENT INCORPORATING THE USE OF A 
 * SHARP MICROCONTROLLER OR SYSTEM-ON-CHIP PRODUCT. USE OF THIS SOURCE
 * FILE IMPLIES ACCEPTANCE OF THESE CONDITIONS.
 *
 * Project: LH79520 SDK79520 
 *
 * Description:
 *    This is audio driver for SDK79520 evaluation board
 *
 * Notes:
 *  
 * Revision History:
 * $Log:   //smaicnt2/pvcs/VM/sharpmcu/archives/sharpmcu/software/csps/lh79524/bsps/sdk79524/source/lh79524_sdk_audio_driver.c-arc  $
 * 
 *    Rev 1.0   Oct 20 2004 09:38:42   ZhangJ
 * Initial revision.
 * 
 * 
 * 
 *********************************************************************/

#include "lh79524_rcpc.h"
#include "lh79524_sdk_audio_driver.h"

void audio_spi_configure(INT_32 reg_addr, INT_32 value);
static void audio_tl320dac23_reg_init(void);

static INT_32 reg_left_control_default;
static INT_32 reg_right_control_default;		
static INT_32 reg_left_vol_default;			
static INT_32 reg_right_vol_default;			
static INT_32 reg_analog_path_default;		
static INT_32 reg_digital_path_default;		
static INT_32 reg_power_down_default;		
static INT_32 reg_digital_format_default;	
static INT_32 reg_sample_rate_default;	
static INT_32 reg_digital_activation_default; 
static INT_32 reg_reset_default;				

#define CODEC_CRYSTAL_5P6MHZ

/**********************************************************************
*
* Function: audio_tl320dac23_reg_init
*
* Purpose:
*   Put TI TLV320DAC23 audio chip register default value to static 
*	register for further register operation
*  
* Processing:
*
* Parameters:
*	None
*
* Outputs:
*   None
*
* Returns:
*   None
*
* Notes:
*   This function must be called before using "audio_configuration"
*	function
*
**********************************************************************/
void audio_tl320dac23_configure(SDK_SAMPLE_T sample_rate)
{
    
    // audio chip is clocked by the clk output pin off the cpu
    RCPC->rcpcctrl &= ~(_BIT(5) | _BIT(6));

	audio_tl320dac23_reg_init();
	
	// Reset the chip
	audio_tl320dac23_configuration(RESET_CHIP,1);
	
	// Configure Digital Audio Path Control
	audio_tl320dac23_configuration(DIGITAL_AUDIO_DAC_SOFT_MUTE,0);

	// Configure power down control 
	audio_tl320dac23_configuration(OSCILLATOR_ON,1);
	audio_tl320dac23_configuration(OUTPUTS_ON,1);
	audio_tl320dac23_configuration(DAC_ON,1);
	
	// Configure digital audio interface
	audio_tl320dac23_configuration(DIGITAL_MASTER_MODE,1);
//	audio_tl320dac23_configuration(DIGITAL_MASTER_MODE,0);
	audio_tl320dac23_configuration(DIGITAL_INPUT_BIT_LENGTH,16);
//	audio_tl320dac23_configuration(DIGITAL_DATA_FORMAT,FORMAT_I2S); // I2S
	audio_tl320dac23_configuration(DIGITAL_DATA_FORMAT,FORMAT_DSP); // SPI
	audio_tl320dac23_configuration(DIGITAL_DAC_LEFT_RIGHT_PHASE,1); 
	
	// MCLK is 11.2896 Mhz for logic board. Set BOSR = 0 based
	// table 3.3.2.2 on the tl320dac23 spec.
	audio_tl320dac23_configuration(BASE_OVERSAMPLING_RATE,0); 
	
	
	// Configure sample rate control	
	switch(sample_rate)
	{
#ifdef CODEC_CRYSTAL_5P6MHZ
	
		case SAMPLE_44P1_KHZ:
			audio_tl320dac23_configuration(CLOCK_INPUT_DIVIDER,0);
			audio_tl320dac23_configuration(SAMPLE_RATE_VALUE,7);
			break;
		case SAMPLE_22P05_KHZ:
			audio_tl320dac23_configuration(CLOCK_INPUT_DIVIDER,0);
			audio_tl320dac23_configuration(SAMPLE_RATE_VALUE,0x0);
			break;
		case SAMPLE_11P025_KHZ:
			audio_tl320dac23_configuration(CLOCK_INPUT_DIVIDER,1);
			audio_tl320dac23_configuration(SAMPLE_RATE_VALUE,0x0);
			break;
		case SAMPLE_8_KHZ:
			audio_tl320dac23_configuration(CLOCK_INPUT_DIVIDER,1);
			audio_tl320dac23_configuration(SAMPLE_RATE_VALUE,0x6);
			break;
		case SAMPLE_4_KHZ:
			audio_tl320dac23_configuration(CLOCK_INPUT_DIVIDER,0);
			audio_tl320dac23_configuration(SAMPLE_RATE_VALUE,0xB);
			break;
		case SAMPLE_2_KHZ:
			audio_tl320dac23_configuration(CLOCK_INPUT_DIVIDER,1);
			audio_tl320dac23_configuration(SAMPLE_RATE_VALUE,0xA);
			break;
		default:
			break;
#else
// Codec crystal is 11.2896 Mhz

		case SAMPLE_44P1_KHZ:
			audio_tl320dac23_configuration(CLOCK_INPUT_DIVIDER,0);
			audio_tl320dac23_configuration(SAMPLE_RATE_VALUE,8);
			break;
		case SAMPLE_22P05_KHZ:
			audio_tl320dac23_configuration(CLOCK_INPUT_DIVIDER,1);
			audio_tl320dac23_configuration(SAMPLE_RATE_VALUE,0x8);
			break;
		case SAMPLE_8_KHZ:
			audio_tl320dac23_configuration(CLOCK_INPUT_DIVIDER,0);
			audio_tl320dac23_configuration(SAMPLE_RATE_VALUE,0xB);
			break;
		case SAMPLE_4_KHZ:
			audio_tl320dac23_configuration(CLOCK_INPUT_DIVIDER,1);
			audio_tl320dac23_configuration(SAMPLE_RATE_VALUE,0xA);
			break;
		default:
			break;
	
#endif
		
	//SAMPLE_48_KHZ,	
	//SAMPLE_44P1_KHZ,	
	//SAMPLE_32_KHZ,	
	//SAMPLE_24_KHZ,	
	//SAMPLE_22P05_KHZ,	
	//SAMPLE_16_KHZ,	
	//SAMPLE_12_KHZ,	
	//SAMPLE_11P025_KHZ,
	//SAMPLE_8_KHZ,	
	//SAMPLE_4_KHZ,	
	//SAMPLE_2_KHZ	
		
	}
	
	// Activate digital interface
	audio_tl320dac23_configuration(DIGITAL_ACTIVATE_INTERFACE,1);

}

/**********************************************************************
*
* Function: audio_tl320dac23_reg_init
*
* Purpose:
*   Put TI TLV320DAC23 audio chip register default value to static 
*	register for further register operation
*  
* Processing:
*
* Parameters:
*	None
*
* Outputs:
*   None
*
* Returns:
*   None
*
* Notes:
*   This function must be called before using "audio_configuration"
*	function
*
**********************************************************************/
static void audio_tl320dac23_reg_init(void)
{
	reg_left_control_default = REG_LEFT_CONTROL_DEFAULT;
	reg_right_control_default = REG_RIGHT_CONTROL_DEFAULT ;		
	reg_left_vol_default = REG_LEFT_VOL_DEFAULT;			
	reg_right_vol_default = REG_RIGHT_VOL_DEFAULT;			
	reg_analog_path_default = REG_ANALOG_PATH_DEFAULT;		
	reg_digital_path_default = REG_DIGITAL_PATH_DEFAULT;		
	reg_power_down_default = REG_POWER_DOWN_DEFAULT;		
	reg_digital_format_default = REG_DIGITAL_FORMAT_DEFAULT;	
	reg_sample_rate_default = REG_SAMPLE_RATE_DEFAULT;	
	reg_digital_activation_default = REG_DIGITAL_ACTIVATION_DEFAULT; 
	reg_reset_default = REG_RESET_DEFAULT;				
}

/**********************************************************************
*
* Function: audio_configuration
*
* Purpose:
*   Use SPI line to configure TI TLV320DAC23 audio chip
*  
* Processing:
*
* Parameters:
*   action:	which action to do configure the audio chip
*	arg:	parameter for this action, usually arg = 1 for yes
*	arg = 0 for no. Detail to see the comments in the code
*
* Outputs:
*   None
*
* Returns:
*   _NO_ERROR:	success.
*   _ERROR:		error in arg.
*
* Notes:
*   Since there is no way to get the current value for the control
*	register. New value write to the control register will be based
*	on the modification of the default register value.
*
**********************************************************************/
INT_32 audio_tl320dac23_configuration(AUDIO_ACTION_T action, INT_32 arg)
{
	INT_32 result = _NO_ERROR;
	INT_32 reg_value;
	
	switch(action)
	{
		case LEFT_LINE_SIMU_UPDATE:
			if(arg == 1)
			{
				/* enable left line simultaneous volume/mute update */
				reg_value = reg_left_control_default | _BIT(8);
				audio_spi_configure(REG_LEFT_CONTROL, reg_value);
				reg_left_control_default = reg_value;
			}
			else if(arg == 0)
			{
				/* disable left line simultaneous volume/mute update */
				reg_value = reg_left_control_default & (~_BIT(8));
				audio_spi_configure(REG_LEFT_CONTROL, reg_value);
				reg_left_control_default = reg_value;
			}
			else
			{
				result = _ERROR;
			}
			break;
		case RIGHT_LINE_SIMU_UPDATE:
			if(arg == 1)
			{
				/* enable right line simultaneous volume/mute update */
				reg_value = reg_right_control_default | _BIT(8);
				audio_spi_configure(REG_RIGHT_CONTROL, reg_value);
				reg_right_control_default = reg_value;
			}
			else if(arg == 0)
			{
				/* disable right line simultaneous volume/mute update */
				reg_value = reg_right_control_default & (~_BIT(8));
				audio_spi_configure(REG_RIGHT_CONTROL, reg_value);
				reg_right_control_default = reg_value;
			}
			else
			{
				result = _ERROR;
			}
			break;
		case LEFT_LINE_INPUT_MUTE:
			if(arg == 1)
			{
				/* left line input is muted */
				reg_value = reg_left_control_default | _BIT(7);
				audio_spi_configure(REG_LEFT_CONTROL, reg_value);
				reg_left_control_default = reg_value;
			}
			else if(arg == 0)
			{
				/* left line input is normal */
				reg_value = reg_left_control_default & (~_BIT(7));
				audio_spi_configure(REG_LEFT_CONTROL, reg_value);
				reg_left_control_default = reg_value;
			}
			else
			{
				result = _ERROR;
			}
			break;
		case RIGHT_LINE_INPUT_MUTE:
			if(arg == 1)
			{
				/* right line input is muted */
				reg_value = reg_right_control_default | _BIT(7);
				audio_spi_configure(REG_RIGHT_CONTROL, reg_value);
				reg_right_control_default = reg_value;
			}
			else if(arg == 0)
			{
				/* right line input is normal */
				reg_value = reg_right_control_default & (~_BIT(7));
				audio_spi_configure(REG_RIGHT_CONTROL, reg_value);
				reg_right_control_default = reg_value;
			}
			else
			{
				result = _ERROR;
			}
			break;
		case LEFT_HEADPHONE_SIMU_UPDATE:
			if(arg == 1)
			{
				/* left headphoine channel simultaneous volume
				mute update */
				reg_value = reg_left_vol_default | _BIT(8);
				audio_spi_configure(REG_LEFT_VOL, reg_value);
				reg_left_vol_default = reg_value;
			}
			else if(arg == 0)
			{
				/* disable left headphone channel simultaneous volume
				mute update */
				reg_value = reg_left_vol_default & (~_BIT(8));
				audio_spi_configure(REG_LEFT_VOL, reg_value);
				reg_left_vol_default = reg_value;
			}
			else
			{
				result = _ERROR;
			}
			break;
		case RIGHT_HEADPHONE_SIMU_UPDATE:
			if(arg == 1)
			{
				/* right headphone channel simultaneous volume
				mute update */
				reg_value = reg_right_vol_default | _BIT(8);
				audio_spi_configure(REG_RIGHT_VOL, reg_value);
				reg_right_vol_default = reg_value;
			}
			else if(arg == 0)
			{
				/* disable right headphone channel simultaneous volume
				mute update */
				reg_value = reg_right_vol_default & (~_BIT(8));
				audio_spi_configure(REG_RIGHT_VOL, reg_value);
				reg_right_vol_default = reg_value;
			}
			else
			{
				result = _ERROR;
			}
			break;
		case LEFT_CHANNEL_ZERO_CROSS_DETECT:
			if(arg == 1)
			{
				/* turn on left channel zero-crsoo detect */
				reg_value = reg_left_vol_default | _BIT(7);
				audio_spi_configure(REG_LEFT_VOL, reg_value);
				reg_left_vol_default = reg_value;
			}
			else if(arg == 0)
			{
				/* turn off left channel zero-crsoo detect */
				reg_value = reg_left_vol_default & (~_BIT(7));
				audio_spi_configure(REG_LEFT_VOL, reg_value);
				reg_left_vol_default = reg_value;
			}
			else
			{
				result = _ERROR;
			}
			break;
		case RIGHT_CHANNEL_ZERO_CROSS_DETECT:
			if(arg == 1)
			{
				/* turn on right channel zero-crsoo detect */
				reg_value = reg_right_vol_default | _BIT(7);
				audio_spi_configure(REG_RIGHT_VOL, reg_value);
				reg_right_vol_default = reg_value;
			}
			else if(arg == 0)
			{
				/* turn off right channel zero-crsoo detect */
				reg_value = reg_right_vol_default & (~_BIT(7));
				audio_spi_configure(REG_RIGHT_VOL, reg_value);
				reg_right_vol_default = reg_value;
			}
			else
			{
				result = _ERROR;
			}
			break;
		case LEFT_HEADPHONE_VOL:
			/* Set left channel volume - arg = input db from
			+6 dB to -73 dB. -73 dB is mute, +6 dB is loudest */
			if((arg >= -73) && (arg <= 6))
			{
				/* Set left headphone volume */
				// Clear the volume bits
				reg_value = reg_left_vol_default & (~0x7f);
				reg_value |= (arg + (0x7f - 6));
				audio_spi_configure(REG_LEFT_VOL, reg_value);
				reg_left_vol_default = reg_value;
			}
			else
			{
				result = _ERROR;
			}
			break;
		case RIGHT_HEADPHONE_VOL:
			/* Set right channel volume - arg = input db from
			+6 dB to -73 dB. -73 dB is mute, +6 dB is loudest */
			if((arg >= -73) && (arg <= 6))
			{
				/* Set right headphone volume */
				// Clear the volume bits
				reg_value = reg_right_vol_default & (~0x7f);
				reg_value |= (arg + (0x7f - 6));
				audio_spi_configure(REG_RIGHT_VOL, reg_value);
				reg_right_vol_default = reg_value;
			}
			else
			{
				result = _ERROR;
			}
			break;
		case ANALOG_AUDIO_DAC:
			if(arg == 1)
			{
				/* turn on analog audio dac */
				reg_value = reg_analog_path_default | _BIT(4);
				audio_spi_configure(REG_ANALOG_PATH, reg_value);
				reg_analog_path_default = reg_value;
			}
			else if(arg == 0)
			{
				/* turn off analog audio dac */
				reg_value = reg_analog_path_default & (~_BIT(4));
				audio_spi_configure(REG_ANALOG_PATH, reg_value);
				reg_analog_path_default = reg_value;
			}
			else
			{
				result = _ERROR;
			}
			break;
		case ANALOG_AUDIO_BYPASS:
			if(arg == 1)
			{
				/* Enable analog audio bypass */
				reg_value = reg_analog_path_default | _BIT(3);
				audio_spi_configure(REG_ANALOG_PATH, reg_value);
				reg_analog_path_default = reg_value;
			}
			else if(arg == 0)
			{
				/* Disable analog audio bypass */
				reg_value = reg_analog_path_default & (~_BIT(3));
				audio_spi_configure(REG_ANALOG_PATH, reg_value);
				reg_analog_path_default = reg_value;
			}
			else
			{
				result = _ERROR;
			}
			break;
		case DIGITAL_AUDIO_DAC_SOFT_MUTE:
			if(arg == 1)
			{
				/* Enable digital audio dac soft mute */
				reg_value = reg_digital_path_default | _BIT(3);
				audio_spi_configure(REG_DIGITAL_PATH, reg_value);
				reg_digital_path_default = reg_value;
			}
			else if(arg == 0)
			{
				/* Disable digital audio dac soft mute */
				reg_value = reg_digital_path_default & (~_BIT(3));
				audio_spi_configure(REG_DIGITAL_PATH, reg_value);
				reg_digital_path_default = reg_value;
			}
			else
			{
				result = _ERROR;
			}
			break;
		case DIGITAL_AUDIO_DE_EMPHASIS:
			if(arg == DE_EM_DISABLE)
			{
				/* Digital audio de-emphasis is disabled */
				reg_value = reg_digital_path_default & (~(_BIT(2)|_BIT(1)));
				reg_value |= (0<<1);
				audio_spi_configure(REG_DIGITAL_PATH, reg_value);
				reg_digital_path_default = reg_value;
			}
			else if(arg == DE_EM_32KHZ)
			{
				/* Digital audio de-emphasis is 32 khz */
				reg_value = reg_digital_path_default & (~(_BIT(2)|_BIT(1)));

⌨️ 快捷键说明

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