📄 wm9713.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: 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 + -