示例#1
0
int audio_Initialize(u16 baseAddr)
{
	LOG_TRACE();
	return audio_Mute(baseAddr, 1);
}
示例#2
0
int audio_Configure(u16 baseAddr, audioParams_t *params, u16 pixelClk, unsigned int ratioClk)
{
	u16 i = 0;
	LOG_TRACE();
	/* more than 2 channels => layout 1 else layout 0 */
	halFrameComposerAudio_PacketLayout(baseAddr + FC_BASE_ADDR,
			((audioParams_ChannelCount(params) + 1) > 2) ? 1 : 0);
	/* iec validity and user bits (IEC 60958-1 */
	for (i = 0; i < 4; i++)
	{
		/* audioParams_IsChannelEn considers left as 1 channel and
		 * right as another (+1), hence the x2 factor in the following */
		/* validity bit is 0 when reliable, which is !IsChannelEn */
		halFrameComposerAudio_ValidityRight(baseAddr + FC_BASE_ADDR,
				!(audioParams_IsChannelEn(params, (2 * i))), i);
		halFrameComposerAudio_ValidityLeft(baseAddr + FC_BASE_ADDR,
				!(audioParams_IsChannelEn(params, (2 * i) + 1)), i);
		halFrameComposerAudio_UserRight(baseAddr + FC_BASE_ADDR,
				USER_BIT, i);
		halFrameComposerAudio_UserLeft(baseAddr + FC_BASE_ADDR,
				USER_BIT, i);
	}

	/* IEC - not needed if non-linear PCM */
	halFrameComposerAudio_IecCgmsA(baseAddr + FC_BASE_ADDR,
			audioParams_GetIecCgmsA(params));
	halFrameComposerAudio_IecCopyright(baseAddr + FC_BASE_ADDR,
			audioParams_GetIecCopyright(params) ? 0 : 1);
	halFrameComposerAudio_IecCategoryCode(baseAddr + FC_BASE_ADDR,
			audioParams_GetIecCategoryCode(params));
	halFrameComposerAudio_IecPcmMode(baseAddr + FC_BASE_ADDR,
			audioParams_GetIecPcmMode(params));
	halFrameComposerAudio_IecSource(baseAddr + FC_BASE_ADDR,
			audioParams_GetIecSourceNumber(params));
	for (i = 0; i < 4; i++)
	{ /* 0, 1, 2, 3 */
		halFrameComposerAudio_IecChannelLeft(baseAddr + FC_BASE_ADDR,
				2* i + 1, i); /* 1, 3, 5, 7 */
		halFrameComposerAudio_IecChannelRight(baseAddr + FC_BASE_ADDR,
				2* (i + 1), i); /* 2, 4, 6, 8 */
	}
	halFrameComposerAudio_IecClockAccuracy(baseAddr + FC_BASE_ADDR, audioParams_GetIecClockAccuracy(params));
    halFrameComposerAudio_IecSamplingFreq(baseAddr + FC_BASE_ADDR, audioParams_IecSamplingFrequency(params));
    halFrameComposerAudio_IecOriginalSamplingFreq(baseAddr + FC_BASE_ADDR, audioParams_IecOriginalSamplingFrequency(params));
    halFrameComposerAudio_IecWordLength(baseAddr + FC_BASE_ADDR, audioParams_IecWordLength(params));

	halAudioI2s_Select(baseAddr + AUD_BASE_ADDR + AUDIO_I2S, (audioParams_GetInterfaceType(params) == I2S)? 1 : 0);
 	/*
 	 * ATTENTION: fixed I2S data enable configuration
 	 * is equivalent to 0x1 for 1 or 2 channels
 	 * is equivalent to 0x3 for 3 or 4 channels
 	 * is equivalent to 0x7 for 5 or 6 channels
 	 * is equivalent to 0xF for 7 or 8 channels
 	 */
 	halAudioI2s_DataEnable(baseAddr + AUD_BASE_ADDR + AUDIO_I2S, 0xF);
 	/* ATTENTION: fixed I2S data mode (standard) */
 	halAudioI2s_DataMode(baseAddr + AUD_BASE_ADDR + AUDIO_I2S, 0);
 	halAudioI2s_DataWidth(baseAddr + AUD_BASE_ADDR + AUDIO_I2S, audioParams_GetSampleSize(params));
 	halAudioI2s_InterruptMask(baseAddr + AUD_BASE_ADDR + AUDIO_I2S, 3);
 	halAudioI2s_InterruptPolarity(baseAddr + AUD_BASE_ADDR + AUDIO_I2S, 3);
 	halAudioI2s_ResetFifo(baseAddr + AUD_BASE_ADDR + AUDIO_I2S);

 	halAudioSpdif_NonLinearPcm(baseAddr + AUD_BASE_ADDR + AUDIO_SPDIF, audioParams_IsLinearPCM(params)? 0 : 1);
 	halAudioSpdif_DataWidth(baseAddr + AUD_BASE_ADDR + AUDIO_SPDIF, audioParams_GetSampleSize(params));
 	halAudioSpdif_InterruptMask(baseAddr + AUD_BASE_ADDR + AUDIO_SPDIF, 3);
 	halAudioSpdif_InterruptPolarity(baseAddr + AUD_BASE_ADDR + AUDIO_SPDIF, 3);
 	halAudioSpdif_ResetFifo(baseAddr + AUD_BASE_ADDR + AUDIO_SPDIF);

 	halAudioHbr_Select(baseAddr + AUD_BASE_ADDR + AUDIO_HBR, (audioParams_GetInterfaceType(params) == HBR)? 1 : 0);
 	halAudioHbr_InterruptMask(baseAddr + AUD_BASE_ADDR + AUDIO_HBR, 7);
 	halAudioHbr_InterruptPolarity(baseAddr + AUD_BASE_ADDR + AUDIO_HBR, 7);
 	halAudioHbr_ResetFifo(baseAddr + AUD_BASE_ADDR + AUDIO_HBR);

	if (audioParams_GetInterfaceType(params) == GPA)
	{
		for (i = 0; i < 8; i++)
		{
			halAudioGpa_ChannelEnable(baseAddr + AUD_BASE_ADDR + AUDIO_GPA, audioParams_IsChannelEn(params, i), i);
		}
		halAudioGpa_HbrEnable(baseAddr + AUD_BASE_ADDR + AUDIO_GPA, audioParams_GetPacketType(params) == HBR_STREAM? 1: 0);
		halAudioGpa_InterruptMask(baseAddr + AUD_BASE_ADDR + AUDIO_GPA, 3);
		halAudioGpa_InterruptPolarity(baseAddr + AUD_BASE_ADDR + AUDIO_GPA, 3);
		halAudioGpa_ResetFifo(baseAddr + AUD_BASE_ADDR + AUDIO_GPA);
	}
 	halAudioClock_N(baseAddr + AUD_BASE_ADDR + AUDIO_CLOCK, audio_ComputeN(baseAddr, audioParams_GetSamplingFrequency(params), pixelClk, ratioClk));
	/* if NOT GPA interface, use automatic mode, else, compute CTS */
 	halAudioClock_Cts(baseAddr + AUD_BASE_ADDR + AUDIO_CLOCK, (audioParams_GetInterfaceType(params) != GPA)? 0: audio_ComputeCts(baseAddr, audioParams_GetSamplingFrequency(params), pixelClk, ratioClk));
	if (audioParams_GetInterfaceType(params) != GPA)
	{
		switch (audioParams_GetClockFsFactor(params))
		{
			/* This version does not support DRU Bypass - found in controller 1v30a
			 *	0 128Fs		I2S- (SPDIF when DRU in bypass)
			 *	1 256Fs		I2S-
			 *	2 512Fs		I2S-HBR-(SPDIF - when NOT DRU bypass)
			 *	3 1024Fs	I2S-(SPDIF - when NOT DRU bypass)
			 *	4 64Fs		I2S
			 */
			case 64:
#if 0
				if (audioParams_GetInterfaceType(params) != I2S)
				{
					return FALSE;
				}
#endif
				halAudioClock_F(baseAddr + AUD_BASE_ADDR + AUDIO_CLOCK, 4);
				break;
			case 128:
#if 0
				if (audioParams_GetInterfaceType(params) != I2S)
				{
					return FALSE;
				}
#endif
				halAudioClock_F(baseAddr + AUD_BASE_ADDR + AUDIO_CLOCK, 0);
				break;
			case 256:
#if 0
				if (audioParams_GetInterfaceType(params) != I2S)
				{
					return FALSE;
				}
#endif
				halAudioClock_F(baseAddr + AUD_BASE_ADDR + AUDIO_CLOCK, 1);
				break;
			case 512:
				halAudioClock_F(baseAddr + AUD_BASE_ADDR + AUDIO_CLOCK, 2);
				break;
			case 1024:
				if (audioParams_GetInterfaceType(params) == HBR)
				{
					return FALSE;
				}
				halAudioClock_F(baseAddr + AUD_BASE_ADDR + AUDIO_CLOCK, 3);
				break;
			default:
				/* Fs clock factor not supported */
				return FALSE;
		}
	}
#if 0
 	if (audio_AudioGenerator(baseAddr, params) != TRUE)
 	{
 		return FALSE;
 	}
#endif
 	return audio_Mute(baseAddr, 0);
 }
示例#3
0
void api_AudioMute(int enable)
{
	LOG_TRACE1(enable);
	audio_Mute(api_mBaseAddress, enable);
}