blob: 6f1be6c1e0bad4bebb8973d7aac67bea0370c6f0 [file] [log] [blame]
/*------------------------------------------------------------------------------
* Module Name: SiITTVideo
*
* Module Description:
*
* 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 "SiIVidRes.h"
#include "SiIVidF.h"
#include "SiIGlob.h"
#include "SiITTVideo.h"
#include "SiITrace.h"
#include "SiIHDMIRX.h"
#include "SiIAudio.h"
#include "SiIVidIn.h"
#include "SiIISR.h"
#include "SiITTAudio.h"
#include "../hdmirx_ext_drv.h"
/*------------------------------------------------------------------------------
* Function Name: IsVideoOn
* Function Description: checks video state machine, state is used when res
* change interrupt is ignorred
* Accepts: none
* Returns: BOOL, true if Video is on
* Globals: SiI_Ctrl.sm_bVideo
*----------------------------------------------------------------------------
*/
BOOL siiIsVideoOn(void)
{
BOOL qResult = FALSE;
if ((SiI_Ctrl.sm_bVideo == SiI_RX_VS_VideoOn) ||
(SiI_Ctrl.sm_bVideo == SiI_RX_VS_VMNotDetected))
qResult = TRUE;
return qResult;
}
/*------------------------------------------------------------------------------
* Function Name: siiSMCheckReqVideoOn
* Function Description: checks video state machine, state is used when res
* change interrupt is ignorred
* Accepts: none
* Returns: BOOL
* Globals: Read only, SiI_Ctrl.sm_bVideo
*----------------------------------------------------------------------------
*/
BOOL siiSMCheckReqVideoOn(void)
{
BOOL qResult = FALSE;
if (SiI_Ctrl.sm_bVideo == SiI_RX_VS_ReqVideoOn)
qResult = TRUE;
return qResult;
}
/*------------------------------------------------------------------------------
* Function Name: siiSetSM_ReqGlobalPowerDown
* Function Description: Sets SiI_RX_VS_ReqGlobalPowerDown and when
* SiI_RX_VS_GlobalPowerDown will be asserted
*----------------------------------------------------------------------------
*/
void siiSetSM_ReqGlobalPowerDown(void)
{
SiI_Ctrl.sm_bVideo = SiI_RX_VS_ReqGlobalPowerDown;
SiI_Ctrl.wVideoTimeOut = 32;
}
/*------------------------------------------------------------------------------
* Function Name: siiSetSM_ReqPowerDown
* Function Description: Sets SiI_RX_VS_ReqPowerDown and when
* SiI_RX_VS_PowerDown will be asserted
*----------------------------------------------------------------------------
*/
void siiSetSM_ReqPowerDown(void)
{
SiI_Ctrl.sm_bVideo = SiI_RX_VS_ReqPowerDown;
SiI_Ctrl.wVideoTimeOut = 1200;
}
/*------------------------------------------------------------------------------
* Function Name:
* Function Description:
*----------------------------------------------------------------------------
*/
void siiSetPowerDownModeAndSetSM_PowerDown(void)
{
SiI_Ctrl.sm_bVideo = SiI_RX_VS_PowerDown;
siiRX_PowerDown(ON);
SiI_Ctrl.wVideoTimeOut = 200;
}
/*-----------------------------------------------------------------------------
* Function Name:
* Function Description:
*----------------------------------------------------------------------------
*/
void siiSetSM_ReqVidInChange(void)
{
SiI_Ctrl.sm_bVideo = SiI_RX_VS_ReqVidInChange;
SiI_Ctrl.wVideoTimeOut = 64;
}
/*------------------------------------------------------------------------------
* Function Name: siiMuteVideoAndSetSM_SyncInChange
* Function Description: Mutes Video, change Video state machine to SyncInCange,
* and sets Time after which sync information will be read
* Accepts: none
* Returns: none
* Globals: SiI_Ctrl.sm_bVideo modified
*----------------------------------------------------------------------------
*/
void siiMuteVideoAndSetSM_SyncInChange(void)
{
if (SiI_Ctrl.sm_bVideo != SiI_RX_VS_GlobalPowerDown) {
siiMuteVideo(ON);
siiRX_PowerDown(OFF);
SiI_Ctrl.wVideoTimeOut = 100;
SiI_Ctrl.sm_bVideo = SiI_RX_VS_SyncInChange;
}
}
/*------------------------------------------------------------------------------
* Function Name: siiCheckOverrangeConditions
* Function Description: This function used to check sync overrange conditions
* Accepts: none
* Returns: Error Code
* Globals: SiI_Inf:sm_bVideo modified
*----------------------------------------------------------------------------
*/
/*******************************************************************************
*->SiI_RX_VS_SyncStable
* Check Overrange Conditions
* -> SiI_RX_VS_ReqVMDetection
* -> SiI_RX_VS_SyncOutOfRange
*
******************************************************************************
*/
void CheckOutOfRangeConditions(void)
{
if (siiCheckOutOfRangeConditions(&SiI_Inf.Sync))
SiI_Ctrl.sm_bVideo = SiI_RX_VS_SyncOutOfRange;
else {
SiI_Ctrl.sm_bVideo = SiI_RX_VS_ReqVMDetection;
SiI_Ctrl.wVideoTimeOut = 10;
}
}
/*------------------------------------------------------------------------------
* Function Name: siiGetPixClock()
* Function Description: This function checks if video resolution detected,
* if it wasn't detected then return Zero
* Accepts: void
* Returns: bPixClock
* Globals: read only; SiI_Ctrl.sm_bVideo
*----------------------------------------------------------------------------
*/
BYTE siiGetPixClock(void)
{
BYTE bPixClock;
if ((SiI_Ctrl.sm_bVideo == SiI_RX_VS_VMDetected) ||
(SiI_Ctrl.sm_bVideo == SiI_RX_VS_VideoOn) ||
(SiI_Ctrl.sm_bVideo == SiI_RX_VS_ReqVideoOn)) {
bPixClock = siiGetPixClockFromTables(SiI_Inf.bVResId);
} else
bPixClock = 0;
return bPixClock;
}
#ifdef SII_NO_RESOLUTION_DETECTION
/*------------------------------------------------------------------------------
* Function Name:
* Function Description:
*
* Accepts: void
* Returns: qResult
* Globals: read only; SiI_Ctrl.sm_bVideo
*----------------------------------------------------------------------------
*/
BOOL siiCheckIfVideoOutOfRangeOrVMNotDetected(void)
{
BOOL qResult = FALSE;
if ((SiI_Ctrl.sm_bVideo == SiI_RX_VS_SyncOutOfRange) ||
(SiI_Ctrl.sm_bVideo == SiI_RX_VS_VMNotDetected))
qResult = TRUE;
return qResult;
}
#endif
/*------------------------------------------------------------------------------
* Function Name:
* Function Description:
*
* Accepts: void
* Returns: qResult
* Globals: read only; SiI_Ctrl.sm_bVideo
*----------------------------------------------------------------------------
*/
BOOL siiCheckIfVideoInputResolutionReady(void)
{
BOOL qResult = FALSE;
if ((SiI_Ctrl.sm_bVideo == SiI_RX_VS_VMDetected) ||
(SiI_Ctrl.sm_bVideo == SiI_RX_VS_VideoOn) ||
(SiI_Ctrl.sm_bVideo == SiI_RX_VS_ReqVideoOn))
qResult = TRUE;
return qResult;
}
/*------------------------------------------------------------------------------
* Function Name: siiVideoResolutionDetection
* Function Description: This function is used for Video Resolution detection
* Accepts: none
* Returns: Error Code
* Globals: SiI_Inf:sm_bVideo, bVResId modified
*----------------------------------------------------------------------------
*/
/*******************************************************************************
*-> SiI_RX_VS_ReqVMDetection
* Video Resolution Detection
* -> SiI_RX_VS_VMDetected
* -> SiI_RX_VS_VMNotDetected ( unknown resolution )
******************************************************************************
*/
static void VideoResolutionDetection(void)
{
BYTE bSearchResult;
bSearchResult = siiVideoModeDetection(&SiI_Inf.bVResId, &SiI_Inf.Sync);
if (!bSearchResult) { /* Mode is not detected */
SiI_Ctrl.sm_bVideo = SiI_RX_VS_VMNotDetected;
/* siiMuteVideo(OFF); //YMA change */
siiMuteVideo(ON);
} else
SiI_Ctrl.sm_bVideo = SiI_RX_VS_VMDetected;
SiI_Ctrl.wVideoTimeOut = 10;
/* #ifdef SII_DUMP_UART */
siiPrintVModeParameters(SiI_Inf.bVResId, bSearchResult);
/* #endif */
}
/*------------------------------------------------------------------------------
* Function Name: PowerDownProcessing
* Function Description:
*----------------------------------------------------------------------------
*/
static void PowerDownProcessing(void)
{
siiRX_PowerDown(OFF); /* SCDT doesn't work in PD */
/* Wilma has the SCDT doesn't work in PD bug */
/*
* if ( siiCheckClockDetect() ){
* siiMuteVideoAndSetSM_SyncInChange();
* }
*/
if ((siiCheckSyncDetect()) ||
((SiI_Ctrl.bDevId == RX_SiI9133) && (siiCheckClockDetect())))
siiMuteVideoAndSetSM_SyncInChange();
else
siiSetPowerDownModeAndSetSM_PowerDown();
}
/*------------------------------------------------------------------------------
* Function Name: SyncInChangeProcessing
* Function Description:
*----------------------------------------------------------------------------
*/
static void SyncInChangeProcessing(void)
{
if (siiCheckSyncDetect()) {
SiI_Ctrl.sm_bVideo = SiI_RX_VS_SyncStable;
SiI_Ctrl.wVideoTimeOut = 10;
siiGetSyncInfo(&SiI_Inf.Sync);
#ifdef SII_BUG_PHOEBE_AUTOSW_BUG
if ((SiI_Ctrl.bDevId == RX_SiI9023) ||
(SiI_Ctrl.bDevId == RX_SiI9033)) {
siiSetAutoSWReset(OFF);
siiTurnAudioOffAndSetSM_AudioOff();
}
#endif
} else {
siiSetSM_ReqPowerDown();
}
}
/*------------------------------------------------------------------------------
* Function Name: siiSetResDepVideoPath
* Function Description: This function is used to set Res Dependent Video path
* Accepts: none
* Returns: Error Code
* Globals: SiI_Inf:sm_bVideo, bVResId modified
*----------------------------------------------------------------------------
*/
/*******************************************************************************
*-> SiI_RX_VS_VMDetected
* Set Video Dependent Video Path
* -> SiI_RX_VS_VideoOn
* -> SiI_RX_VS_SyncInChange
*******************************************************************************
*/
static void SetResDepVideoPath(void)
{
if (!(SiI_Inf.bGlobStatus & SiI_RX_GlobalHDMI_Detected)) {
siiSetAnalogAudioMux(SiI_Ctrl.bVidInChannel);
if (SiI_Inf.AVI.bInputColorSpace != SiI_RX_ICP_RGB) {
SiI_Inf.AVI.bInputColorSpace = SiI_RX_ICP_RGB;
siiSetVideoPathColorSpaceDependent(
SiI_Ctrl.VideoF.bOutputVideoPath,
SiI_Inf.AVI.bInputColorSpace);
/* As color space has changed, it's need
*a call to config. Video Path non res.
*dependent Vid. Path
*/
}
} else
siiSetDigitalAudioMux();
siiSetVidResDependentVidOutputFormat(SiI_Inf.bVResId,
SiI_Ctrl.VideoF.bOutputVideoPath, SiI_Inf.AVI.bAVI_State);
SiI_Ctrl.sm_bVideo = SiI_RX_VS_ReqVideoOn;
SiI_Ctrl.wVideoTimeOut = 32;
}
/*------------------------------------------------------------------------------
* Function Name:
* Function Description:
*----------------------------------------------------------------------------
*/
static void CheckIfResUnMuteVideoIfOK(void)
{
struct SyncInfoType_s SyncInfo;
/* in case if Pix Replication was changed
* need to check sync info wasn't changed
* res change interrupt is ignorred for this
* state of Video state machine
*/
siiGetSyncInfo(&SyncInfo);
if (siiCompareNewOldSync(&SiI_Inf.Sync, &SyncInfo)) {
siiMuteVideo(OFF);
SiI_Ctrl.sm_bVideo = SiI_RX_VS_VideoOn;
/* TBD: This User call should be removed -
* Needed for Oscar board only
*/
/* InitTX(); */
} else
siiMuteVideoAndSetSM_SyncInChange();
}
/*------------------------------------------------------------------------------
* Function Name: siiSetGlobalVideoMuteAndSM_Video
* Function Description:
*----------------------------------------------------------------------------
*/
void siiSetGlobalVideoMuteAndSM_Video(BOOL qOn)
{
if (qOn) {
siiMuteVideo(ON);
SiI_Ctrl.sm_bVideo = SiI_RX_VS_HoldVideoMute;
} else {
siiMuteVideo(OFF);
SiI_Ctrl.sm_bVideo = SiI_RX_VS_VideoOn;
}
}
/*------------------------------------------------------------------------------
* Function Name:
* Function Description:
*----------------------------------------------------------------------------
*/
BYTE siiTTVideoHandler(BOOL qTimeOut)
{
BYTE bECode = FALSE;
RXEXTDBG("%s: sm_bVideo=%d\n", __func__, SiI_Ctrl.sm_bVideo);
switch (SiI_Ctrl.sm_bVideo) {
case SiI_RX_VS_ReqPowerDown:
if (qTimeOut) {
siiTurnAudioOffAndSetSM_AudioOff();
siiSetPowerDownModeAndSetSM_PowerDown();
#ifdef SII_DUMP_UART
printf("\nAudioOff\n");
printf("PowerDown\n");
#endif
}
break;
case SiI_RX_VS_PowerDown:
if (qTimeOut)
PowerDownProcessing();
break;
case SiI_RX_VS_SyncInChange:
if (qTimeOut)
SyncInChangeProcessing();
break;
case SiI_RX_VS_SyncStable:
#ifdef SII_BUG_PHOEBE_AUTOSW_BUG
if ((SiI_Ctrl.bDevId == RX_SiI9023) ||
(SiI_Ctrl.bDevId == RX_SiI9033)) {
siiCheckTransitionToDVIModeAndResetHDMIInfoIfConfirmed
();
}
#endif
CheckOutOfRangeConditions();
break;
case SiI_RX_VS_ReqVMDetection:
VideoResolutionDetection();
break;
case SiI_RX_VS_VMDetected:
SetResDepVideoPath();
break;
case SiI_RX_VS_ReqVideoOn:
CheckIfResUnMuteVideoIfOK();
break;
case SiI_RX_VS_ReqVidInChange:
if (qTimeOut)
siiSetVideoInput(SiI_Ctrl.bVidInChannel);
break;
case SiI_RX_VS_ReqGlobalPowerDown:
siiMuteVideo(ON);
siiRX_DisableTMDSCores();
siiRX_PowerDown(ON);
SiI_Ctrl.sm_bVideo = SiI_RX_VS_GlobalPowerDown;
break;
case SiI_RX_VS_HoldVideoMute: /* do nothing */
break;
}
return bECode;
}