📄 adjust.c
字号:
/*===========================================================
* Copyright (c) Realtek Semiconductor Corporation, 2005
* All rights reserved.
* ========================================================== */
/*==================== File Description ===================== */
/**
* @file
* This file is osd control declaration related functions.
*
* @author $Author: hillwang $
* @date $Date: 2006-09-07 19:38:12 +0800 (?熸??? 07 涔濇? 2006) $
* @version $Revision: 1187 $
* @ingroup Auto
*/
/**
* @addtogroup Auto
* @{
*/
#define _ADJUST_C
/*===================== Module dependency ================== */
#include "Core\Header\Include.h"
/*======================= Private Types ===================== */
/*======================== Definitions ====================== */
/*========================== Variables ====================== */
BYTE idata ucAdjustCtrl = 0;
/*=================== Local Functions Phototype ==============*/
static void CAdjustSetSharpnessTable(bit scaling,BYTE code *pArray0, BYTE code *pArray1);
void CAdjustPeakingCoring(void);
void CAdjustPeakingFilter(SBYTE ucPeaking);
/*=========================== Functions ===================== */
//--------------------------------------------------
// Description : Adjust IHS delay
// Input Value : IHS delay
// Output Value : None
//--------------------------------------------------
void CAdjustIHSDelay(WORD usIHSDelay)
{
CScalerSetBit(_VGIP_HV_DELAY_1E, ~_BIT0, HIBYTE(usIHSDelay) & _BIT0);
CScalerSetByte(_IHS_DELAY_1D, LOBYTE(usIHSDelay));
}
//--------------------------------------------------
// Description : Adjust IVS delay
// Input Value : IVS delay
// Output Value : None
//--------------------------------------------------
void CAdjustIVSDelay(WORD usIVSDelay)
{
CScalerSetBit(_VGIP_HV_DELAY_1E, ~_BIT1, (usIVSDelay >> 7) & _BIT1);
CScalerSetByte(_IVS_DELAY_1C, LOBYTE(usIVSDelay));
}
//--------------------------------------------------
// Description : Adjust Dclk offset
// Input Value : Dclk offset
// Output Value : None
//--------------------------------------------------
void CAdjustDclkOffset(WORD usDclkOffset)
{
CScalerPageSelect(_PAGE1);
CScalerSetBit(_P1_DCLK_FINE_TUNE_OFFSET_MSB_C4, 0xf0, HIBYTE(usDclkOffset) & 0x0f);
CScalerSetByte(_P1_DCLK_FINE_TUNE_OFFSET_LSB_C5, LOBYTE(usDclkOffset));
CScalerSetBit(_P1_DCLK_SPREAD_SPECTRUM_C6, ~_BIT2, _BIT2);
}
//--------------------------------------------------
// Description : Adjust spread spectrum range
// Input Value : Spread spectrum range
// Output Value : None
//--------------------------------------------------
void CAdjustSpreadSpectrumRange(BYTE ucSpreadRange)
{
CScalerPageSelect(_PAGE1);
CScalerSetBit(_P1_DCLK_SPREAD_SPECTRUM_C6, 0x0f, (ucSpreadRange << 4) & 0xf0);
CScalerSetBit(_P1_DCLK_SPREAD_SPECTRUM_C6, ~_BIT2, _BIT2);
}
//--------------------------------------------------
// Description : Sync processor measure start
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CAdjustSyncProcessorMeasureStart(void)
{
CScalerSetBit(_MEAS_HS_PERIOD_H_52, ~_BIT5, _BIT5);
}
//--------------------------------------------------
// Description : Turn on the error correction function
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CAdjustTMDSErrorCorrectionOn(void)
{
CScalerPageSelect(_PAGE2);
CScalerSetBit(_P2_UP_DOWN_CTRL2_B7, ~(_BIT7 | _BIT6 | _BIT5), _BIT7);
}
#if(((_TMDS_SUPPORT == _ON) || (_HDMI_SUPPORT == _ON)) && (_DVI_LONG_CABLE_SUPPORT == _ON))
//--------------------------------------------------
// Description : Measure TMDS transition result
// Input Value : ucType --> _TMDS_MEASURE_AVE, _TMDS_MEASURE_MAX, _TMDS_MEASURE_MIN
// ucSelect --> _TMDS_MEASURE_HSYNC_BE, _TMDS_MEASURE_HSYNC_AF, _TMDS_MEASURE_DE_BE, _TMDS_MEASURE_DE_AF
// Output Value : Transition result
//--------------------------------------------------
BYTE CAdjustTMDSMeasure(BYTE ucType, BYTE ucSelect)
{
BYTE result;
CScalerPageSelect(_PAGE2);
CScalerSetBit(_P2_TMDS_MEAS_RESULT0_A2, ~(_BIT6 | _BIT5), (ucType << 5));
CScalerSetBit(_P2_TMDS_MEAS_RESULT0_A2, ~(_BIT7 | _BIT4 | _BIT3), (_BIT7 | (ucSelect << 3)));
if(CTimerPollingEventProc(60, CMiscTMDSMeasureEvent) == _FALSE)
{
CScalerSetBit(_P2_TMDS_MEAS_RESULT0_A2, ~_BIT7, 0x00);
return 0xff;
}
CScalerRead(_P2_TMDS_MEAS_RESULT1_A3, 1, &result, _NON_AUTOINC);
return (result & 0x7f);
}
//--------------------------------------------------
// Description : TMDS CRC check process before displaying
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CAdjustTMDSCRCCheck(void)
{
BYTE temp0, temp1;
DWORD dsod0, dsod1;
if(GET_FRAMESYNCSTATUS())
{
CTimerDelayXms(20);
temp0 = 0;
temp0 += CAdjustTMDSCRC(&pData[8]);
temp0 += CAdjustTMDSCRC(&pData[12]);
dsod0 = abs(((DWORD *)pData)[2] - ((DWORD *)pData)[3]);
if(temp0 < 2)
{
CScalerPageSelect(_PAGE2);
CScalerSetBit(_P2_ANALOG_COMMON_CTRL2_AB, ~(_BIT5 | _BIT6), CScalerGetBit(_P2_ANALOG_COMMON_CTRL2_AB, (_BIT6 | _BIT5)) ^ (_BIT5 | _BIT6));
temp1 = 0;
temp1 += CAdjustTMDSCRC(&pData[8]);
temp1 += CAdjustTMDSCRC(&pData[12]);
dsod1 = abs(((DWORD *)pData)[2] - ((DWORD *)pData)[3]);
if(temp1 < 2)
{
if(GET_USE_TRANSITION_RESULT())
{
CScalerSetBit(_P2_ANALOG_COMMON_CTRL2_AB, ~(_BIT5 | _BIT6), CScalerGetBit(_P2_ANALOG_COMMON_CTRL2_AB, (_BIT6 | _BIT5)) ^ (_BIT5 | _BIT6));
}
else
{
if(dsod0 <= dsod1)
CScalerSetBit(_P2_ANALOG_COMMON_CTRL2_AB, ~(_BIT5 | _BIT6), CScalerGetBit(_P2_ANALOG_COMMON_CTRL2_AB, (_BIT6 | _BIT5)) ^ (_BIT5 | _BIT6));
}
}
else
{
//CModeSetDigitalCapture();
}
}
else
{
//CModeSetDigitalCapture();
}
}
}
//--------------------------------------------------
// Description : Get TMDS transition difference
// Input Value : ucPar --> _MEASURE_HSYNC or _MEASURE_DE
// Output Value : Transition difference result
//--------------------------------------------------
BYTE CAdjustTMDSEqualizerCheck(BYTE ucPar)
{
BYTE result0, result1;
if(ucPar == _MEASURE_HSYNC)
{
result0 = CAdjustTMDSMeasure(_TMDS_MEASURE_MAX, _TMDS_MEASURE_HSYNC_BE);
if(result0 == 0xff) return 0xff;
else if(result0 < 6) return 0xfe;
result1 = CAdjustTMDSMeasure(_TMDS_MEASURE_MIN, _TMDS_MEASURE_HSYNC_AF);
if(result1 == 0xff) return 0xff;
else if(result1 < 6) return 0xfe;
}
else if(ucPar == _MEASURE_DE)
{
result0 = CAdjustTMDSMeasure(_TMDS_MEASURE_MAX, _TMDS_MEASURE_DE_BE);
if(result0 == 0xff) return 0xff;
else if(result0 < 6) return 0xfe;
result1 = CAdjustTMDSMeasure(_TMDS_MEASURE_MAX, _TMDS_MEASURE_DE_AF);
if(result1 == 0xff) return 0xff;
else if(result1 < 6) return 0xfe;
}
result0 = abs(result0 - result1);
if(result0 <= 2)
result0 = 0;
return result0;
}
//--------------------------------------------------
// Description : Adjust TMDS equalizer setting
// Input Value : None
// Output Value : return _TRUE if success
//--------------------------------------------------
bit CAdjustTMDSEqualizer(void)
{
BYTE cnt, result0, result1;
CLR_USE_TRANSITION_RESULT();
CScalerPageSelect(_PAGE2);
CScalerSetByte(_P2_TMDS_MEAS_SELECT_A1, 0x21);
CScalerSetBit(_P2_TMDS_MEAS_RESULT0_A2, ~(_BIT6 | _BIT5), _BIT5);
cnt = 1;
do
{
CScalerSetBit(_P2_TMDS_MEAS_SELECT_A1, 0xf0, (cnt%16));
result0 = CAdjustTMDSMeasure(_TMDS_MEASURE_MAX, _TMDS_MEASURE_DE_BE);
if(result0 == 0xff)
return _FALSE;
if(result0 > 80)
break;
cnt++;
}
while(cnt <= 16);
cnt = 0;
CScalerPageSelect(_PAGE2);
CScalerSetBit(_P2_ANALOG_COMMON_CTRL2_AB, ~(_BIT6 | _BIT5 | _BIT4), 0x00);
result0 = CAdjustTMDSEqualizerCheck(_MEASURE_HSYNC);
if(result0 == 0xff) return _FALSE;
if(result0 == 0xfe) cnt += 1;
CScalerPageSelect(_PAGE2);
CScalerSetBit(_P2_ANALOG_COMMON_CTRL2_AB, ~(_BIT6 | _BIT5 | _BIT4), _BIT4);
result1 = CAdjustTMDSEqualizerCheck(_MEASURE_HSYNC);
if(result1 == 0xff) return _FALSE;
if(result1 == 0xfe) cnt += 2;
if((abs(result0 - result1) <= 2) || (cnt != 0))
{
cnt = 0;
CScalerSetBit(_P2_ANALOG_COMMON_CTRL2_AB, ~(_BIT6 | _BIT5 | _BIT4), 0x00);
result0 = CAdjustTMDSEqualizerCheck(_MEASURE_DE);
if(result0 == 0xff) return _FALSE;
if(result0 == 0xfe) cnt += 1;
CScalerSetBit(_P2_ANALOG_COMMON_CTRL2_AB, ~(_BIT6 | _BIT5 | _BIT4), _BIT4);
result1 = CAdjustTMDSEqualizerCheck(_MEASURE_DE);
if(result1 == 0xff) return _FALSE;
if(result1 == 0xfe) cnt += 2;
}
if((result0 <= result1) || (cnt >= 2))
CScalerSetBit(_P2_ANALOG_COMMON_CTRL2_AB, ~(_BIT6 | _BIT5 | _BIT4), (_BIT6 | _BIT5 | _BIT4));
if(abs(result0 - result1) > 2)
SET_USE_TRANSITION_RESULT();
return _TRUE;
}
#endif // End of #if(((_TMDS_SUPPORT == _ON) || (_HDMI_SUPPORT == _ON)) && (_DVI_LONG_CABLE_SUPPORT == _ON))
#if((_TMDS_SUPPORT == _ON) || (_HDMI_SUPPORT == _ON))
//--------------------------------------------------
// Description : Set digital mode capture
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CAdjustSetDigitalCapture(void)
{
CScalerSetBit(_VGIP_CTRL_10, ~_BIT1, _BIT1);
CScalerSetBit(_IPH_ACT_STA_H_14, 0xf8, 0x00);
CScalerSetByte(_IPH_ACT_STA_L_15, 0x00);
CScalerSetBit(_IPV_ACT_STA_H_18, ~(_BIT2 | _BIT1 | _BIT0), _BIT2 | _BIT1 | _BIT0);
CScalerSetByte(_IPV_ACT_STA_L_19, 0x00);
}
//--------------------------------------------------
// Description : Measure TMDS CRC value
// Input Value : None
// Output Value : CRC value, DWORD data type
//--------------------------------------------------
//--------------------------------------------------
// Description : TMDS digital/analog capture check process before displaying
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CAdjustTMDSCaptureCheck(void)
{
BYTE flag = 0;
if(flag)
{
CAdjustSetDigitalCapture();
CTimerDelayXms(20);
}
}
#endif // End of #if(_TMDS_SUPPORT == _ON)
#if(_HDCP_SUPPORT == _ON)
//--------------------------------------------------
// Description : Adjust HDCP key
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CAdjustHDCP(void)
{
CScalerPageSelect(_PAGE2);
CScalerSetByte(_P2_HDCP_CTRL_C0, 0x06);
CScalerCodeW(tHDCP_CTRL);
CScalerWrite(_P2_DEVICE_KEY_ACCESS_PORT_C1, 320, tHDCP_KEY_TABLE_0, _NON_AUTOINC);
CScalerSetByte(_P2_HDCP_CTRL_C0, 0x01);
}
#endif
//--------------------------------------------------
// Description : Enable watch dog
// Input Value : ucPar --> Parameter for watch dog
// Output Value : None
//--------------------------------------------------
void CAdjustEnableWatchDog(BYTE ucPar)
{
// add this line by Moya, we don't enable watch-dog at all.
//return;
if(GET_FRAMESYNCSTATUS())
{
CScalerSetByte(_WATCH_DOG_CTRL0_0C, 0x00);
CMiscClearStatusRegister();
CScalerSetBit(_WATCH_DOG_CTRL0_0C, ~ucPar, 0x06 | ucPar); //Ming-Yen
ucPar = ucPar + 0; //Ming-Yen
}
}
//--------------------------------------------------
// Description : Disable watch dog
// Input Value : ucPar --> Parameter for watch dog
// Output Value : None
//--------------------------------------------------
void CAdjustDisableWatchDog(BYTE ucPar)
{
BYTE temp;
CScalerSetBit(_WATCH_DOG_CTRL0_0C, ~ucPar, 0x00);
temp = CScalerGetBit(_WATCH_DOG_CTRL0_0C, (_BIT7 | _BIT6 | _BIT5 | _BIT4 | _BIT3));
if(temp == 0x00)
CScalerSetByte(_WATCH_DOG_CTRL0_0C, 0x00);
}
//--------------------------------------------------
// Description : Adjust gamma
// Input Value : Gamma table type and gamma tables
// Output Value : None
//--------------------------------------------------
void CAdjustGamma(BYTE ucGammaTableType, BYTE *pGammaTableArrayR, BYTE *pGammaTableArrayG, BYTE *pGammaTableArrayB)
{
WORD cnt;
BYTE i, temp;
if((ucGammaTableType == _COMPACT_GAMMA_NORMAL_TABLE) || (ucGammaTableType == _FULL_GAMMA_NORMAL_TABLE))
{
CScalerSetByte(_GAMMA_CTRL_67, 0x80 | ucGammaTableType);
CScalerWrite(_GAMMA_PORT_66, ((ucGammaTableType == _COMPACT_GAMMA_NORMAL_TABLE) ? 256 : 384), pGammaTableArrayR, _NON_AUTOINC);
CScalerSetByte(_GAMMA_CTRL_67, 0x90 | ucGammaTableType);
CScalerWrite(_GAMMA_PORT_66, ((ucGammaTableType == _COMPACT_GAMMA_NORMAL_TABLE) ? 256 : 384), pGammaTableArrayG, _NON_AUTOINC);
CScalerSetByte(_GAMMA_CTRL_67, 0xa0 | ucGammaTableType);
CScalerWrite(_GAMMA_PORT_66, ((ucGammaTableType == _COMPACT_GAMMA_NORMAL_TABLE) ? 256 : 384), pGammaTableArrayB, _NON_AUTOINC);
CScalerSetByte(_GAMMA_CTRL_67, 0x40);
}
#if(_GAMMA_TYPE == _FULL_GAMMA_COMPRESS_TABLE2)
else if(ucGammaTableType == _FULL_GAMMA_COMPRESS_TABLE2)
{
CScalerSetByte(_GAMMA_CTRL_67, 0x81);
CRtdWriteGamma(pGammaTableArrayR);
CScalerSetByte(_GAMMA_CTRL_67, 0x91);
CRtdWriteGamma(pGammaTableArrayG);
CScalerSetByte(_GAMMA_CTRL_67, 0xa1);
CRtdWriteGamma(pGammaTableArrayB);
CScalerSetByte(_GAMMA_CTRL_67, 0x40);
}
#endif
else if((ucGammaTableType == _COMPACT_GAMMA_COMPRESS_TABLE) || (ucGammaTableType == _FULL_GAMMA_COMPRESS_TABLE))
{
for(i=0;i<3;i++)
{
ucVLDCnt = 0;
ucVLDTemp = 0;
if(i == 0)
{
CScalerSetByte(_GAMMA_CTRL_67, 0x80 | (ucGammaTableType % 2));
pvldarray = (pGammaTableArrayR + 16);
}
else if(i == 1)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -