📄 lcd_main.c
字号:
Data[3] = Data[1];
Data[2] = Data[2] & 0x8f;
usHsync = ((unsigned int *)Data)[1]; // Current usHsync timing
usVsync = ((unsigned int *)Data)[2]; // Current usVsync timing
// Polarity must be correct
if ((bVpole_Curr != bVpole_Prev) || (bHpole_Curr != bHpole_Prev))
{
RTDRead(VGIP_SIGINV_05, 0x01, N_INC);
Data[0] &= 0xd7; // HS_RAW & VS positive
if (!bHpole_Curr) Data[0] |= 0x20;
if (!bVpole_Curr && SYNC_SS == ucSync_Type) Data[0] |= 0x08; // Seperate sync
RTDSetByte(VGIP_SIGINV_05, Data[0]);
ucMode_Found = MODE_NOSUPPORT;
}
else
{
if (0x07ff <= usHsync || 0x07ff <= usVsync || 0 == usHsync || 0 == usVsync) // Check overflow
{
ucMode_Found = MODE_NOSUPPORT;
}
else
{
if ((usHsync < (usStdHS - 1)) || (usHsync > (usStdHS + 3)) ||
(usVsync < (usStdVS - 1)) || (usVsync > (usStdVS + 3)))
{
ucMode_Found = MODE_NOSUPPORT;
}
else
{
ucMode_Found = ucMode_Curr;
}
}
}
}
if (MODE_NOSUPPORT == ucMode_Found)
{
Reset_Mode();
}
else
{
bStable = 1; // Set bStable to 1 when signal timing is stable.
LED_GREEN = 0X00;
LED_RED = 0X01;
#if(AS_NON_FRAMESYNC)
RTDSetByte(STATUS0_01, 0x00); // Clear status
RTDSetByte(STATUS1_1F, 0x00); // Clear status
if(bFrameSync)
RTDSetBit(ODD_CTRL_8E,0xef,0x10);
#endif
}
}
/////////////////////////////////////////////////////////
//------------------ Detect VIDEO Mode ----------------//
/////////////////////////////////////////////////////////
#if (VIDEO_CHIP == TW_9905)
void Reset_TW9905(void)
{
Delay_Xms(2);
bVDC_RESET=0;
Delay_Xms(20);
bVDC_RESET=1;
}
void I2CWrite_TW990X(unsigned char address,unsigned char wdata)
{
Data[0] = 4;
Data[1] = 0x8c;
Data[2] = address;
Data[3] = wdata;
I2CWrite(Data);
}
#endif
#if(TV_NONE != TV_CHIP || VIDEO_CHIP == TW_9905)
unsigned char I2CRead_TW990X(unsigned char address)
{
unsigned char rdata;
I2CSendAddr(0x8c, address, 0);
I2CSendAddr(0x8c, 0, 1);
rdata = I2CGetByte(1);
I2CSendStop();
return rdata;
}
#endif
#if(TV_CHIP != TV_NONE)
void Detect_TV_Mode(void)
{
ucAV_Mode = 0x02; //PAL 50HZ
ucMode_Curr = MODE_VIDEO50HZ;
Delay_Xms(20);
RTDCodeW(RTD_VIDEO_50);
Delay_Xms(10);
ucMode_Times=0;
bStable = 0;
Display_Video_Set();
Set_Panel(1);
}
void Check_TV_Mode(void)
{
RTDRead(VDIS_CTRL_20, 1, N_INC);
if (0 == (Data[0] & 0x08))
{
// Change to Frame-sync display
RTDSetBit(VDIS_CTRL_20, 0xf6, 0x08);
RTDSetBit(VDIS_CTRL_20, 0xf6, 0x09);
}
bStable = 1;
LED_GREEN = 0X00;
LED_RED = 0X01;
}
#endif
void Detect_Video_Mode(void)
{
#if (VIDEO_CHIP == TW_9905 )
Data[0]=I2CRead_TW990X(0x01);
if ((Data[0] & 0x80)==0)
{
Delay_Xms(10);
Data[0]=I2CRead_TW990X(0x1c);
Data[0]=Data[0]>>4;
switch(Data[0] & 0x07)
{
case 0x01://PAL
case 0x02:
case 0x05:
if (MODE_VIDEO50HZ == ucMode_Found)
{
ucMode_Times ++;
}
else
{
ucMode_Found = MODE_VIDEO50HZ;
ucMode_Times = 0;
}
ucAV_Mode = 0x02;
break;
case 0x00:
case 0x03:
case 0x04:
case 0x06:
if (MODE_VIDEO60HZ == ucMode_Found)
{
ucMode_Times ++;
}
else
{
ucMode_Found = MODE_VIDEO60HZ;
ucMode_Times = 0;
}
ucAV_Mode = 0x01;
break;
} //switch
}//if
else
{
// Non Horizontal Lock
ucAV_Mode = 0;
if (ucMode_Found != MODE_NOSUPPORT)
{
ucMode_Found = MODE_NOSUPPORT;
ucMode_Times = 0;
}
}
//-------------Check result--------------
if (MODE_NOSUPPORT != ucMode_Found)
{
if (VIDEO_SEARCH_TIMES < ucMode_Times)
{
bLIGHT_PWR = LIGHT_OFF; // Turn off BackLight for reset display
RTDSetByte(HOSTCTRL_02, 0x40); // Wake RTD up
ucMode_Curr = ucMode_Found;
ucMode_Times = 0;
bStable = 0; // bStable must be cleared when mode changed
Display_Video_Set();
}
}
else
{
ucMode_Times ++;
if (NO_MODE_TIMES < ucMode_Times && (stGUD1.INPUT_SOURCE & 0x07) != SOURCE_SV)
{
bStable = 1; // Set bStable to 1 when signal timing is stable.
ucMode_Times = NO_MODE_TIMES - 1;
}
else if ((NO_MODE_TIMES + 8) < ucMode_Times && (stGUD1.INPUT_SOURCE & 0x07) == SOURCE_SV)
{
bStable = 1; // Set bStable to 1 when signal timing is stable.
ucMode_Times = NO_MODE_TIMES - 1;
}
LED_GREEN = 0X00;
LED_RED = 0X00;
}
#if(VIDEO_CHIP != VDC_NONE)
// Display_Video_Set();
#endif
#endif
#if (VIDEO_CHIP == VDC_SAA7114 || VIDEO_CHIP == VDC_SAA7115 )
I2CRead(ADDR_VIDEO, 0x1f, 0x01);
//------ Check Horizontal Lock & Frequency ------
if (0 == (Data[0] & 0x40))
{
if ((Data[0] & 0x20) && (0x01 != (ucAV_Mode & 0x0f)))
{
// Field rate changed to 60Hz
ucAV_Mode = 0x01;
ucMode_Found = MODE_NOSUPPORT;
ucMode_Times = 0;
Data[0] = 4;
Data[1] = ADDR_VIDEO;
Data[2] = 0x0e;
Data[3] = 0x08; // Start color search from NTSC-M
I2CWrite(Data);
}
else if ((0 == (Data[0] & 0x20)) && (0x02 != (ucAV_Mode & 0x02)))
{
// Field rate changed to 50Hz
ucAV_Mode = 0x02;
ucMode_Found = MODE_NOSUPPORT;
ucMode_Times = 0;
Data[0] = 4;
Data[1] = ADDR_VIDEO;
Data[2] = 0x0e;
Data[3] = 0x08; // Start color search from PAL-BDGHI
I2CWrite(Data);
}
else
{
//------ Check Lock Color ------
if (0x01 == (Data[0] & 0x01))
{
// Lock Color
if (ucAV_Mode & 0x01)
{
if (MODE_VIDEO60HZ == ucMode_Found)
{
ucMode_Times ++;
}
else
{
ucMode_Found = MODE_VIDEO60HZ;
ucMode_Times = 0;
}
}
else
{
if (MODE_VIDEO50HZ == ucMode_Found)
{
ucMode_Times ++;
}
else
{
ucMode_Found = MODE_VIDEO50HZ;
ucMode_Times = 0;
}
}
}
else
{
// Non Lock Color
if (MODE_NOSUPPORT != ucMode_Found)
{
ucMode_Found = MODE_NOSUPPORT;
ucMode_Times = 0;
}
Data[0] = 4;
Data[1] = ADDR_VIDEO;
Data[2] = 0x0e;
if (0x03 == (ucAV_Mode & 0x03))
{
// SECAM -> PAL-BDGHI(50Hz)
Data[3] = 0x08;
I2CWrite(Data);
ucAV_Mode = 0x02;
}
else
{
if (ucMode_Times & 0x01) // Every 2-times , change color
{
switch (ucAV_Mode & 0x70)
{
case 0x00:
Data[3] = 0x18; // NTSC-4.43(50Hz) // PAL-4.43(60Hz)
I2CWrite(Data);
ucAV_Mode = (ucAV_Mode & 0x0f) | 0x10;
break;
case 0x10:
Data[3] = 0x28; // PAL-N(50Hz) // NTSC-4.43(60Hz)
I2CWrite(Data);
ucAV_Mode = (ucAV_Mode & 0x0f) | 0x20;
break;
case 0x20:
Data[3] = 0x38; // NTSC-N(50Hz) // PAL-M(60Hz)
I2CWrite(Data);
ucAV_Mode = (ucAV_Mode & 0x0f) | 0x30;
break;
case 0x30:
if (ucAV_Mode & 0x02)
{
// NTSC-N -> SECAM (50Hz)
Data[3] = 0x5c;
I2CWrite(Data);
ucAV_Mode = 0x03;
}
else
{
// PAL-M -> NTSC_M (60Hz)
Data[3] = 0x08;
I2CWrite(Data);
ucAV_Mode = ucAV_Mode & 0x0f | 0x00;
}
default:
break;
}//end of "switch (ucAV_Mode & 0x70)"
}//end of "if (ucMode_Times & 0x01)"
}//end of "if (0x03 == (ucAV_Mode & 0x03)) else"
}//end of "Non Lock color
}//end of "Check Lock Color"
}//end of "if (0==(Data[0] & 0x40))"
else
{
// Non Horizontal Lock
ucAV_Mode = 0;
if (ucMode_Found != MODE_NOSUPPORT)
{
ucMode_Found = MODE_NOSUPPORT;
ucMode_Times = 0;
}
}
//-------------Check result--------------
if (MODE_NOSUPPORT != ucMode_Found)
{
if (VIDEO_SEARCH_TIMES < ucMode_Times)
{
bLIGHT_PWR = LIGHT_OFF; // Turn off BackLight for reset display
RTDSetByte(HOSTCTRL_02, 0x40); // Wake RTD up
RTDCodeW(OSD_Reset); // Clear OSD
if (SOURCE_YUV == (stGUD1.INPUT_SOURCE & 0x07))
ucMode_Curr = (ucAV_Mode & 0x02) ? MODE_YUV50HZ : MODE_YUV60HZ;
else
ucMode_Curr = ucMode_Found;
ucMode_Times = 0;
bStable = 0; // bStable must be cleared when mode changed
Display_Video_Set();
}
}
else
{
ucMode_Times ++;
if (ucAV_Mode)
{
// Force to display although we cannot lock color
if (VIDEO_SEARCH_TIMES < ucMode_Times
&& (NO_COLOR_TIMES < ucMode_Times || SOURCE_YUV == (stGUD1.INPUT_SOURCE & 0x07)))
{
bLIGHT_PWR = LIGHT_OFF; // Turn off BackLight for reset display
RTDSetByte(HOSTCTRL_02, 0x40); // Wake RTD up
RTDCodeW(OSD_Reset); // Clear OSD
ucAV_Mode = (ucAV_Mode & 0x02) ? 0x82 : 0x81;
if (SOURCE_YUV != (stGUD1.INPUT_SOURCE & 0x07))
ucMode_Curr = (ucAV_Mode & 0x02) ? MODE_VIDEO50HZ : MODE_VIDEO60HZ;
else
ucMode_Curr = (ucAV_Mode & 0x02) ? MODE_YUV50HZ : MODE_YUV60HZ;
ucMode_Times = 0;
bStable = 0; // bStable must be cleared when mode changed
Display_Video_Set();
}
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -