📄 lh79524_sdk_audio_driver.c
字号:
/**********************************************************************
* 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 + -