📄 video.c
字号:
//Set Capture Window
ustemp = stModeInfo.IHStartPos + _CAPTURE_HDELAY - (ucHStartBias + _PROGRAM_HDELAY);
CScalerSetBit(_IPH_ACT_STA_H_14, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(ustemp) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPH_ACT_STA_L_15, LOBYTE(ustemp));
CScalerSetBit(_IPH_ACT_WID_H_16, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(stModeInfo.IHWidth) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPH_ACT_WID_L_17, LOBYTE(stModeInfo.IHWidth));
ustemp = stModeInfo.IVStartPos - (ucVStartBias + _PROGRAM_VDELAY);
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));
CScalerSetBit(_IPH_ACT_WID_H_16, ~_BIT7, 0x00);//Video8 C-port MSB & LSB Swap(Normal)
// 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);
//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);
if(field == _VIDEO_60HZ) // hill added to avoid framesync error
stModeInfo.IVTotal = 264; // set 60HZ 525 lines
else if(field == _VIDEO_50HZ)
stModeInfo.IVTotal = 312; // set 50Hz 625 lines
// 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);
// Set internal input H sync delay
CAdjustIHSDelay(ucHStartBias + _PROGRAM_HDELAY);
// Set internal input V sync delay
CAdjustIVSDelay(ucVStartBias + _PROGRAM_VDELAY);
// Calculate and set display clock frequency
stModeInfo.IHFreq = 157; // For PAL and NTSC. We can use sync processor to measure the actual value.
((DWORD *)pData)[0] = (DWORD)(stDisplayInfo.DHTotal) * (DWORD)stModeInfo.IHFreq * (DWORD)(stDisplayInfo.DVHeight) / stModeInfo.IVHeight / 10; // uint Khz Ken
CAdjustDPLL(((DWORD *)pData)[0]);
CModeSetScaling(ucScale); // 0x05: ALL SCALE UP
// ok here
// Turn off full-line buffer
CScalerSetBit(_SCALE_CTRL_32, ~_BIT4, 0x00);
CAdjustIVS2DVSDelay(ucScale); // 0x05: ALL SCALE UP
// Enable display timing
CScalerSetBit(_VDISP_CTRL_28, ~(_BIT5 | _BIT3 | _BIT1 | _BIT0), (_BIT5 | _BIT3 | _BIT1 | _BIT0));
// Disable SRGB
CScalerSetBit(_COLOR_CTRL_62, ~(_BIT2), 0x00);
CSetVideoColor();
#if(_DE_INTERLACE_SUPPORT == _ON)
#if(_DE_INTERLACE_TEST_OPTION==_ENABLE)
if(!bDIstatus)
CModeDeInterlaceSetting();
else
{
CScalerSetBit(_SCALE_CTRL_32, ~(_BIT7 ), _BIT7); //video mode compensation enable
CScalerPageSelect(_PAGE6);
CScalerSetBit(_P6_ENABLE_BIST_CTRL_A0, ~_BIT3, 0x00); //Disable De-interlace Mode
}
#else
CModeDeInterlaceSetting();
#endif
#endif
//fjyang20070712 for Video8 can do CFrameSyncDetect.
#if 1
CAdjustInterlaceIVS2DVSDelay();
#else
// Change to even/odd field frame sync
CScalerSetByte(_IPV_ACT_STA_L_19, CScalerGetBit(_IPV_ACT_STA_L_19, 0xff) + 1);
CScalerRead(_IV_DV_DELAY_CLK_ODD_41, LENGTH(1), &temp, _NON_AUTOINC);
ustemp = (WORD)temp * 16 + 16;
ustemp += stModeInfo.IHTotal;
CScalerSetByte(_IV_DV_DELAY_CLK_ODD_41, (ustemp - 16) / 16);
ustemp -= stModeInfo.IHTotal / 2; //forster modified 060424 for frame sync issue
CScalerSetByte(_IV_DV_DELAY_CLK_EVEN_42, (ustemp - 16) / 16);
// CScalerSetBit(_FS_DELAY_FINE_TUNING_43, ~(_BIT1), _BIT1|_BIT0);
CScalerSetBit(_FS_DELAY_FINE_TUNING_43, ~(_BIT1), _BIT1);
#endif
CTimerDelayXms(100);
pData[0] = CFrameSyncDo();
/*
if(0)//ucOsdState != _AUTOSCANCHANNEL_STATE) // TV autoscan not to check frame sync fail,hill 20070503
{
if (pData[0] == 2)
{
CModeResetMode();
return;
}
} */
SET_MODESTABLE();
CTimerDelayXms(100);
CModeSetupEtcs(_FUNCTION_DISABLE);
CScalerSetDataPortByte(_DISP_ACCESS_PORT_2A, _DISP_NEW_DV_CTRL_22, 0x00);
CScalerPageSelect(_PAGE7);
CScalerSetByte(0xAF,0x80);
CScalerSetByte(0xB0,0x80);
//CTimerActiveTimerEvent(SEC(2), SetDHToal);
//CScalerSetByte(_DISP_ACCESS_PORT_2A,0x0f);
//CScalerSetByte(_DISP_DATA_PORT_2B,0x04);
}
/*
//-->fjyang20070712 add to fix FHFV bug
UINT8 dto_check_count = 0;
UINT32 dto_diff_sum = 0;
void CVideoFixedFHFVBug(void)
{
UINT16 EVEN_LINE,ODD_LINE;
UINT8 VLINE;
UINT8 do_dto_sum;
UINT16 hdto_msb_tmp;
UINT32 dto_diff_avg;
UINT32 cdto_tmp, hdto_tmp, diff_tmp;
if ((ucMode_Curr_2610 == ZPAL_I)||(ucMode_Curr_2610 == ZNTSC))
{
//Start of FV +/-3 hz
CScalerPageSelect(_PAGEA);
CScalerRead(_PA_MEAS_1ST_V_HI_D3, 4, pData, _AUTOINC);
EVEN_LINE= (((UINT16)(pData[0])<<8)+(UINT16)pData[1]);
ODD_LINE= (((UINT16)(pData[2])<<8)+(UINT16)pData[3]);
if (ucMode_Curr_2610 == ZPAL_I)
{
if((EVEN_LINE+ODD_LINE)>625)
VLINE=0xc1+(EVEN_LINE+ODD_LINE-625);
else if ((EVEN_LINE+ODD_LINE)<625)
VLINE=0xc1-(625-(EVEN_LINE+ODD_LINE));
else
VLINE=0xc1;
}
else if (ucMode_Curr_2610 == ZNTSC)
{
if((EVEN_LINE+ODD_LINE)>525)
VLINE=0x61+(EVEN_LINE+ODD_LINE-525);
else if ((EVEN_LINE+ODD_LINE)<525)
VLINE=0x61-(525-(EVEN_LINE+ODD_LINE));
else
VLINE=0x61;
}
CScalerPageSelect(_PAGE8);
CScalerSetBit(_P8_ZORAN_REG_EN_D7, ~_BIT1, _BIT1);
CScalerPageSelect(_PAGE9);
CScalerRead(_P9_VACT_HEIGHT_E1, 1, pData, _NON_AUTOINC);
if(pData[0]!=VLINE)
CScalerWrite(_P9_VACT_HEIGHT_E1, 1, &VLINE, _NON_AUTOINC);
//End of FV +/-3 hz
//Start of FH +/-400 hz
CScalerPageSelect(_PAGE8);
CScalerRead(_P8_HDTO_INC_STATUS4_C0, 8, pData, _AUTOINC);
hdto_tmp = (((UINT32)(pData[0])<<24)+((UINT32)(pData[1])<<16)+((UINT32)(pData[2])<<8)+((UINT32)pData[3]));
cdto_tmp = (((UINT32)(pData[4])<<24)+((UINT32)(pData[5])<<16)+((UINT32)(pData[6])<<8)+((UINT32)pData[7]));
hdto_msb_tmp = (((UINT16)(pData[0])<<8)+(UINT16)(pData[1]));
do_dto_sum = 1;
if( hdto_msb_tmp > 0x2000 )
{
if( hdto_msb_tmp - 0x2000 > 0xD0)
do_dto_sum =0;
}
else
{
if( 0x2000 - hdto_msb_tmp > 0xE0)
do_dto_sum =0;
}
dto_diff_avg = 0;
if(do_dto_sum)
{
diff_tmp = cdto_tmp-hdto_tmp;
dto_diff_sum += diff_tmp;
dto_check_count ++;
if(dto_check_count == 16)
{
dto_diff_avg = dto_diff_sum >> 4;
dto_check_count = 0;
dto_diff_sum = 0;
}
}
if(dto_diff_avg!=0)
{
if (ucMode_Curr_2610 == ZNTSC)
{
if((dto_diff_avg <= 0x01D18000) || (dto_diff_avg >= 0x020f6000))
{
CScalerSetByte(_P8_YCSEP_CTRL_E0, 0x03);
if(CFrameSyncDetect())
{
SET_MODESTABLE();
CModeResetMode();
}
}
else
{
CScalerSetByte(_P8_YCSEP_CTRL_E0, 0x00);
}
}
else if (ucMode_Curr_2610 == ZPAL_I)
{
if((dto_diff_avg <= 0x09EA0000) || (dto_diff_avg >= 0x0A23F2EF))
{
CScalerSetByte(_P8_YCSEP_CTRL_E0, 0x03);
if(CFrameSyncDetect())
{
SET_MODESTABLE();
CModeResetMode();
}
}
else
{
CScalerSetByte(_P8_YCSEP_CTRL_E0, 0x02);
}
}
}
//End of FH +/-400 hz
}
} */
/**
* CVideoProcess
* The VDC input's state machine.
* If the input source is throught VDC, it will call this function to
* process display state. There are 4 states here.
* @param <none>
* @return {none}
*
*/
//--------------------------------------------------
// Description : The VDC input's state machine.
// If the input source is throught VDC, it will call this function to
// process display state. There are 4 states here.
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CVideoProcess(void)
{
switch (ucCurrState)
{
case _SEARCH_STATE:
if(GET_SCREEN_LR())
bLR = 1; //jokerxie 08-05-05 for chuangfeng Screen 90 270
else
bLR = 0;//0//TX//1//UD
if(GET_SCREEN_UD())
bUD = 1; //jokerxie for chuangfeng Screen 0 180
else
bUD = 0;//0//TX//1//RL
if(gmi_CVideoModeChange())
{
CTimerCancelTimerEvent(CModeNoSignalEvent);
SET_READYFORDISPLAY();
CVideoDisplaySet();
CLR_LIGHTPOWERSTATUS();
ucSearchCount = 1;
ucTVSyncFailCount = 0;
/*
if(GET_SCREEN_LR())
MCU_PORT75_PIN_REG_FFD4 = 1; //jokerxie 08-05-05 for chuangfeng Screen 90 270
else
MCU_PORT75_PIN_REG_FFD4 = 0;
if(GET_SCREEN_UD())
MCU_PORT74_PIN_REG_FFD3 = 1; //jokerxie for chuangfeng Screen 0 180
else
MCU_PORT74_PIN_REG_FFD3 = 0;
*/
//$$ Modified by AndyLiu 20080618
/* if(GET_SCREEN_LR())
{
bLR = 0;
SET_SCREEN_LR(0);
}
else
{
bLR = 1;
SET_SCREEN_LR(1);
}
if(GET_SCREEN_UD())
{
bUD = 0;
SET_SCREEN_UD(0);
}
else
{
bUD = 1;
SET_SCREEN_UD(1);
}
CEepromSaveSystemData();
*/
//$$ ~Modified by AndyLiu 20080618
ucCurrState = _ACTIVE_STATE;
}
else
{
ucCurrState = _NOSIGNAL_STATE;
SET_READYFORDISPLAY();
}
break;
case _ACTIVE_STATE:
if (!gmi_CVideoIsExist())
{
CModeResetMode();
break;
}
// CVideoFixedFHFVBug();
if (GET_READYFORDISPLAY() == _TRUE)
{
CPowerPanelOn();
CLR_READYFORDISPLAY();
SET_OSD_READYFORDISPLAY();
}
if (ucSearchCount)
ucSearchCount++;
if (ucSearchCount < 100)
break;
ucSearchCount = 0;
if (GET_LIGHTPOWERSTATUS() == _OFF)
{
CScalerSetBit(_VDISP_CTRL_28, ~(_BIT5), (0x00));
CPowerLightPowerOn();
/*
if (GET_FIRST_SHOW_NOTE())
ucOsdEventMsg = _DO_SHOW_NOTE;
#if(_VIDEO_TV_SUPPORT)
else if(_GET_INPUT_SOURCE() == _SOURCE_VIDEO_TV && bChangeChannel)
CShowTVNumber(stTvInfo.CurChn, _SHOW_CH_TV_NUMBER | _SHOW_CH_TV_TYPE);
#endif
*/
#if(_VIDEO_TV_SUPPORT)
if(_GET_INPUT_SOURCE() == _SOURCE_VIDEO_TV && bChangeChannel)
CShowTVNumber(stTvInfo.CurChn, _SHOW_CH_TV_NUMBER | _SHOW_CH_TV_TYPE);
else
#endif
ucOsdEventMsg = _DO_SHOW_NOTE;
}
break;
case _NOSIGNAL_STATE:
if (GET_READYFORDISPLAY())
{
CLR_READYFORDISPLAY();
CModeSetFreeRun();
SET_OSD_READYFORDISPLAY();
}
if (gmi_CModeLocked())
{
COsdDispOsdTimerEvent();
ucTVSyncFailCount = 250;
CModeResetMode();
}
else
{
CScalerSetByte(_DISP_ACCESS_PORT_2A,0x22);
CScalerSetByte(_DISP_DATA_PORT_2B,0xa0);
}
break;
case _SLEEP_STATE:
if (gmi_CModeLocked())
{
ucTVSyncFailCount = 250;
CModeResetMode();
}
break;
default:
break;
}
}
#endif // End of #if(_VIDEO_SUPPORT == _ON)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -