📄 hwctxt.cpp
字号:
//
// FUNCTION: BSPAUDMUXShowReg
//
// DESCRIPTION: Gives the AUDMUX register dump
//
// PARAMETERS: AUDMUX register mapping pointer
//
// RETURNS: None.
//
//------------------------------------------------------------------------------
void HardwareContext::BSPAUDMUXShowReg(PCSP_AUDMUX_REG pAUD)
{
UINT32 val;
DEBUGMSG(1, (TEXT("AUDMUX General Registers:\r\n")));
val = INREG32(&pAUD->HPCR1);
DEBUGMSG(1, (TEXT("HPCR1(0x%08x)\r\n"), val));
val = INREG32(&pAUD->HPCR2);
DEBUGMSG(1, (TEXT("HPCR2(0x%08x)\r\n"), val));
val = INREG32(&pAUD->HPCR3);
DEBUGMSG(1, (TEXT("HPCR3(0x%08x)\r\n"), val));
val = INREG32(&pAUD->PPCR1);
DEBUGMSG(1, (TEXT("PPCR1(0x%08x)\r\n"), val));
val = INREG32(&pAUD->PPCR2);
DEBUGMSG(1, (TEXT("PPCR2(0x%08x)\r\n"), val));
val = INREG32(&pAUD->PPCR3);
DEBUGMSG(1, (TEXT("PPCR3(0x%08x)\r\n"), val));
}
#endif
//-----------------------------------------------------------------------------
//
// Function: BSPAudioInitOutput
//
// This function initializes the DMA, SSI, and AUDMUX to support audio
// output.
//
// Parameters:
// bus - The Audio data bus to be initialises SSI1 / SSI2.
// txbuffer - Pointer to the DMA transmit buffer
// txbufferSize - Size of the allocated transmit buffer.
// Returns:
// TRUE or FALSE.
//
//-----------------------------------------------------------------------------
BOOL HardwareContext::BSPAudioInitOutput(AUDIO_BUS bus,
UINT32 txBuffer,
UINT32 txBufferSize)
{
BOOL rc = FALSE;
DMAC_CHANNEL_CFG dmaCfg;
UINT8 size = sizeof(HWSAMPLE);
DMAC_TRANSFER_SIZE audioDataTXWordSize = DMAC_TRANSFER_SIZE_8BIT;
if (size == sizeof(INT16))
{
audioDataTXWordSize = DMAC_TRANSFER_SIZE_16BIT;
}
else if (size == sizeof(INT32))
{
audioDataTXWordSize = DMAC_TRANSFER_SIZE_32BIT;
}
switch (bus)
{
case AUDIO_BUS_STEREO_OUT:
// Configure the SSI to function as the audio output channel.
BSPAudioInitSsi(bus, STEREO_DAC_SSI);
// Configure the PMIC Stereo DAC.
BSPAudioInitCodec(bus);
// Configure the AUDMUX to route the SSI to the PMIC Stereo DAC.
//
// We need to do this last (and only after both the SSI and PMIC
// has been properly configured) to avoid any possible signal
// conflicts due to any previous SSI and/or PMIC configuration
// settings.
BSPAudioRoute();
// Configure the output DMA watermark level. This value defines
// the number of empty slots in the SSI transmit FIFO before a
// DMA request is generated. Therefore, this value is also the
// number of words that we should transfer using a single DMA
// operation to try and refill the FIFO
// Request the DMA channel for handling SSI transmit/playback.
m_OutputDMAChan = DDKDmacRequestChan(BSP_DMA_CH_AUDIO_TX);
if (m_OutputDMAChan) rc = TRUE;
// Initialize the TX DMA channel
dmaCfg.SrcAddr = txBuffer;
dmaCfg.DstAddr = BSPGetSsiFifoPhyAddr(SSI_TRANSFER_TX, SSI_CHANNEL0,
STEREO_DAC_SSI);
dmaCfg.DataSize = txBufferSize;
dmaCfg.DstMode = DMAC_TRANSFER_MODE_FIFO;
dmaCfg.SrcMode = DMAC_TRANSFER_MODE_LINEAR_MEMORY;
dmaCfg.MemDirIncrease = TRUE;
dmaCfg.DstSize = audioDataTXWordSize;
dmaCfg.SrcSize = DMAC_TRANSFER_SIZE_32BIT;
dmaCfg.RepeatType = DMAC_REPEAT_FOREVER;
dmaCfg.ExtReqEnable = TRUE;
dmaCfg.ReqSrc = DMAC_REQUEST_SSI2_TX0_FIFO;
dmaCfg.BurstLength = SSI_SFCSR_TX_WATERMARK * 2;
dmaCfg.ReqTimeout = FALSE;
dmaCfg.ReqTOCounter = 0;
dmaCfg.BusClkCounter = 0;
if(DDKDmacConfigureChan(m_OutputDMAChan, &dmaCfg) == DMAC_CHANNEL_INVALID)
{
//DEBUGMSG(cond, printf_exp)(AUDIO_ERROR_MSG, (TEXT("Bind TXCH failed!\r\n")));
rc = FALSE;
}
DDKDmacClearChannelIntr(m_OutputDMAChan);
break;
default:
rc = FALSE;
}
#ifdef DEBUG
BSPSSIShowReg(STEREO_DAC_SSI);
#endif
return rc;
}
#ifdef AUDIO_RECORDING_ENABLED
//-----------------------------------------------------------------------------
//
// Function: BSPAudioInitInput
//
// This function initializes the DMA, SSI, and AUDMUX to support audio
// input.
//
// Parameters:
// bus - The Audio data bus to be initialises SSI1 / SSI2.
// rxbuffer - Pointer to the DMA receive buffer
// rxbufferSize - Size of the allocated receive buffer.
// Returns:
// None.
//
//-----------------------------------------------------------------------------
BOOL HardwareContext::BSPAudioInitInput(AUDIO_BUS bus,
UINT32 rxBuffer,
UINT32 rxBufferSize)
{
BOOL rc = FALSE;
DMAC_CHANNEL_CFG dmaCfg;
switch (bus)
{
case AUDIO_BUS_VOICE_IN:
// Configure the SSI to function as the audio input channel.
BSPAudioInitSsi(bus, VOICE_CODEC_SSI);
// Configure the PMIC Voice CODEC.
BSPAudioInitCodec(bus);
// Configure the AUDMUX to route the SSI to the PMIC Voice Codec.
//
// We need to do this last (and only after both the SSI and PMIC
// has been properly configured) to avoid any possible signal
// conflicts due to any previous SSI and/or PMIC configuration
// settings.
BSPAudioRoute();
// Configure the output DMA watermark level. This value defines
// the number of empty slots in the SSI transmit FIFO before a
// DMA request is generated. Therefore, this value is also the
// number of words that we should transfer using a single DMA
// operation to try and refill the FIFO.
// Request the DMA channel for handling SSI transmit/playback.
m_InputDMAChan = DDKDmacRequestChan(BSP_DMA_CH_AUDIO_RX);
// Initialize the RX DMA channel
dmaCfg.SrcAddr = BSPGetSsiFifoPhyAddr(SSI_TRANSFER_RX, SSI_CHANNEL0,
VOICE_CODEC_SSI);
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 = SSI_SFCSR_RX_WATERMARK;
dmaCfg.ReqTimeout = FALSE;
dmaCfg.ReqTOCounter = 0;
dmaCfg.BusClkCounter = 0;
if(DDKDmacConfigureChan(m_InputDMAChan, &dmaCfg) == DMAC_CHANNEL_INVALID)
{
DEBUGMSG(1, (TEXT("Bind RXCH failed!\r\n")));
return FALSE;
}
rc =TRUE;
break;
default:
rc = FALSE;
}
#ifdef DEBUG
BSPSSIShowReg(VOICE_CODEC_SSI);
#endif
return rc;
}
#endif // #ifdef AUDIO_RECORDING_ENABLED
//-----------------------------------------------------------------------------
//
// Function: BSPAudioStartOutput
//
// This function configures audio output devices to start audio playback.
//
// Parameters:
// bus - Audio bus to be used for output SSI1 / SSI2
// path - Audio out path selection
// Returns:
// TRUE or FALSE
//
//-----------------------------------------------------------------------------
BOOL HardwareContext::BSPAudioStartOutput(AUDIO_BUS bus, AUDIO_PATH path)
{
BOOL rc = TRUE;
switch (bus)
{
case AUDIO_BUS_STEREO_OUT:
// Turn on the codec and amps. This must be done before starting
// SSI output because there are required delays involved in
// enabling some of the PMIC audio components. These required
// delays will cause an SSI FIFO underrun error if the SSI
// transmitter is already running before the PMIC audio components
// have been enabled.
BSPAudioStartCodecOutput(bus, path);
// Start the SSI transmitter.
BSPAudioStartSsiOutput(STEREO_DAC_SSI);
#ifdef DEBUG
BSPSSIShowReg(STEREO_DAC_SSI);
BSPAUDMUXShowReg(m_pAUDMUX);
#endif
break;
default:
rc = FALSE;
}
return rc;
}
#ifdef AUDIO_RECORDING_ENABLED
//-----------------------------------------------------------------------------
//
// Function: BSPAudioStartInput
//
// This function configures audio input devices to start audio record.
//
// Parameters:
// bus - Audio bus to be used for output SSI1 / SSI2
// path - Audio out path selection
// Returns:
// TRUE or FALSE
//
//-----------------------------------------------------------------------------
BOOL HardwareContext::BSPAudioStartInput(AUDIO_BUS bus, AUDIO_PATH path)
{
BOOL rc = TRUE;
switch (bus)
{
case AUDIO_BUS_VOICE_IN:
// Start SSI receive
BSPAudioStartSsiInput(VOICE_CODEC_SSI);
// Turn on the codec and amps
BSPAudioStartCodecInput(bus, path);
break;
default:
rc = FALSE;
}
return rc;
}
#endif // #ifdef AUDIO_RECORDING_ENABLED
//-----------------------------------------------------------------------------
//
// Function: BSPAudioStopOutput
//
// This function configures audio output devices to stop audio playback.
//
// Parameters:
// bus - Audio bus to be used for output SSI1 / SSI2
// path - Audio out path selection
// Returns:
// TRUE or FALSE
//
//-----------------------------------------------------------------------------
BOOL HardwareContext::BSPAudioStopOutput(AUDIO_BUS bus, AUDIO_PATH path)
{
BOOL rc = TRUE;
switch (bus)
{
case AUDIO_BUS_STEREO_OUT:
// Turn off the codec and amps
BSPAudioStopCodecOutput(bus, path);
// Stop SSI transmit
BSPAudioStopSsiOutput(STEREO_DAC_SSI);
break;
}
return rc;
}
#ifdef AUDIO_RECORDING_ENABLED
//-----------------------------------------------------------------------------
//
// Function: BSPAudioStopInput
//
// This function configures audio input devices to stop audio record.
//
// Parameters:
// bus - Audio bus to be used for output SSI1 / SSI2
// path - Audio out path selection
// Returns:
// TRUE or FALSE
//
//-----------------------------------------------------------------------------
BOOL HardwareContext::BSPAudioStopInput(AUDIO_BUS bus, AUDIO_PATH path)
{
BOOL rc = TRUE;
switch (bus)
{
case AUDIO_BUS_VOICE_IN:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -