📄 wmi2sgeneric.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: WMI2SGeneric.c 2563 2005-12-21 17:06:11Z ian $
*
* This file specifies the generic behaviour for Wolfson I2S DACs
* with no register setup.
*
* Warning:
* This driver is specifically written for Wolfson Codecs. It is not a
* general CODEC device driver.
*
* --------------------------------------------------------------------------*/
/*
* Include files
*/
#include "WMCommon.h"
#include "WMI2SAudio.h"
#if WMI2S_GENERIC_FAMILY
/*
* Global definitions
*/
#if WM_USE_SHADOW_REGISTERS
/*
* Shadow registers
* There are none that are in a consistent place to use,
* so we use generic names and "unset" initialisation values.
*/
static const WM_SHADOW_REGISTERS s_WMI2SGenericShadowed[] =
{
{ WM_REGADDR_0, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_1, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_2, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_3, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_4, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_5, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_6, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_7, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_8, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_9, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_10, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_11, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_12, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_13, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_14, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_15, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_16, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_17, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_18, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_19, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_20, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_21, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_22, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_23, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_24, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_25, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_26, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_27, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_28, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_29, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_30, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_31, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_32, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_33, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_34, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_35, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_36, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_37, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_38, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_39, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_40, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_41, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_42, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_43, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_44, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_45, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_46, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_47, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_48, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_49, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_50, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_51, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_52, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_53, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_54, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_55, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_56, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_57, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_58, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_59, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_60, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_61, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_62, WM_REGISTER_UNSET }, /* Unknown */
{ WM_REGADDR_63, WM_REGISTER_UNSET }, /* Unknown */
};
#endif /* WM_USE_SHADOW_REGISTERS */
/*******************************************************************************
* Action tables for the profiles.
*/
/*
* HiFi Playback
*
* Playback from I2S to all outputs.
*/
static const WM_ACTION s_HiFiPlaybackActions[] =
{
/* Power up and start streaming to HiFi DAC */
WMACT_ENABLE_STREAM( WM_STREAM_HIFI_OUT ),
};
/*
* Stop Playback
*
* Stops all playback
*/
static const WM_ACTION s_StopPlaybackActions[] =
{
/* Stop all playback */
WMACT_DISABLE_STREAM( WM_STREAM_HIFI_OUT ),
};
static const WM_PROFILE s_WMI2SGeneric_7BitAddrProfiles[] =
{
WM_PROFILE_ENTRY( "HiFi Playback", WM_CHIP_WMI2S_7BIT_ADDR, s_HiFiPlaybackActions ),
WM_PROFILE_ENTRY( "Stop playback", WM_CHIP_WMI2S_7BIT_ADDR, s_StopPlaybackActions ),
WM_PROFILE_ENTRY( "Stop HiFi playback", WM_CHIP_WMI2S_7BIT_ADDR, s_StopPlaybackActions )
};
static const WM_PROFILE s_WMI2SGeneric_8BitAddrProfiles[] =
{
WM_PROFILE_ENTRY( "HiFi Playback", WM_CHIP_WMI2S_8BIT_ADDR, s_HiFiPlaybackActions ),
WM_PROFILE_ENTRY( "Stop playback", WM_CHIP_WMI2S_8BIT_ADDR, s_StopPlaybackActions ),
WM_PROFILE_ENTRY( "Stop HiFi playback", WM_CHIP_WMI2S_8BIT_ADDR, s_StopPlaybackActions )
};
/*******************************************************************************
* Stream to channel mappings.
*/
static const WM_STREAM_MAPPING s_WMI2SGenericStreamMappings[] =
{
{ WM_STREAM_HIFI_OUT, WMAUDIO_I2S_STEREO_OUT },
};
/*******************************************************************************
* Sample rates.
*/
static const WM_SAMPLE_RATE_PAIR s_SupportedRatesHiFi[] =
{
{ 8000, 8000 },
{ 8000, 44100 },
{ 8000, 48000 },
{ 11025, 11025 },
{ 12000, 12000 },
{ 16000, 16000 },
{ 22050, 22050 },
{ 24000, 24000 },
{ 32000, 32000 },
{ 44100, 8000 },
{ 44100, 44100 },
{ 48000, 8000 },
{ 48000, 48000 },
{ 88200, 88200 },
{ 96000, 96000 }
};
/*******************************************************************************
* Details of supported interfaces.
*/
static const WM_INTERFACE_DETAILS s_Interfaces[] =
{
{
WM_AUDIOIF_HIFI,
s_SupportedRatesHiFi,
WM_ARRAY_COUNT( s_SupportedRatesHiFi ),
WM_IF_EXCLUSIVE_RATES | WM_IF_PLAYBACK
}
};
/*
* Tables for the record sources:
* There are NO record sources.
*/
static WM_RECSOURCE_DETAILS s_WMI2SGenericRecordSourceDetails = {0};
/*
* Function prototypes.
*/
static void private_InitChipdefWMI2SGeneric( WM_CHIPDEF *pChipDef );
/*-----------------------------------------------------------------------------
* Function: InitChipdefWMI2SGeneric7Bit
*
* Initialises the chipdef structure for the generic Wolfson I2S DAC
* with 7-bit address and 9-bit data.
*
* Parameters:
* pChipDef chipdef structure to fill in.
*
* Returns: void
*---------------------------------------------------------------------------*/
void InitChipdefWMI2SGeneric7Bit( WM_CHIPDEF *pChipDef )
{
private_InitChipdefWMI2SGeneric( pChipDef );
/* Identifying information */
pChipDef->deviceType = WM_CHIP_WMI2S_7BIT_ADDR;
pChipDef->deviceName = "WMI2S_7BIT";
pChipDef->regAddrShift = 9;
pChipDef->regAddrMask = 0xFE00;
pChipDef->regDataMask = 0x01FF;
}
/*-----------------------------------------------------------------------------
* Function: InitChipdefWMI2SGeneric8Bit
*
* Initialises the chipdef structure for the generic Wolfson I2S DAC with 8-bit
* address and 8-bit data.
*
* NOTE: ** UNTESTED **
*
* Parameters:
* pChipDef chipdef structure to fill in.
*
* Returns: void
*---------------------------------------------------------------------------*/
void InitChipdefWMI2SGeneric8Bit( WM_CHIPDEF *pChipDef )
{
private_InitChipdefWMI2SGeneric( pChipDef );
/* Identifying information */
pChipDef->deviceType = WM_CHIP_WMI2S_8BIT_ADDR;
pChipDef->deviceName = "WMI2S_8BIT";
pChipDef->regAddrShift = 8;
pChipDef->regAddrMask = 0xFF00;
pChipDef->regDataMask = 0x00FF;
}
/*-----------------------------------------------------------------------------
* Function: private_InitChipdefWMI2SGeneric
*
* Common worker function which initialises the chipdef structure for the
* generic Wolfson I2S DACs.
*
* Parameters:
* pChipDef chipdef structure to fill in.
*
* Returns: void
*---------------------------------------------------------------------------*/
static void private_InitChipdefWMI2SGeneric( WM_CHIPDEF *pChipDef )
{
/* Identifying information */
pChipDef->maxRegister = WM_GENERIC_I2S_MAX_REGISTER;
pChipDef->regOffset = 1;
pChipDef->defaultPower = WM_POWER_LINK; /* + digital */
/* Shadow Registers */
#if WM_USE_SHADOW_REGISTERS
pChipDef->pShadowedRegisters = s_WMI2SGenericShadowed;
pChipDef->nShadowedRegisters = WM_ARRAY_COUNT( s_WMI2SGenericShadowed );
#endif /* WM_USE_SHADOW_REGISTERS */
pChipDef->resetReg = WM_REG_INVALID;
/* Profiles */
pChipDef->profiles = NULL;
pChipDef->nProfiles = 0;
#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 = NULL;
pChipDef->recSourceSignalCount = 0;
pChipDef->recSourceDetails = s_WMI2SGenericRecordSourceDetails;
pChipDef->pSignalDetails = NULL;
pChipDef->signalCount = 0;
pChipDef->pMicControlDetails = NULL;
pChipDef->micControlCount = 0;
/* Audio streams */
pChipDef->pStreamMappings = s_WMI2SGenericStreamMappings;
pChipDef->streamCount = WM_ARRAY_COUNT( s_WMI2SGenericStreamMappings );
/* Default sample rates */
pChipDef->defADCRate = WM_SAMPLE_RATE_UNKNOWN;
pChipDef->defHiFiDACRate = WM_MCLK_FREQUENCY/256;
#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 = NULL;
pChipDef->vtable.fnPowerDown = NULL;
pChipDef->vtable.fnGetPower = NULL;
#if WM_AUDIO
pChipDef->vtable.fnConfigureInterface = NULL; /* Not applicable */
pChipDef->vtable.fnUnconfigureInterface = NULL; /* Not applicable */
pChipDef->vtable.fnEnableStream = NULL;
pChipDef->vtable.fnDisableStream = NULL;
pChipDef->vtable.fnSetSampleRate = WMI2SSetSampleRate;
pChipDef->vtable.fnGetSampleRate = NULL; /* We rely on the cached values */
pChipDef->vtable.fnSetLineInRecPaths = NULL;
pChipDef->vtable.fnClearLineInRecPaths = NULL;
pChipDef->vtable.fnSetMicRecPaths = NULL;
pChipDef->vtable.fnClearMicRecPaths = NULL;
#endif /* WM_AUDIO */
#if WM_AUXADC && WM_STREAM_AUXADC
pChipDef->vtable.fnReadCTCAuxADC = NULL;
#endif /* WM_AUXADC && WM_STREAM_AUXADC */
}
#endif /* WMI2S_GENERIC_FAMILY */
/*------------------------------ END OF FILE ---------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -