⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wmi2sgeneric.c

📁 WM9713 audio codec driver for WinCE 5.0
💻 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 + -