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

📄 hwctxt.cpp

📁 Microsoft WinCE 6.0 BSP FINAL release source code for use with the i.MX27ADS TO2 WCE600_FINAL_MX27_S
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//
//  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 + -