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

📄 wm9705.c

📁 WM9713 audio codec driver for WinCE 5.0
💻 C
字号:
/*-----------------------------------------------------------------------------
 * Copyright (c) Wolfson Microelectronics plc.  All rights reserved.
 *
 * This software as well as any related documentation is furnished under 
 * license and may only be used or copied in accordance with the terms of the 
 * license. The information in this file is furnished for informational use 
 * only, is subject to change without notice, and should not be construed as 
 * a commitment by Wolfson Microelectronics plc. Wolfson Microelectronics plc
 * assumes no responsibility or liability for any errors or inaccuracies that
 * may appear in this document or any software that may be provided in
 * association with this document. 
 *
 * Except as permitted by such license, no part of this document may be 
 * reproduced, stored in a retrieval system, or transmitted in any form or by 
 * any means without the express written consent of Wolfson Microelectronics plc. 
 *
 * $Id: WM9705.c 2570 2006-01-12 10:02:57Z fb $
 *
 * This file specifies the per-device specific behaviour for the WM9705.
 *
 * Warning:
 *  This driver is specifically written for Wolfson Codecs. It is not a 
 *  general CODEC device driver.
 *
 * --------------------------------------------------------------------------*/

/*
 * Include files
 */
#include "WMCommon.h"
#include "WM97Power.h"
#include "WMPlatformACLink.h"
#include "WMAuxADC.h"
#include "WMTouch.h"
#include "WMTouchDefs.h"
#include "WM97Audio.h"
#include "WM97AudioPaths.h"

#if WM9705_FAMILY

/*
 * Global definitions
 */

#if WM_USE_SHADOW_REGISTERS
/*
 * Shadow registers
 */
static const WM_SHADOW_REGISTERS s_WM9705Shadowed[] =
{
    { WM97_MASTER_VOLUME,           0x8000 },   /* 0x02 */
    { WM97_HEADPHONE,               0x8000 },   /* 0x04 */
    { WM97_MASTER_VOLUME_MONO,      0x8000 },   /* 0x06 */
    { WM97_PCBEEP,                  0x8000 },   /* 0x0A */
    { WM97_PHONE_VOLUME,            0x8008 },   /* 0x0C */
    { WM97_MIC_VOLUME,              0x8008 },   /* 0x0E */
    { WM97_LINEIN_VOLUME,           0x8808 },   /* 0x10 */
    { WM97_CD_VOLUME,               0x8808 },   /* 0x12 */
    { WM97_VIDEO_VOLUME,            0x8808 },   /* 0x14 */
    { WM97_AUX_VOLUME,              0x8808 },   /* 0x16 */
    { WM97_DAC_VOLUME,              0x8808 },   /* 0x18 */
    { WM97_REC_SELECT,              0x0000 },   /* 0x1A */
    { WM97_REC_GAIN,                0x8000 },   /* 0x1C */
    { WM97_GENERAL,                 0x0000 },   /* 0x20 */
    { WM97_3D_CONTROL,              0x0000 },   /* 0x22 */
    { WM97_FRONT_MIXER_VOLUME,      0x0808 },   /* 0x72 */
    { WM9705_ADD_FUN,               0x0000 }    /* 0x74 */
};
#endif /* WM_USE_SHADOW_REGISTERS */

/*
 * A table for the ADCs
 * 
 * Values are ADC select register value, ADC data register value
 * (or WM_AUXADC_INVALID for both if that AuxADC input is not
 * supported), and whether it requires pen down.
 */
