int audio_Initialize(u16 baseAddr) { LOG_TRACE(); return audio_Mute(baseAddr, 1); }
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); }
void api_AudioMute(int enable) { LOG_TRACE1(enable); audio_Mute(api_mBaseAddress, enable); }