📄 mode.c
字号:
CScalerSetBit(_IPV_ACT_STA_H_18, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(ustemp) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPV_ACT_STA_L_19, LOBYTE(ustemp));
CScalerSetBit(_IPV_ACT_LEN_H_1A, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(stModeInfo.IVHeight) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPV_ACT_LEN_L_1B, LOBYTE(stModeInfo.IVHeight));
// Set internal input H sync delay
CAdjustIHSDelay(ucHStartBias + _PROGRAM_HDELAY);
// Set internal input V sync delay
CAdjustIVSDelay(ucVStartBias + _PROGRAM_VDELAY);
}
//--------------------------------------------------
// Description : Set scaling factor settings
// Input Value : Scaling information
// Output Value : None
//--------------------------------------------------
void CModeSetScaling(BYTE ucOption)
{
// Set window size before scale up
if(ucOption & _BIT3)
{
// H scale-down
pData[0] = (BYTE)((stDisplayInfo.DHWidth >> 4) & 0x70);
pData[1] = LOBYTE(stDisplayInfo.DHWidth);
}
else
{
// No H scale-down
pData[0] = (BYTE)((stModeInfo.IHWidth >> 4) & 0x70);
pData[1] = LOBYTE(stModeInfo.IHWidth);
}
if(ucOption & _BIT1)
{
// V scale-down
pData[0] = pData[0] | (HIBYTE(stDisplayInfo.DVHeight) & 0x07);
pData[2] = LOBYTE(stDisplayInfo.DVHeight);
}
else
{
// No V scale-down
pData[0] = pData[0] | (HIBYTE(stModeInfo.IVHeight) & 0x07);
pData[2] = LOBYTE(stModeInfo.IVHeight);
}
CScalerSetByte(_FIFO_ACCESS_PORT_30, _FIFO_DWRWL_H_BSU_00);
CScalerWrite(_FIFO_DATA_PORT_31, 3, pData, _NON_AUTOINC);
// Write coefficient for sharpness for scale-up
CAdjustSharpnessForScaleUp();
// Write sharpness coefficient for scale-down
CAdjustSharpnessForScaleDown();
// Config scaling
if(ucOption & _BIT1)
CScalerSetBit(_P6_UZD_CTRL0_E3, ~_BIT1, _BIT1); // Turn on V scale-down
else
CScalerSetBit(_P6_UZD_CTRL0_E3, ~_BIT1, 0x00); // Turn off V scale-down
if(ucOption & _BIT3)
CScalerSetBit(_P6_UZD_CTRL0_E3, ~_BIT0, _BIT0); // Turn on H scale-down
else
CScalerSetBit(_P6_UZD_CTRL0_E3, ~_BIT0, 0x00); // Turn off H scale-down
if(ucOption & _BIT0)
CScalerSetBit(_SCALE_CTRL_32, ~_BIT1, _BIT1); // Turn on V scale-up
else
CScalerSetBit(_SCALE_CTRL_32, ~_BIT1, 0x00); // Turn off V scale-up
if(ucOption & _BIT2)
CScalerSetBit(_SCALE_CTRL_32, ~_BIT0, _BIT0); // Turn on H scale-up
else
CScalerSetBit(_SCALE_CTRL_32, ~_BIT0, 0x00); // Turn off H scale-up
// Set scale-down coefficient
if(ucOption & _BIT3) // H scale-down
{
// Data[12~15]
((DWORD *)pData)[3] = (DWORD)1 * 1048576 * stModeInfo.IHWidth;
((DWORD *)pData)[3] = (((DWORD *)pData)[3] % stDisplayInfo.DHWidth) ? ((((DWORD *)pData)[3] / stDisplayInfo.DHWidth) + 1) : (((DWORD *)pData)[3] / stDisplayInfo.DHWidth);
// H scale-down factor
pData[0] = ((((DWORD *)pData)[3] >> 16) & 0xff);
pData[1] = ((((DWORD *)pData)[3] >> 8) & 0xff);
pData[2] = ((((DWORD *)pData)[3]) & 0xff);
///CScalerSetBit(_IPH_PORCH_NUM_H_1F, ~_BIT3, _BIT3); //Ming-Yen
CScalerSetBit(_P6_UZD_CTRL1_E4, ~(_BIT3 | _BIT2), _BIT3); //For vertical UZD, H->V
if(stModeInfo.IHWidth >= stDisplayInfo.DHWidth)
{
if(stDisplayInfo.DHWidth > 960)
CScalerSetBit(_P6_UZD_CTRL0_E3, ~_BIT4, _BIT4); //Enable 2-tap
}
else
{
if(stModeInfo.IHWidth > 960)
CScalerSetBit(_P6_UZD_CTRL0_E3, ~_BIT4, _BIT4); //Enable 2-tap
}
}
else
{
pData[0] = 0x00;
pData[1] = 0x00;
pData[2] = 0x00;
}
if(ucOption & _BIT1) // V scale-down
{
((DWORD *)pData)[3] = (DWORD)1048576 * stModeInfo.IVHeight / stDisplayInfo.DVHeight;
// V scale-down factor
pData[3] = ((((DWORD *)pData)[3] >> 16) & 0xff);
pData[4] = ((((DWORD *)pData)[3] >> 8) & 0xff);
pData[5] = ((((DWORD *)pData)[3]) & 0xff);
CScalerSetBit(_P6_UZD_CTRL0_E3, ~_BIT7, 0x00); // Diable Video scale-down compensation
if(stModeInfo.IHWidth >= stDisplayInfo.DHWidth)
{
if(stDisplayInfo.DHWidth > 960)
CScalerSetBit(_P6_UZD_CTRL0_E3, ~_BIT4, _BIT4); //Enable 2-tap
}
else{
if(stModeInfo.IHWidth > 960)
CScalerSetBit(_P6_UZD_CTRL0_E3, ~_BIT4, _BIT4); //Enable 2-tap
}
CScalerSetBit(_P6_UZD_CTRL1_E4, ~(_BIT3 | _BIT2), _BIT3); //For vertical UZD, H->V
}
else
{
pData[3] = 0x00;
pData[4] = 0x00;
pData[5] = 0x00;
CScalerSetBit(_P6_UZD_CTRL0_E3, ~_BIT7, 0x00); // Disable Video scale-down compensation
}
CTimerWaitForEvent(_EVENT_IEN_STOP);
CScalerWrite(_P6_UZD_SCALE_HOR_FACTOR_H_E5, 6, pData, _AUTOINC);
pData[0] = 0x00;
pData[1] = 0x00;
pData[2] = 0x00;
pData[3] = 0x00;
pData[4] = (BYTE)(stDisplayInfo.DHWidth >> 8);
pData[5] = (BYTE)stDisplayInfo.DHWidth;
pData[6] = 0x00;
pData[7] = 0x00;
CScalerWrite(_P6_UZD_HOR_DELTA1_H_EB, 8, pData, _AUTOINC);
#if(_NONLINEAR_SCALING)
CScalerDisableNonlinearScaleDown();
#endif
// Set scale-up coefficient
if(ucOption & _BIT2) // H scale-up
{
// Data[12~15]
((DWORD *)pData)[3] = (DWORD)2 * 1048576 * stModeInfo.IHWidth / stDisplayInfo.DHWidth;
((DWORD *)pData)[3] = (((DWORD *)pData)[3] >> 1) + (((DWORD *)pData)[3] & 0x01);
pData[0] = ((((DWORD *)pData)[3] >> 16) & 0x0f);
pData[1] = ((((DWORD *)pData)[3] >> 8) & 0xff);
pData[2] = ((((DWORD *)pData)[3]) & 0xff);
}
else {
pData[0] = 0x0f;
pData[1] = 0xff;
pData[2] = 0xff;
}
if(ucOption & _BIT0) // V scale-up
{
// Data[12~15]
((DWORD *)pData)[3] = (DWORD)2 * 1048576 * stModeInfo.IVHeight / stDisplayInfo.DVHeight;
((DWORD *)pData)[3] = (((DWORD *)pData)[3] >> 1) + (((DWORD *)pData)[3] & 0x01);
pData[3] = ((((DWORD *)pData)[3] >> 16) & 0x0f);
pData[4] = ((((DWORD *)pData)[3] >> 8) & 0xff);
pData[5] = ((((DWORD *)pData)[3]) & 0xff);
}
else
{
pData[3] = 0x0f;
pData[4] = 0xff;
pData[5] = 0xff;
}
CScalerSetByte(_SU_ACCESS_PORT_33, 0x80);
CScalerWrite(_SU_DATA_PORT_34, 6, pData, _NON_AUTOINC);
CScalerSetByte(_SU_ACCESS_PORT_33, 0x00);
CScalerPageSelect(_PAGE0);
#if(_NONLINEAR_SCALING)
CScalerDisableNonlinearScaleUp();
CScalerNonlinearScaleUp(ucOption);
CScalerNonlinearScaleDown(ucOption);
#endif
}
//--------------------------------------------------
// Description : Set display
// Input Value : Scaling information
// Output Value : None
//--------------------------------------------------
void CModeSetDisplay(BYTE ucOption)
{
// Disable spread spectrum
CAdjustSpreadSpectrumRange(0);
// Calculate and set display clock frequency
((DWORD *) pData)[0] = (DWORD)(stDisplayInfo.DHTotal) * (DWORD)stModeInfo.IHFreq * (DWORD)(stDisplayInfo.DVHeight) / stModeInfo.IVHeight / 10;
CAdjustDPLL(((DWORD *) pData)[0]);
// Set DH_TOTAL
pData[0] = (HIBYTE(stDisplayInfo.DHTotal - 4) & 0x0f);
pData[1] = (LOBYTE(stDisplayInfo.DHTotal - 4));
CScalerSetByte(_DISP_ACCESS_PORT_2A, _DISP_DH_TOTAL_H_00);
CScalerWrite(_DISP_DATA_PORT_2B, 2, pData, _NON_AUTOINC);
// Calculate DV_TOTAL setting for watchdog
((WORD *) pData)[2] = (DWORD) stModeInfo.IVTotal * (DWORD) (stDisplayInfo.DVHeight) / stModeInfo.IVHeight + 64;
pData[0] = (HIBYTE(((WORD *) pData)[2]) & 0x0f);
pData[1] = (LOBYTE(((WORD *) pData)[2]));
CScalerSetByte(_DISP_ACCESS_PORT_2A, _DISP_DV_TOTAL_H_0B);
CScalerWrite(_DISP_DATA_PORT_2B, 2, pData, _NON_AUTOINC);
// Display horizontal start/end
((WORD *)pData)[4] = CCalcPanelDHSta();
((WORD *)pData)[5] = CCalcPanelDHEnd();
//((WORD *)pData)[4] = (Panel[ucPanelSelect]->DHWidth - stDisplayInfo.DHWidth) / 2 + Panel[ucPanelSelect]->DHStartPos;
//((WORD *)pData)[5] = ((WORD *)pData)[4] + stDisplayInfo.DHWidth;
pData[0] = HIBYTE(((WORD *)pData)[4]);
pData[1] = LOBYTE(((WORD *)pData)[4]);
pData[2] = HIBYTE(((WORD *)pData)[5]);
pData[3] = LOBYTE(((WORD *)pData)[5]);
CScalerSetByte(_DISP_ACCESS_PORT_2A, _DISP_DH_ACT_STA_H_05);
CScalerWrite(_DISP_DATA_PORT_2B, 4, pData, _NON_AUTOINC);
// Display vertical start/end
((WORD *)pData)[4] = stDisplayInfo.DVStartPos - ((Panel[ucPanelSelect]->DVHeight - stDisplayInfo.DVHeight) / 2);
((WORD *)pData)[5] = stDisplayInfo.DVStartPos;
((WORD *)pData)[6] = ((WORD *)pData)[5] + stDisplayInfo.DVHeight;
((WORD *)pData)[7] = ((WORD *)pData)[4] + Panel[ucPanelSelect]->DVHeight;
pData[0] = HIBYTE(((WORD *)pData)[4]);
pData[1] = LOBYTE(((WORD *)pData)[4]);
pData[2] = HIBYTE(((WORD *)pData)[5]);
pData[3] = LOBYTE(((WORD *)pData)[5]);
pData[4] = HIBYTE(((WORD *)pData)[6]);
pData[5] = LOBYTE(((WORD *)pData)[6]);
pData[6] = HIBYTE(((WORD *)pData)[7]);
pData[7] = LOBYTE(((WORD *)pData)[7]);
CScalerSetByte(_DISP_ACCESS_PORT_2A, (0x80 | _DISP_DV_BKGD_STA_H_0E));
CScalerWrite(_DISP_DATA_PORT_2B, 8, pData, _NON_AUTOINC);
CScalerSetByte(_DISP_ACCESS_PORT_2A, 0x00);//cyc_test
// Turn off full-line buffer
CScalerSetBit(_SCALE_CTRL_32, ~_BIT4, 0x00);
CAdjustIVS2DVSDelay(ucOption);
//CTimerWaitForEvent(_EVENT_DEN_STOP);
// Enable display timing
CScalerSetBit(_VDISP_CTRL_28, ~(_BIT5 | _BIT3 | _BIT1 | _BIT0), (_BIT5 | _BIT3 | _BIT1 | _BIT0));
CMiscClearStatusRegister();
}
//--------------------------------------------------
// Description : Modify IVTotal
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CModeModifyVTotal(void)
{
/*
BYTE ucTemp;
// Force to stop auto-tracking function
CScalerSetByte(_AUTO_ADJ_CTRL_7F, 0x00);
CScalerSetByte(_STATUS0_01, 0x00); // Clear Status
ucTemp = 8; // Tracking timeout 80ms
do
{
CTimerDelayXms(10);
CScalerRead(_STATUS0_01, 1, pData, _NON_AUTOINC); // Read Status
// V101C corrected
if(pData[0] & 0x80)
CScalerSetByte(_STATUS0_01, 0x00); // Clear Status
else
break;
}
while(--ucTemp);
// Measure actual number of scan line in each frame
CScalerCodeW(tMEASURE_IVS);
ucTemp = 50; // Tracking timeout 50ms
do
{
CTimerDelayXms(1);
CScalerRead(_AUTO_ADJ_CTRL_7F, 0x01, pData, _NON_AUTOINC);
}
while((pData[0] & 0x01) && (--ucTemp));
CScalerSetByte(_AUTO_ADJ_CTRL_7F, 0x00);
if(ucTemp)
{
CScalerRead(_VER_START_80, 0x04, pData, _AUTOINC);
pData[0] = pData[3] & 0x0f;
pData[1] = pData[2];
stModeInfo.IVTotal = stModeInfo.IVTotal < ((WORD *)pData)[0] ? ((WORD *)pData)[0] : stModeInfo.IVTotal;
}
*/
}
//----------------------------------------------------------------------------------------------------
// Other Mode Functions
//----------------------------------------------------------------------------------------------------
/**
* CModeResetMode
* Reset mode
* clear some display flags and registers and go back to _SEARCH_STATE
* @param <none>
* @return {none}
*
*/
void CModeResetMode(void)
{
if (_GET_INPUT_SOURCE() == _SOURCE_VIDEO_TV)
{
ucTVSyncFailCount++;
if(ucTVSyncFailCount < 100)
return;
}
ucTVSyncFailCount = 0;
CLR_OSD_READYFORDISPLAY();
#if (_HDMI_SUPPORT == _ON)
if(CHdmiFormatDetect())//Input source is the HDMI format.
{
CScalerPageSelect(_PAGE2);
CAdjustDisableHDMIWatchDog(_WD_AUDIO_FOR_TMDS_CLOCK | _WD_PACKET_VARIATION);//731301
CScalerSetDataPortBit(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_VCR_50, 0xf0, 0x00);
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_AOCR_62, 0x00);//Disable SPDIF/I2S Output
SET_VIDEOMODECHANGE();
} /*
CScalerPageSelect(_PAGE2);
CScalerSetDataPortBit(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_SCR_00, ~(_BIT3 | _BIT2), _BIT3);//Set HDMI/DVI switch mode(manual,DVI)
*/
#endif
#if defined(CONFIG_VBI_ENABLE)
if(!GET_HDMISHOWSEARCH())
COsdFxDisableOsd();
#if ((_VCHIP == _ENABLE) && _VBI_ENABLE)
Vchip_Init();
#endif
CCcInitial();
CCcDisable(); // all the VDC input source should support CC
#endif
if (_GET_INPUT_SOURCE() == _SOURCE_VIDEO_TV)
CAdjustBackgroundColor(0x00, 0x00, (_GET_BLUE_BACKGROUND()) ? 0xFF : 0x00);
else
CAdjustBackgroundColor(0x00, 0x00, 0x00);
// force to background
CTimerWaitForEvent(_EVENT_DEN_STOP);
CScalerSetBit(_VDISP_CTRL_28, 0xff, _BIT5); // Display output is forced to the background color
#if(_YPBPR_NEW_SYNC_DETECT == _ON) // Set SOG0,SOG1 sync level to default 320mv
if(CGetSourcePortType(_GET_INPUT_SOURCE()) == _YPBPR_A0_PORT)
{
CScalerPageSelect(_PAGE0);
CScalerSetByte(_P0_ADC_SOG0_CTRL_D2, 0x20);
}
else
{
CScalerPageSelect(_PAGEB);
CScalerSetByte(_PB_SOYCH0_CFG3_C3,0x20);
}
#endif
CAdjustDisableWatchDog(_WD_ALL); // Disable watch dog
CScalerSetByte(_HOST_CTRL_01, 0x40);
CScalerSetBit(_VGIP_CTRL_10, ~(_BIT1 | _BIT0), 0x00);
CScalerSetByte(_VGIP_SIGINV_11, 0x00);
CScalerSetByte(_VGIP_DELAY_CTRL_12, 0x00); //731301
CScalerPageSelect(_PAGE2);
CScalerSetBit(_P2_Z0_CALIBRATION_CTRL_AC, ~_BIT6, _BIT6); //V305 modify
CScalerPageSelect(_PAGE2);
CScalerSetByte(_P2_TMDS_OUTPUT_CTRL_A6, 0x78); //Auto Output Disable
CScalerSetByte(_P2_POWER_ON_OFF_CTRL_A7, 0x6F); //Input Channel ctrl by auto func(Manual)
CScalerCodeW(tSCALER_RESET_TABLE);
CModeSetFreeRun();
if (GET_PANELPOWERSTATUS() == _OFF)
{
CScalerEnableDisplayOutput();
}
CModeAutoMeasureOff(); // Disable auto measure
CAdjustTMDSErrorCorrectionOn();
CMiscClearStatusRegister();
if(_GET_INPUT_SOURCE() == _SOURCE_VGA)
{
CScalerSetDataPor
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -