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

📄 audio.cpp

📁 freesacle mx21下的声卡alc5620的驱动程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
// 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 + -