📄 wm9712.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: WM9712.c 2571 2006-01-12 10:26:00Z fb $
*
* This file specifies the per-device specific behaviour for the WM9712.
*
* 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"
#if WM9712_FAMILY
/*
* Global definitions
*/
#if WM_USE_SHADOW_REGISTERS
/*
* Shadow registers
*/
static const WM_SHADOW_REGISTERS s_WM9712Shadowed[] =
{
{ WM97_MASTER_VOLUME, 0x8000 }, /* 0x02 */
{ WM97_HEADPHONE, 0x8000 }, /* 0x04 */
{ WM97_MASTER_VOLUME_MONO, 0x8000 }, /* 0x06 */
{ WM97_DAC_TONE_CONTROL, 0x0F0F }, /* 0x08 */
{ WM97_PCBEEP, 0xAAA0 }, /* 0x0A */
{ WM97_PHONE_VOLUME, 0xC008 }, /* 0x0C */
{ WM97_MIC_VOLUME, 0x6808 }, /* 0x0E */
{ WM97_LINEIN_VOLUME, 0xE808 }, /* 0x10 */
{ WM97_AUXDAC_VOLUME, 0xAAA0 }, /* 0x12 */
{ WM97_SIDETONE_VOLUME, 0xAD00 }, /* 0x14 */
{ WM9712_OUT3_VOLUME, 0x8000 }, /* 0x16 */
{ WM97_DAC_VOLUME, 0xE808 }, /* 0x18 */
{ WM97_REC_SELECT, 0x3000 }, /* 0x1A */
{ WM97_REC_GAIN, 0x8000 }, /* 0x1C */
{ WM97_GENERAL, 0x0000 }, /* 0x20 */
{ WM97_3D_CONTROL, 0x0000 }, /* 0x22 */
{ WM97_GPIO_PIN_CONFIG, 0xF83E }, /* 0x4C */
{ WM97_GPIO_PIN_POLARITY, 0xFFFF }, /* 0x4E */
{ WM97_GPIO_PIN_STICKY, 0x0000 }, /* 0x50 */
{ WM97_GPIO_PIN_WAKEUP, 0x0000 }, /* 0x52 */
{ WM97_GPIO_PIN_ASSIGN, 0xF83E }, /* 0x56 */
{ 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_adcDetailsWM9712[] =
{
{ 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 */
{ WM_AUXADC_BMON, WM_AUXADC_BMON, FALSE }, /* WM_ADC_BMON */
{ WM_AUXADC_INVALID, WM_AUXADC_INVALID, FALSE }, /* WM_ADC_AUXADC */
{ WM_AUXADC_INVALID, WM_AUXADC_INVALID, FALSE }, /* WM_ADC_PHONE */
{ WM_AUXADC_INVALID, WM_AUXADC_INVALID, FALSE }, /* WM_ADC_PCBEEP */
{ WM_AUXADC_COMP1, WM_AUXADC_COMP1, FALSE }, /* WM_ADC_COMP1 */
{ WM_AUXADC_COMP2, WM_AUXADC_COMP2, FALSE }, /* WM_ADC_COMP2 */
{ WM_AUXADC_WIPER, WM_AUXADC_WIPER, FALSE }, /* WM_ADC_WIPER */
{ WM_AUXADC_COMP1, WM_AUXADC_COMP1, FALSE }, /* WM_ADC_AUX1 */
{ WM_AUXADC_COMP2, WM_AUXADC_COMP2, FALSE }, /* WM_ADC_AUX2 */
{ WM_AUXADC_AUX3, WM_AUXADC_AUX3, FALSE }, /* WM_ADC_AUX3 */
{ WM_AUXADC_WIPER, WM_AUXADC_WIPER, FALSE } /* WM_ADC_AUX4 */
};
/*
* Tables for the record sources
*/
static WM_RECSOURCE_DETAILS s_WM9712RecordSourceDetails =
{
WM97_REC_SELECT,
WM97_RECSRCL_MASK,
WM97_RECSRCR_MASK,
WM97_RECSRC_MASK
};
static const WM_RECSOURCE_SIGNALS s_WM9712RecordSourceSignals[] =
{
{ WM_AUDIO_MIC1, WM97_RECSRCL_MIC, WM97_RECSRCR_MIC },
{ WM_AUDIO_MIC2, WM97_RECSRCL_MIC, WM97_RECSRCR_MIC },
{ WM_AUDIO_SPEAKER, WM97_RECSRCL_LINEOUT, WM97_RECSRCR_LINEOUT },
{ WM_AUDIO_SPEAKER_MIXER, WM97_RECSRCL_LINEOUT, WM97_RECSRCR_LINEOUT },
{ 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 the signals
*/
static const WM_SIGNAL_DETAILS s_WM9712Signals[] =
{
/* Inputs */
WM_SIG_AC97_STEREO_IN_MUTE ( WM_AUDIO_LINEIN, WM_SIG_ANALOGUE_INPUT, WM97_LINEIN_VOLUME, WM97_LINEIN_MUTE ),
WM_SIG_AC97_MONO_IN_MUTE ( WM_AUDIO_PHONEIN, WM_SIG_ANALOGUE_INPUT, WM97_PHONE_VOLUME, WM9712_PHONE_MUTE, WM_SIG_SHIFT( 0 ) ),
WM_SIG_AC97_MONO_IN_MUTE ( WM_AUDIO_MIC1, WM_SIG_ANALOGUE_INPUT, WM97_MIC_VOLUME, WM9712_MIC1_MUTE, WM_SIG_SHIFT( 0 ) ),
WM_SIG_AC97_MONO_IN_MUTE ( WM_AUDIO_MIC2, WM_SIG_ANALOGUE_INPUT, WM97_MIC_VOLUME, WM9712_MIC2_MUTE, WM_SIG_SHIFT( 0 ) ),
WM_SIG_AC97_PCBEEP_MULTIPLE( WM97_PCBEEP ),
/* 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, WM97_DAC_VOLUME, WM97_DAC_MUTE ),
WM_SIG_AC97_MULTIPLE ( WM_AUDIO_MONO_DAC, WM_SIG_DAC | WM_CHANNEL_MONO, WM97_AUXDAC_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 ) ),
WM_SIG_AC97_MONO_OUT ( WM_AUDIO_OUT3, WM_SIG_ANALOGUE_OUTPUT, WM9712_OUT3_VOLUME, WM_SIG_SHIFT( 0 ) ),
/* ADCs are outputs from the analogue domain - i.e. they receive analogue signals */
WM_SIG_AC97_STEREO_IN ( WM_AUDIO_HIFI_ADC, WM_SIG_ADC, WM97_REC_GAIN ),
};
/*
* The microphone select details.
*/
static const WM_MIC_CONTROL_DETAILS s_WM9712MicControl[] =
{
{
WM_AUDIO_MIC1, /* Mic Id */
WM97_MIC_VOLUME, /* Mic select Reg */
WM9712_MIC_SEL_MIC1, /* Mic select Bits */
WM9712_MIC_SEL_MASK, /* Mic select Mask */
(WM_AUDIO_MIC_REC_PGA | WM_AUDIO_MIC_REC_ALC), /* Mic info Flags */
WM_REG_INVALID, /* Rec Boost Reg */
0, /* Rec Boost Bit */
WM97_REC_GAIN, /* Rec PGA Reg */
WM97_SET_ADC_EXTENDED_HIGH, /* Rec PGA Val */
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 */
},
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -