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

📄 wm8753.c

📁 WM9713 audio codec driver for WinCE 5.0
💻 C
📖 第 1 页 / 共 3 页
字号:
    WMACT_DISABLE_STREAM( WM_STREAM_HIFI_IN ),
    
    /* 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.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 + -