/**
*******************************************************************************
* @file dac.h
* @author Wang Yun
* @version V1.0.0
* @date 30-June-2014
* @brief dac module c header file
*******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, MVSILICON SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
*
© COPYRIGHT 2013 MVSilicon
*/
#ifndef __DAC_H__
#define __DAC_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
#include "type.h"
#define MDAC_DATA_FROM_DEC 0
#define MDAC_DATA_FROM_I2S 1
#define MDAC_MUTE_EN 1
#define MDAC_MUTE_DIS 0
#define MDAC_DITHER_POW 0x1400
/**
* DAC(mixer) input channle
*/
typedef enum _DAC_CHANNEL
{
DAC_CH_NONE = 0,
DAC_CH_FM1_L = 0x01,
DAC_CH_FM2_L = 0x02,
DAC_CH_DECD_L = 0x04,
DAC_CH_LINE_L = 0x08,
DAC_CH_FM1_R = 0x10,
DAC_CH_FM2_R = 0x20,
DAC_CH_DECD_R = 0x40,
DAC_CH_LINE_R = 0x80,
DAC_CH_PGA_L = 0x100,
DAC_CH_PGA_R = 0x200,
DAC_CH_MASK = 0x3FF
} DAC_CHANNEL;
/*****************************************************************************
* Digital part of DAC
******************************************************************************/
/**
* @brief Disable DAC.
* @details Close DAC interpolate filter.
* @param None
* @return None
* @note
*/
void DacDisable(void);
/**
* @brief Enable DAC.
* @details Open CODAC module clock & interpolate filter.
* @param None
* @return None
* @note
*/
void DacEnable(void);
/**
* @brief Set the sample rate of CODAC
* @param SampleRate -> Sample rate the the DAC(8/11.025/12/16/22.05/24/32/44.1/48 KHz)
* Mode -> MCLK mode(USB_MODE/NORMAL_MODE)
* @return None
* @note Audio ADC、Audio DAC和I2S采用同一套时钟源(MCLK,LRCLK,BCLK)
*/
void DacAdcSampleRateSet(uint32_t SampleRate, uint8_t Mode);
/**
* @brief Get the sample rate of CODAC.
* @param None
* @return sample rate of codac
* @note
*/
uint32_t DacAdcSampleRateGet(void);
/**
* @brief 配置DAC模块(MCLK模式、帧同步信号源、开启内置滤波器),必须在调用DacInit函数后使用
* @param DatDirSel -> Dac frame-sync signal select.
* ClkMode -> MCLK mode(USB_MODE/NORMAL_MODE).
* @return None
* @note DatDirSel must be MDAC_DATA_FROM_DEC or MDAC_DATA_FROM_I2S
*/
void DacConfig(uint8_t DatDirSel, uint8_t ClkMode);
/**
* @brief Sidetone config.
* @param SdtgL -> sidetone left channel value.
* @param SdtgR -> sidetone right channel value.
* @return None
*/
void DacSidetoneConfig(uint8_t SdtgL, uint8_t SdtgR);
/**
* @brief DAC (interpolate filter) volume set
* @param LVol -> [0x001:-72dB, 0xFFF:0dB]
* @param RVol -> [0x001:-72dB, 0xFFF:0dB]
* @return None
* @note Digital adc mute When value equals 0x0
* @note Valid only for OFIFOIN_MIX_DACOUT phub path
*/
void DacVolumeSet(uint16_t LVol, uint16_t RVol);
/**
* @brief DAC digital moudle mute on/off control
* @param LeftMuteEn -> set to TRUE to mute the output of the Left channel DAC.
* @param RightMuteEn -> set to TRUE to mute the output of the Right channel DAC.
* @return None
*/
void DacDigitalMuteSet(bool LeftMuteEn, bool RightMuteEn);
/**
* @brief DAC soft-mute on/off control
* @param LeftMuteEn -> set to TRUE to mute the output of the Left channel DAC.
* @param RightMuteEn -> set to TRUE to mute the output of the Right channel DAC.
* @return None
* @note
*/
void DacSoftMuteSet(bool LeftMuteEn, bool RightMuteEn);
/**
* @brief Dac section analog module mute set
* @param LeftMuteEn -> set to TRUE to mute the output of the Left channel dac section.
* @param RightMuteEn -> set to TRUE to mute the output of the Right channel dac section.
* @return None
* @note
*/
void DacAnalogMuteSet(bool LeftMuteEn, bool RightMuteEn);
/**
* @brief DAC mono config
* @param IsMonoEn -> set to TRUE to enable Mono
IsMonoShift -> TRUE: mono output to left channel, shift 180 to right channel
* @return None
* @note IsMonoShift is only valid when IsMonoEn set to TRUE.
*/
void DacMonoConfig(bool IsMonoEn, bool IsMonoShift);
/**
* @brief Codec module dac section analog and digital module mute on/off control
* @param LeftMuteEn -> set to TRUE to mute the output of the Left channel DAC.
* @param RightMuteEn -> set to TRUE to mute the output of the Right channel DAC.
* @return None
* @note
*/
void CodecDacMuteSet(bool LeftMuteEn, bool RightMuteEn);
/**
* @brief adjust DAC clock frequnecy(sample rate)
* @param AdjEn TRUE: enable, FALSE: disable dac samplerate adjustment function
* @param Ppm range:[-524287,524287] >0: clock speed up val*0.2ppm <0:clock slow down val*0.2ppm
* @return None
*/
void DacSampRateAdjust(bool AdjEn, int32_t Ppm);
/**
* @brief Set adc/dac clock mode
* @param 1: usb mode(12M), 0: normal mode
* @return none
*/
void AdcDacClkModeSet(uint8_t ClkMode);
/**
* @brief Check if the DAC's clock mode is USB mode(12MHz) or not.
* @param None
* @retval Return TRUE for USB mode, otherwise return FALSE.
* @note
*/
bool DacIsUsbMode(void);
/**
* @brief not use capasity,chip drive earphone directly
* @param None
* @return None
*/
void DacNoUseCapacityToPlay(void);
/**
* @brief Save the current state of CODEC clock & Open it.
* @param IsFastCharge -> set to TRUE for fast-charge.
* @return None
* @note
*/
void CodecClockEnable(void);
/**
* @brief Restore CODEC clock state.
* @param IsFastCharge -> set to TRUE for fast-charge.
* @return None
* @note
*/
void CodecClockRestore(void);
/**
* @brief codec module DAC section analog volume set.
* @param LVol -> 0:23dB 1:0dB 2:-6dB 3:-12dB
* @param RVol -> 0:23dB 1:0dB 2:-6dB 3:-12dB
* @return None
* @pre
* @note
*/
void CodecDacAnaVolSet(uint8_t LVol, uint8_t RVol);
/**
* @brief Initialize Codec module Dac section.
* @param IsFastCharge -> set to TRUE for fast-charge.
* @return Return TRUE if successful, or FALSE otherwise.
* @pre
* @note
*/
bool CodecDacInit(bool IsFastCharge);
/**
* @brief Deinitialize Codec module Dac section.
* @param IsFastCharge -> set to TRUE for fast-charge.
* @return Return TRUE if successful, or FALSE otherwise.
*/
bool CodecDacDeinit(bool IsFastCharge);
/**
* @brief Codec channel selection.
* @param Channel -> Indicate that which channel will strobe to the MIXER.
* @return Return TRUE if successful, or FALSE otherwise.
* @pre The CodecDacInit() function must be executed previously.
* @note
*/
bool CodecDacChannelSel(uint16_t Channel);
/**
* @brief Codec module dac section channel selection and will not change mute or
unmute mode.
* @param Channel -> Indicate that which channel will strobe to the MIXER.
* @return Return TRUE if successful, or FALSE otherwise.
* @pre The CodecDacInit() function must be executed previously.
* @note The function is different with function named CodecDacChannelSel,it will
not exit mute mode when a connection is established and it will not into
mute mode when a disconnection is established.
*/
bool CodecDacChannelSelNotChangeMode(uint16_t Channel);
/**
* @brief only use Line in analog path
* @param VolLeft -> [0x00:5.34dB, 0x3F:-61.44dB]
* @param VolLeft -> [0x00:5.34dB, 0x3F:-61.44dB]
* @return NONE
*/
void CodecDacLineInGainConfig(uint8_t VolLeft, uint8_t VolRight);
/**
* @brief only use FM in analog path
* @param VolLeft -> [0x00:21.36dB, 0x3F:-53.26dB]
* @param VolLeft -> [0x00:21.36dB, 0x3F:-53.26dB]
* @return NONE
*/
void CodecDacFmInGainConfig(uint8_t VolLeft, uint8_t VolRight);
/**
* @brief only use MIC in analog path
* @param VolLeft -> [0x00:42.0dB, 0x3F:-18.0dB]
* @param VolLeft -> [0x00:42.0dB, 0x3F:-18.0dB]
* @return NONE
*/
void CodecDacMicInGainConfig(uint8_t VolLeft, uint8_t VolRight);
/**
* @brief judge whether DAC digital section is mute
* @param None
* @return Mute is return TRUE otherwise return FALSE
*/
bool CodecDacIsSoftMute(void);
/**
* @brief judge whether DAC analog section left channel is mute
* @param None
* @return Mute is return TRUE otherwise return FALSE
*/
bool DacIsLeftAnaMute(void);
/**
* @brief judge whether DAC analog section right channel is mute
* @param None
* @return Mute is return TRUE otherwise return FALSE
*/
bool DacIsRightAnaMute(void);
/**
* @brief judge whether DAC analog section left and right channel are both mute
* @param None
* @return Mute is return TRUE otherwise return FALSE
*/
bool CodecDacIsAnaMute(void);
/**
* @brief enable mic bias
* @param BiasEn 1: enable 0:disable
* @return None
*/
void CodecMicBiasEn(bool BiasEn);
#ifdef __cplusplus
}
#endif//__cplusplus
#endif //__DAC_H__
//