blob: 71753e18c664e6749a05f93266314f2822929c30 [file] [log] [blame]
/*------------------------------------------------------------------------------
* Module Name: SiITTAudio
*
* Module Description: Serves Audio Timeing evevts and audio state machine
*
* Copyright © 2002-2005, Silicon Image, Inc. All rights reserved.
*
* No part of this work may be reproduced, modified, distributed, transmitted,
* transcribed, or translated into any language or computer format, in any form
* or by any means without written permission of: Silicon Image, Inc.,
* 1060 East Arques Avenue, Sunnyvale, California 94085
*----------------------------------------------------------------------------
*/
#include "SiIGlob.h"
#include "SiITTAudio.h"
#include "SiITTVideo.h" /* need to sync with video */
#include "SiIAudio.h"
#include "SiITrace.h"
#include "SiIHAL.h"
#ifdef SII_DUMP_UART
#include "SiIISR.h"
#include "../hdmirx_ext_drv.h"
#endif
/*------------------------------------------------------------------------------
* Function Name: siiIsAudioHoldMuteState
* Function Description: This function checks state machine, if state
* SiI_RX_AS_HoldAudioMute then return true
*
* Accepts: none
* Returns: BOOL
* Globals: none
*----------------------------------------------------------------------------
*/
BOOL siiIsAudioHoldMuteState(void)
{
BOOL qResult = FALSE;
if (SiI_Ctrl.sm_bAudio == SiI_RX_AS_HoldAudioMute)
qResult = TRUE;
return qResult;
}
/*------------------------------------------------------------------------------
* Function Name: SetTimeOutOandSM_ReqWaitVideoOn
* Function Description: assign this state and time out in order to
* sync Audio with Video
*
* Accepts: none
* Returns: none
* Globals: SiI_Ctrl.sm_bAudio, SiI_Ctrl.wAudioTimeOut
*----------------------------------------------------------------------------
*/
static void SetTimeOutandSM_ReqWaitVideoOn(void)
{
SiI_Ctrl.sm_bAudio = SiI_RX_AS_WaitVideoOn;
SiI_Ctrl.wAudioTimeOut = 16;
}
/*------------------------------------------------------------------------------
* Function Name: siiIsAudioStatusReady
* Function Description: This function checks state machine, if state AudioOn
* then return true
*
* Accepts: none
* Returns: BOOL
* Globals: none
*----------------------------------------------------------------------------
*/
BOOL siiIsAudioStatusReady(void)
{
BOOL qResult = FALSE;
if (SiI_Ctrl.sm_bAudio == SiI_RX_AS_AudioOn)
qResult = TRUE;
return qResult;
}
/*------------------------------------------------------------------------------
* Function Name: siiSetSM_ReqAudio
* Function Description: asserts SiI_RX_AS_ReqAudio, this state starts check
* Audio conditions exception asserted
* SiI_RX_AS_HoldAudioMute state
*
* Accepts: none
* Returns: none
* Globals: none
*----------------------------------------------------------------------------
*/
void siiSetSM_ReqAudio(void)
{
/* Audio mute which is asserted by API command can be
* can be de-asserted only by command
*/
if (SiI_Ctrl.sm_bAudio != SiI_RX_AS_HoldAudioMute) {
SiI_Ctrl.sm_bAudio = SiI_RX_AS_ReqAudio;
SiI_Ctrl.wAudioTimeOut = 5;
}
}
/*------------------------------------------------------------------------------
* Function Name: SetSM_HoldAudioMute
* Function Description: asserts and deaserts SiI_RX_AS_HoldAudioMute
* only by this function iI_RX_AS_HoldAudioMute
* can be deasserted
*----------------------------------------------------------------------------
*/
static void SetSM_HoldAudioMute(BOOL qOn)
{
if (qOn) {
SiI_Ctrl.sm_bAudio = SiI_RX_AS_HoldAudioMute;
SiI_Ctrl.wAudioTimeOut = 0;
} else {
SiI_Ctrl.sm_bAudio = SiI_RX_AS_ReqAudio;
SiI_Ctrl.wAudioTimeOut = 5;
}
}
/*------------------------------------------------------------------------------
* Function Name: SetSM_AudioOff
* Function Description: this function sets SiI_RX_AS_AudioOff, exception
* asserted SiI_RX_AS_HoldAudioMute state
*----------------------------------------------------------------------------
*/
static void SetSM_AudioOff(void)
{
/* Audio mute which is asserted by API command can be
* can be de-asserted only by command
*/
if (SiI_Ctrl.sm_bAudio != SiI_RX_AS_HoldAudioMute) {
SiI_Ctrl.sm_bAudio = SiI_RX_AS_AudioOff;
/* # ms being quiet, (not to attepmt bring up Audio) */
SiI_Ctrl.wAudioTimeOut = 200;
}
}
/*------------------------------------------------------------------------------
* Function Name: siiTurnAudioOffAndSetSM_AudioOff
* Function Description: This function calls turning Audio Off, and changes
* state of the state machine
*
* Accepts: none
* Returns: none
* Globals: none
*----------------------------------------------------------------------------
*/
void siiTurnAudioOffAndSetSM_AudioOff(void)
{
/* siiSetAutoFIFOReset(OFF); */
siiTurningAudio(OFF);
SetSM_AudioOff();
}
/*------------------------------------------------------------------------------
* Function Name: siiSetGlobalAudioMuteAndSM_Audio
* Function Description: Asserts or Deasserts Audio Mute
*
* Accepts: BOOL
* Returns: none
* Globals: none
*----------------------------------------------------------------------------
*/
void siiSetGlobalAudioMuteAndSM_Audio(BOOL qOn)
{
if (qOn) {
siiSetAudioMuteEvent();
SetSM_HoldAudioMute(ON);
} else {
SetSM_HoldAudioMute(OFF);
}
}
/*------------------------------------------------------------------------------
* Function Name: siiSetSM_ReqHoldAudioMute
* Function Description: This function emolliates waiting for Soft Muting,
* it should be used to wait when audio soft mute is ramping down
* Accepts: none
* Returns: none
*----------------------------------------------------------------------------
*/
void siiSetSM_ReqHoldAudioMuteAndStartMuting(BOOL qOn)
{
if (qOn) {
siiAudioMute(ON);
SiI_Ctrl.sm_bAudio = SiI_RX_AS_ReqHoldAudioMute;
SiI_Ctrl.wAudioTimeOut = 50; /* delays for 50 ms */
} else {
SetSM_HoldAudioMute(OFF);
}
}
/*------------------------------------------------------------------------------
* Function Name: CheckAudio_IfOK_InitACR
* Function Description: If Audio is OK and ACR init., then set time after which
* CTS change interrupt can be cleared (used for STS stability check later)
*----------------------------------------------------------------------------
*/
static void CheckAudio_IfOK_InitACR(void)
{
siiClearCTSChangeInterruprt();
if (siiCheckAudio_IfOK_InitACR()) {
SiI_Ctrl.wAudioTimeOut = 4;
SiI_Ctrl.sm_bAudio = SiI_RX_AS_StartCheckCTS_Stable;
} else {
SetSM_AudioOff();
}
}
/*------------------------------------------------------------------------------
* Function Name: StartCheckCTS_Stable
* Function Description: Call clear CTS change interrupt,
* change state machine for waiting PLL Lock
*----------------------------------------------------------------------------
*/
static void StartCheckCTS_Stable(void)
{
siiClearCTSChangeInterruprt();
SiI_Ctrl.sm_bAudio = SiI_RX_AS_WaitAudioPPLLock;
SiI_Ctrl.wAudioTimeOut = 150; /* Set wait # ms for PLL Locking */
}
/*------------------------------------------------------------------------------
* Function Name: PrepareTurningAudioOn
* Function Description: If Audio prepered for turning on (waked up Audio DAC),
* hten set delay when Audio DAC will be ready
*----------------------------------------------------------------------------
*/
static void PrepareTurningAudioOn(void)
{
if (siiPrepareTurningAudioOn()) {
SiI_Ctrl.sm_bAudio = SiI_RX_AS_WaitAudioDACReady;
/* Set wait # ms, when Audio DAC will be ready */
SiI_Ctrl.wAudioTimeOut = SiI_RX_DelayAudio_WaitDACWakingUp;
} else {
SiI_Ctrl.sm_bAudio = SiI_RX_AS_AudioOff;
/* # ms being quiet, (not to attepmt bring up Audio) */
SiI_Ctrl.wAudioTimeOut = 200;
}
}
/*------------------------------------------------------------------------------
* Function Name: TurningAudioOn
* Function Description: call teurning Audio On and change state machine
* to Audio On
*----------------------------------------------------------------------------
*/
static void TurningAudioOn_SetSM_WaitStatusLock(void)
{
siiTurningAudio(ON);
SiI_Ctrl.sm_bAudio = SiI_RX_AS_AudioOnWaitLockStatus;
/* # ms being quiet, (not to attepmt bring up Audio) */
SiI_Ctrl.wAudioTimeOut = 700;
}
/*------------------------------------------------------------------------------
* Function Name:
* Function Description:
*----------------------------------------------------------------------------
*/
static void LockAudioStatusSetSM_AudioOn(void)
{
siiSaveInputAudioStatus();
SiI_Ctrl.sm_bAudio = SiI_RX_AS_AudioOn;
}
/*------------------------------------------------------------------------------
* Function Name: siiTTAudioHandler
* Function Description: Calls processing of Audio Timing Events
*
* Accepts: none
* Returns: none
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE siiTTAudioHandler(BOOL qTimeOut)
{
BYTE bECode = FALSE;
switch (SiI_Ctrl.sm_bAudio) {
case SiI_RX_AS_ReqAudio:
if (qTimeOut)
CheckAudio_IfOK_InitACR();
break;
case SiI_RX_AS_StartCheckCTS_Stable:
if (qTimeOut) {
StartCheckCTS_Stable();
siiClearGotCTSAudioPacketsIterrupts();
}
break;
case SiI_RX_AS_WaitAudioPPLLock:
if (qTimeOut)
PrepareTurningAudioOn();
break;
case SiI_RX_AS_AudioOff:
if (qTimeOut) {
siiSetSM_ReqAudio();
siiClearGotCTSAudioPacketsIterrupts();
}
break;
case SiI_RX_AS_WaitAudioDACReady:
if (qTimeOut) {
if (siiIsVideoOn()) {
#ifdef SII_DUMP_UART
siiTraceRXInterrupts();
#endif
TurningAudioOn_SetSM_WaitStatusLock();
#ifdef SII_DUMP_UART
printf(" Aud On ");
#endif
} else
SetTimeOutandSM_ReqWaitVideoOn();
}
break;
case SiI_RX_AS_AudioOnWaitLockStatus:
if (qTimeOut)
LockAudioStatusSetSM_AudioOn();
break;
case SiI_RX_AS_HoldAudioMute:
/* Do nothing, a global Audio Mute is asserted! */
break;
case SiI_RX_AS_WaitVideoOn:
if (qTimeOut) {
if (siiIsVideoOn())
TurningAudioOn_SetSM_WaitStatusLock();
else
SetTimeOutandSM_ReqWaitVideoOn();
}
break;
case SiI_RX_AS_ReqHoldAudioMute:
if (qTimeOut) {
SetSM_HoldAudioMute(ON);
siiTurnAudioOffAndSetSM_AudioOff();
}
break;
}
bECode = SiI_Inf.bAudioErr;
return bECode;
}