📄 mode.c
字号:
// Output Value : None
//--------------------------------------------------
void CModeSetCaptureWindow(BYTE ucOption)
{
WORD ustemp;
ucHStartBias = 100;
ucVStartBias = 0;
ucVStartBias = CAdjustIVS2DVSDelay(ucOption);
if(ucVStartBias > stModeInfo.IVStartPos)
ucVStartBias = stModeInfo.IVStartPos;
// Set capture window
ustemp = stModeInfo.IHStartPos + _CAPTURE_HDELAY - (ucHStartBias + _PROGRAM_HDELAY);
CScalerSetBit(_IPH_ACT_STA_H_09, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(ustemp) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPH_ACT_STA_L_0A, LOBYTE(ustemp));
CScalerSetBit(_IPH_ACT_WID_H_0B, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(stModeInfo.IHWidth) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPH_ACT_WID_L_0C, LOBYTE(stModeInfo.IHWidth));
ustemp = stModeInfo.IVStartPos - (ucVStartBias + _PROGRAM_VDELAY);
CScalerSetBit(_IPV_ACT_STA_H_0D, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(ustemp) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPV_ACT_STA_L_0E, LOBYTE(ustemp));
CScalerSetBit(_IPV_ACT_LEN_H_0F, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(stModeInfo.IVHeight) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPV_ACT_LEN_L_10, 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);
}
CScalerWrite(_DWRWL_H_BSU_14, 3, pData, _AUTOINC);
// Write coefficient for sharpness
CAdjustSharpness();
// Config scaling
if(ucOption & _BIT1)
CScalerSetBit(_SCALE_DOWN_CTRL_22, ~_BIT0, _BIT0); // Turn on V scale-down
else
CScalerSetBit(_SCALE_DOWN_CTRL_22, ~_BIT0, 0x00); // Turn off V scale-down
if(ucOption & _BIT3)
CScalerSetBit(_SCALE_DOWN_CTRL_22, ~_BIT1, _BIT1); // Turn on H scale-down
else
CScalerSetBit(_SCALE_DOWN_CTRL_22, ~_BIT1, 0x00); // Turn off H scale-down
if(ucOption & _BIT0)
CScalerSetBit(_SCALE_CTRL_19, ~_BIT1, _BIT1); // Turn on V scale-up
else
CScalerSetBit(_SCALE_CTRL_19, ~_BIT1, 0x00); // Turn off V scale-up
if(ucOption & _BIT2)
CScalerSetBit(_SCALE_CTRL_19, ~_BIT0, _BIT0); // Turn on H scale-up
else
CScalerSetBit(_SCALE_CTRL_19, ~_BIT0, 0x00); // Turn off H scale-up
// Set scale-down coefficient
if(ucOption & _BIT3) // H scale-down
{
// Data[12~15]
((LWORD *)pData)[3] = (LWORD)131072 * stModeInfo.IHWidth / stDisplayInfo.DHWidth;
// H scale-down factor
pData[0] = ((((LWORD *)pData)[3] >> 16) & 0x07);
pData[0] |= ((((LWORD *)pData)[3] * 16 / 131072 - 16) << 3);
pData[1] = ((((LWORD *)pData)[3] >> 8) & 0xff);
pData[2] = ((((LWORD *)pData)[3]) & 0xff);
//CScalerSetBit(_VGIP_CTRL_04, 0xff, 0x40); // Enable H scale-down compensation
}
else
{
pData[0] = 0x02;
pData[1] = 0x00;
pData[2] = 0x00;
//CScalerSetBit(_VGIP_CTRL_04, 0xbf, 0x00); // Diable H scale-down compensation
}
if(ucOption & _BIT1) // V scale-down
{
// Data[12~15]
((LWORD *)pData)[3] = (LWORD)4096 * stModeInfo.IVHeight / stDisplayInfo.DVHeight;
// V scale-down factor
pData[3] = ((((LWORD *)pData)[3] >> 8) & 0xff);
pData[4] = ((((LWORD *)pData)[3]) & 0xff);
CScalerSetBit(_SCALE_DOWN_CTRL_22, ~_BIT2, 0x00); // Diable V scale-down compensation
}
else
{
pData[3] = 0x10;
pData[4] = 0x00;
CScalerSetBit(_SCALE_DOWN_CTRL_22, ~_BIT2, 0x00); // Diable V scale-down compensation
}
CScalerWrite(_H_SCALE_DOWN_H_23, 5, pData, _AUTOINC);
// Set scale-up coefficient
if(ucOption & _BIT2) // H scale-up
{
// Data[12~15]
((LWORD *)pData)[3] = (LWORD)2 * 1048576 * stModeInfo.IHWidth / stDisplayInfo.DHWidth;
((LWORD *)pData)[3] = (((LWORD *)pData)[3] >> 1) + (((LWORD *)pData)[3] & 0x01);
pData[0] = ((((LWORD *)pData)[3] >> 16) & 0x0f);
pData[1] = ((((LWORD *)pData)[3] >> 8) & 0xff);
pData[2] = ((((LWORD *)pData)[3]) & 0xff);
}
else
{
pData[0] = 0x0f;
pData[1] = 0xff;
pData[2] = 0xff;
}
if(ucOption & _BIT0) // V scale-up
{
// Data[12~15]
((LWORD *)pData)[3] = (LWORD)2 * 1048576 * stModeInfo.IVHeight / stDisplayInfo.DVHeight;
((LWORD *)pData)[3] = (((LWORD *)pData)[3] >> 1) + (((LWORD *)pData)[3] & 0x01);
pData[3] = ((((LWORD *)pData)[3] >> 16) & 0x0f);
pData[4] = ((((LWORD *)pData)[3] >> 8) & 0xff);
pData[5] = ((((LWORD *)pData)[3]) & 0xff);
}
else
{
pData[3] = 0x0f;
pData[4] = 0xff;
pData[5] = 0xff;
}
CScalerSetByte(_SF_ACCESS_PORT_1A, 0x80);
CScalerWrite(_SF_DATA_PORT_1B, 6, pData, _NON_AUTOINC);
CScalerSetByte(_SF_ACCESS_PORT_1A, 0x00);
}
/*
//--------------------------------------------------
// 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
((LWORD *)pData)[0] = (LWORD)(stDisplayInfo.DHTotal) * (LWORD)stModeInfo.IHFreq * (LWORD)(stDisplayInfo.DVHeight) / stModeInfo.IVHeight / 10;
CAdjustDPLL(((LWORD *)pData)[0]);
// Set DH_TOTAL
pData[0] = (HIBYTE(stDisplayInfo.DHTotal - 4) & 0x0f);
pData[1] = (LOBYTE(stDisplayInfo.DHTotal - 4));
CScalerWrite(_DH_TOTAL_H_2A, 2, pData, _AUTOINC);
// Calculate DV_TOTAL setting for watchdog
((WORD *)pData)[2] = (LWORD)stModeInfo.IVTotal * (LWORD)(stDisplayInfo.DVHeight) / stModeInfo.IVHeight + 64;
pData[0] = (HIBYTE(((WORD *)pData)[2]) & 0x0f);
pData[1] = (LOBYTE(((WORD *)pData)[2]));
CScalerWrite(_DV_TOTAL_H_35, 2, pData, _AUTOINC);
// Display vertical start/end
((WORD *)pData)[2] = Panel.DVStartPos;
((WORD *)pData)[3] = ((WORD *)pData)[2] + stDisplayInfo.DVHeight;
pData[0] = HIBYTE(((WORD *)pData)[2]);
pData[1] = LOBYTE(((WORD *)pData)[2]);
pData[2] = HIBYTE(((WORD *)pData)[3]);
pData[3] = LOBYTE(((WORD *)pData)[3]);
CScalerWrite(_DV_ACT_STA_H_3A, 4, pData, _AUTOINC);
// Turn off full-line buffer
CScalerSetBit(_SCALE_CTRL_19, ~_BIT4, 0x00);
CAdjustIVS2DVSDelay(ucOption);
// Enable display timing
CScalerSetBit(_VDISP_CTRL_28, ~(_BIT5 | _BIT3 | _BIT1 | _BIT0), (_BIT5 | _BIT3 | _BIT1 | _BIT0));
CMiscClearStatusRegister();
}
*/
//version 200D
//--------------------------------------------------
// 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
((LWORD *)pData)[0] = (LWORD)(stDisplayInfo.DHTotal) * (LWORD)stModeInfo.IHFreq * (LWORD)(stDisplayInfo.DVHeight) / stModeInfo.IVHeight / 10;
CAdjustDPLL(((LWORD *)pData)[0]);
// Set DH_TOTAL
pData[0] = (HIBYTE(stDisplayInfo.DHTotal - 4) & 0x0f);
pData[1] = (LOBYTE(stDisplayInfo.DHTotal - 4));
CScalerWrite(_DH_TOTAL_H_2A, 2, pData, _AUTOINC);
// Calculate DV_TOTAL setting for watchdog
((WORD *)pData)[2] = (LWORD)stModeInfo.IVTotal * (LWORD)(stDisplayInfo.DVHeight) / stModeInfo.IVHeight + 64;
pData[0] = (HIBYTE(((WORD *)pData)[2]) & 0x0f);
pData[1] = (LOBYTE(((WORD *)pData)[2]));
CScalerWrite(_DV_TOTAL_H_35, 2, pData, _AUTOINC);
// Display vertical start/end
((WORD *)pData)[2] = stDisplayInfo.DVStartPos;
((WORD *)pData)[3] = ((WORD *)pData)[2] + stDisplayInfo.DVHeight;
pData[0] = HIBYTE(((WORD *)pData)[2]);
pData[1] = LOBYTE(((WORD *)pData)[2]);
pData[2] = HIBYTE(((WORD *)pData)[3]);
pData[3] = LOBYTE(((WORD *)pData)[3]);
CScalerWrite(_DV_ACT_STA_H_3A, 4, pData, _AUTOINC);
// Turn off full-line buffer
CScalerSetBit(_SCALE_CTRL_19, ~_BIT4, 0x00);
CAdjustIVS2DVSDelay(ucOption);
// Enable display timing
CScalerSetBit(_VDISP_CTRL_28, ~(_BIT5 | _BIT3 | _BIT1 | _BIT0), (_BIT5 | _BIT3 | _BIT1 | _BIT0));
CMiscClearStatusRegister();
}
/*
//--------------------------------------------------
// Description : Set digital mode capture
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CModeSetDigitalCapture(void)
{
CScalerSetBit(_VGIP_CTRL_05, ~_BIT1, _BIT1);
CScalerSetBit(_IPH_ACT_STA_H_09, 0xf8, 0x00);
CScalerSetByte(_IPH_ACT_STA_L_0A, 0x00);
CScalerSetByte(_IPV_ACT_STA_H_0D, 0x00);
CScalerSetByte(_IPV_ACT_STA_L_0E, 0x00);
}
*/
//--------------------------------------------------
// 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
//----------------------------------------------------------------------------------------------------
//--------------------------------------------------
// Description : Reset mode
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CModeResetMode(void)
{
//x.hu, for mute, needs to update
if (GET_MUTESTATUS() == 0){
#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
if (!GET_VIDEO_PN_ACTION()) {
//b4052A = b4052B = 1;
#if (_AUDIO_DEVICE != _AUDIO_NONE)
CAudioSelChannel(_AUDIO_CHANNEL_NC);
#endif
}
#else
#if (_AUDIO_DEVICE != _AUDIO_NONE)
CAudioSelChannel(_AUDIO_CHANNEL_NC);
#endif
#endif
}
//CPowerLightPowerOff();
COsdFxDisableOsd();// XYW
CAudioVolumemute();//xyw
CPowerPanelOff();
CAdjustDisableWatchDog(_WD_ALL);
CScalerSetByte(_HOST_CTRL_01, 0x00);
CScalerSetBit(_VGIP_CTRL_05, ~_BIT1, 0x00);
#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
if (!GET_VIDEO_PN_ACTION())
{
CModeSetFreeRun();
//CAdjustBackgroundColor(_BGND_COLOR_R, _BGND_COLOR_G, _BGND_COLOR_B); //by x.hu
CAdjustBackgroundColor(0, 0, 0); //by x.hu
}
#else
CModeSetFreeRun();
//CAdjustBackgroundColor(_BGND_COLOR_R, _BGND_COLOR_G, _BGND_COLO
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -