//----------------------------------------------------------------------------------------------------
// ID Code      : Power.c No.0002
// Update Note  :
//
//----------------------------------------------------------------------------------------------------

#define __POWER__

#include "Core\Header\Include.h"
//#include "Core\Header\Tv.h"


/**
 * CPowerHandler
 * do powercontrol if power switch is changed
 * only called at the start of CModeHandler
 * @param <none>
 * @return {none}
 *
*/
bit CPowerHandler(void)
{
    if(GET_POWERSWITCH()){
        CPowerControl();
        CLR_POWERSWITCH();
        return _TRUE;
    }
    return _FALSE;
}

//--------------------------------------------------
// Description  : Execute power up/down process
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerControl(void)
{
    //CModeResetMode();
	if(GET_POWERSTATUS())// Power Down Process
	{ 
		#if _USE_MISC_KEY_STATE
        MCU_IR_STATUS_FF89		|=_BIT0;//|_BIT1;//enable IR
		#endif	
		//20080827 ccy modify
		LED_Message(_LED_MSG_BLACK);
#if  0
		CCcDisable();
#endif

           #if(_FIX_POWER_ON_ERROR)//ok
              COsdFxDisableOsd();		
		CAdjustBackgroundColor(0x00, 0x00, 0x00);	
		//CScalerDisableDisplayOutput();			
		CTimerCancelTimerEvent(CModeNoSignalEvent);
           #endif
		//DebugPrintf("\n Pwr-Dn%c",0x20);
		
		//add lbh 090916
           CTimerCancelTimerEvent(CModeNoSignalEvent);
           CTimerCancelTimerEvent(CModeNoCableEvent);
           CTimerCancelTimerEvent(CModeNoSupportEvent);
           CTimerCancelTimerEvent(CModePowerSavingEvent);
           CTimerCancelTimerEvent(COsdFxExitEvent);
	    CTimerCancelTimerEvent(CModeNoSignalIconMoveEvent);
		//endadd 090916
		
		SET_MUTE_PROCESS(_ENABLE);
		   
		CPowerDownCustomerControl();
		//CPowerLenOff();//eric 20070531
//		CTimerCancelTimerEvent(COsdFxSetWinMovingEvent);//tommy add for cancel move
		TV_Power_Down(); //add by xyw 070903
		//20080823 ccy add
			#if (_PCB_TYPE == _PCB_TEST)
			CLR_DVD_POWERONOFF();
			#endif
		//Flag_SAVELOGER_Draw = 0 ;//reset the flag tommy add 
		//czl 071130
		SET_AUDIO_CHIP_STBY(1);
#if(_FAST_READ == _ON)		
		MCU_CTRL_FFED = 0x80;     			//reset to crystal clk(27MHz)
		MCU_CLOCK_CTRL_FFEE = 0x44;	//reset to crystal clk(27MHz)
		RCAP2L = 0xD4;								//MCU:27M; BaudRate=19200 
		RCAP2H = 0xFF;
#endif		

#if( _DEBUG_TOOL == _RS232)
		MCU_PIN_SHARE_CTRL00_FF96 &= 0x07;				//add  by lbh 20091014
		ucRtd2662IspFlag = 1;

#endif			
#if _CUSTOMER_CGT
		if(GET_AUDIO_MUTE())
			CLR_AUDIO_MUTE();
#if _CGT_DELAY_PC_MUTE
		CLR_PC_AUDIO_ACTIVE();
#endif	//#if _CGT_DELAY_PC_MUTE

#endif

		CLR_EXT_POWER();

#if (_PCB_TYPE==_PCB_PT2662F1A ||_PCB_TYPE==_PCB_PT2662F1C)
		SET_DVD_POWER(_OFF);
#endif	//#if _PCB_TYPE==_PCB_PT2662F1A

//20080215, Pioneer DVD HDMI cause YPBPR can't be shown.
#if (_HDCP_SUPPORT == _ON)
		SET_HOTPLUG_HDMI(_OFF);
		SET_HOTPLUG_HDMI2(_OFF);
#endif

#if _PCB_TYPE==_PCB_PT2660_KTC57924G
		if (GET_ITEM_SELECTED())
		{
			CLR_ITEM_SELECTED();
			COsdFxCloseWindow(5);
		}
#endif

	}
	else
	{                        // Power Up Process	
        #if _USE_MISC_KEY_STATE
        //SET_POWER_ON_STATE() ;
		MCU_IR_STATUS_FF89	&= ~_BIT0;//|_BIT1;//disable IR
		#endif
		LED_Message(_LED_MSG_GREEN);
		SET_EXT_POWER();
//#ifdef PANEL_USE_UD_LR
	#if _PANEL_TYPE == _LQ104V1DG52		//add 20091214
#ifdef DERUN_1012_SHARPLQ104
#ifdef DERUN_SHARP104DGVW1
		SET_PANEL_UD(1);	
		SET_PANEL_LR(1);
		#else
		SET_PANEL_UD(1);	
		SET_PANEL_LR(0);
		#endif
#else
		SET_PANEL_UD(1);	
		SET_PANEL_LR(0);
#endif
	#endif	
//#endif	
		//CTimerDelayXms(500);
	        COsdFxDisableOsd();	//add by xyw 070810
		//DebugPrintf("\n Pwr-Up%c",0x20);
#if(_FAST_READ == _ON)		
		CMCUSetFlashClk();
#endif		
				//20080829 ccy modify
		if (GET_INPUTPORT_TYPE(stSystemData.InputSource)== _VIDEO_TV_PORT)
			TV_Power_ON(); //add by xyw 070903
	#if (_PCB_TYPE == _PCB_TEST)
		else if (GET_INPUTPORT_TYPE(stSystemData.InputSource)== _YPBPR_A0_PORT)
		{
			SET_DVD_POWERONOFF();
			CTimerDelayXms(1660);//20070714 gary for HDMI compatibility problem
		}
	#endif
		CLR_FACTORYSTATUS();	//add 20091113
		SET_POWERSTATUS();
		CScalerReset();//CScalerInitial();//Alanli 20070801
		CModeResetMode();//CScalerReset();//Alanli 20070801
#if (_HDCP_SUPPORT == _ON)
		SET_HOTPLUG_HDMI(_OFF);
		SET_HOTPLUG_HDMI2(_OFF);

		CAdjustHDCP();//HDCP1.0 for DVI

		CTimerDelayXms(100);//20070714 gary for HDMI compatibility problem
#endif
		 //czl 071130
		 SET_AUDIO_CHIP_STBY(0);

		COsdInitialize();
#if _HDMI_SUPPORT
		if(GET_INPUTPORT_TYPE(stSystemData.InputSource)==_HDMI_PORT || GET_INPUTPORT_TYPE(stSystemData.InputSource)==_HDMI_PORT2) //add by xyw in070816
		ucFirstShowLogo = 2; //tommy change ,don't change the position
#endif
		CPowerUpCustomerControl();	
		//CModeResetMode();			
		CEepromSaveSystemData();	
		CScalerSetBit(_OVERLAY_CTRL_6C, 0x23, (GET_OSDBLENDING() & 0x07) << 2);//tommmy add for blend osd

		SET_VDC_FIRST_ON();
		//DebugPrintf("\nvdc req init power on\n", 0);
		SET_TV_FIRST_ON();//CModeResetMode()		
		//DebugPrintf("\ntuner req init power on\n", 0);
//20080215, Pioneer DVD HDMI cause YPBPR can't be shown.
#if (_HDCP_SUPPORT == _ON)
		if (GET_INPUTSOURCE_TYPE()==_SOURCE_DVI)
		{
			if (GET_INPUTPORT_TYPE(stSystemData.InputSource)==_HDMI_PORT)
			{
				SET_HOTPLUG_HDMI(_ON);
				SET_HOTPLUG_HDMI2(_OFF);
			}
			else if (GET_INPUTPORT_TYPE(stSystemData.InputSource)==_HDMI_PORT2)
			{
				SET_HOTPLUG_HDMI(_OFF);
				SET_HOTPLUG_HDMI2(_ON);
			}
		}
#endif

#if( _DEBUG_TOOL == _RS232)

#if (_DEBUG_Printf_OUTPUT_CONTROL == _ON || _HDCP_WR_BY_RS232 == _ON)
		//press MENU+SOURCE key to initialize serial port
		ucRtd2662IspFlag = 1;	
		{	
	  		MCU_PIN_SHARE_CTRL00_FF96 |= 0xF8;
			ucRtd2662IspFlag = 0;
	  	}
		CUartInitial();		// Initial uart settings	
		CTimerDelayXms(20);
#endif	//#if (_DEBUG_Printf_OUTPUT_CONTROL == _ON || _HDCP_WR_BY_RS232 == _ON)

#endif  // End of #if(_DEBUG_TOOL == _RS232)


	    #if _USE_MISC_KEY_STATE
        MCU_IR_STATUS_FF89		|=_BIT0;//|_BIT1;//enable IR
		#endif	

#if _BURNIN_MODE_FOR_JPE
		CLR_POWER_KEY_STATE();
#endif
	}
}

//--------------------------------------------------
// Description  : Set panel on process
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerPanelOn(void)
{
	if (GET_PANELPOWERSTATUS() == _OFF)
	{
       	CPowerPanelPowerOn();
	#if (_PANEL_TYPE == _HANNSTAR_M1905_19)
		CTimerDelayXms(45);
		CPowerDisplayPortOn();
       	CScalerEnableDisplayOutput();
       	CTimerDelayXms(250);
	#elif _PANEL_TYPE == _LQ104V1DG52
		CTimerDelayXms(25);		
		CPowerDisplayPortOn();
		CScalerEnableDisplayOutput();
		CTimerDelayXms(250);
#elif(_PANEL_TYPE ==_AUO_LVDS_22_WXGA ||_PANEL_TYPE ==_M220Z1_03_WXGA)//eric 20070524 AU22	
		CTimerDelayXms(70);
		CPowerDisplayPortOn();
		CScalerEnableDisplayOutput();
		CTimerDelayXms(500);
#elif(_PANEL_TYPE ==_CMO_M260J1_WUXGA)
		CTimerDelayXms(40);			//0-50ms
		CPowerDisplayPortOn();
		CScalerEnableDisplayOutput();
		CTimerDelayXms(500+50);	//>500ms
#elif _PANEL_TYPE == _AU_LVDS_T315XW01
		CTimerDelayXms(40);		//20-50ms
		CPowerDisplayPortOn();
		CScalerEnableDisplayOutput();
		//CTimerDelayXms(1000);	//min 800ms
		LED_Message(_LED_MSG_RED);//modified by xyw 080219
    	CTimerDelayXms(300);
		LED_Message(_LED_MSG_GREEN);
    	CTimerDelayXms(300);
		LED_Message(_LED_MSG_RED);
		CTimerDelayXms(300);
		LED_Message(_LED_MSG_GREEN);
		CTimerDelayXms(150);
#elif _PANEL_TYPE == _SHARP_LVDS_LQ150||_PANEL_TYPE == _LQ121S1LG55 ||_PANEL_TYPE == _LQ110Y3DG01||_PANEL_TYPE == _LQ104V1DG52
		CTimerDelayXms(20);
		CPowerDisplayPortOn();
		CScalerEnableDisplayOutput();
		CTimerDelayXms(400);
#else
		CTimerDelayXms(40);
		CPowerDisplayPortOn();
		CScalerEnableDisplayOutput();
		CTimerDelayXms(500);				
#endif
	}

	CPowerLightPowerOn();
	CMiscClearStatusRegister();

#if _C_REMOTE_CONTROL ==  _PHILIPS_RC5_TYPE
	RC5_RepeatCnt = 1;
	COsdInitIR_RC5_RepeatCnt();
#endif

}

//--------------------------------------------------
// Description  : Set panel off process
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerPanelOff(void)
{

#if (_PANEL_TYPE == _LC171W03)
	CPowerLightPowerOff();
  	//CTimerDelayXms(120);
	// Ken
	CScalerSetBit(_OVERLAY_CTRL_6C, 0xFF,_BIT5);
	CScalerSetByte(_BGND_COLOR_CTRL_6D, 0xFF);
	CScalerSetByte(_BGND_COLOR_CTRL_6D, 0xFF);
	CScalerSetByte(_BGND_COLOR_CTRL_6D, 0xFF);
	CScalerSetBit(_VDISP_CTRL_28, ~ _BIT3,_BIT5);  // free running then force to background
	CTimerDelayXms(200);
	//Ken
    CScalerDisableDisplayOutput();
    CPowerDisplayPortOff();
    CTimerDelayXms(40);
    CPowerPanelPowerOff();

    // The delay below is to prevent from short period between panel OFF and next ON
    CTimerDelayXms(250);
#elif _PANEL_TYPE == _LQ104V1DG52
	CPowerLightPowerOff();
	CTimerDelayXms(250);
	CScalerDisableDisplayOutput();
	CPowerDisplayPortOff();
	CTimerDelayXms(50);
	CPowerPanelPowerOff();
	CTimerDelayXms(1000);
#elif ((_PANEL_TYPE == _CMO_M190A1_19)||(_PANEL_TYPE == _SAMSUNG_LVDS_19_WXGA)||(_PANEL_TYPE == _CMO_LVDS_22_WXGA)||(_PANEL_TYPE == _SVA_LVDS_19_WXGA))
    CPowerLightPowerOff();
    CTimerDelayXms(100);
    CScalerDisableDisplayOutput();
    CPowerDisplayPortOff();
    CTimerDelayXms(45);
	CPowerPanelPowerOff();
    // The delay below is to prevent from short period between panel OFF and next ON
    CTimerDelayXms(250);
#elif (_PANEL_TYPE == _HANNSTAR_M1905_19)
    CPowerLightPowerOff();
    CTimerDelayXms(250);
    CScalerDisableDisplayOutput();
    CPowerDisplayPortOff();
    CTimerDelayXms(45);
	CPowerPanelPowerOff();
    // The delay below is to prevent from short period between panel OFF and next ON
    CTimerDelayXms(600);
#elif(_PANEL_TYPE ==_AUO_LVDS_22_WXGA ||_PANEL_TYPE ==_M220Z1_03_WXGA)//eric 20070524 AU22 	
	CPowerLightPowerOff();
	CTimerDelayXms(250);
	CScalerDisableDisplayOutput();
	CPowerDisplayPortOff();
	CTimerDelayXms(50);
	CPowerPanelPowerOff();
	// The delay below is to prevent from short period between panel OFF and next ON
	CTimerDelayXms(500);
#elif(_PANEL_TYPE ==_CMO_M260J1_WUXGA)
	CPowerLightPowerOff();
	CTimerDelayXms(90+10);		//>90ms
	CScalerDisableDisplayOutput();
	CPowerDisplayPortOff();
	CTimerDelayXms(40);			//<50ms
	CPowerPanelPowerOff();
	// The delay below is to prevent from short period between panel OFF and next ON
	CTimerDelayXms(500+50);		//>500ms
#elif _PANEL_TYPE == _AU_LVDS_T315XW01
	CPowerLightPowerOff();
	CTimerDelayXms(250);	//min 200ms
	CScalerDisableDisplayOutput();
	CPowerDisplayPortOff();
	CTimerDelayXms(60);	//min 50ms
	CPowerPanelPowerOff();
	// The delay below is to prevent from short period between panel OFF and next ON
	CTimerDelayXms(1000);
#elif _PANEL_TYPE == _SHARP_LVDS_LQ150||_PANEL_TYPE == _LQ121S1LG55||_PANEL_TYPE == _LQ110Y3DG01||_PANEL_TYPE == _LQ104V1DG52
	CPowerLightPowerOff();
	CTimerDelayXms(220);
	CScalerDisableDisplayOutput();
	CPowerDisplayPortOff();
	CTimerDelayXms(400);
	CPowerPanelPowerOff();
	CTimerDelayXms(1000);
#else
    CPowerLightPowerOff();
    CTimerDelayXms(120);
    CScalerDisableDisplayOutput();
    CPowerDisplayPortOff();
    CTimerDelayXms(40);
	CPowerPanelPowerOff();
    // The delay below is to prevent from short period between panel OFF and next ON
    CTimerDelayXms(250);
#endif

#if _C_REMOTE_CONTROL ==  _PHILIPS_RC5_TYPE
	RC5_RepeatCnt = 3;
	COsdInitIR_RC5_RepeatCnt();
#endif
}

//--------------------------------------------------
// Description  : Set panel power on
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerPanelPowerOn(void)
{
    PANELPOWER_UP();
    SET_PANELPOWERSTATUS();
}

//--------------------------------------------------
// Description  : Set panel power off
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerPanelPowerOff(void)
{
    PANELPOWER_DOWN();
    CLR_PANELPOWERSTATUS();
}

//--------------------------------------------------
// Description  : Set backlight power on
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerLightPowerOn(void)
{
#if _BACKLIGHT_SUPPORT
	CAdjustBacklight();
#endif
 	LIGHTPOWER_UP();
	SET_LIGHTPOWERSTATUS();
}

//--------------------------------------------------
// Description  : Set backlight power off
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerLightPowerOff(void)
{
	//20080114
	CAdjustBacklightZeroSavePower();

    LIGHTPOWER_DOWN();
    CLR_LIGHTPOWERSTATUS();

}

//--------------------------------------------------
// Description  : Power on display port
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerDisplayPortOn(void)
{
    switch(Panel[ucPanelSelect].PanelStyle)
    {
        case _PANEL_TTL:
//            break;

        case _PANEL_LVDS:
            CPowerLVDSOn();
            break;

        case _PANEL_RSDS:
            CPowerRSDSOn();
            break;
    }
}

//--------------------------------------------------
// Description  : Power off display port
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerDisplayPortOff(void)
{
    switch(Panel[ucPanelSelect].PanelStyle)
    {
        case _PANEL_TTL:
//            break;

        case _PANEL_LVDS:
            CPowerLVDSOff();
            break;

        case _PANEL_RSDS:
            CPowerRSDSOff();
            break;
    }
}

//--------------------------------------------------
// Description  : Power on LVDS
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerLVDSOn(void)
{
    if((bit)(Panel[ucPanelSelect].PanelConfig & _BIT3)){
        CScalerSetByte(_TCON_ADDR_PORT_8B, _TCON_LVDS_CTRL0_A0);
        CScalerSetByte(_TCON_DATA_PORT_8C, 0x30);
    }
    else{
        //LVDS from even port, if from odd port, the below value should be 0xa0
        CScalerSetByte(_TCON_ADDR_PORT_8B, _TCON_LVDS_CTRL0_A0);
        CScalerSetByte(_TCON_DATA_PORT_8C, 0x30);
    }
}

//--------------------------------------------------
// Description  : Power off LVDS
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerLVDSOff(void)
{
    CScalerSetByte(_TCON_ADDR_PORT_8B, _TCON_LVDS_CTRL0_A0);
    CScalerSetByte(_TCON_DATA_PORT_8C, 0x00);
}

//--------------------------------------------------
// Description  : Power on RSDS
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerRSDSOn(void)
{
    CPowerLVDSOn();
    CScalerSetByte(_TCON_ADDR_PORT_8B, 0x00);
    CScalerSetByte(_TCON_DATA_PORT_8C, 0xc3);  //for 8-bit RSDS panel
    CTimerDelayXms(40);
    CScalerSetByte(_TCON_ADDR_PORT_8B, 0x00);
    CScalerSetByte(_TCON_DATA_PORT_8C, 0x83);
}

//--------------------------------------------------
// Description  : Power off RSDS
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerRSDSOff(void)
{
    CPowerLVDSOff();
	//731301***
    	CScalerSetBit(_VDISP_CTRL_28, ~_BIT1, _BIT1); // Force HS/VS/DEN/Data to 0
    	CTimerDelayXms(40);
    	CScalerSetDataPortByte(_TCON_ADDR_PORT_8B, _TCON_CTRL0_00, 0x48); // TTL output 0
    	CTimerDelayXms(40);
    	CScalerSetDataPortByte(_TCON_ADDR_PORT_8B, _TCON_CTRL0_00, 0x42); // Back to HZ
    	CScalerSetBit(_VDISP_CTRL_28, ~_BIT1, 0); // Release force
    	//731301###
}

//--------------------------------------------------
// Description  : Power on ADC and APLL
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerADCAPLLOn(void)
{
#if(_SCALER_TYPE==_RTD2662)
    CScalerPageSelect(_PAGE1);
    CScalerSetBit(_P1_PLL_WD_AF, ~_BIT0, 0x00);     // Power up PLL

    CScalerPageSelect(_PAGE0);
    CScalerSetBit(_P0_ADC_POWER_C6, ~(_BIT2 | _BIT1 | _BIT0), (_BIT2 | _BIT1 | _BIT0));    // Power up ADC
#else
    CScalerPageSelect(_PAGE1);
    CScalerSetBit(_P1_PLL1_N_AB, ~_BIT7, 0x00);     			// Power up PLL1
	CScalerSetBit(_P1_PLL2_WD_B1, ~_BIT0, 0x00);    		// Power up PLL2

    CScalerPageSelect(_PAGE0);
    CScalerSetBit(_P0_ADC_POWER_AD, ~(_BIT2 | _BIT1 | _BIT0), (_BIT2 | _BIT1 | _BIT0));    // Power up ADC
#endif    
}

//--------------------------------------------------
// Description  : Power off ADC and APLL
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerADCAPLLOff(void)
{
#if(_SCALER_TYPE==_RTD2662)
    CScalerPageSelect(_PAGE1);
    CScalerSetBit(_P1_PLL_WD_AF, ~_BIT0, _BIT0);     // Power down PLL

    CScalerPageSelect(_PAGE0);
    CScalerSetBit(_P0_ADC_POWER_C6, ~(_BIT2 | _BIT1 | _BIT0), 0x00);    // Power down ADC
#else
    CScalerPageSelect(_PAGE1);
    CScalerSetBit(_P1_PLL1_N_AB, ~_BIT7, _BIT7);     						// Power down PLL1
    CScalerSetBit(_P1_PLL2_WD_B1, ~_BIT0, _BIT0);    					// Power down PLL2

    CScalerPageSelect(_PAGE0);
    CScalerSetBit(_P0_ADC_POWER_AD, ~(_BIT2 | _BIT1 | _BIT0), 0x00);    	// Power down ADC
#endif    
}

//--------------------------------------------------
// Description  : Power on TMDS
// Input Value  : None
// Output Value : None
//--------------------------------------------------
#if((_TMDS_SUPPORT == _ON) || (_HDMI_SUPPORT == _ON))
void CPowerTMDSOn(void)
{
    CScalerSetBit(_SYNC_CTRL_49, ~(_BIT1 | _BIT0), 0x00);
}
#endif

//--------------------------------------------------
// Description  : Power off TMDS
// Input Value  : None
// Output Value : None
//--------------------------------------------------
/*
void CPowerTMDSOff(void)
{
    CScalerPageSelect(_PAGE2);
	CScalerSetBit(_P2_Z0_CALIBRATION_CTRL_AC, ~_BIT6, 0x00);
    CScalerSetBit(_P2_TMDS_OUTPUT_CTRL_A6, ~_BIT7, 0x00);
}
*/
//--------------------------------------------------
// Description  : Power off ADC and APLL
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CPowerDPLLOff(void)
{
#if(_SCALER_TYPE==_RTD2662)
    CScalerPageSelect(_PAGE1);
    CScalerSetBit(_P1_DPLL_N_C0, ~_BIT7, _BIT7);// Power down DPLL
#else
    CScalerPageSelect(_PAGE1);
    CScalerSetBit(_P1_DPLL_N_B8, ~_BIT7, _BIT7);// Power down DPLL
#endif
}