static const WM_AUXADC_DETAILS s_adcDetailsWM9705[] =
{
    { WM_AUXADC_X_COORD,    WM_AUXADC_X_COORD,      TRUE },     /* WM_ADC_X_COORD */
    { WM_AUXADC_Y_COORD,    WM_AUXADC_Y_COORD,      TRUE },     /* WM_ADC_Y_COORD */
    { WM_AUXADC_INVALID,    WM_AUXADC_INVALID,      FALSE },    /* WM_ADC_TOUCH */
    { WM_AUXADC_PRESSURE,   WM_AUXADC_PRESSURE,     TRUE },     /* WM_ADC_PRESSURE */
    { WM9705_AUXADC_BMON,   WM9705_AUXADC_BMON,     FALSE },    /* WM_ADC_BMON */
    { WM_AUXADC_AUXADC,     WM_AUXADC_AUXADC,       FALSE },    /* WM_ADC_AUXADC */
    { WM_AUXADC_PHONE,      WM_AUXADC_PHONE,        FALSE },    /* WM_ADC_PHONE */
    { WM_AUXADC_PCBEEP,     WM_AUXADC_PCBEEP,       FALSE },    /* WM_ADC_PCBEEP */
    { WM_AUXADC_INVALID,    WM_AUXADC_INVALID,      FALSE },    /* WM_ADC_COMP1 */
    { WM_AUXADC_INVALID,    WM_AUXADC_INVALID,      FALSE },    /* WM_ADC_COMP2 */
    { WM_AUXADC_INVALID,    WM_AUXADC_INVALID,      FALSE },    /* WM_ADC_WIPER */
    { WM_AUXADC_AUXADC,     WM_AUXADC_AUXADC,       FALSE },    /* WM_ADC_AUX1 */
    { WM_AUXADC_INVALID,    WM_AUXADC_INVALID,      FALSE },    /* WM_ADC_AUX2 */
    { WM_AUXADC_INVALID,    WM_AUXADC_INVALID,      FALSE },    /* WM_ADC_AUX3 */
    { WM_AUXADC_INVALID,    WM_AUXADC_INVALID,      FALSE }     /* WM_ADC_AUX4 */
};

/*
 * Tables for the record sources
 */

static WM_RECSOURCE_DETAILS s_WM9705RecordSourceDetails =
{
    WM97_REC_SELECT, 
    WM97_RECSRCL_MASK,
    WM97_RECSRCR_MASK,
    WM97_RECSRC_MASK
};

static const WM_RECSOURCE_SIGNALS s_WM9705RecordSourceSignals[] =
{
    { WM_AUDIO_MIC1,            WM97_RECSRCL_MIC,       WM97_RECSRCR_MIC },
    { WM_AUDIO_MIC2,            WM97_RECSRCL_MIC,       WM97_RECSRCR_MIC },
    { WM_AUDIO_CD,              WM97_RECSRCL_CD,        WM97_RECSRCR_CD },
    { WM_AUDIO_VIDEO,           WM97_RECSRCL_VIDEO,     WM97_RECSRCR_VIDEO },
    { WM_AUDIO_AUXIN,           WM97_RECSRCL_AUXIN,     WM97_RECSRCR_AUXIN },
    { WM_AUDIO_LINEIN,          WM97_RECSRCL_LINEIN,    WM97_RECSRCR_LINEIN },
    { WM_AUDIO_HEADPHONE,       WM97_RECSRCL_HEADPHONE, WM97_RECSRCR_HEADPHONE },
    { WM_AUDIO_HEADPHONE_MIXER, WM97_RECSRCL_HEADPHONE, WM97_RECSRCR_HEADPHONE },
    { WM_AUDIO_PHONEOUT,        WM97_RECSRCL_PHONEMIX,  WM97_RECSRCR_PHONEMIX },
    { WM_AUDIO_PHONE_MIXER,     WM97_RECSRCL_PHONEMIX,  WM97_RECSRCR_PHONEMIX },
    { WM_AUDIO_MONOOUT,         WM97_RECSRCL_PHONEMIX,  WM97_RECSRCR_PHONEMIX },
    { WM_AUDIO_PHONEIN,         WM97_RECSRCL_PHONE,     WM97_RECSRCR_PHONE }
};

/*
 * A table for signals.
 */
