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

📄 dcr_type_2.c

📁 realtek LCD monitor, TV开发源代码
💻 C
字号:
//**********************************************************************************************************
//  The  Software  is  proprietary,  confidential,  and  valuable to Realtek Semiconductor
//  Corporation  ("Realtek").  All  rights, including but not limited  to  copyrights,
//  patents,  trademarks, trade secrets, mask work rights, and other similar rights and interests,
//  are reserved to Realtek. Without  prior  written  consent  from  Realtek,  copying, reproduction,
//  modification,  distribution,  or  otherwise  is strictly prohibited. The Software  shall  be
//  kept  strictly  in  confidence,  and  shall  not be  disclosed to or otherwise accessed by
//  any third party. @ <2003> - <2008>   The Software is provided "AS IS" without any warranty of any kind,
//  express, implied, statutory or otherwise.
//**********************************************************************************************************
//----------------------------------------------------------------------------------------------------
// ID Code      : DCR.c No.0000
// Update Note  :
//
//----------------------------------------------------------------------------------------------------

#define __DCR_TYPE_2__

#include "Common\Header\Include.h"

#if(_DCR_MODE == _DCR_TYPE_2)

//--------------------------------------------------
// Description  : None
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CDcrSetBoundary(void)
{
    WORD Cap_Hor_Start, Cap_Hor_End, Cap_Ver_Start, Cap_Ver_End;
    WORD Cap_VS_Delay, Cap_HS_Delay;

    CScalerRead(_IPH_ACT_STA_H_14, 11, pData, _AUTOINC);

//Anderson 080227 for Different Register Mapping Start
#if(_SCALER_TYPE == _RTD2472D)

    Cap_Hor_Start = ((pData[0] & 0x07)<<8) | pData[1];
    Cap_Hor_End   = ((pData[2] & 0x07)<<8) | pData[3];

    Cap_Ver_Start = ((pData[4] & 0x07)<<8) | pData[5];
    Cap_Ver_End   = ((pData[6] & 0x07)<<8) | pData[7];

#elif((_SCALER_TYPE == _RTD2545LR) || (_SCALER_TYPE == _RTD247xRD) || (_SCALER_TYPE == _RTD248xRD))//cyyeh 20080611

    Cap_Hor_Start = ((pData[0] & 0x0f)<<8) | pData[1];
    Cap_Hor_End   = ((pData[0] & 0xf0)<<4) | pData[3];//Anderson 080422

    Cap_Ver_Start = ((pData[4] & 0x0f)<<8) | pData[5];
    Cap_Ver_End   = ((pData[4] & 0xf0)<<4) | pData[7];//Anderson 080422

#else
    No Setting !!
#endif //End of #if(_SCALER_TYPE == _RTD2472D)
//Anderson 080227 for Different Register Mapping End
    Cap_VS_Delay  = ((pData[10] & 0x02)<<7)| pData[8];
    Cap_HS_Delay  = ((pData[10] & 0x01)<<8)| pData[9];


    if((bit)CScalerGetBit(_VGIP_CTRL_10, _BIT1))  // digital cpature
    {

#if (_HDMI_OVERSCAN == _ON)
        Cap_Hor_Start = Cap_Hor_Start + Cap_HS_Delay - 32 + 2 + ucOverScanH;
        Cap_Ver_Start = Cap_Ver_Start + Cap_VS_Delay - 3  + ucOverScanV;

        Cap_Hor_End   = Cap_Hor_Start + Cap_Hor_End  - 1 - (ucOverScanH * 2);           // Auto_Hor_E
        Cap_Ver_End   = Cap_Ver_Start + Cap_Ver_End  - 1 - (ucOverScanV * 2);           // Auto_Ver_E
#else
        Cap_Hor_Start = Cap_Hor_Start + Cap_HS_Delay - 32 + 2;
        Cap_Ver_Start = Cap_Ver_Start + Cap_VS_Delay - 3;

        Cap_Hor_End   = Cap_Hor_Start + Cap_Hor_End  - 1;                              // Auto_Hor_E
        Cap_Ver_End   = Cap_Ver_Start + Cap_Ver_End  - 1;                              // Auto_Ver_E
#endif
        CScalerSetByte(_VGIP_HV_DELAY_1E, 0x50);            // Auto HS, VS delay

        usHorBoundary = Cap_Hor_End - Cap_Hor_Start;
        usVerBoundary = Cap_Ver_End - Cap_Ver_Start;
    }
    else    // analog capture
    {

        Cap_Hor_Start = Cap_Hor_Start + Cap_HS_Delay - 32 + 2;
        Cap_Ver_Start = Cap_Ver_Start + Cap_VS_Delay - 3;

        Cap_Hor_End   = Cap_Hor_Start + Cap_Hor_End  - 1;                              // Auto_Hor_E
        Cap_Ver_End   = Cap_Ver_Start + Cap_Ver_End  - 1;                              // Auto_Ver_E

        CScalerSetByte(_VGIP_HV_DELAY_1E, 0x50);            // Auto HS, VS delay

        usHorBoundary = Cap_Hor_End - Cap_Hor_Start + 1;
        usVerBoundary = Cap_Ver_End - Cap_Ver_Start + 1;
    }


    pData[0] = ((Cap_Hor_Start & 0x0700) >> 4) | ((Cap_Hor_End & 0x0f00) >> 8);
    pData[1] =   Cap_Hor_Start & 0x00ff;
    pData[2] =   Cap_Hor_End   & 0x00ff;
    pData[3] = ((Cap_Ver_Start & 0x0700) >> 4) | ((Cap_Ver_End & 0x0f00) >> 8);
    pData[4] =   Cap_Ver_Start & 0x00ff;
    pData[5] =   Cap_Ver_End   & 0x00ff;

    CScalerWrite(_H_BOUNDARY_H_70, 6, pData,  _AUTOINC);
}


//--------------------------------------------------
// Description  : None
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CDcrMeasureStart(void)
{
    DWORD temp_b;

    //CLR_DCRWAITINGTIMEOUT(); //cyyeh 20080606

    CScalerSetByte(_DIFF_THRESHOLD_79, 0x06);           // Up Threshold: Black_Noise
//  CScalerSetByte(_AUTO_ADJ_CTRL0_7A, 0x03);
//  CScalerSetByte(_AUTO_ADJ_CTRL1_7D, 0x30);
    CScalerSetBit(_AUTO_ADJ_CTRL0_7A, ~_BIT4, _BIT4);
    CScalerSetBit(_AUTO_ADJ_CTRL1_7D, ~(_BIT5 | _BIT4), (_BIT5 | _BIT4));
    //CScalerSetBit(_AUTO_ADJ_CTRL1_7D, ~_BIT0, _BIT0);

    //CTimerActiveTimerEvent(SEC(0.07), CDcrWaitingMeasureReadyEven);

    if(bAutoMeasureByDCR)
    {
        if(!CScalerGetBit(_AUTO_ADJ_CTRL1_7D, _BIT0))
        {
            CScalerRead(_AUTO_PHASE_3_84, 4, pData, _AUTOINC);

            temp_b = pData[0];
            temp_b = temp_b << 8;
            temp_b = (temp_b & 0x0000ff00) | pData[1];
            temp_b = temp_b << 8;
            temp_b = (temp_b & 0x00ffff00) | pData[2];
            temp_b = temp_b << 8;
            temp_b = (temp_b & 0xffffff00) | pData[3];

            temp_b = temp_b / usVerBoundary;
            temp_b = temp_b / usHorBoundary;

            usRGBInfo = temp_b;

#if(_DCR_SHOWVALUE == _ON)
            COsdFxShowNumber(ROW(8), COL(13), usRGBInfo, (_ALIGN_RIGHT | _FORCE_SHOW_NUMBER_OFF | _SHOW_4));
            COsdFxShowNumber(ROW(9), COL(13), usHorBoundary, (_ALIGN_RIGHT | _FORCE_SHOW_NUMBER_OFF | _SHOW_4)); // test
            COsdFxShowNumber(ROW(10), COL(13), usVerBoundary, (_ALIGN_RIGHT | _FORCE_SHOW_NUMBER_OFF | _SHOW_4)); // test
#endif
            if(GET_ASCR_STATUS())
            {
                CDcrDcr2();
            }
            CScalerSetBit(_AUTO_ADJ_CTRL1_7D, ~_BIT0, _BIT0);
        }
    }
    else
    {
        CScalerSetBit(_AUTO_ADJ_CTRL1_7D, ~_BIT0, 0x00);
        CScalerSetBit(_AUTO_ADJ_CTRL1_7D, ~_BIT0, _BIT0);
        bAutoMeasureByDCR = _TRUE;
    }

}


/*
//--------------------------------------------------
// Description  : None
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CDcrWaitingMeasureReadyEven(void)
{

    DWORD temp_b;

    SET_DCRWAITINGTIMEOUT();

    if(!CScalerGetBit(_AUTO_ADJ_CTRL1_7D, _BIT0))
    {

        CScalerRead(_AUTO_PHASE_3_84, 4, pData, _AUTOINC);

        temp_b = pData[0];
        temp_b = temp_b << 8;
        temp_b = (temp_b & 0x0000ff00) | pData[1];
        temp_b = temp_b << 8;
        temp_b = (temp_b & 0x00ffff00) | pData[2];
        temp_b = temp_b << 8;
        temp_b = (temp_b & 0xffffff00) | pData[3];

        temp_b = temp_b / usVerBoundary;
        temp_b = temp_b / usHorBoundary;

        usRGBInfo = temp_b;

#if(_DCR_SHOWVALUE == _ON)
        COsdFxShowNumber(ROW(17), COL(10), usRGBInfo, (_ALIGN_RIGHT | _FORCE_SHOW_NUMBER_OFF | _SHOW_4));
        COsdFxShowNumber(ROW(18), COL(11), usHorBoundary, (_ALIGN_RIGHT | _FORCE_SHOW_NUMBER_OFF | _SHOW_4)); // test
        COsdFxHLine(ROW(18), COL(12), LENGTH(1), 0x0e, _WRITE_BYTE1);
        COsdFxShowNumber(ROW(18), COL(16), usVerBoundary, (_ALIGN_RIGHT | _FORCE_SHOW_NUMBER_OFF | _SHOW_4)); // test
        COsdFxShowNumber(ROW(20), COL(10), stSystemData.BackLight, (_ALIGN_RIGHT | _FORCE_SHOW_NUMBER_OFF | _SHOW_4)); // test
        COsdFxShowNumber(ROW(21), COL(10), ucPreBacklightPWM, (_ALIGN_RIGHT | _FORCE_SHOW_NUMBER_OFF | _SHOW_4));
#endif
        if(GET_DCR_STATUS())
        {
            CDcrDcr2();
        }

    }
}
*/


//--------------------------------------------------
// Description  : None
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CDcrDcr2(void)
{

    if(usRGBInfo < 48 )     // 16
    {
        pData[0] = ((DWORD)50 * 10000 / 48)  * usRGBInfo / 10000;
        if(pData[0] == 0)
            pData[0] = ((((DWORD)50 * 10000 / 48) * usRGBInfo) >= 5000)? 1:0;
    }
    else if(usRGBInfo < 96) // 32
        pData[0] = ((DWORD)(220 - 50) * 10000 / (96 - 48))  * (usRGBInfo - 48) / 10000 + 50;

    else if(usRGBInfo < 144)    // 48
        pData[0] = ((DWORD)(230 - 220) * 10000 / (144 - 96))  * (usRGBInfo - 96) / 10000 + 220;

    else if(usRGBInfo < 288)    // 96
        pData[0] = 230;

    else if(usRGBInfo < 336)    // 112
        pData[0] = ((DWORD)(240 - 230) * 10000 / (336 - 288))  * (usRGBInfo - 288) / 10000 + 230;

    else if(usRGBInfo < 576)    // 192
        pData[0] = 240;

    else if(usRGBInfo < 672)    // 224
        pData[0] = ((DWORD)(255 - 240) * 10000 / (672 - 576))  * (usRGBInfo - 576) / 10000 + 240;

    else                    // 240~
        pData[0] = 255;

    pData[0] = ((WORD)pData[0] * ucDCRPercent + (WORD)(stSystemData.BackLight * (100 - ucDCRPercent)))/100;

    CDcrSlowAdjust(pData[0]);

    pData[1] = ((DWORD)255 * 10000 / (765 - 0))  * (usRGBInfo - 0) / 10000; // usRGBInfo ratio
    pData[1] = 255 - pData[1];

    // step by step DCC
    if(ucPreDCCLum > pData[1])              // white to black
    {
        if((ucPreDCCLum - pData[1]) > 20)
            pData[1] = ucPreDCCLum - 10;
        else
            pData[1] = ucPreDCCLum - 1;
    }
    else if(ucPreDCCLum < pData[1])         // black to white
    {
        if((pData[1] - ucPreDCCLum) > 20)
            pData[1] = ucPreDCCLum + 10;
        else
            pData[1] = ucPreDCCLum + 1;
    }
    else
            pData[1] = ucPreDCCLum;
    ////////// End of step by step ////////
#if(_VIVID_COLOR_FUCTION == _ON)
    CAdjustDCRFillDCCTable(pData[1]);           // watch for the pData[1]
#endif
    ucPreDCCLum = pData[1];
}

//--------------------------------------------------
// Description  : None
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CDcrSlowAdjust(BYTE ucValue)
{
    pData[0] = ucValue;
    // Step by step PWM
    if(ucPreBacklightPWM > pData[0])                // white to black
    {
        if((ucPreBacklightPWM - pData[0]) > 20)
            pData[0] = ucPreBacklightPWM - 10;
        else
            pData[0] = ucPreBacklightPWM - 1;
    }
    else if(ucPreBacklightPWM < pData[0])           // black to white
    {
        if((pData[0] - ucPreBacklightPWM) > 20)
            pData[0] = ucPreBacklightPWM + 10;
        else
            pData[0] = ucPreBacklightPWM + 1;
    }
    else
        pData[0] = ucPreBacklightPWM;
    // End of step by step

    ucPreBacklightPWM = pData[0];
    CAdjustBacklight(ucPreBacklightPWM);
}


//--------------------------------------------------
// Description    : Fill DCC table , then enable DCC function,DCR Interpolation
// Input Value   : pControlTable, pUserCurveTable, both parameters accroding to Vivid color software.
// Output Value : None
//--------------------------------------------------
#if(_VIVID_COLOR_FUCTION == _ON)

code BYTE tDCR_USERCURVE0[] =
{
    0x0a,  0x20,  0x30,  0x40,
    0x50,  0x60,  0x70,  0x80,
    0x90,  0xa0,  0xb0,  0xc0,
    0xd0,  0xe0,  0xf0,
};

code BYTE tDCR_USERCURVE255[] =
{
    0x10,  0x20,  0x37,  0x4a,
    0x5a,  0x6a,  0x7a,  0x8a,
    0x9a,  0xaa,  0xba,  0xca,
    0xda,  0xe8,  0xf8,
};

void CAdjustDCRFillDCCTable( BYTE lamp_value)
{
    BYTE i;
    CScalerPageSelect(_PAGE7);
    CScalerRead(_P7_DCC_CTRL0_C7, 1, &i, _NON_AUTOINC);
    i = (i & 0xfc) | 0x01;
    CScalerSetByte(_P7_DCC_CTRL0_C7, i);

    // fill DCC user curve table
    CScalerSetByte(_P7_DCC_ACCESS_PORT_C9, 0x00);

    if(usRGBInfo < 48)
    {
        for (i=0; i<15; i++)
        {
            pData[0] = tDCR_USERCURVE255[i];
            CScalerSetByte(_P7_DCC_DATA_PORT_CA, pData[0]);
        }

        for (i=0; i<5; i++)
            CScalerSetByte(_P7_DCC_DATA_PORT_CA, 0x00);
    }
    else if(usRGBInfo < 336)
        CAdjustFillDCCTable(0);
    else
        pData[0] = (WORD)(tDCR_USERCURVE255[i] - tDCR_USERCURVE0[i]) * lamp_value / 255 + tDCR_USERCURVE0[i];
}

#endif // End of #if(_VIVID_COLOR_FUCTION == _ON)

#endif // End of #if(_DCR_MODE == _DCR_TYPE_2)



⌨️ 快捷键说明

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