?? audio.cpp
字號:
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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -