📄 wm8731.c
字号:
WM_PROFILE_ENTRY( "Mic1 record", WM_CHIP_WM8731, s_MicRecordActions ),
WM_PROFILE_ENTRY( "Line record", WM_CHIP_WM8731, s_LineRecordActions ),
WM_PROFILE_ENTRY( "Mic off", WM_CHIP_WM8731, s_StopRecordActions ),
WM_PROFILE_ENTRY( "Mic1 off", WM_CHIP_WM8731, s_StopRecordActions ),
WM_PROFILE_ENTRY( "Line off", WM_CHIP_WM8731, s_StopRecordActions ),
WM_PROFILE_ENTRY( "Stop playback", WM_CHIP_WM8731, s_StopPlaybackActions ),
WM_PROFILE_ENTRY( "Stop HiFi playback", WM_CHIP_WM8731, s_StopPlaybackActions ),
WM_PROFILE_ENTRY( "Stop record", WM_CHIP_WM8731, s_StopRecordActions ),
WM_PROFILE_ENTRY( "Stop HiFi record", WM_CHIP_WM8731, s_StopRecordActions ),
WM_PROFILE_ENTRY( "Standby", WM_CHIP_WM8731, s_StandbyActions ),
WM_PROFILE_ENTRY( "Low power", WM_CHIP_WM8731, s_PowerdownActions )
};
static const WM_PROFILE s_WM8711Profiles[] =
{
WM_PROFILE_ENTRY( "HiFi playback", WM_CHIP_WM8731, s_HiFiPlaybackActions ),
WM_PROFILE_ENTRY( "Stop playback", WM_CHIP_WM8731, s_StopPlaybackActions ),
WM_PROFILE_ENTRY( "Stop HiFi playback", WM_CHIP_WM8731, s_StopPlaybackActions ),
WM_PROFILE_ENTRY( "Standby", WM_CHIP_WM8731, s_StandbyActions ),
WM_PROFILE_ENTRY( "Low power", WM_CHIP_WM8731, s_PowerdownActions )
};
/*******************************************************************************
* Stream to channel mappings.
*/
static const WM_STREAM_MAPPING s_WM8731StreamMappings[] =
{
{ WM_STREAM_HIFI_OUT, WMAUDIO_I2S_STEREO_OUT },
{ WM_STREAM_HIFI_IN, WMAUDIO_I2S_STEREO_IN }
};
static const WM_STREAM_MAPPING s_WM8711StreamMappings[] =
{
{ WM_STREAM_HIFI_OUT, WMAUDIO_I2S_STEREO_OUT }
};
/*******************************************************************************
* Sample rates.
*/
#if (12288000 == WM_MCLK_FREQUENCY) || (18432000 == WM_MCLK_FREQUENCY) || (24576000 == WM_MCLK_FREQUENCY) || (36864000 == WM_MCLK_FREQUENCY)
static const WM_SAMPLE_RATE_PAIR s_SupportedRates[] =
{
/* First the matched sample rates */
{ 8000, 8000 },
{ 32000, 32000 },
{ 48000, 48000 },
{ 96000, 96000 },
/* Now the unmatched sample rates */
{ 8000, 48000 },
{ 48000, 8000 },
};
#elif (11289600 == WM_MCLK_FREQUENCY) || (16934400 == WM_MCLK_FREQUENCY) || (22579200 == WM_MCLK_FREQUENCY) || (33868800 == WM_MCLK_FREQUENCY)
static const WM_SAMPLE_RATE_PAIR s_SupportedRates[] =
{
/* First the matched sample rates */
{ 8000, 8000 },
{ 44100, 44100 },
{ 88200, 88200 },
/* Now the unmatched sample rates */
{ 8000, 44100 },
{ 44100, 8000 },
};
#elif (6144000 == WM_MCLK_FREQUENCY) || (9216000 == WM_MCLK_FREQUENCY)
static const WM_SAMPLE_RATE_PAIR s_SupportedRates[] =
{
{ 48000, 48000 },
};
#elif (5644800 == WM_MCLK_FREQUENCY) || (8467200 == WM_MCLK_FREQUENCY)
static const WM_SAMPLE_RATE_PAIR s_SupportedRates[] =
{
{ 44100, 44100 },
};
#elif (12000000 == WM_MCLK_FREQUENCY) || (24000000 == WM_MCLK_FREQUENCY)
static const WM_SAMPLE_RATE_PAIR s_SupportedRates[] =
{
/* First the matched sample rates */
{ 8000, 8000 },
{ 32000, 32000 },
{ 44100, 44100 },
{ 48000, 48000 },
{ 88200, 88200 },
{ 96000, 96000 },
/* Now the unmatched sample rates */
{ 8000, 44100 },
{ 8000, 48000 },
{ 44100, 8000 },
{ 48000, 8000 },
};
#else
# error Unsupported MCLK frequency for WM8731.
#endif
/*******************************************************************************
* Details of supported interfaces.
*/
static const WM_INTERFACE_DETAILS s_CodecInterfaces[] =
{
{
WM_AUDIOIF_HIFI,
s_SupportedRates,
WM_ARRAY_COUNT( s_SupportedRates ),
WM_IF_EXCLUSIVE_RATES | WM_IF_DUPLEX
}
};
static const WM_INTERFACE_DETAILS s_DACInterfaces[] =
{
{
WM_AUDIOIF_HIFI,
s_SupportedRates,
WM_ARRAY_COUNT( s_SupportedRates ),
WM_IF_EXCLUSIVE_RATES | WM_IF_PLAYBACK
}
};
/*
* Tables for the record sources
*/
static WM_RECSOURCE_DETAILS s_WM8731RecordSourceDetails = {0};
/*
* A table for the signals.
*/
static const WM_SIGNAL_DETAILS s_WM8731Signals[] =
{
/* Inputs */
{ WM_AUDIO_LINEIN, WM_SIG_ANALOGUE_INPUT | WM_CHANNEL_LEFT | WM_SIG_HAS_BOTH,
WM8731_LEFT_INPUT_VOLUME, WM_SIG_SHIFT( 0 ), WM8731_INVOL_MASK,
0x0, 0x1F, WM8731_INVOL_0DB, WM_SIGNAL_LEVEL(1.5),
WM8731_LEFT_INPUT_VOLUME, WM8731_INVOL_MUTE, WM8731_INVOL_MUTE,
WM_SIG_NO_ZERO_CROSS, WM8731_VOLUME_BOTH
},
{ WM_AUDIO_LINEIN, WM_SIG_ANALOGUE_INPUT | WM_CHANNEL_RIGHT | WM_SIG_HAS_BOTH,
WM8731_RIGHT_INPUT_VOLUME, WM_SIG_SHIFT( 0 ), WM8731_INVOL_MASK,
0x0, 0x1F, WM8731_INVOL_0DB, WM_SIGNAL_LEVEL(1.5),
WM8731_RIGHT_INPUT_VOLUME, WM8731_INVOL_MUTE, WM8731_INVOL_MUTE,
WM_SIG_NO_ZERO_CROSS, WM8731_VOLUME_BOTH
},
{ WM_AUDIO_MIC, WM_SIG_ANALOGUE_INPUT | WM_CHANNEL_MONO,
WM8731_ANALOGUE_PATH_CONTROL, WM_SIG_SHIFT( 0 ), WM8731_INVOL_MASK,
0x0, WM8731_MIC_BOOST, 0, WM_SIGNAL_LEVEL(20),
WM8731_ANALOGUE_PATH_CONTROL, WM8731_MUTE_MIC, WM8731_MUTE_MIC,
WM_SIG_NO_ZERO_CROSS, WM_SIG_NO_SPECIAL
},
/* DACs are inputs to the analogue domain - i.e. they generate analogue signals */
WM_SIG_NO_VOLUME_MUTE(
WM_AUDIO_HIFI_DAC, WM_SIG_DAC | WM_CHANNEL_STEREO,
WM8731_DIGITAL_PATH_CONTROL, WM8731_DAC_MUTE
),
/* Outputs */
{ WM_AUDIO_HEADPHONE, WM_SIG_ANALOGUE_OUTPUT | WM_CHANNEL_LEFT | WM_SIG_HAS_BOTH | WM_SIG_VOLUME_MUTE,
WM8731_LEFT_HEADPHONE_VOLUME, WM_SIG_SHIFT( 0 ), WM8731_OUTVOL_MASK,
0x30, 0x7F, WM8731_OUTVOL_0DB, WM_SIGNAL_LEVEL(1),
WM8731_LEFT_HEADPHONE_VOLUME, 0, WM8731_OUTVOL_MASK,
WM8731_OUTVOL_ZERO_CROSS, WM8731_VOLUME_BOTH,
},
{ WM_AUDIO_HEADPHONE, WM_SIG_ANALOGUE_OUTPUT | WM_CHANNEL_RIGHT | WM_SIG_HAS_BOTH | WM_SIG_VOLUME_MUTE,
WM8731_RIGHT_HEADPHONE_VOLUME, WM_SIG_SHIFT( 0 ), WM8731_OUTVOL_MASK,
0x30, 0x7F, WM8731_OUTVOL_0DB, WM_SIGNAL_LEVEL(1),
WM8731_RIGHT_HEADPHONE_VOLUME, 0, WM8731_OUTVOL_MASK,
WM8731_OUTVOL_ZERO_CROSS, WM8731_VOLUME_BOTH,
},
/* ADCs are outputs from the analogue domain - i.e. they receive analogue signals */
WM_SIG_NO_VOLUME( WM_AUDIO_HIFI_ADC, WM_SIG_ADC | WM_CHANNEL_STEREO ),
};
/*-----------------------------------------------------------------------------
* Function: InitChipdefWM8731
*
* Initialises the chipdef structure for the WM8731.
*
* Parameters:
* pChipDef chipdef structure to fill in.
*
* Returns: void
*---------------------------------------------------------------------------*/
void InitChipdefWM8731( WM_CHIPDEF *pChipDef )
{
/* Identifying information */
pChipDef->deviceType = WM_CHIP_WM8731;
pChipDef->deviceName = "WM8731/WM8734";
pChipDef->maxRegister = WM8731_MAX_REGISTER;
pChipDef->regOffset = 1;
pChipDef->defaultPower = WM_POWER_LINK | WM_POWER_CLOCK;
/* Register details */
pChipDef->regAddrShift = 9;
pChipDef->regAddrMask = 0xFE00;
pChipDef->regDataMask = 0x01FF;
pChipDef->resetReg = WM8731_RESET;
/* Shadow Registers */
#if WM_USE_SHADOW_REGISTERS
pChipDef->pShadowedRegisters = s_WM8731Shadowed;
pChipDef->nShadowedRegisters = WM_ARRAY_COUNT( s_WM8731Shadowed );
#endif /* WM_USE_SHADOW_REGISTERS */
/* Profiles */
pChipDef->profiles = s_WM8731Profiles;
pChipDef->nProfiles = WM_ARRAY_COUNT( s_WM8731Profiles );
#if WM_AUXADC
/* Auxiliary ADCs */
pChipDef->pAuxADCDetails = NULL;
pChipDef->adcCount = 0;
#endif /* WM_AUXADC */
#if WM_AUDIO
/* Interfaces */
pChipDef->pInterfaces = s_CodecInterfaces;
pChipDef->nInterfaces = WM_ARRAY_COUNT( s_CodecInterfaces );
/* Signals */
pChipDef->pRecSourceSignals = NULL;
pChipDef->recSourceSignalCount = 0;
pChipDef->recSourceDetails = s_WM8731RecordSourceDetails;
pChipDef->pSignalDetails = s_WM8731Signals;
pChipDef->signalCount = WM_ARRAY_COUNT( s_WM8731Signals );
pChipDef->pMicControlDetails = NULL;
pChipDef->micControlCount = 0;
/* Audio streams */
pChipDef->pStreamMappings = s_WM8731StreamMappings;
pChipDef->streamCount = WM_ARRAY_COUNT( s_WM8731StreamMappings );
/* Default sample rates */
pChipDef->defADCRate = WM_MCLK_FREQUENCY/256;
pChipDef->defHiFiDACRate = WM_MCLK_FREQUENCY/256;
pChipDef->defVoiceDACRate = WM_SAMPLE_RATE_UNKNOWN;
pChipDef->defMonoDACRate = WM_SAMPLE_RATE_UNKNOWN;
#endif /* WM_AUDIO */
/* GPIOs */
pChipDef->pGPIODetails = NULL;
pChipDef->gpioCount = 0;
/*
* The device-specific functions
*/
pChipDef->vtable.fnPowerUp = WM8731PowerUp;
pChipDef->vtable.fnPowerDown = WM8731PowerDown;
pChipDef->vtable.fnGetPower = WM8731GetCurrentPower;
#if WM_AUDIO
pChipDef->vtable.fnConfigureInterface = WM8731ConfigureInterface;
pChipDef->vtable.fnUnconfigureInterface = WM8731UnconfigureInterface;
pChipDef->vtable.fnEnableStream = NULL;
pChipDef->vtable.fnDisableStream = NULL;
pChipDef->vtable.fnSetSampleRate = WM8731SetSampleRate;
pChipDef->vtable.fnGetSampleRate = NULL; /* We rely on the cached values */
pChipDef->vtable.fnSetLineInRecPaths = NULL;
pChipDef->vtable.fnClearLineInRecPaths = NULL;
pChipDef->vtable.fnSetMicRecPaths = NULL;
pChipDef->vtable.fnClearMicRecPaths = NULL;
#endif /* WM_AUDIO */
#if WM_AUXADC && WM_STREAM_AUXADC
pChipDef->vtable.fnReadCTCAuxADC = NULL;
#endif /* WM_AUXADC && WM_STREAM_AUXADC */
}
#endif /* WM8731_FAMILY */
/*------------------------------ END OF FILE ---------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -