⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 power_ctrl.c

📁 Realtek 公司的RTD2523A芯片原厂source code,没有被修改过的。
💻 C
字号:
#define __POWERCTRL__

#include "Header\INCLUDE.H"


void PowerDown_ADC(void)
{
    RTDSetByte(PLL1_CTRL_D6, 0xf2);     // Power down PLL1
    RTDSetByte(PLL2_CTRL_DA, 0x40);     // Power down PLL2
    RTDSetByte(ADC_CTRL_E6, 0x40);      // Power down ADC

	ucI_Code        = 0;
}

void PowerUp_ADC(void)
{
    RTDSetByte(PLL1_CTRL_D6, 0xf3);     // Power up PLL1
    RTDSetByte(PLL2_CTRL_DA, 0x41);     // Power up PLL2
    RTDSetByte(ADC_CTRL_E6, 0x47);      // Power up ADC

    RTDSetByte(PLL2_FILTER_DD, 0x5f);
}

void PowerDown_TMDS(void)
{
    RTDSetByte(TMDS_OUTPUT_ENA_A0, 0x0F);    
}

void PowerUp_TMDS(void)
{
    RTDCodeW(TMDS_MANUAL_ON);
    //RTDSetByte(TMDS_OUTPUT_ENA_A0, 0x8F);
}

void PowerDown_VDC(void)
{
#if (VIDEO_CHIP != VDC_NONE)

#if (MCU_TYPE == MCU_STD8051)
    bVDC_PWR    = VDC_OFF;
#else
    MCU_WriteVideoPower(VDC_OFF);
#endif

#endif
}

void PowerUp_VDC(void)
{
#if (VIDEO_CHIP != VDC_NONE)

#if (MCU_TYPE == MCU_STD8051)
     bVDC_PWR    = VDC_ON;
#else
     MCU_WriteVideoPower(VDC_ON);
#endif

#endif
}

void PowerDown_LVDS(void)
{
#if (OUTPUT_BUS == LVDS_TYPE)
    RTDCodeW(LVDS_POWERDOWN);
#endif
}

void PowerUp_LVDS(void)
{
#if (OUTPUT_BUS == LVDS_TYPE)
    RTDCodeW(LVDS_POWERUP);
#endif
}

void Set_Panel(unsigned char status)
{
    if (status)
    {
        RTDSetByte(HOSTCTRL_02, 0x00);

        PowerUp_LVDS();
        Delay_Xms(10);

        RTDSetByte(VDIS_SIGINV_21, 0x00 | DISP_EO_SWAP | DISP_RB_SWAP | DISP_ML_SWAP);       // DHS, DVS, DEN, DCLK MUST NOT be inverted.

        RTDSetBit(VDIS_CTRL_20, 0xfd, 0x01);    // DHS, DVS, DEN, DCLK and data are clamped to 0
        Delay_Xms(20);
        RTDSetBit(VDIS_CTRL_20, 0xfe, 0x00);    // Stop display timing
        Delay_Xms(20);

#if (MCU_TYPE == MCU_STD8051)
        bPANEL_PWR  = PANEL_ON;
#else
        MCU_WritePanelPower(PANEL_ON);
#endif
        bPanel_Status = _ON;
        
        Delay_Xms(40);

        RTDSetByte(VDIS_SIGINV_21, DISP_INV | DISP_EO_SWAP | DISP_RB_SWAP | DISP_ML_SWAP);       // DHS, DVS, DEN, DCLK MUST NOT be inverted.

        RTDSetBit(VDIS_CTRL_20, 0xff, 0x03);    // DHS, DVS, DEN, DCLK in normal operation        
        RTDSetBit(DIS_TIMING0_3A, 0xff, 0x20);  // Force display timing enable
        RTDSetBit(DIS_TIMING0_3A, 0xdf, 0x00);  // Stop forcing

        Delay_Xms(200);

        RTDRead(VDIS_CTRL_20, 1, N_INC);
        if ((Data[0] & 0x08))   RTDSetByte(VDIS_CTRL_20, Data[0] & 0xdf);

#if (MCU_TYPE == MCU_STD8051)
        bLIGHT_PWR  = LIGHT_ON;
#else
        MCU_WriteBacklightPower(LIGHT_ON);
#endif
        Delay_Xms(40);

        RTDSetByte(STATUS0_01, 0x00);  // Write once to clear status
        RTDSetByte(STATUS1_1F, 0x00);  // Write once to clear status
    }
    else
    {
#if (MCU_TYPE == MCU_STD8051)
        bLIGHT_PWR  = LIGHT_OFF;
#else
        MCU_WriteBacklightPower(LIGHT_OFF);
#endif
        Delay_Xms(120);

        OSD_Dispatcher(NOTIFY_CLEAR_OSD);   // Clear OSD

        RTDSetByte(VDIS_SIGINV_21, 0x00 | DISP_EO_SWAP | DISP_RB_SWAP | DISP_ML_SWAP);       // DHS, DVS, DEN, DCLK MUST NOT be inverted.

        RTDSetBit(VDIS_CTRL_20, 0xfd, 0x01);    // DHS, DVS, DEN, DCLK and data are clamped to 0
        Delay_Xms(20);
        RTDSetBit(VDIS_CTRL_20, 0xfe, 0x00);    // Stop display timing
        Delay_Xms(20);

#if (MCU_TYPE == MCU_STD8051)	 
        bPANEL_PWR  = PANEL_OFF;
#else
        MCU_WritePanelPower(PANEL_OFF);
#endif
        bPanel_Status = _OFF;
        Delay_Xms(40);

        PowerDown_LVDS();

        // The delay below is to prevent from short period between panel OFF and next ON
        Delay_Xms(250);
        Delay_Xms(250);
        Delay_Xms(250);
        Delay_Xms(250);
    }
}

//////////////////////
// Power Controller //
//////////////////////
bit Power_Control(unsigned char Notify)
{
    if (0 == bPower_Status)
    {
        if (NOTIFY_POWERUP == Notify)
        {
            bPower_Status   = 1;

            Power_Up_Init();

#if (ISPACK)
            RTDSetByte(DDC_SET_SLAVE_F0, 0x6a);
#endif

            OSD_Dispatcher(NOTIFY_RESET_OSD);   // Reset OSD

            ucModeCnt   = MODE_DETECT_FREQ;     // Reset Input Mode Detector
            Measure_Mode();                     // Measure mode-timing

#if (POWER_KEY_TYPE == TYPE_ONE_TOUCH)
            // Save power status when power-key is one-touch type
            stGUD1.FUNCTION &= 0xf7;
            Save_GUD1();
            Delay_Xms(10);
#endif
        }

        return _TRUE;
    }
    else if (NOTIFY_POWERDOWN == Notify)
    {
#if (POWER_KEY_TYPE == TYPE_ONE_TOUCH)
        // Save power status when power-key is one-touch type
        stGUD1.FUNCTION |= 0x08;
        Save_GUD1();
        Delay_Xms(10);
#endif
        bPower_Status   = 0;

        Set_Panel(0);                       // Turn off panel
						
        OSD_Dispatcher(NOTIFY_RESET_OSD);   // Reset OSD

        RTDSetByte(HOSTCTRL_02, 0x02);      // Set RTD to power-saving

#if (VIDEO_CHIP != VDC_NONE)
        I2CWrite(V_DISABLE);
#endif
        PowerDown_ADC();
        PowerDown_VDC();
        PowerDown_TMDS();

        Delay_Xms(250);
        Delay_Xms(250);
        Delay_Xms(250);
        Delay_Xms(250);
        Delay_Xms(250);

        return _TRUE;
    }
    
    return _FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -