📄 hwctxt.cpp
字号:
//
//-----------------------------------------------------------------------------
BOOL HardwareContext::BSPAudioInitInput(AUDIO_BUS bus)
{
BOOL rc = FALSE;
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((VOICE_CODEC_SSI == m_pSSI1) ? SSI1_AUDMUX_PORT :
SSI2_AUDMUX_PORT,
VOICE_CODEC_AUDMUX_PORT,
(VOICE_CODEC_SSI == m_pSSI1) ? BSP_SSI1_MASTER_BOOL :
BSP_SSI2_MASTER_BOOL);
// Configure the input DMA watermark level. This value is the
// number of words currently stored in the SSI receiver FIFO
// before a DMA request is sent. Therefore, this is also the
// number of words that we will read (and remove) from the FIFO
// using a single DMA operation.
m_InputDMALevel = SSI_SFCSR_RX_WATERMARK;
// Open the DMA channel for handling SSI receive/recording.
m_InputDMAChan = DDKSdmaOpenChan((VOICE_CODEC_SSI == m_pSSI1) ?
DDK_DMA_REQ_SSI1_RX0 :
DDK_DMA_REQ_SSI2_RX0,
BSP_SDMA_CHNPRI_AUDIO, NULL,
(VOICE_CODEC_SSI == m_pSSI1) ?
IRQ_SSI1 : IRQ_SSI2);
if (m_InputDMAChan) rc = TRUE;
break;
}
return rc;
}
#endif // #ifdef AUDIO_RECORDING_ENABLED
//-----------------------------------------------------------------------------
//
// Function: BSPAudioStartOutput
//
// This function configures audio output devices to start audio playback.
//
// Parameters:
// The SSI configuration to be used.
//
// Returns:
// None.
//
//-----------------------------------------------------------------------------
BOOL HardwareContext::BSPAudioStartOutput(AUDIO_BUS bus, AUDIO_PATH path,
const HWSAMPLE *const ssiFifoPrefill,
const unsigned nSsiFifoPrefill)
{
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, ssiFifoPrefill,
nSsiFifoPrefill);
break;
}
return rc;
}
#ifdef AUDIO_RECORDING_ENABLED
//-----------------------------------------------------------------------------
//
// Function: BSPAudioStartInput
//
// This function configures audio input devices to start audio record.
//
// Parameters:
// The SSI configuration to be used.
//
// Returns:
// None.
//
//-----------------------------------------------------------------------------
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;
}
return rc;
}
#endif // #ifdef AUDIO_RECORDING_ENABLED
//-----------------------------------------------------------------------------
//
// Function: BSPAudioStopOutput
//
// This function configures audio output devices to stop audio playback.
//
// Parameters:
// The SSI configuration to be used.
//
// Returns:
// None.
//
//-----------------------------------------------------------------------------
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:
// The SSI configuration to be used.
//
// Returns:
// None.
//
//-----------------------------------------------------------------------------
BOOL HardwareContext::BSPAudioStopInput(AUDIO_BUS bus, AUDIO_PATH path)
{
BOOL rc = TRUE;
switch (bus)
{
case AUDIO_BUS_VOICE_IN:
// Turn off the codec and amps
BSPAudioStopCodecInput(bus, path);
// Stop SSI transmit
BSPAudioStopSsiInput(VOICE_CODEC_SSI);
break;
}
return rc;
}
#endif // #ifdef AUDIO_RECORDING_ENABLED
//-----------------------------------------------------------------------------
//
// Function: BSPAudioSetOutputGain
//
// This function configures the Stereo DAC's output PGA amplifier gain
// level based upon the volume level that Windows is currently requesting.
//
// The current mapping uses only the low-word of the DWORD dwGain
// argument because the PMIC does not allow setting separate gain
// levels for the left and right channels. Therefore, as documented
// in the audio driver online help files, we should just use the
// low-word part of the gain value. This provides a range of 0-65535.
//
// Note that the MC13783 PMIC Stereo DAC supports 14 distinct output
// gain levels that range from -33dB to +6dB in 3dB steps. Therefore,
// we have implemented a linear mapping of the 0-65535 range to the
// 0-13 range in order to select the actual hardware gain level.
//
// Parameters:
// bus [in] Ignored.
// dwGain [in] The desired output volume level.
//
// Returns:
// TRUE if new output gain was successfully set.
// FALSE if new output gain could not be set.
//
//-----------------------------------------------------------------------------
BOOL HardwareContext::BSPAudioSetOutputGain(AUDIO_BUS bus, const DWORD dwGain)
{
DWORD lowGain = (dwGain & 0xFFFF); // Just use low-word of dwGain.
PMIC_AUDIO_OUTPUT_PGA_GAIN pmicGain;
PMIC_STATUS rc;
DEBUGMSG(ZONE_FUNCTION, (_T("+HardwareContext::BSPAudioSetOutputGain\n")));
if (lowGain <= 2521)
{
// Set to minimum amplifier gain.
pmicGain = OUTPGA_GAIN_MINUS_33DB;
}
else if (lowGain > 63013)
{
// Set to maximum amplifier gain.
pmicGain = OUTPGA_GAIN_PLUS_6DB;
}
else
{
// Linear mapping of lowGain value to available amplifier gain levels.
pmicGain = (PMIC_AUDIO_OUTPUT_PGA_GAIN)((lowGain - 2522) / 5041 + 1);
}
// Set the Stereo DAC's PGA output gain level.
rc = PmicAudioOutputSetPgaGain(hStDAC, pmicGain);
DEBUGMSG(ZONE_FUNCTION, (_T("-HardwareContext::BSPAudioSetOutputGain\n")));
return (rc == PMIC_SUCCESS);
}
#ifdef AUDIO_RECORDING_ENABLED
//-----------------------------------------------------------------------------
//
// Function: BSPAudioSetInputGain
//
//
// Parameters:
//
// Returns:
// None.
//
//-----------------------------------------------------------------------------
BOOL HardwareContext::BSPAudioSetInputGain(AUDIO_BUS bus, const DWORD dwGain)
{
DEBUGMSG(ZONE_FUNCTION, (_T("+HardwareContext::BSPAudioSetInputGain\n")));
DEBUGMSG(ZONE_FUNCTION, (_T("-HardwareContext::BSPAudioSetInputGain\n")));
return TRUE;
}
#endif // #ifdef AUDIO_RECORDING_ENABLED
//-----------------------------------------------------------------------------
//
// Function: BSPAudioRoute
//
// This function configures the Audio MUX to connect/disconnect the SSI
// to the external power management IC.
//
// Parameters:
// intPort [in] Audio MUX internal port for connection to SSI.
// extPort [in] Audio MUX external port for connection to PMIC.
// bMaster [in] Boolean flag to select SSI Master (if TRUE) or
// PMIC Master (if FALSE) modes.
//
// Returns:
// None.
//
//-----------------------------------------------------------------------------
void HardwareContext::BSPAudioRoute(AUDMUX_INTERNAL_PORT intPort,
AUDMUX_EXTERNAL_PORT extPort, BOOL bMaster)
{
PUINT32 pPTCR, pPDCR;
// Get pointers to the Audio MUX internal port registers.
pPTCR = &m_pAUDMUX->PTCR1 + intPort*2;
pPDCR = &m_pAUDMUX->PDCR1 + intPort*2;
// Configure the Audio MUX internal port to connect with the SSI based
// upon who is acting as the bus master.
//
// But regardless of who is the master, we also configure the internal
// port for synchronous 4-wire operation in normal mode (which is what
// we actually need to support the SSI and PMIC for either network or I2S
// modes).
//
// Note that we only configure the transmit framesync and bitclock here
// because we are using synchronous mode and the receiver clock
// settings will be determined by the transmitter settings.
if (bMaster)
{
// All clock signals for the internal port are input signals for
// SSI master mode.
OUTREG32(pPTCR,
CSP_BITFVAL(AUDMUX_PTCR_TFSDIR, AUDMUX_PTCR_TFSDIR_INPUT) |
CSP_BITFVAL(AUDMUX_PTCR_TCLKDIR, AUDMUX_PTCR_TCLKDIR_INPUT) |
CSP_BITFVAL(AUDMUX_PTCR_SYN, AUDMUX_PTCR_SYN_SYNC));
}
else
{
// All clock signals for the internal port are all output signals for
// PMIC master mode. The source of the clock signals is the external
// port that is connected to the PMIC.
OUTREG32(pPTCR,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -