📄 wm8753.c
字号:
/* Mute input PGAs */
WMACT_SET_BITS( WM8753_LEFT_INPUT_VOLUME, WM8753_INVOL_MUTE ),
WMACT_SET_BITS( WM8753_RIGHT_INPUT_VOLUME,
WM8753_INVOL_MUTE | WM8753_VOLUME_UPDATE
),
/* Select LPGA on left, and RPGA on right so we can mute them */
WMACT_SET_FIELD( WM8753_ADC_INPUT_MODE,
WM8753_LEFTADCSEL_PGA | WM8753_RIGHTADCSEL_PGA,
WM8753_LEFTADCSEL_MASK | WM8753_RIGHTADCSEL_MASK
),
/* Make sure nothing is going to the ALC */
WMACT_CLEAR_BITS( WM8753_INPUT_CONTROL_2,
WM8753_LINEALC | WM8753_MIC1ALC | WM8753_MIC2ALC | WM8753_RXALC
),
/* Turn off all output paths */
WMACT_CLEAR_BITS( WM8753_LEFT_OUT_MIX_1, WM8753_MIX2OUT | WM8753_DAC2OUT ),
WMACT_CLEAR_BITS( WM8753_LEFT_OUT_MIX_2, WM8753_ST2OUT | WM8753_VXDAC2OUT ),
WMACT_CLEAR_BITS( WM8753_RIGHT_OUT_MIX_1, WM8753_MIX2OUT | WM8753_DAC2OUT ),
WMACT_CLEAR_BITS( WM8753_RIGHT_OUT_MIX_2, WM8753_ST2OUT | WM8753_VXDAC2OUT ),
WMACT_CLEAR_BITS( WM8753_MONO_OUT_MIX_1, WM8753_MIX2OUT | WM8753_DAC2OUT ),
WMACT_CLEAR_BITS( WM8753_MONO_OUT_MIX_2,
WM8753_ST2OUT | WM8753_DAC2OUT | WM8753_VXD2MO
),
/* Don't record anything */
WMACT_CLEAR_BITS( WM8753_RECORD_MIX_1, WM8753_REC_RMIX | WM8753_REC_LMIX ),
WMACT_CLEAR_BITS( WM8753_RECORD_MIX_2, WM8753_REC_MMIX ),
};
/*
* Powerdown
*
* Low-power state.
*/
static const WM_ACTION s_PowerdownActions[] =
{
/* Stop everything */
WMACT_LOAD_PROFILE( "Standby" ),
/* Now power everything down */
WMACT_POWERDOWN( WM_POWER_ALL ),
};
static const WM_PROFILE s_WM8753Profiles[] =
{
WM_PROFILE_ENTRY( "HiFi Playback", WM_CHIP_WM8753, s_HiFiPlaybackActions ),
WM_PROFILE_ENTRY( "Voice playback", WM_CHIP_WM8753, s_VoicePlaybackActions ),
WM_PROFILE_ENTRY( "Mic record", WM_CHIP_WM8753, s_MicRecordActions ),
WM_PROFILE_ENTRY( "Mic1 record", WM_CHIP_WM8753, s_Mic1RecordActions ),
WM_PROFILE_ENTRY( "Mic2 record", WM_CHIP_WM8753, s_Mic2RecordActions ),
WM_PROFILE_ENTRY( "Line record", WM_CHIP_WM8753, s_LineRecordActions ),
WM_PROFILE_ENTRY( "Mic1/Line record", WM_CHIP_WM8753, s_Mic1LineRecordActions ),
WM_PROFILE_ENTRY( "Mic2/Line record", WM_CHIP_WM8753, s_Mic2LineRecordActions ),
WM_PROFILE_ENTRY( "Mic to Voice", WM_CHIP_WM8753, s_MicToVoiceActions ),
WM_PROFILE_ENTRY( "Mic1 to Voice", WM_CHIP_WM8753, s_Mic1ToVoiceActions ),
WM_PROFILE_ENTRY( "Mic2 to Voice", WM_CHIP_WM8753, s_Mic2ToVoiceActions ),
WM_PROFILE_ENTRY( "Line to Voice", WM_CHIP_WM8753, s_LineToVoiceActions ),
WM_PROFILE_ENTRY( "ALC record", WM_CHIP_WM8753, s_ALCRecordActions ),
WM_PROFILE_ENTRY( "Direct LineIn", WM_CHIP_WM8753, s_DirectLineInRecordActions ),
WM_PROFILE_ENTRY( "Mic1 off", WM_CHIP_WM8753, s_Mic1OffActions ),
WM_PROFILE_ENTRY( "Mic2 off", WM_CHIP_WM8753, s_Mic2OffActions ),
WM_PROFILE_ENTRY( "Line off", WM_CHIP_WM8753, s_LineOffActions ),
WM_PROFILE_ENTRY( "Stop playback", WM_CHIP_WM8753, s_StopPlaybackActions ),
WM_PROFILE_ENTRY( "Stop HiFi playback", WM_CHIP_WM8753, s_StopHiFiPlaybackActions ),
WM_PROFILE_ENTRY( "Stop Voice playback", WM_CHIP_WM8753, s_StopVoicePlaybackActions ),
WM_PROFILE_ENTRY( "Stop record", WM_CHIP_WM8753, s_StopRecordActions ),
WM_PROFILE_ENTRY( "Stop HiFi record", WM_CHIP_WM8753, s_StopRecordActions ),
WM_PROFILE_ENTRY( "Stop Voice record", WM_CHIP_WM8753, s_StopRecordActions ),
WM_PROFILE_ENTRY( "Standby", WM_CHIP_WM8753, s_StandbyActions ),
WM_PROFILE_ENTRY( "Low power", WM_CHIP_WM8753, s_PowerdownActions )
};
/*******************************************************************************
* Stream to channel mappings.
*/
static const WM_STREAM_MAPPING s_WM8753StreamMappings[] =
{
{ WM_STREAM_HIFI_OUT, WMAUDIO_I2S_STEREO_OUT },
{ WM_STREAM_HIFI_IN, WMAUDIO_I2S_STEREO_IN }
#if WM_VOICE
,
{ WM_STREAM_VOICE_OUT, WMAUDIO_VOICE_OUT },
{ WM_STREAM_VOICE_IN, WMAUDIO_VOICE_IN }
#endif /* WM_VOICE */
};
/*******************************************************************************
* Sample rates.
*/
static const WM_SAMPLE_RATE_PAIR s_SupportedRatesHiFi[] =
{
{ 8000, 8000 },
{ 8000, 44100 },
{ 8000, 48000 },
{ 11025, 11025 },
{ 12000, 12000 },
{ 16000, 16000 },
{ 22050, 22050 },
{ 24000, 24000 },
{ 32000, 32000 },
{ 44100, 8000 },
{ 44100, 44100 },
{ 48000, 8000 },
{ 48000, 48000 },
{ 88200, 88200 },
{ 96000, 96000 }
};
static const WM_SAMPLE_RATE_PAIR s_SupportedRatesVoice[] =
{
{ 8000, 8000 },
{ 11025, 11025 },
{ 12000, 12000 },
{ 16000, 16000 },
{ 22050, 22050 },
{ 24000, 24000 },
{ 44100, 44100 },
{ 48000, 48000 }
};
/*******************************************************************************
* Details of supported interfaces.
*/
static const WM_INTERFACE_DETAILS s_Interfaces[] =
{
{
WM_AUDIOIF_HIFI,
s_SupportedRatesHiFi,
WM_ARRAY_COUNT( s_SupportedRatesHiFi ),
WM_IF_EXCLUSIVE_RATES | WM_IF_DUPLEX
},
{
WM_AUDIOIF_VOICE,
s_SupportedRatesVoice,
WM_ARRAY_COUNT( s_SupportedRatesVoice ),
WM_IF_EXCLUSIVE_RATES | WM_IF_DUPLEX
}
};
/*
* Tables for the record sources
*/
static WM_RECSOURCE_DETAILS s_WM8753RecordSourceDetails = {0};
/*
* A table for the signals.
*/
#define WM8753_OUTPUT_SIGNAL( _signal, _flags, _reg ) { \
_signal, _flags | WM_SIG_HAS_UPDATE | WM_SIG_VOLUME_MUTE, \
_reg, WM_SIG_SHIFT( 0 ), WM8753_OUTVOL_MASK, \
WM8753_OUTVOL_MIN, WM8753_OUTVOL_MAX, WM8753_OUTVOL_0DB, WM_SIGNAL_LEVEL(1),\
_reg, 0, WM8753_OUTVOL_MASK, WM8753_OUTVOL_ZEROCROSS, WM8753_VOLUME_UPDATE\
}
static const WM_SIGNAL_DETAILS s_WM8753Signals[] =
{
/* Inputs */
{ WM_AUDIO_LINEIN,
WM_SIG_ANALOGUE_INPUT | WM_CHANNEL_LEFT | WM_SIG_HAS_UPDATE,
WM8753_LEFT_INPUT_VOLUME, WM_SIG_SHIFT( 0 ), WM8753_INVOL_MASK,
WM8753_INVOL_MIN, WM8753_INVOL_MAX, WM8753_INVOL_0DB, WM_SIGNAL_LEVEL(0.75),
WM8753_LEFT_INPUT_VOLUME, WM8753_INVOL_MUTE, WM8753_INVOL_MUTE,
WM_SIG_NO_ZERO_CROSS, WM8753_VOLUME_UPDATE
},
{ WM_AUDIO_LINEIN,
WM_SIG_ANALOGUE_INPUT | WM_CHANNEL_RIGHT | WM_SIG_HAS_UPDATE,
WM8753_RIGHT_INPUT_VOLUME, WM_SIG_SHIFT( 0 ), WM8753_INVOL_MASK,
WM8753_INVOL_MIN, WM8753_INVOL_MAX, WM8753_INVOL_0DB, WM_SIGNAL_LEVEL(0.75),
WM8753_RIGHT_INPUT_VOLUME, WM8753_INVOL_MUTE, WM8753_INVOL_MUTE,
WM_SIG_NO_ZERO_CROSS, WM8753_VOLUME_UPDATE
},
{ WM_AUDIO_MIC1,
WM_SIG_ANALOGUE_INPUT | WM_CHANNEL_MONO,
WM8753_INPUT_CONTROL_1, WM8753_MIC1BOOST_SHIFT, WM8753_MIC1BOOST_MASK,
WM8753_MICBOOST_12DB, WM8753_MICBOOST_30DB, (WM_REGVAL) -2, WM_SIGNAL_LEVEL(6),
WM_REG_INVALID, 0, 0,
WM_SIG_NO_ZERO_CROSS, WM_SIG_NO_SPECIAL
},
{ WM_AUDIO_MIC2,
WM_SIG_ANALOGUE_INPUT | WM_CHANNEL_MONO,
WM8753_INPUT_CONTROL_1, WM8753_MIC2BOOST_SHIFT, WM8753_MIC2BOOST_MASK,
WM8753_MICBOOST_12DB, WM8753_MICBOOST_30DB, (WM_REGVAL) -2, WM_SIGNAL_LEVEL(6),
WM_REG_INVALID, 0, 0,
WM_SIG_NO_ZERO_CROSS, WM_SIG_NO_SPECIAL
},
/* DACs are inputs to the analogue domain - i.e. they generate analogue signals */
{ WM_AUDIO_HIFI_DAC,
WM_SIG_DAC | WM_CHANNEL_LEFT | WM_SIG_HAS_UPDATE,
WM8753_LEFT_DAC_VOLUME, WM_SIG_SHIFT( 0 ), WM8753_DACVOL_MASK,
0x01, 0xFF, WM8753_DACVOL_0DB, WM_SIGNAL_LEVEL(0.5),
WM8753_DAC_CONTROL, WM8753_DAC_SOFT_MUTE, WM8753_DAC_SOFT_MUTE,
WM_SIG_NO_ZERO_CROSS, WM8753_VOLUME_UPDATE
},
{ WM_AUDIO_HIFI_DAC,
WM_SIG_DAC | WM_CHANNEL_RIGHT | WM_SIG_HAS_UPDATE,
WM8753_RIGHT_DAC_VOLUME, WM_SIG_SHIFT( 0 ), WM8753_DACVOL_MASK,
0x01, 0xFF, WM8753_DACVOL_0DB, WM_SIGNAL_LEVEL(0.5),
WM8753_DAC_CONTROL, WM8753_DAC_SOFT_MUTE, WM8753_DAC_SOFT_MUTE,
WM_SIG_NO_ZERO_CROSS, WM8753_VOLUME_UPDATE
},
WM_SIG_NO_VOLUME( WM_AUDIO_VOICE_DAC, WM_SIG_DAC | WM_CHANNEL_MONO ),
/* Outputs */
WM8753_OUTPUT_SIGNAL( WM_AUDIO_HEADPHONE,
WM_SIG_ANALOGUE_OUTPUT | WM_CHANNEL_LEFT,
WM8753_LOUT1_VOLUME ),
WM8753_OUTPUT_SIGNAL( WM_AUDIO_HEADPHONE,
WM_SIG_ANALOGUE_OUTPUT | WM_CHANNEL_RIGHT,
WM8753_ROUT1_VOLUME ),
WM8753_OUTPUT_SIGNAL( WM_AUDIO_SPEAKER,
WM_SIG_ANALOGUE_OUTPUT | WM_CHANNEL_LEFT,
WM8753_LOUT2_VOLUME ),
WM8753_OUTPUT_SIGNAL( WM_AUDIO_SPEAKER,
WM_SIG_ANALOGUE_OUTPUT | WM_CHANNEL_RIGHT,
WM8753_ROUT2_VOLUME ),
WM8753_OUTPUT_SIGNAL( WM_AUDIO_MONOOUT,
WM_SIG_ANALOGUE_OUTPUT | WM_CHANNEL_MONO,
WM8753_MONOOUT_VOLUME ),
WM_SIG_NO_VOLUME( WM_AUDIO_OUT3, WM_SIG_ANALOGUE_OUTPUT | WM_CHANNEL_MONO ),
WM_SIG_NO_VOLUME( WM_AUDIO_OUT4, WM_SIG_ANALOGUE_OUTPUT | WM_CHANNEL_MONO ),
/* ADCs are outputs from the analogue domain - i.e. they receive analogue signals */
{ WM_AUDIO_HIFI_ADC,
WM_SIG_ADC | WM_CHANNEL_LEFT | WM_SIG_HAS_UPDATE | WM_SIG_VOLUME_MUTE,
WM8753_LEFT_ADC_VOLUME, WM_SIG_SHIFT( 0 ), WM8753_ADCVOL_MASK,
0x01, 0xFF, WM8753_ADCVOL_0DB, WM_SIGNAL_LEVEL(0.5),
WM8753_LEFT_ADC_VOLUME, 0, WM8753_ADCVOL_MASK,
WM_SIG_NO_ZERO_CROSS, WM8753_VOLUME_UPDATE
},
{ WM_AUDIO_HIFI_ADC,
WM_SIG_ADC | WM_CHANNEL_RIGHT | WM_SIG_HAS_UPDATE | WM_SIG_VOLUME_MUTE,
WM8753_RIGHT_ADC_VOLUME, WM_SIG_SHIFT( 0 ), WM8753_ADCVOL_MASK,
0x01, 0xFF, WM8753_ADCVOL_0DB, WM_SIGNAL_LEVEL(0.5),
WM8753_RIGHT_ADC_VOLUME, 0, WM8753_ADCVOL_MASK,
WM_SIG_NO_ZERO_CROSS, WM8753_VOLUME_UPDATE
},
};
/*-----------------------------------------------------------------------------
* Function: InitChipdefWM8753
*
* Initialises the chipdef structure for the WM8753.
*
* Parameters:
* pChipDef chipdef structure to fill in.
*
* Returns: void
*---------------------------------------------------------------------------*/
void InitChipdefWM8753( WM_CHIPDEF *pChipDef )
{
/* Identifying information */
pChipDef->deviceType = WM_CHIP_WM8753;
pChipDef->deviceName = "WM8753";
pChipDef->maxRegister = WM8753_MAX_REGISTER;
pChipDef->regOffset = 1;
pChipDef->defaultPower = WM_POWER_LINK; /* + digital */
/* Register details */
pChipDef->regAddrShift = 9;
pChipDef->regAddrMask = 0xFE00;
pChipDef->regDataMask = 0x01FF;
pChipDef->resetReg = WM8753_RESET;
/* Shadow Registers */
#if WM_USE_SHADOW_REGISTERS
pChipDef->pShadowedRegisters = s_WM8753Shadowed;
pChipDef->nShadowedRegisters = WM_ARRAY_COUNT( s_WM8753Shadowed );
#endif /* WM_USE_SHADOW_REGISTERS */
/* Profiles */
pChipDef->profiles = s_WM8753Profiles;
pChipDef->nProfiles = WM_ARRAY_COUNT( s_WM8753Profiles );
#if WM_AUXADC
/* Auxiliary ADCs */
pChipDef->pAuxADCDetails = NULL;
pChipDef->adcCount = 0;
#endif /* WM_AUXADC */
#if WM_AUDIO
/* Interfaces */
pChipDef->pInterfaces = s_Interfaces;
pChipDef->nInterfaces = WM_ARRAY_COUNT( s_Interfaces );
/* Signals */
pChipDef->pRecSourceSignals = NULL;
pChipDef->recSourceSignalCount = 0;
pChipDef->recSourceDetails = s_WM8753RecordSourceDetails;
pChipDef->pSignalDetails = s_WM8753Signals;
pChipDef->signalCount = WM_ARRAY_COUNT( s_WM8753Signals );
pChipDef->pMicControlDetails = NULL;
pChipDef->micControlCount = 0;
/* Audio streams */
pChipDef->pStreamMappings = s_WM8753StreamMappings;
pChipDef->streamCount = WM_ARRAY_COUNT( s_WM8753StreamMappings );
/* Default sample rates */
pChipDef->defADCRate = WM_MCLK_FREQUENCY/256;
pChipDef->defHiFiDACRate = WM_MCLK_FREQUENCY/256;
#if WM_VOICE
pChipDef->defVoiceDACRate = WM_MCLK_FREQUENCY/256;
#endif
#if WM_MONO
pChipDef->defMonoDACRate = WM_SAMPLE_RATE_UNKNOWN;
#endif
#endif /* WM_AUDIO */
/* GPIOs */
pChipDef->pGPIODetails = NULL;
pChipDef->gpioCount = 0;
/*
* The device-specific functions
*/
pChipDef->vtable.fnPowerInit = NULL;
pChipDef->vtable.fnPowerUp = WM8753PowerUp;
pChipDef->vtable.fnPowerDown = WM8753PowerDown;
pChipDef->vtable.fnGetPower = WM8753GetCurrentPower;
#if WM_AUDIO
pChipDef->vtable.fnConfigureInterface = WM8753ConfigureInterface;
pChipDef->vtable.fnUnconfigureInterface = WM8753UnconfigureInterface;
pChipDef->vtable.fnEnableStream = WM8753EnableStream;
pChipDef->vtable.fnDisableStream = WM8753DisableStream;
pChipDef->vtable.fnSetSampleRate = WM8753SetSampleRate;
pChipDef->vtable.fnGetSampleRate = NULL; /* We rely on the cached values */
pChipDef->vtable.fnSetLineInRecPaths = WM8753SetLineInRecPaths;
pChipDef->vtable.fnClearLineInRecPaths = WM8753ClearLineInRecPaths;
pChipDef->vtable.fnSetMicRecPaths = WM8753SetMicRecPaths;
pChipDef->vtable.fnClearMicRecPaths = WM8753ClearMicRecPaths;
#endif /* WM_AUDIO */
#if WM_AUXADC && WM_STREAM_AUXADC
pChipDef->vtable.fnReadCTCAuxADC = NULL;
#endif /* WM_AUXADC && WM_STREAM_AUXADC */
}
#endif /* WM8753_FAMILY */
/*------------------------------ END OF FILE ---------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -