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

📄 wm9713.c

📁 WM9713 audio codec driver for WinCE 5.0
💻 C
📖 第 1 页 / 共 2 页
字号:
/*-----------------------------------------------------------------------------
 * 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: WM9713.c 2571 2006-01-12 10:26:00Z fb $
 *
 * This file specifies the per-device specific behaviour for the WM9713.
 *
 * 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 "WMGPIO.h"
#include "WM97Audio.h"
#include "WM97AudioPaths.h"
#include "WM9713Audio.h"

#if WM9713_FAMILY

/*
 * Global definitions
 */

#if WM_USE_SHADOW_REGISTERS
/*
 * Shadow registers
 */
static const WM_SHADOW_REGISTERS s_WM9713Shadowed[] =
{
    { WM97_SPEAKER_VOLUME,          0x8080 },   /* 0x02 */
    { WM97_HEADPHONE,               0x8080 },   /* 0x04 */
    { WM9713_OUT3_4_VOLUME,         0x8080 },   /* 0x06 */
    { WM9713_MONO_VOLUME,           0xC880 },   /* 0x08 */
    { WM9713_LINEIN_VOLUME,         0xE808 },   /* 0x0A */
    { WM9713_DAC_VOLUME,            0xE808 },   /* 0x0C */
    { WM97_MIC_VOLUME,              0x0808 },   /* 0x0E */
    { WM9713_MIC_ROUTING,           0x00DA },   /* 0x10 */
    { WM9713_REC_VOLUME,            0x8000 },   /* 0x12 */
    { WM9713_REC_ROUTING,           0xD600 },   /* 0x14 */
    { WM9713_PCBEEP_VOLUME,         0xAAA0 },   /* 0x16 */
    { WM9713_VXDAC_VOLUME,          0xAAA0 },   /* 0x18 */
    { WM9713_AUXDAC_VOLUME,         0xAAA0 },   /* 0x1A */
    { WM9713_OUTPUT_SELECT,         0x0000 },   /* 0x1C */
    { WM9713_3D_INV_MUX_CONTROL,    0x0000 },   /* 0x1E */
    { WM9713_DAC_TONE_CONTROL,      0x0F0F },   /* 0x20 */
    { WM9713_MIC_SELECT,            0x0040 },   /* 0x22 */
    { WM9713_OUTPUT_VOL_MAPPING,    0x0000 },   /* 0x24 */
    { WM9713_VOICE_CODEC_CONTROL,   0x4523 },   /* 0x36 */
    { WM9713_GENERAL,               0x0000 },   /* 0x40 */
    { WM9713_MCLK_CONTROL_1,        0x0080 },   /* 0x44 */
    { WM9713_MCLK_CONTROL_2,        0x0000 },   /* 0x46 */
    { WM97_GPIO_PIN_CONFIG,         0xFFFE },   /* 0x4C */
    { WM97_GPIO_PIN_POLARITY,       0xFFFF },   /* 0x4E */
    { WM97_GPIO_PIN_STICKY,         0x0000 },   /* 0x50 */
    { WM97_GPIO_PIN_WAKEUP,         0x0000 },   /* 0x52 */
    { WM97_GPIO_PIN_ASSIGN,         0xFFFE },   /* 0x56 */
    { WM9713_GPIO_PULL_UP_CONTROL,  0x4000 },   /* 0x58 */
    { WM97_ALC_CONTROL,             0xB032 },   /* 0x60 */
    { WM97_ALC_NOISE_GATE_CONTROL,  0x3E00 },   /* 0x62 */
    { WM97_AUXDAC_INPUT_CONTROL,    0x0000 }    /* 0x64 */
};
#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_adcDetailsWM9713[] =
{
    { WM_ADCSEL_X_COORD,    WM_AUXADC_X_COORD,    TRUE },  /* WM_ADC_X_COORD */
    { WM_ADCSEL_Y_COORD,    WM_AUXADC_Y_COORD,    TRUE },  /* WM_ADC_Y_COORD */
    { WM_ADCSEL_INVALID,    WM_AUXADC_INVALID,    FALSE }, /* WM_ADC_TOUCH */
    { WM_ADCSEL_PRESSURE,   WM_AUXADC_PRESSURE,   TRUE },  /* WM_ADC_PRESSURE */
    { WM_ADCSEL_AUX3,       WM_AUXADC_AUX3,       FALSE }, /* WM_ADC_BMON */
    { WM_ADCSEL_INVALID,    WM_AUXADC_INVALID,    FALSE }, /* WM_ADC_AUXADC */
    { WM_ADCSEL_INVALID,    WM_AUXADC_INVALID,    FALSE }, /* WM_ADC_PHONE */
    { WM_ADCSEL_INVALID,    WM_AUXADC_INVALID,    FALSE }, /* WM_ADC_PCBEEP */
    { WM_ADCSEL_AUX1,       WM_AUXADC_AUX1,       FALSE }, /* WM_ADC_COMP1 */
    { WM_ADCSEL_AUX2,       WM_AUXADC_AUX2,       FALSE }, /* WM_ADC_COMP2 */
    { WM_ADCSEL_AUX4,       WM_AUXADC_AUX4,       FALSE }, /* WM_ADC_WIPER */
    { WM_ADCSEL_AUX1,       WM_AUXADC_AUX1,       FALSE }, /* WM_ADC_AUX1 */
    { WM_ADCSEL_AUX2,       WM_AUXADC_AUX2,       FALSE }, /* WM_ADC_AUX2 */
    { WM_ADCSEL_AUX3,       WM_AUXADC_INVALID,    FALSE }, /* WM_ADC_AUX3 */
    { WM_ADCSEL_AUX4,       WM_AUXADC_AUX4,       FALSE }, /* WM_ADC_AUX4 */
    { WM_ADCSEL_SPKMON,     WM_AUXADC_SPKMON,     FALSE }, /* WM_ADC_SPKMON */
};

/*
 * Tables for the record sources
 */

static WM_RECSOURCE_DETAILS s_WM9713RecordSourceDetails =
{
    WM9713_REC_ROUTING, 
    WM9713_RECSRCL_MASK,
    WM9713_RECSRCR_MASK,
    WM9713_RECSRC_MASK
};

static const WM_RECSOURCE_SIGNALS s_WM9713RecordSourceSignals[] =
{
    { WM_AUDIO_MIC1,            WM9713_RECSRCL_MICA,    WM9713_RECSRCR_MICA },
    { WM_AUDIO_MIC2A,           WM9713_RECSRCL_MICA,    WM9713_RECSRCR_MICA },
    { WM_AUDIO_MIC2B,           WM9713_RECSRCL_MICB,    WM9713_RECSRCR_MICB },
    { WM_AUDIO_LINEIN,          WM9713_RECSRCL_LINE,    WM9713_RECSRCR_LINE },
    { WM_AUDIO_MONOIN,          WM9713_RECSRCL_MONOIN,  WM9713_RECSRCR_MONOIN },
    { WM_AUDIO_HEADPHONE,       WM9713_RECSRCL_HPMIX,   WM9713_RECSRCR_HPMIX },
    { WM_AUDIO_HEADPHONE_MIXER, WM9713_RECSRCL_HPMIX,   WM9713_RECSRCR_HPMIX },
    { WM_AUDIO_SPEAKER,         WM9713_RECSRCL_SPEAKER, WM9713_RECSRCR_SPEAKER },
    { WM_AUDIO_SPEAKER_MIXER,   WM9713_RECSRCL_SPEAKER, WM9713_RECSRCR_SPEAKER },
    { WM_AUDIO_MONO_MIXER,      WM9713_RECSRCL_MONOMIX, WM9713_RECSRCR_MONOMIX }
};

/*
 * A table for the signals.
 */
static const WM_SIGNAL_DETAILS s_WM9713Signals[] =
{
    /* Inputs */
    WM_SIG_AC97_STEREO_IN_MUTE  ( WM_AUDIO_LINEIN,      WM_SIG_ANALOGUE_INPUT,    WM9713_LINEIN_VOLUME,       WM97_LINEIN_MUTE ),
    WM_SIG_AC97_MONO_IN_REG_MUTE( WM_AUDIO_MONOIN,      WM_SIG_ANALOGUE_INPUT,    WM9713_MONO_IN_VOLUME,    WM9713_MONO_IN_VOLUME,   WM9713_MONOIN_MUTE,   WM_SIG_SHIFT( 8 ) ),
    WM_SIG_AC97_MONO_IN_REG_MUTE( WM_AUDIO_MIC,         WM_SIG_ANALOGUE_INPUT,    WM97_MIC_VOLUME,          WM9713_MIC_ROUTING,      WM9713_MIC2A_MUTE,    WM_SIG_SHIFT( 8 ) ),
    WM_SIG_AC97_MONO_IN_REG_MUTE( WM_AUDIO_MIC2A,       WM_SIG_ANALOGUE_INPUT,    WM97_MIC_VOLUME,          WM9713_MIC_ROUTING,      WM9713_MIC2A_MUTE,    WM_SIG_SHIFT( 8 ) ),
    WM_SIG_AC97_MONO_IN_REG_MUTE( WM_AUDIO_MIC2B,       WM_SIG_ANALOGUE_INPUT,    WM97_MIC_VOLUME,          WM9713_MIC_ROUTING,      WM9713_MIC2B_MUTE,    WM_SIG_SHIFT( 0 ) ),
    WM_SIG_NO_VOLUME            ( WM_AUDIO_MIC2BTOA,    WM_SIG_ANALOGUE_INPUT | WM_CHANNEL_MONO ), /* needs checking */
    WM_SIG_AC97_PCBEEP_MULTIPLE ( WM9713_PCBEEP_VOLUME ),
    /* DACs are inputs to the analogue domain - i.e. they generate analogue signals */
    WM_SIG_AC97_STEREO_IN_MUTE  ( WM_AUDIO_HIFI_DAC,    WM_SIG_DAC,               WM9713_DAC_VOLUME,  WM97_DAC_MUTE ),
    WM_SIG_AC97_MULTIPLE        ( WM_AUDIO_VOICE_DAC,   WM_SIG_DAC | WM_CHANNEL_MONO, WM9713_VXDAC_VOLUME ),
    WM_SIG_AC97_MULTIPLE        ( WM_AUDIO_MONO_DAC,    WM_SIG_DAC | WM_CHANNEL_MONO, WM9713_AUXDAC_VOLUME ),

    /* Outputs */
    WM_SIG_AC97_STEREO_OUT_STEREO_MUTE( WM_AUDIO_SPEAKER,           WM_SIG_ANALOGUE_OUTPUT,                     WM97_SPEAKER_VOLUME ),
    WM_SIG_AC97_STEREO_OUT_STEREO_MUTE( WM_AUDIO_HEADPHONE,         WM_SIG_ANALOGUE_OUTPUT,                     WM97_HEADPHONE ),
    WM_SIG_AC97_BASE_OUT_MUTE_2ZC     ( WM_AUDIO_MONOOUT,           WM_SIG_ANALOGUE_OUTPUT | WM_CHANNEL_MONO,   WM9713_MONO_VOLUME,         WM_SIG_SHIFT( 0 ), WM9713_MONO_VOLUME,   WM9713_MUTE_MONO ),
    WM_SIG_AC97_BASE_OUT_MUTE_2ZC     ( WM_AUDIO_OUT3,              WM_SIG_ANALOGUE_OUTPUT | WM_CHANNEL_MONO,   WM9713_OUT3_4_VOLUME,       WM_SIG_SHIFT( 0 ), WM9713_OUT3_4_VOLUME, WM9713_MUTE_MONO ),
    WM_SIG_AC97_BASE_OUT_MUTE_2ZC     ( WM_AUDIO_OUT4,              WM_SIG_ANALOGUE_OUTPUT | WM_CHANNEL_MONO,   WM9713_OUT3_4_VOLUME,       WM_SIG_SHIFT( 8 ), WM9713_OUT3_4_VOLUME, WM9713_MUTE_MONO_SHIFTED ),
    /* 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,                                 WM9713_REC_VOLUME ),
};       

/*
 * The microphone select details.
 */
static const WM_MIC_CONTROL_DETAILS s_WM9713MicControl[] =
{
    {
        WM_AUDIO_MIC1,                                      /* Mic Id             */
        WM9713_MIC_SELECT,                                  /* Mic select Reg     */
        WM9713_MIC_SEL_MPASEL_MIC1,                         /* Mic select Bits    */
        WM9713_MIC_SEL_MPASEL_MASK,                         /* Mic select Mask    */
        WM_AUDIO_MIC_REC_PGA,                               /* Mic info  Flags    */
        WM9713_MIC_SELECT,                                  /* Rec Boost Reg      */
        WM9713_MIC_SEL_MPABST_24DB,                         /* Rec Boost Bit      */
        WM9713_AUXDAC_VOLUME,                               /* Record PGA         */
        WM97_SET_ADC_EXTENDED_HIGH,                         /* Record PGA         */
        WM97_ALC_CONTROL,                                   /* ALC Control Reg    */
        WM97_ALC_CTRL_VOICE,                                /* ALC Control Val    */
        WM97_ALC_NOISE_GATE_CONTROL,                        /* ALC Noise Gate Reg */
        (WM97_ALC_ALCSEL_STEREO | WM97_ALC_NOISE_GATE_VOICE), /* ALC Noise Gate Val */
    },
    {
        WM_AUDIO_MIC2A,                                     /* Mic Id             */
        WM9713_MIC_SELECT,                                  /* Mic select Reg     */
        WM9713_MIC_SEL_MPASEL_MIC2A,                        /* Mic select Bits    */
        WM9713_MIC_SEL_MPASEL_MASK,                         /* Mic select Mask    */        
        WM_AUDIO_MIC_REC_PGA,                               /* Mic info  Flags    */
        WM9713_MIC_SELECT,                                  /* Rec Boost Reg      */
        WM9713_MIC_SEL_MPABST_24DB,                         /* Rec Boost Bit      */
        WM9713_AUXDAC_VOLUME,                               /* Record PGA         */

⌨️ 快捷键说明

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