📄 audio.cpp
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//------------------------------------------------------------------------------
//
// Copyright (C) 2004, Freescale Semiconductor, Inc. All Rights Reserved
// THIS SOURCE CODE IS CONFIDENTIAL AND PROPRIETARY AND MAY NOT
// BE USED OR DISTRIBUTED WITHOUT THE WRITTEN PERMISSION OF
// FREESCALE SEMICONDUCTOR, INC.
//
//------------------------------------------------------------------------------
//
// Copyright (C) 2005, MOTOROLA, INC. All Rights Reserved
// THIS SOURCE CODE IS CONFIDENTIAL AND PROPRIETARY AND MAY NOT
// BE USED OR DISTRIBUTED WITHOUT THE WRITTEN PERMISSION OF
// MOTOROLA, INC.
//
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//
// Module: audio.cpp
//
// Common audio helper library.
//
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// INCLUDE FILES
//------------------------------------------------------------------------------
#include "bsp.h"
#include "audio.h"
//------------------------------------------------------------------------------
// GLOBAL DEFINITIONS
//------------------------------------------------------------------------------
#define AUDIO_DEBUG_MSG 1
#define AUDIO_ERROR_MSG 1
//------------------------------------------------------------------------------
// GLOBAL OR STATIC VARIABLES
//------------------------------------------------------------------------------
SsiClass *g_Ssi = NULL;
RT_CodecComm *g_Codec = NULL;
static AudmuxClass *g_Audmux = NULL;
//------------------------------------------------------------------------------
// STATIC FUNCTION PROTOTYPES
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// EXPORTED FUNCTIONS
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//
// FUNCTION: audioInit
//
// DESCRIPTION: Initialises the audio hardware.
//
// PARAMETERS:
// codec - [OUT] pointer to Wm8731Class object
// ssi - [OUT] pointer to SsiClass object
// audmux - [OUT] pointer to AudmuxClass object
// dmac - [OUT] pointer to DmacClass object
// txBufferSize - [IN] size of 1 TX DMA buffer.
// txbuffer - [IN] PHYSICAL address of TX DMA buffer
// rxBufferSize - [IN] size of 1 TX DMA buffer.
// rxbuffer - [IN] PHYSICAL address of RX DMA buffer
// ssiDmaEn - [IN] Enable SSI DMA if TRUE
// ssiIntrEn - [IN] Enable SSI interrupts if TRUE
// txDmaCh - [OUT] allocated TX DMA channel
// rxDmaCh - [OUT] allocated RX DMA channel
//
// RETURNS:
// TRUE for success initialisation.
// FALSE otherwise
//
//------------------------------------------------------------------------------
BOOL audioHwInit( BOOL ssiDmaEn,
BOOL ssiIntrEn,
UINT32 txBuffer,
UINT32 txBufferSize,
UINT32 rxBuffer,
UINT32 rxBufferSize,
UINT8 *txDmaCh,
UINT8 *rxDmaCh)
{
SSI_MODULE_CONFIG ssiConfig;
AUDMUX_PORT_CONFIG audmuxConfig;
DMAC_CHANNEL_CFG dmaCfg;
g_Ssi = new SsiClass(AUDIO_SSI_ID);
g_Codec = new RT_CodecComm;
g_Audmux = new AudmuxClass;
if(!g_Ssi || !g_Codec || !g_Audmux)
{
ERRORMSG(1, (TEXT("Audio NULL pointer!\r\n")));
return FALSE;
}
// Lock SSI resource
g_Ssi->Lock();
///////////////////////////////////////////////////////
// TO2 CONFIGURATION :
// - SSI NORMAL network mode
// - CODEC SET AS MASTER, MSB-LEFT JUSTIFIED
/////////////////////////////////////////////////////////
ssiConfig.mode = SSI_MODE_NORMAL;
ssiConfig.modeConfig.normalConfig.netEnable = TRUE ;
ssiConfig.modeConfig.normalConfig.txSlotMask = 0xFFFFFFFA;
ssiConfig.modeConfig.normalConfig.rxSlotMask = 0xFFFFFFFA;
ssiConfig.modeConfig.normalConfig.twoChannelMode = FALSE;
ssiConfig.modeConfig.normalConfig.clkIdleHigh = FALSE;
ssiConfig.modeConfig.normalConfig.sysClkOut = FALSE;
ssiConfig.modeConfig.normalConfig.sync = TRUE; //FALSE;
//ssiConfig.modeConfig.normalConfig.sync = FALSE;
ssiConfig.modeConfig.normalConfig.tx.clkSrcIp = FALSE;
ssiConfig.modeConfig.normalConfig.tx.shiftWrtBit0 = TRUE;
ssiConfig.modeConfig.normalConfig.tx.fsInternal = FALSE;
ssiConfig.modeConfig.normalConfig.tx.clkInternal = FALSE;
ssiConfig.modeConfig.normalConfig.tx.lsbFirst = FALSE;
ssiConfig.modeConfig.normalConfig.tx.fallingEdgeLatch = TRUE;
ssiConfig.modeConfig.normalConfig.tx.fsActiveLow = FALSE;
ssiConfig.modeConfig.normalConfig.tx.singleClockFs = FALSE;
ssiConfig.modeConfig.normalConfig.tx.earlyFs = FALSE;
ssiConfig.modeConfig.normalConfig.rx.clkSrcIp = FALSE;
ssiConfig.modeConfig.normalConfig.rx.shiftWrtBit0 = TRUE;
ssiConfig.modeConfig.normalConfig.rx.fsInternal = FALSE;
ssiConfig.modeConfig.normalConfig.rx.clkInternal = FALSE;
ssiConfig.modeConfig.normalConfig.rx.lsbFirst = FALSE;
ssiConfig.modeConfig.normalConfig.rx.fallingEdgeLatch = TRUE;
ssiConfig.modeConfig.normalConfig.rx.fsActiveLow = FALSE;
ssiConfig.modeConfig.normalConfig.rx.singleClockFs = FALSE;
ssiConfig.modeConfig.normalConfig.rx.earlyFs = FALSE;
// ssiConfig.modeConfig.normalConfig.txClkConfig.frameRate = SSI_FRAMERATE_44100;
// ssiConfig.modeConfig.normalConfig.txClkConfig.overSampleValue = 256;
ssiConfig.modeConfig.normalConfig.txClkConfig.wordLen = AUDIO_TX_WORD_LEN;
ssiConfig.modeConfig.normalConfig.txClkConfig.dc = 4;
ssiConfig.txEnable = TRUE;
// ssiConfig.modeConfig.normalConfig.rxClkConfig.frameRate = SSI_FRAMERATE_44100;
// ssiConfig.modeConfig.normalConfig.rxClkConfig.overSampleValue = 256;
ssiConfig.modeConfig.normalConfig.rxClkConfig.wordLen = AUDIO_RX_WORD_LEN;
ssiConfig.modeConfig.normalConfig.rxClkConfig.dc = 4;
ssiConfig.rxEnable = TRUE;
ssiConfig.testEnable = FALSE;
ssiConfig.dmaEnable = ssiDmaEn;
ssiConfig.intrEnable = ssiIntrEn;
ssiConfig.txFifoWatermark = AUDIO_TX_FIFO_WATERMARK;
ssiConfig.rxFifoWatermark = AUDIO_RX_FIFO_WATERMARK;
if(g_Ssi->Configure(&ssiConfig) == FALSE)
{
ERRORMSG(1, (TEXT("SSI%d Configure failed! err=%d\r\n"),
g_Ssi, g_Ssi->GetErrorCode()));
return FALSE;
}
////////////////////////////////////
// AUDMUX SETTING
///////////////////////////////////
// Configure AUDMUX host port1:
// 1. tx source to peripheral port 5
// 2. rx sink from peripheral port4
// 3. TX CLK & FS slave from peripheral port 4
// 4. RX CLK & FS slave from peripheral port 5
audmuxConfig.txFsInput = FALSE;
audmuxConfig.txClkInput = FALSE;
audmuxConfig.txFsClkSrcPort = AUDMUX_PORT_ID_PERI2;
audmuxConfig.txFsClkFromRx = FALSE;
audmuxConfig.rxFsInput = FALSE;
audmuxConfig.rxClkInput = FALSE;
audmuxConfig.rxFsClkSrcPort = AUDMUX_PORT_ID_PERI1;
audmuxConfig.rxFsClkFromRx = FALSE;
audmuxConfig.rxDataSrcPort = AUDMUX_PORT_ID_PERI1;
audmuxConfig.syncModeEn = FALSE;
audmuxConfig.txRxSwitchEn = FALSE;
audmuxConfig.intNetworkEn = FALSE;
g_Audmux->EnablePort(AUDMUX_PORT_ID_HOST1, TRUE);
g_Audmux->SetPortConfig(AUDMUX_PORT_ID_HOST1, &audmuxConfig);
DEBUGMSG(AUDIO_DEBUG_MSG, (TEXT("AUDMUX Port1 configured!\r\n")));
// Configure peripheral port4:
// 1. Rx data source to host port 1
// 2. Rx CLK & FS master
audmuxConfig.txFsInput = TRUE; // Not used. Set as input
audmuxConfig.txClkInput = TRUE; // Not used. Set as input
audmuxConfig.txFsClkSrcPort = AUDMUX_PORT_ID_HOST1; // Ignored
audmuxConfig.txFsClkFromRx = FALSE;
audmuxConfig.rxFsInput = TRUE; // Codec is FS/CLK master
audmuxConfig.rxClkInput = TRUE; // Codec is FS/CLK master
audmuxConfig.rxFsClkSrcPort = AUDMUX_PORT_ID_HOST1; // Ignored
audmuxConfig.rxFsClkFromRx = FALSE;
audmuxConfig.rxDataSrcPort = AUDMUX_PORT_ID_HOST1;
audmuxConfig.syncModeEn = FALSE;
audmuxConfig.txRxSwitchEn = FALSE;
audmuxConfig.intNetworkEn = FALSE;
g_Audmux->EnablePort(AUDMUX_PORT_ID_PERI1, TRUE);
g_Audmux->SetPortConfig(AUDMUX_PORT_ID_PERI1, &audmuxConfig);
DEBUGMSG(AUDIO_DEBUG_MSG, (TEXT("AUDMUX Port4 configured!\r\n")));
// Configure peripheral port 2 for:
// 1. TX data sink from host port 1,
// 2. TX FS/CLK master to host port1
audmuxConfig.txFsInput = TRUE; // Codec is FS/CLK master
audmuxConfig.txClkInput = TRUE; // Codec is FS/CLK master
audmuxConfig.txFsClkSrcPort = AUDMUX_PORT_ID_HOST1;
audmuxConfig.txFsClkFromRx = FALSE;
audmuxConfig.rxFsInput = TRUE; // Not used. Set as input
audmuxConfig.rxClkInput = TRUE; // Not used. Set as input
audmuxConfig.rxFsClkSrcPort = AUDMUX_PORT_ID_HOST1; // Ignored
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -