📄 wm9707.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: WM9707.c 2571 2006-01-12 10:26:00Z fb $
*
* This file specifies the per-device specific behaviour for the WM9707.
*
* 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 "WM97Audio.h"
#include "WM97AudioPaths.h"
#if WM9707_FAMILY
/*
* Global definitions
*/
#if WM_USE_SHADOW_REGISTERS
/*
* Shadow registers
*/
static const WM_SHADOW_REGISTERS s_WM9707Shadowed[] =
{
{ 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 */
{ WM97_SURROUND_SOUND, 0x0000 } /* 0x74 */
};
#endif /* WM_USE_SHADOW_REGISTERS */
/*
* Tables for the record sources
*/
static WM_RECSOURCE_DETAILS s_WM9707RecordSourceDetails =
{
WM97_REC_SELECT,
WM97_RECSRCL_MASK,
WM97_RECSRCR_MASK,
WM97_RECSRC_MASK
};
static const WM_RECSOURCE_SIGNALS s_WM9707RecordSourceSignals[] =
{
{ 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 the signals.
*/
static const WM_SIGNAL_DETAILS s_WM9707Signals[] =
{
/* 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_WM9707MicControl[] =
{
{
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_WM9707StreamMappings[] =
{
{ 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 InitChipdefWM9707( WM_CHIPDEF *pChipDef )
{
/* Identifying information */
pChipDef->deviceType = WM_CHIP_WM9707;
pChipDef->deviceName = "WM9703/07/08/17";
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_WM9707Shadowed;
pChipDef->nShadowedRegisters = WM_ARRAY_COUNT( s_WM9707Shadowed );
#endif /* WM_USE_SHADOW_REGISTERS */
pChipDef->resetReg = WM97_RESET;
#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 = s_WM9707RecordSourceSignals;
pChipDef->recSourceSignalCount = WM_ARRAY_COUNT( s_WM9707RecordSourceSignals );
pChipDef->recSourceDetails = s_WM9707RecordSourceDetails;
pChipDef->pSignalDetails = s_WM9707Signals;
pChipDef->signalCount = WM_ARRAY_COUNT( s_WM9707Signals );
pChipDef->pMicControlDetails = s_WM9707MicControl;
pChipDef->micControlCount = WM_ARRAY_COUNT( s_WM9707MicControl );
/* Audio streams */
pChipDef->pStreamMappings = s_WM9707StreamMappings;
pChipDef->streamCount = WM_ARRAY_COUNT( s_WM9707StreamMappings );
/* 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 WM_AUXADC && WM_STREAM_AUXADC
pChipDef->vtable.fnReadCTCAuxADC = NULL;
#endif /* WM_AUXADC && WM_STREAM_AUXADC */
}
#endif /* WM9707_FAMILY */
/*------------------------------ END OF FILE ---------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -