📄 wmchipdef.h
字号:
/*-----------------------------------------------------------------------------
* 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: WMChipDef.h 3998 2006-10-03 13:00:37Z fb $
*
* This file defines the information held about the different Wolfson devices.
*
* Warning:
* This driver is specifically written for Wolfson Codecs. It is not a
* general CODEC device driver.
*
*---------------------------------------------------------------------------*/
#ifndef __WMCHIPDEF_H__
#define __WMCHIPDEF_H__
/*
* Include files
*/
#include "WMTypes.h"
#include "WMAudio.h"
#include "WMAudioInternal.h"
#include "WMGPIO.h"
#include "WMAuxADC.h"
#include "WMPower.h"
#include "WMProfiles.h"
/*
* Definitions
*/
/*
* Shadow Registers
*/
typedef struct tagWM_SHADOW_REGISTERS
{
WM_REGTYPE reg;
WM_REGVAL defaultValue;
} WM_SHADOW_REGISTERS;
/*
* A description of each ADC
*/
typedef struct tagWM_AUXADC_DETAILS
{
WM_REGVAL adcSel;
WM_REGVAL adcAdr;
short int needPenDown;
} WM_AUXADC_DETAILS;
#define END_OF_REGISTERS ((WM_REGTYPE)-1)
/*
* The record source signals.
*/
typedef struct tagWM_RECSOURCE_SIGNALS
{
WM_AUDIO_SIGNAL signal;
WM_REGVAL leftVal;
WM_REGVAL rightVal;
} WM_RECSOURCE_SIGNALS;
/*
* The record source register details.
*/
typedef struct tagWM_RECSOURCE_DETAILS
{
WM_REGTYPE reg;
WM_REGVAL leftMask;
WM_REGVAL rightMask;
WM_REGVAL stereoMask;
} WM_RECSOURCE_DETAILS;
/*
* Definitions of how the register controls a given signal.
*/
typedef unsigned int WM_SIGNAL_FLAGS;
#define WM_SIG_CHANNEL_MASK WM_CHANNEL_ALL /* 0xFF */
#define WM_SIG_TYPE_MASK 0x00000F00
#define WM_SIG_ANALOGUE_INPUT 0x00000100
#define WM_SIG_ANALOGUE_OUTPUT 0x00000200
#define WM_SIG_DAC 0x00000300
#define WM_SIG_ADC 0x00000400
#define WM_SIG_MIXER 0x00000500
#define WM_SIG_HAS_UPDATE 0x00010000
#define WM_SIG_HAS_BOTH 0x00020000
#define WM_SIG_VOLUME_MUTE 0x00040000 /* Special volume value mutes */
/*
* Extra definitions for the signal details.
*/
#define WM_SIG_NO_ZERO_CROSS 0x0000
#define WM_SIG_NO_SPECIAL 0x0000
#define WM_SIG_SHIFT( _n ) _n
/*
* The signal details. Note there is one of these per signal per channel, so
* a stereo signal will have both WM_CHANNEL_LEFT and WM_CHANNEL_RIGHT.
*/
typedef struct tagWM_SIGNAL_DETAILS
{
WM_AUDIO_SIGNAL signal; /* Signal in question */
WM_SIGNAL_FLAGS flags; /* Flags describing the signal, including the channel */
WM_REGTYPE reg; /* Register containing the volume control, or WM_REG_INVALID if no volume control */
unsigned int shift; /* Offset of start of field in bits */
WM_REGVAL mask; /* Mask for field (already shifted) */
WM_REGVAL minval; /* Lowest field value - may be highest volume */
WM_REGVAL maxval; /* Highest field value - may be lowest volume */
signed short zerodB; /* Value corresponding to zero dB (may be out of range in a few cases) */
int step; /* No of 1/16dB between values */
WM_REGTYPE muteReg; /* Register containing the mute, or WM_REG_INVALID if no mute */
WM_REGVAL mute; /* Register value corresponding to mute */
WM_REGVAL muteMask; /* Register mask corresponding to mute for volume mutes */
WM_REGVAL zeroCross; /* Register value corresponding to zero-cross, or WM_SIG_NO_ZERO_CROSS if not supported */
WM_REGVAL special; /* Register value corresponding to BOTH or UPDATE bit, or WM_SIG_NO_SPECIAL */
} WM_SIGNAL_DETAILS;
/*
* Shortcuts for signals which are supported but don't have volume control.
*/
#define WM_SIG_NO_VOLUME_MUTE( _signal, _flags, _muteReg, _mute ) \
{ _signal, _flags, WM_REG_INVALID, 0, 0, 0, 0, 0, 0, \
_muteReg, _mute, _mute, WM_SIG_NO_ZERO_CROSS, WM_SIG_NO_SPECIAL \
}
#define WM_SIG_NO_VOLUME( _signal, _flags ) \
WM_SIG_NO_VOLUME_MUTE( _signal, _flags, WM_REG_INVALID, 0 )
/*
* Shortcuts for AC'97 outputs
*/
#define WM_SIG_AC97_BASE_OUT_MUTE_ZC( _signal, _flags, _reg, _shift, _muteReg, _mute, _zeroCross ) \
{ _signal, _flags, _reg, _shift, (WM97_VOLUME_MASK << _shift), \
WM97_MIN_OUTPUT_ATTENUATION, WM97_MAX_OUTPUT_ATTENUATION, WM97_OUTVOL_0DB,\
WM_SIGNAL_LEVEL(-1.5), \
_muteReg, _mute, _mute, \
_zeroCross, WM_SIG_NO_SPECIAL \
}
#define WM_SIG_AC97_BASE_OUT_MUTE( _signal, _flags, _reg, _shift, _muteReg, _mute ) \
WM_SIG_AC97_BASE_OUT_MUTE_ZC( _signal, _flags, _reg, _shift, _muteReg, _mute, WM97_ZERO_CROSS )
#define WM_SIG_AC97_BASE_OUT_MUTE_2ZC( _signal, _flags, _reg, _shift, _muteReg, _mute ) \
WM_SIG_AC97_BASE_OUT_MUTE_ZC( _signal, _flags, _reg, _shift, _muteReg, _mute, WM9713_ZERO_CROSS_MONO << _shift )
#define WM_SIG_AC97_BASE_OUT( _signal, _flags, _reg, _shift ) \
WM_SIG_AC97_BASE_OUT_MUTE( _signal, _flags, _reg, _shift, _reg, WM97_STANDARD_MUTE )
#define WM_SIG_AC97_MONO_OUT( _signal, _flags, _reg, _shift ) \
WM_SIG_AC97_BASE_OUT( _signal, _flags | WM_CHANNEL_MONO, _reg, _shift )
#define WM_SIG_AC97_LEFT_OUT( _signal, _flags, _reg ) \
WM_SIG_AC97_BASE_OUT( _signal, _flags | WM_CHANNEL_LEFT, _reg, WM97_LEFT_VOLUME_SHIFT )
#define WM_SIG_AC97_LEFT_OUT_STEREO_MUTE( _signal, _flags, _reg ) \
WM_SIG_AC97_BASE_OUT_MUTE_2ZC( _signal, _flags | WM_CHANNEL_LEFT, _reg, WM97_LEFT_VOLUME_SHIFT, _reg, WM9713_MUTE_LEFT_MASK )
#define WM_SIG_AC97_RIGHT_OUT( _signal, _flags, _reg ) \
WM_SIG_AC97_BASE_OUT( _signal, _flags | WM_CHANNEL_RIGHT, _reg, WM97_RIGHT_VOLUME_SHIFT )
#define WM_SIG_AC97_RIGHT_OUT_STEREO_MUTE( _signal, _flags, _reg ) \
WM_SIG_AC97_BASE_OUT_MUTE_2ZC( _signal, _flags | WM_CHANNEL_RIGHT, _reg, WM97_RIGHT_VOLUME_SHIFT, _reg, WM9713_MUTE_RIGHT_MASK )
#define WM_SIG_AC97_STEREO_OUT( _signal, _flags, _reg ) \
WM_SIG_AC97_LEFT_OUT( _signal, _flags, _reg ), \
WM_SIG_AC97_RIGHT_OUT( _signal, _flags, _reg )
#define WM_SIG_AC97_STEREO_OUT_STEREO_MUTE( _signal, _flags, _reg ) \
WM_SIG_AC97_LEFT_OUT_STEREO_MUTE( _signal, _flags, _reg ), \
WM_SIG_AC97_RIGHT_OUT_STEREO_MUTE( _signal, _flags, _reg )
/*
* Shortcuts for AC'97 inputs
*/
#define WM_SIG_AC97_BASE_IN_REG_MUTE( _signal, _flags, _reg, _muteReg, _mute, _shift )\
{ _signal, _flags, _reg, _shift, (WM97_INPUT_VOLUME_MASK << _shift), \
WM97_MAX_INPUT_GAIN, WM97_MIN_INPUT_GAIN, WM97_VOL_IN_0DB, \
WM_SIGNAL_LEVEL(-1.5), \
_muteReg, _mute, _mute, WM_SIG_NO_ZERO_CROSS, WM_SIG_NO_SPECIAL \
}
#define WM_SIG_AC97_BASE_IN_MUTE( _signal, _flags, _reg, _mute, _shift ) \
WM_SIG_AC97_BASE_IN_REG_MUTE( _signal, _flags, _reg, _reg, _mute, _shift )
#define WM_SIG_AC97_MONO_IN_REG_MUTE( _signal, _flags, _reg, _muteReg, _mute, _shift )\
WM_SIG_AC97_BASE_IN_REG_MUTE( _signal, _flags | WM_CHANNEL_MONO, _reg, _muteReg, _mute, _shift )
#define WM_SIG_AC97_MONO_IN_MUTE( _signal, _flags, _reg, _mute, _shift ) \
WM_SIG_AC97_MONO_IN_REG_MUTE( _signal, _flags, _reg, _reg, _mute, _shift )
#define WM_SIG_AC97_STEREO_IN_MUTE( _signal, _flags, _reg, _mute ) \
WM_SIG_AC97_BASE_IN_MUTE( _signal, _flags | WM_CHANNEL_LEFT, _reg, _mute, WM97_LEFT_VOLUME_SHIFT ),\
WM_SIG_AC97_BASE_IN_MUTE( _signal, _flags | WM_CHANNEL_RIGHT, _reg, _mute, WM97_RIGHT_VOLUME_SHIFT )
#define WM_SIG_AC97_BASE_IN( _signal, _flags, _reg, _shift ) \
WM_SIG_AC97_BASE_IN_MUTE( _signal, _flags, _reg, WM97_STANDARD_MUTE, _shift )
#define WM_SIG_AC97_MONO_IN( _signal, _flags, _reg, _shift ) \
WM_SIG_AC97_MONO_IN_MUTE( _signal, _flags, _reg, WM97_STANDARD_MUTE, _shift )
#define WM_SIG_AC97_STEREO_IN( _signal, _flags, _reg ) \
WM_SIG_AC97_BASE_IN( _signal, _flags | WM_CHANNEL_LEFT, _reg, WM97_LEFT_VOLUME_SHIFT ),\
WM_SIG_AC97_BASE_IN( _signal, _flags | WM_CHANNEL_RIGHT, _reg, WM97_RIGHT_VOLUME_SHIFT )
#define WM_SIG_AC97_MULTIPLE_BASE( _signal, _flags, _reg, _shift ) \
{ _signal, _flags, \
_reg, _shift, (WM97_PGA_VOL_MASK << _shift), \
WM97_PGA_VOL_PLUS6DB, WM97_PGA_VOL_MINUS15DB, WM97_PGA_VOL_0DB, \
WM_SIGNAL_LEVEL(-3), \
_reg, (WM97_PGA_VOL_MUTE << _shift), (WM97_PGA_VOL_MUTE << _shift), \
WM_SIG_NO_ZERO_CROSS, WM_SIG_NO_SPECIAL \
}
#define WM_SIG_AC97_MULTIPLE( _signal, _flags, _reg ) \
WM_SIG_AC97_MULTIPLE_BASE( _signal, _flags, _reg, 4 ), \
WM_SIG_AC97_MULTIPLE_BASE( _signal, _flags, _reg, 8 ), \
WM_SIG_AC97_MULTIPLE_BASE( _signal, _flags, _reg, 12 )
#define WM_SIG_AC97_PCBEEP_STD( _reg ) \
{ WM_AUDIO_PCBEEP, WM_SIG_ANALOGUE_INPUT | WM_CHANNEL_MONO, \
_reg, WM97_PCBEEP_OFFSET, WM97_PCBEEP_MASK, \
WM97_MAX_PCBEEP_STANDARD, WM97_MIN_PCBEEP_STANDARD, \
WM97_PCBEEP_0DB_STANDARD, WM_SIGNAL_LEVEL(-3), \
_reg, WM97_STANDARD_MUTE, WM97_STANDARD_MUTE, \
WM_SIG_NO_ZERO_CROSS, WM_SIG_NO_SPECIAL\
}
#define WM_SIG_AC97_PCBEEP_MULTIPLE_BASE( _reg, _shift ) \
WM_SIG_AC97_MULTIPLE_BASE( WM_AUDIO_PCBEEP, WM_SIG_ANALOGUE_INPUT | WM_CHANNEL_MONO, _reg, _shift )
#define WM_SIG_AC97_PCBEEP_MULTIPLE( _reg ) \
WM_SIG_AC97_PCBEEP_MULTIPLE_BASE( _reg, 4 ), \
WM_SIG_AC97_PCBEEP_MULTIPLE_BASE( _reg, 8 ), \
WM_SIG_AC97_PCBEEP_MULTIPLE_BASE( _reg, 12 )
#define WM_SIG_AC97_STANDARD_ADC_BASE( _flags, _reg, _shift, _zeroCross ) \
{ WM_AUDIO_HIFI_ADC, _flags, _reg, _shift, \
( WM97_MAX_STANDARD_ADC_GAIN << _shift ), WM97_MIN_STANDARD_ADC_GAIN, \
WM97_MAX_STANDARD_ADC_GAIN, WM97_STANDARD_ADC_0DB, WM_SIGNAL_LEVEL(-1.5), \
_reg, WM97_STANDARD_MUTE, WM97_STANDARD_MUTE, _zeroCross, WM_SIG_NO_SPECIAL \
}
#define WM_SIG_AC97_STANDARD_ADC_STEREO( _reg ) \
WM_SIG_AC97_STANDARD_ADC_BASE( WM_SIG_ADC | WM_CHANNEL_LEFT, _reg, \
WM97_LEFT_VOLUME_SHIFT, \
WM_SIG_NO_ZERO_CROSS ), \
WM_SIG_AC97_STANDARD_ADC_BASE( WM_SIG_ADC | WM_CHANNEL_RIGHT, _reg, \
WM97_RIGHT_VOLUME_SHIFT, \
WM_SIG_NO_ZERO_CROSS )
#define WM_SIG_AC97_STANDARD_ADC_STEREO_ZC( _reg ) \
WM_SIG_AC97_STANDARD_ADC_BASE( WM_SIG_ADC | WM_CHANNEL_LEFT, _reg, \
WM97_LEFT_VOLUME_SHIFT, \
WM97_ZERO_CROSS ), \
WM_SIG_AC97_STANDARD_ADC_BASE( WM_SIG_ADC | WM_CHANNEL_RIGHT, _reg, \
WM97_RIGHT_VOLUME_SHIFT, \
WM97_ZERO_CROSS )
#define WM_SIG_AC97_EXTENDED_ADC_BASE( _flags, _reg, _shift ) \
{ WM_AUDIO_HIFI_ADC_EXTENDED, _flags, _reg, _shift, \
( WM97_MAX_EXTENDED_ADC_GAIN << _shift ), \
WM97_MIN_EXTENDED_ADC_GAIN, WM97_MAX_EXTENDED_ADC_GAIN, \
WM97_EXTENDED_ADC_0DB, WM_SIGNAL_LEVEL(-0.75), _reg, WM97_STANDARD_MUTE, \
WM97_STANDARD_MUTE, WM97_ZERO_CROSS, WM_SIG_NO_SPECIAL \
}
#define WM_SIG_AC97_EXTENDED_ADC_STEREO( _reg ) \
WM_SIG_AC97_EXTENDED_ADC_BASE( WM_SIG_ADC | WM_CHANNEL_LEFT, _reg, \
WM97_LEFT_VOLUME_SHIFT ), \
WM_SIG_AC97_EXTENDED_ADC_BASE( WM_SIG_ADC | WM_CHANNEL_RIGHT, _reg, \
WM97_RIGHT_VOLUME_SHIFT )
/*
* The microphone control details.
*/
typedef struct tagWM_MIC_CONTROL_DETAILS
{
WM_AUDIO_SIGNAL mic;
WM_REGTYPE micSelectReg;
WM_REGVAL micSelectBits;
WM_REGVAL micSelectMask;
WM_MIC_INFO micInfoFlags;
WM_REGTYPE recBoostReg; /* Record path boost Register */
WM_REGVAL recBoostBit; /* Record path boost bit */
WM_REGTYPE recPGAReg;
WM_REGVAL recPGAVal;
WM_REGTYPE alcControlReg;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -