📄 lcd_main.c
字号:
}
else
{
bLIGHT_PWR = LIGHT_OFF; // Turn off BackLight for reset display
RTDSetByte(HOSTCTRL_02, 0x40); // Wake RTD up
RTDCodeW(OSD_Reset); // Clear OSD
ucMode_Curr = ucMode_Found; // Search mode OK
ucMode_Times = 0; // Reset mode timer
bStable = 0; // bStable must be cleared when mode changed
Display_DVI_Set(); // Set VGA Mode registers
#if (RTDDEBUG)
if (ucMode_PrevAct == ucMode_Curr)
{
if (0xff > ucMode_QuitCnt) ucMode_QuitCnt += 1;
}
else
{
ucMode_PrevAct = ucMode_Curr;
ucMode_QuitCnt = 0;
ucDebug = 0;
}
#endif
}
}
}
#else
Display_DVI_Set();
#endif
}
unsigned char Seek_DVI_Mode(unsigned char mode)
{
#if(TMDS_ENABLE)
unsigned char Wait_Time_Cnt;
RTDSetByte(SYNC_POR_4C, 0x03); // Measure data enable width and height
Wait_Time_Cnt = 60;
do
{
Delay_Xms(1);
RTDRead(SYNC_POR_4C, 0x07, Y_INC);
}
while ((Data[0] & 0x02) && (--Wait_Time_Cnt));
Data[7] = Data[5];
Data[6] = Data[6] & 0x0f;
Data[5] = Data[3];
Data[4] = Data[4] & 0x87;
Data[3] = Data[1];
Data[2] = Data[2] & 0x8f;
// Measure Failed !!!
if ((0 == ((unsigned int *)Data)[1]) || (0x07ff <= ((unsigned int *)Data)[1]) ||
(0 == ((unsigned int *)Data)[2]) || (0x07ff <= ((unsigned int *)Data)[2]) ||
(0 == Wait_Time_Cnt))
{
RTDSetByte(SYNC_POR_4C, 0x00);
return MODE_NOSUPPORT;
}
// Save IH_TOTAL in usADC_Clock
usADC_Clock = ((unsigned int *)Data)[1] * 2;
// Save input data enable width and height
usIPV_ACT_LEN = ((unsigned int *)Data)[2];
usIPH_ACT_WID = ((unsigned int *)Data)[3] * 2;
// We don't support input image less than 350 active lines
if (350 > usIPV_ACT_LEN) return MODE_NOSUPPORT;
// We only support 8N active width
usIPH_ACT_WID = (2 < (usIPH_ACT_WID & 0x0007)) ? ((usIPH_ACT_WID + 8) & 0xfff8) : (usIPH_ACT_WID & 0xfff8);
// We only support active width not larger than 1280
if (1280 < usIPH_ACT_WID) usIPH_ACT_WID = 1280;
// Calculate maximum usIPV_ACT_LEN limitation
((unsigned int *)Data)[0] = (unsigned long)(usVsync - 1) * DISP_LEN / MIN_DV_TOTAL;
if (((unsigned int *)Data)[0] < usIPV_ACT_LEN) usIPV_ACT_LEN = ((unsigned int *)Data)[0];
if (MODE_NOSUPPORT == mode)
{
mode = MODE_UNDEFINED0;
}
else if (CAP_WIN[mode][2] != usIPH_ACT_WID || CAP_WIN[mode][4] != usIPV_ACT_LEN)
{
switch (usIPV_ACT_LEN)
{
case 350 :
if (MODE_0640x0350x70HZ <= mode && MODE_0720x0400x70HZ >= mode)
{
mode = (716 > usIPH_ACT_WID) ? MODE_0640x0350x70HZ : MODE_0720x0350x70HZ;
}
else if (MODE_0640x0350x85HZ <= mode && MODE_0720x0400x85HZ >= mode)
{
mode = MODE_0640x0350x85HZ;
}
else if (MODE_0640x0480x50HZ == mode)
{
mode = MODE_VGA350x50Hz;
}
else if (MODE_0640x0480x60HZ == mode)
{
mode = MODE_VGA350x60Hz;
}
else
{
mode = MODE_UNDEFINED0;
}
break;
case 400 :
if (MODE_0640x0350x70HZ <= mode && MODE_0720x0400x70HZ >= mode)
{
mode = (716 > usIPH_ACT_WID) ? MODE_0640x0400x70HZ : MODE_0720x0400x70HZ;
}
else if (MODE_0640x0350x85HZ <= mode && MODE_0720x0400x85HZ >= mode)
{
mode = (716 > usIPH_ACT_WID) ? MODE_0640x0400x85HZ : MODE_0720x0400x85HZ;
}
else if (MODE_0640x0480x50HZ == mode)
{
mode = MODE_VGA400x50Hz;
}
else if (MODE_0640x0480x60HZ == mode)
{
mode = MODE_VGA400x60Hz;
}
else if (MODE_USER720x400 != mode)
{
mode = MODE_UNDEFINED0;
}
break;
case 480 :
if ((MODE_USER640x480 != mode) && ((MODE_0640x0480x50HZ > mode) || (MODE_0640x0480x85HZ < mode)))
mode = MODE_UNDEFINED0;
break;
case 600 :
if ((MODE_USER800x600 != mode) && ((MODE_0800x0600x56HZ > mode) || (MODE_0800x0600x85HZ < mode)))
mode = MODE_UNDEFINED0;
break;
case 624 :
if (MODE_0832x0624x75HZ != mode)
mode = MODE_UNDEFINED0;
break;
case 768 :
if ((MODE_USER1024x768 != mode) && ((MODE_1024x0768x60HZ > mode) || (MODE_1024x0768x85HZ < mode)))
mode = MODE_UNDEFINED0;
break;
case 800 :
if (MODE_1024x0800x84HZ != mode)
mode = MODE_UNDEFINED0;
break;
case 864 :
if ((MODE_USER1152x864 != mode) && (MODE_1152x0864x75HZ != mode))
mode = MODE_UNDEFINED0;
break;
case 870 :
if (MODE_1152x0870x75HZ != mode)
mode = MODE_UNDEFINED0;
break;
case 900 :
if ((MODE_USER1152x900 != mode) && ((MODE_1152x0900x66HZ > mode) || (MODE_1152x0900x76HZ < mode)))
mode = MODE_UNDEFINED0;
break;
case 960 :
if ((MODE_USER1280x960 != mode) && ((MODE_1280x0960x60HZ > mode) || (MODE_1280x0960x85HZ < mode)))
mode = MODE_UNDEFINED0;
break;
case 1024 :
if ((MODE_USER1280x1024 != mode) && ((MODE_1280x1024x60HZ > mode) || (MODE_1280x1024x85HZ < mode)))
mode = MODE_UNDEFINED0;
break;
case 1600 :
if ((MODE_USER1600x1200 != mode) && (MODE_1600x1200x60HZ != mode))
mode = MODE_UNDEFINED0;
break;
default :
mode = MODE_UNDEFINED0;
break;
}
}
if (MODE_UNDEFINED0 == mode)
{
// First, we try user-mode to fit the undefined mode for full-screen display.
Wait_Time_Cnt = MODE_USER720x400;
do
{
if (Mode_Preset[Wait_Time_Cnt][2] < CAP_WIN[Wait_Time_Cnt][4]) // V scale-down
{
// Larger scale-down ratio may need a larger DH_TOTAL.
// So usIPV_ACT_LEN should not be too larger than pre-set capture window length
if (Mode_Preset[Wait_Time_Cnt][2] > usIPV_ACT_LEN || (CAP_WIN[Wait_Time_Cnt][4] + 24) < usIPV_ACT_LEN) continue;
}
else
{
if (Mode_Preset[Wait_Time_Cnt][2] < usIPV_ACT_LEN) continue;
}
((unsigned int *)Data)[0] = (unsigned long)2458 * Mode_Preset[Wait_Time_Cnt][0] * Mode_Preset[Wait_Time_Cnt][2]
/ ((unsigned long)100 * usIPV_ACT_LEN * usHsync);
// Return if we find out a suitable user-mode.
if (MAX_DCLK > ((unsigned int *)Data)[0]) return Wait_Time_Cnt;
}
while (MODE_USER1600x1200 >= ++Wait_Time_Cnt);
// If failed, we try partial-screen display.
if (DISP_LEN < usIPV_ACT_LEN) // Scale-down
{
((unsigned int *)Data)[0] = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED1][0] * DISP_LEN
/ ((unsigned long)100 * usIPV_ACT_LEN * usHsync);
if (MAX_DCLK < ((unsigned int *)Data)[0])
{
((unsigned int *)Data)[1] = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED1][0] * MIN_DV_TOTAL
/ ((unsigned long)100 * (usVsync - 1) * usHsync);
if (MAX_DCLK < ((unsigned int *)Data)[1])
{
// Decrease usIPV_ACT_LEN to DISP_LEN and go further to check if it can be displayed.
usIPV_ACT_LEN = DISP_LEN;
}
else
{
mode = MODE_UNDEFINED1 | 0x80; // Scale-down and partial-V display
}
}
else
mode = MODE_UNDEFINED1; // Scale-down and full-V display
}
if (DISP_LEN >= usIPV_ACT_LEN) // Scale-up
{
((unsigned int *)Data)[0] = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED0][0] * DISP_LEN
/ ((unsigned long)100 * usIPV_ACT_LEN * usHsync);
if (MAX_DCLK < ((unsigned int *)Data)[0])
{
if (MIN_DV_TOTAL >= (usVsync - 1))
{
((unsigned int *)Data)[1] = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED0][0] * MIN_DV_TOTAL
/ ((unsigned long)100 * (usVsync - 1) * usHsync);
}
else
{
((unsigned int *)Data)[1] = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED0][0]
/ ((unsigned long)100 * usHsync);
}
if (MAX_DCLK < ((unsigned int *)Data)[1])
mode = MODE_NOSUPPORT; // Cannot display
else
mode = MODE_UNDEFINED0 | 0x80; // Scale-up and partial-screen display
}
else
mode = MODE_UNDEFINED0; // Scale-up and full-screen display
}
}
return mode;
#else
mode = MODE_UNDEFINED0;
return 0;
#endif
}
//------------------- Check DVI Mode -------------------//
void Check_DVI_Mode(void)
{
#if(TMDS_ENABLE)
RTDRead(SYNC_POR_4C, 0x05, Y_INC);
if (Data[0] & 0x02)
{
RTDSetByte(SYNC_POR_4C, 0x00); // Reset Sync Processor
ucMode_Found = MODE_NOSUPPORT;
}
else
{
bVpole_Curr = (bit)(Data[0] & 0x08); // Current usVsync polarity
bHpole_Curr = (bit)(Data[0] & 0x04); // Current usHsync polarity
Data[5] = Data[3];
Data[4] = Data[4] & 0x87;
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] &= 0xf3; // VS & HS positive
if (!bVpole_Curr) Data[0] |= 0x08;
if (!bHpole_Curr) Data[0] |= 0x04;
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.
#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)
{
if(bChanel_Show)
bBlueScreen = 0; //V229
if ((Detect_Video_Signal()==MODE_VIDEO50HZ || Detect_Video_Signal()==MODE_VIDEO60HZ) && !bBlueScreen) //V229
{
if (Detect_Video_Signal()==MODE_VIDEO50HZ ) //V210
{
ucAV_Mode = 0x02; //PAL 50HZ
ucMode_Curr = MODE_VIDEO50HZ;
Delay_Xms(20);
RTDCodeW(RTD_VIDEO_50);
Delay_Xms(10);
ucMode_Times=0;
Display_Video_Set();
}
else
{
ucAV_Mode = 0x01; //NTSC 60HZ
ucMode_Curr = MODE_VIDEO60HZ;
Delay_Xms
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -