📄 dcr_type_2.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 + -