static const WM_SIGNAL_DETAILS s_WM9705Signals[] =
{
    /* Inputs */
    WM_SIG_AC97_STEREO_IN ( WM_AUDIO_LINEIN,            WM_SIG_ANALOGUE_INPUT,    WM97_LINEIN_VOLUME ),
    WM_SIG_AC97_MONO_IN   ( WM_AUDIO_PHONEIN,           WM_SIG_ANALOGUE_INPUT,    WM97_PHONE_VOLUME,          WM_SIG_SHIFT( 0 ) ),
    WM_SIG_AC97_MONO_IN   ( WM_AUDIO_MIC,               WM_SIG_ANALOGUE_INPUT,    WM97_MIC_VOLUME,            WM_SIG_SHIFT( 0 ) ),
    WM_SIG_AC97_STEREO_IN ( WM_AUDIO_CD,                WM_SIG_ANALOGUE_INPUT,    WM97_CD_VOLUME ),
    WM_SIG_AC97_STEREO_IN ( WM_AUDIO_VIDEO,             WM_SIG_ANALOGUE_INPUT,    WM97_VIDEO_VOLUME ),
    WM_SIG_AC97_STEREO_IN ( WM_AUDIO_AUXIN,             WM_SIG_ANALOGUE_INPUT,    WM97_AUX_VOLUME ),
    WM_SIG_AC97_PCBEEP_STD( WM97_PCBEEP ),
    /* DACs are inputs to the analogue domain - i.e. they generate analogue signals */
    WM_SIG_AC97_STEREO_IN ( WM_AUDIO_HIFI_DAC,          WM_SIG_DAC,               WM97_DAC_VOLUME ),

    /* Outputs */
    WM_SIG_AC97_STEREO_OUT( WM_AUDIO_SPEAKER,           WM_SIG_ANALOGUE_OUTPUT,   WM97_SPEAKER_VOLUME ),
    WM_SIG_AC97_STEREO_OUT( WM_AUDIO_HEADPHONE,         WM_SIG_ANALOGUE_OUTPUT,   WM97_HEADPHONE ),
    WM_SIG_AC97_MONO_OUT  ( WM_AUDIO_MONOOUT,           WM_SIG_ANALOGUE_OUTPUT,   WM97_MASTER_VOLUME_MONO,    WM_SIG_SHIFT( 0 ) ),
    /* ADCs are outputs from the analogue domain - i.e. they receive analogue signals */
    WM_SIG_AC97_STEREO_OUT( WM_AUDIO_HIFI_ADC,          WM_SIG_ADC,               WM97_REC_GAIN ),

    /* Mixers */                                                                                     
    WM_SIG_AC97_STEREO_IN ( WM_AUDIO_FRONT_MIXER,       WM_SIG_MIXER,             WM97_FRONT_MIXER_VOLUME )
};

/*
 * The microphone select details.
 */
static const WM_MIC_CONTROL_DETAILS s_WM905MicControl[] =
{
    { 
        WM_AUDIO_MIC1,                                  /* Mic Id             */
        WM97_GENERAL,                                   /* Mic select Reg     */
        WM97_MIC_SEL_MIC1,                              /* Mic select Bits    */
        WM97_MIC_SEL_MASK,                              /* Mic select Mask    */
        WM_AUDIO_MIC_REC_BOOST,                         /* Mic info  Flags    */
        WM97_MIC_VOLUME,                                /* Rec Boost Reg      */
        WM97_MIC_20dB_BOOST,                            /* Rec Boost Bit      */
        WM_REG_INVALID,                                 /* Record PGA         */
        0,                                              /* Record PGA         */
        WM_REG_INVALID,                                 /* ALC Control Reg    */
        0,                                              /* ALC Control Val    */
        WM_REG_INVALID,                                 /* ALC Noise Gate Reg */
        0,                                              /* ALC Noise Gate Val */
    },
    {
        WM_AUDIO_MIC2,                                  /* Mic Id             */
        WM97_GENERAL,                                   /* Mic select Reg     */
        WM97_MIC_SEL_MIC2,                              /* Mic select Bits    */
        WM97_MIC_SEL_MASK,                              /* Mic select Mask    */
        WM_AUDIO_MIC_REC_BOOST,                         /* Mic info  Flags    */
        WM97_MIC_VOLUME,                                /* Rec Boost Reg      */
        WM97_MIC_20dB_BOOST,                            /* Rec Boost Bit      */
        WM_REG_INVALID,                                 /* Record PGA         */
        0,                                              /* Record PGA         */
        WM_REG_INVALID,                                 /* ALC Control Reg    */
        0,                                              /* ALC Control Val    */
        WM_REG_INVALID,                                 /* ALC Noise Gate Reg */
        0,                                              /* ALC Noise Gate Val */
    }
};

/*
 * Stream to channel mappings.
 */
static const WM_STREAM_MAPPING s_WM9705StreamMappings[] =
{
    { WM_STREAM_HIFI_OUT, WMAUDIO_AC97_STEREO_OUT },
    { WM_STREAM_HIFI_IN, WMAUDIO_AC97_STEREO_IN }
};

/*
 * Sample rates.
 */
static const WM_SAMPLE_RATE_PAIR s_SupportedRates[] =
{
    { 8000,  8000 },
    { 11025, 11025 },
    { 16000, 16000 },
    { 22050, 22050 },
    { 32000, 32000 },
    { 44100, 44100 },
    { 48000, 48000 }
};

/*
 * Details of supported interfaces.
 */
static const WM_INTERFACE_DETAILS s_Interfaces[] =
{
    {
        WM_AUDIOIF_HIFI,
        s_SupportedRates,
        WM_ARRAY_COUNT( s_SupportedRates ),
        WM_IF_DUPLEX                            /* flags */
    }
};

/*
 * Finally a function to initialise the chip definition structure.
 */
void InitChipdefWM9705( WM_CHIPDEF *pChipDef )
{
    /* Identifying information */
    pChipDef->deviceType            = WM_CHIP_WM9705;
    pChipDef->deviceName            = "WM9705/10";
    pChipDef->maxRegister           = WM97_MAX_REGISTER;
    pChipDef->regOffset             = 2;
    pChipDef->defaultPower          = WM_POWER_LINK |
                                      WM_POWER_VREF |
                                      WM_POWER_MIXERS |
                                      WM_POWER_AUDIO_HIFI_ADC |
                                      WM_POWER_AUDIO_HIFI_DAC |
                                      WM_POWER_OUTPUTS |
                                      WM_POWER_INPUTS;
    
    /* Shadow Registers */
#if WM_USE_SHADOW_REGISTERS
    pChipDef->pShadowedRegisters    = s_WM9705Shadowed;
    pChipDef->nShadowedRegisters    = WM_ARRAY_COUNT( s_WM9705Shadowed );
#endif /* WM_USE_SHADOW_REGISTERS */
    pChipDef->resetReg              = WM97_RESET;

#if WM_AUXADC
    /* Auxiliary ADCs */
    pChipDef->pAuxADCDetails        = s_adcDetailsWM9705;
    pChipDef->adcCount              = WM_ARRAY_COUNT( s_adcDetailsWM9705 );
#endif /* WM_AUXADC */

#if WM_AUDIO
    /* Interfaces */
    pChipDef->pInterfaces           = s_Interfaces;
    pChipDef->nInterfaces           = WM_ARRAY_COUNT( s_Interfaces );

    /* Signals */
    pChipDef->pRecSourceSignals     = s_WM9705RecordSourceSignals;
    pChipDef->recSourceSignalCount  = WM_ARRAY_COUNT( s_WM9705RecordSourceSignals );
    pChipDef->recSourceDetails      = s_WM9705RecordSourceDetails;
    pChipDef->pSignalDetails        = s_WM9705Signals;
    pChipDef->signalCount           = WM_ARRAY_COUNT( s_WM9705Signals );
    pChipDef->pMicControlDetails    = s_WM905MicControl;
    pChipDef->micControlCount       = WM_ARRAY_COUNT( s_WM905MicControl );
    
    /* Audio streams */
    pChipDef->pStreamMappings       = s_WM9705StreamMappings;
    pChipDef->streamCount           = WM_ARRAY_COUNT( s_WM9705StreamMappings );
    
    /* Default sample rates */
    pChipDef->defADCRate            = 48000;
    pChipDef->defHiFiDACRate        = 48000;
#if WM_VOICE
    pChipDef->defVoiceDACRate       = WM_SAMPLE_RATE_UNKNOWN;
#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              = WM97PowerUp;
    pChipDef->vtable.fnPowerDown            = WM97PowerDown;
    pChipDef->vtable.fnGetPower             = WM97GetCurrentPower;

#if WM_AUDIO
    pChipDef->vtable.fnConfigureInterface   = NULL; /* Not applicable */
    pChipDef->vtable.fnUnconfigureInterface = NULL; /* Not applicable */
    pChipDef->vtable.fnEnableStream         = NULL; /* Not needed */
    pChipDef->vtable.fnDisableStream        = NULL;	/* Not needed */
    pChipDef->vtable.fnSetSampleRate        = WM97SetSampleRate;
    pChipDef->vtable.fnGetSampleRate        = WM97GetSampleRate;
    pChipDef->vtable.fnSetLineInRecPaths    = WM97SetLineInRecPaths;
    pChipDef->vtable.fnClearLineInRecPaths  = NULL;
    pChipDef->vtable.fnSetMicRecPaths       = WM97SetMicRecPaths;
    pChipDef->vtable.fnClearMicRecPaths     = WM97ClearMicRecPaths;
#endif /* WM_AUDIO */

#if WM9705 && WM_AUXADC && WM_STREAM_AUXADC
    pChipDef->vtable.fnReadCTCAuxADC        = WMPlatformACLinkReadCTCAuxADC;
#elif WM_AUXADC && WM_STREAM_AUXADC
    pChipDef->vtable.fnReadCTCAuxADC        = NULL;
#endif /* WM9705 && WM_AUXADC && WM_STREAM_AUXADC */
}
#endif /* WM9705_FAMILY */

/*------------------------------ END OF FILE ---------------------------------*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -