audio.cpp

来自「freesacle mx21下的声卡alc5620的驱动程序」· C++ 代码 · 共 439 行 · 第 1/2 页

CPP
439
字号
    audmuxConfig.rxFsClkFromRx = FALSE;
    audmuxConfig.rxDataSrcPort = AUDMUX_PORT_ID_HOST1;
    audmuxConfig.syncModeEn = FALSE;
    audmuxConfig.txRxSwitchEn = FALSE;
    audmuxConfig.intNetworkEn = FALSE;
    g_Audmux->EnablePort(AUDMUX_PORT_ID_PERI2, TRUE);
    g_Audmux->SetPortConfig(AUDMUX_PORT_ID_PERI2, &audmuxConfig);
    DEBUGMSG(AUDIO_DEBUG_MSG, (TEXT("AUDMUX Port5 configured!\r\n")));
    
    ////////////////////////////////////
    //  CODEC SETTING
    ///////////////////////////////////

	if(g_Codec)
	{
		g_Codec->Init(CODECSAMPLERATE);
	}
	else
	{
		 return FALSE;
	}
	

    // Reserve DMA resources
    if(DDKDmacRequestChan(AUDIO_PLAYBACK_DMA) == DMAC_CHANNEL_INVALID)
    {
        DEBUGMSG(AUDIO_ERROR_MSG, (TEXT("Reserve TXCH failed!\r\n")));
        return FALSE;
    }

    if(DDKDmacRequestChan(AUDIO_RECORD_DMA) == DMAC_CHANNEL_INVALID)
    {
        DEBUGMSG(AUDIO_ERROR_MSG, (TEXT("Reserve RXCH failed!\r\n")));
        return FALSE;
    }

    // Initialize the TX DMA channel
    dmaCfg.SrcAddr = txBuffer;
    dmaCfg.DstAddr = g_Ssi->GetFifoPhyAddr(SSI_TRANSFER_TX, SSI_CHANNEL0);
    dmaCfg.DataSize = txBufferSize;
    dmaCfg.DstMode = DMAC_TRANSFER_MODE_FIFO;
    dmaCfg.SrcMode = DMAC_TRANSFER_MODE_LINEAR_MEMORY;
    dmaCfg.MemDirIncrease = TRUE;
    dmaCfg.DstSize = DMAC_TRANSFER_SIZE_16BIT;
    dmaCfg.SrcSize = DMAC_TRANSFER_SIZE_32BIT;
    dmaCfg.RepeatType = DMAC_REPEAT_DISABLED;
    dmaCfg.ExtReqEnable = TRUE;
    dmaCfg.ReqSrc = DMAC_REQUEST_SSI1_TX0_FIFO;
    dmaCfg.BurstLength = AUDIO_TX_FIFO_WATERMARK * 2;
    dmaCfg.ReqTimeout = FALSE;
    dmaCfg.ReqTOCounter = 0;
    dmaCfg.BusClkCounter = 0;
    
    if(DDKDmacConfigureChan(AUDIO_PLAYBACK_DMA, &dmaCfg) == DMAC_CHANNEL_INVALID)
    {
        DEBUGMSG(AUDIO_ERROR_MSG, (TEXT("Bind TXCH failed!\r\n")));
        return FALSE;
    }

    // Initialize the RX DMA channel
    dmaCfg.SrcAddr = g_Ssi->GetFifoPhyAddr(SSI_TRANSFER_RX, SSI_CHANNEL0);
    dmaCfg.DstAddr = rxBuffer;
    dmaCfg.DataSize = rxBufferSize;
    dmaCfg.DstMode = DMAC_TRANSFER_MODE_LINEAR_MEMORY;
    dmaCfg.SrcMode = DMAC_TRANSFER_MODE_FIFO;
    dmaCfg.MemDirIncrease = TRUE;
    dmaCfg.DstSize = DMAC_TRANSFER_SIZE_32BIT;
    dmaCfg.SrcSize = DMAC_TRANSFER_SIZE_16BIT;
    dmaCfg.RepeatType = DMAC_REPEAT_DISABLED;
    dmaCfg.ExtReqEnable = TRUE;
    dmaCfg.ReqSrc = DMAC_REQUEST_SSI1_RX0_FIFO;
    dmaCfg.BurstLength = AUDIO_RX_FIFO_WATERMARK * 2;
    dmaCfg.ReqTimeout = FALSE;
    dmaCfg.ReqTOCounter = 0;
    dmaCfg.BusClkCounter = 0;

    if(DDKDmacConfigureChan(AUDIO_RECORD_DMA, &dmaCfg) == DMAC_CHANNEL_INVALID)
    {
        DEBUGMSG(AUDIO_ERROR_MSG, (TEXT("Bind RXCH failed!\r\n")));
        return FALSE;
    }

    // PreClear any interrupt status
    DDKDmacClearChannelIntr(AUDIO_PLAYBACK_DMA);
    DDKDmacClearChannelIntr(AUDIO_RECORD_DMA);

    // Return assigned channels
    *txDmaCh = AUDIO_PLAYBACK_DMA;
    *rxDmaCh = AUDIO_RECORD_DMA;

    DEBUGMSG(AUDIO_DEBUG_MSG, (TEXT("Audio DMA enabled. Init done!\r\n")));
    return TRUE;
}

//------------------------------------------------------------------------------
//
//  FUNCTION:       audioHwDeinit
//
//  DESCRIPTION:    De initialises the audio hardware.
//                  
//  PARAMETERS:     
//                  codec - [OUT] address of pointer to Wm8731Class
//                  ssi - [OUT] address of pointer to SsiClass
//                  audmux - [OUT] address of pointer to AudmuxClass
//                  dmac - [OUT] address of pointer to DmacClass
//
//  RETURNS:        
//                  TRUE for success
//                  FALSE otherwise
//
//------------------------------------------------------------------------------
void audioHwDeinit(void) 
{
    if(g_Ssi)
    {
        // release the SSI resources
        g_Ssi->Transmit(FALSE);
        g_Ssi->Receive(FALSE);
        g_Ssi->PowerDown();
        g_Ssi->Unlock();
        g_Ssi = NULL;
    }
    
    // release AUDIO TX and RX channels
    DDKDmacStopChan(AUDIO_PLAYBACK_DMA);
    DDKDmacReleaseChan(AUDIO_PLAYBACK_DMA);
    DDKDmacClearChannelIntr(AUDIO_PLAYBACK_DMA);

    DDKDmacStopChan(AUDIO_RECORD_DMA);
    DDKDmacReleaseChan(AUDIO_RECORD_DMA);
    DDKDmacClearChannelIntr(AUDIO_RECORD_DMA);

    // Power down the codec
    if(g_Codec)
    {
			g_Codec->ChangeCodecPowerStatus(POWER_STATE_D4);
	
        g_Codec = NULL;
    }

    if(g_Audmux)
    {
        // Disable AUDMUX pins
        g_Audmux->EnablePort(AUDMUX_PORT_ID_HOST1, FALSE);
        g_Audmux->EnablePort(AUDMUX_PORT_ID_PERI1, FALSE);
        g_Audmux->EnablePort(AUDMUX_PORT_ID_PERI2, FALSE);
        g_Audmux = NULL;
    }
}

//------------------------------------------------------------------------------
//
//  FUNCTION:       audioHwTxPower
//
//  DESCRIPTION:    Powers up or down the audio TX hardware.
//                  Note:   If the TX and RX SSI is one and the same,
//                          SSI is not powered on/off for input power
//                          control mode.
//                  
//  PARAMETERS:     
//                  codec - [OUT] address of pointer to RT_CodecComm
//                  ssi - [OUT] address of pointer to SsiClass
//                  audmux - [OUT] address of pointer to AudmuxClass
//                  dmac - [OUT] address of pointer to DmacClass
//
//  RETURNS:        
//                  None
//
//------------------------------------------------------------------------------
void audioSetPowerOnOff(BOOL bSetPlayback, BOOL bSetRecord, BOOL bOff)
{
    if(bSetPlayback == TRUE && bSetRecord == TRUE)
	{

		if(bOff)
		{
			g_Codec->ChangeCodecPowerStatus(POWER_STATE_D2);
		}
		else
		{
			g_Codec->ChangeCodecPowerStatus(POWER_STATE_D1);
		}

	}
    else if(bSetPlayback == TRUE)
	{

		if(bOff)
		{
			g_Codec->ChangeCodecPowerStatus(POWER_STATE_D2_PLAYBACK);
		}
		else
		{
			g_Codec->ChangeCodecPowerStatus(POWER_STATE_D1_PLAYBACK);
		}

	}
    else if(bSetRecord == TRUE)
	{

		if(bOff)
		{
			g_Codec->ChangeCodecPowerStatus(POWER_STATE_D2_RECORD);
		}
		else
		{
			g_Codec->ChangeCodecPowerStatus(POWER_STATE_D1_RECORD);
		}

	}




}
//------------------------------------------------------------------------------
// PRIVATE FUNCTIONS
//------------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?