📄 mode_detect.c
字号:
#define __MODEDETECT__
#include "Header\Lcd_func.h"
#include "Header\Lcd_Main.h"
#include "Header\Access.h"
#include "Header\config.h"
#include "Header\OSD.h"
#include "Header\Lcd_Auto.h"
#include "Header\Frame_Sync.h"
#include "Header\Src_Ctrl.h"
#include "Header\LCD_OSD.h"
/////////////////////////////////////////////////////////
//------------------- Mode Detector -----------------//
/////////////////////////////////////////////////////////
void Mode_Detector(void)
{
switch (stGUD1.INPUT_SOURCE & 0x07)
{
case SOURCE_VGA :
case SOURCE_DVI :
// Save previous values of ucMode_Curr, bHpole_Curr and bVpole_Curr
bHpole_Prev = bHpole_Curr;
bVpole_Prev = bVpole_Curr;
if ((MODE_NOSIGNAL == ucMode_Curr) || (MODE_NOSUPPORT == ucMode_Curr))
Detect_Input_Mode();
else
Check_Input_Mode();
break;
default :
if ((MODE_NOSIGNAL == ucMode_Curr) || (MODE_NOSUPPORT == ucMode_Curr))
Detect_Video_Mode(); // Set default polarity
else
Check_Video_Mode(); // Set polarity after measure
break;
}
Measure_Mode(); // Measure mode-timing
}
void Measure_Mode(void)
{
switch (stGUD1.INPUT_SOURCE & 0x07)
{
RTDSetByte(SYNC_CTRL_4A,0x00);
case SOURCE_VGA :
RTDSetByte(SYNC_POR_4C, (SYNC_SS == ucSync_Type) ? 0x02 : 0x32);
break;
case SOURCE_DVI :
/*//eric 0729 test issue:DVI source change
#if (TMDS_ENABLE)
if (0 == ucTMDS_SEARCH_COUNTER && MODE_NOSIGNAL == ucMode_Curr) // V101C modified
{
RTDCodeW(TMDS_MANUAL_ON);
ucTMDS_SEARCH_COUNTER = 0x08;
}
ucTMDS_SEARCH_COUNTER -= 0x01;
#endif
*/
RTDSetByte(SYNC_POR_4C, 0x02);
break;
default :
RTDSetByte(SYNC_POR_4C, 0x02);
break;
}
}
#if(SOURCE_AUTO_SCAN)
/////////////////////////////////////////////////////////
//---Detect which source with valid signal-------------//
/////////////////////////////////////////////////////////
void Measure_Source(unsigned char SOURCE)
{
switch(SOURCE)
{
case SOURCE_VGA:
RTDSetByte(SYNC_CTRL_4A,0x01);
break;
case SOURCE_DVI:
RTDSetByte(SYNC_CTRL_4A,0x03);
break;
case SOURCE_AV:
I2CWrite(V_ENABLE);
I2CWrite(AV_DETECT);
break;
case SOURCE_SV:
I2CWrite(V_ENABLE);
I2CWrite(SV_DETECT);
break;
}
//RTDSetByte(SYNC_POR_4C, 0x32);
//RTDSetByte(SYNC_POR_4C, 0x02);
//RTDSetByte(SYNC_POR_4C, (stGUD1.INPUT_SOURCE & 0x07) == SOURCE_VGA ? 0x32 : 0x02);
if(((stGUD1.INPUT_SOURCE & 0x07) == SOURCE_VGA) && (SYNC_SS != ucSync_Type))
RTDSetByte(SYNC_POR_4C,0x32);
else
RTDSetByte(SYNC_POR_4C,0x02);
Delay_Xms(35);
//Delay_Xms(24);
}
#endif
unsigned char VGA_Mode_Search(unsigned int HS_Pulse)
{
unsigned char ucMode_Temp,m;
Data[0] = HS_Pulse * 12 / usHsync; // 0 : 720x350; 1 : 640x350;
ucMode_Temp = MODE_NOSUPPORT;
// Search for Standard Mode
m = MODE_1280x1024x75HZ; //anson
// m = MODE_1600x1200x60HZ;
do
{
if ((usHsync > VGA_Mode[m][0]) && (usHsync < VGA_Mode[m][1]))
{
if ((usVsync >= VGA_Mode[m][2]) && (usVsync <= VGA_Mode[m][3]))
{
if (MODE_1280x1024x75HZ == m)
{
if (0 == (bVpole_Curr | bHpole_Curr)) m = MODE_1280x1024x76HZ; // SUN 1024-76
}
else if (MODE_1024x0768x75HZ == m)
{
if (0 == (bVpole_Curr | bHpole_Curr)) m = MODE_1024x0768x74HZ; // MAC768-75
}
else if (MODE_0640x0480x60HZ == m && bVpole_Curr != bHpole_Curr)
{
// MODE_VGA350x60Hz : 640x350 60Hz
// MODE_VGA350x60Hz | 0x40 : 720x350 60Hz
// MODE_VGA400x60Hz : 640x400 60Hz
// MODE_VGA400x60Hz | 0x40 : 720x400 60Hz
if (bHpole_Curr)
m = Data[0] ? MODE_VGA350x60Hz : MODE_VGA350x60Hz | 0x40;
else
m = (stGUD1.FUNCTION & 0x10) ? MODE_VGA400x60Hz : MODE_VGA400x60Hz | 0x40;
//m = (stGUD1.INPUT_SOURCE & 0x80) ? MODE_VGA400x60Hz : MODE_VGA400x60Hz | 0x40;
}
else if (MODE_0640x0480x50HZ == m && bVpole_Curr != bHpole_Curr)
{
// MODE_VGA350x50Hz : 640x350 50Hz
// MODE_VGA350x50Hz | 0x40 : 720x350 50Hz
// MODE_VGA400x50Hz : 640x400 50Hz
// MODE_VGA400x50Hz | 0x40 : 720x400 50Hz
if (bHpole_Curr)
m = Data[0] ? MODE_VGA350x50Hz : MODE_VGA350x50Hz | 0x40;
else
m = (stGUD1.FUNCTION & 0x10) ? MODE_VGA400x50Hz : MODE_VGA400x50Hz | 0x40;
//m = (stGUD1.INPUT_SOURCE & 0x80) ? MODE_VGA400x50Hz : MODE_VGA400x50Hz | 0x40;
}
else if (MODE_0720x0400x85HZ == m)
{
if (1 == bHpole_Curr && 0 == bVpole_Curr)
m = MODE_0640x0350x85HZ;
else if (stGUD1.FUNCTION & 0x10) //else if (stGUD1.INPUT_SOURCE & 0x80)
m = MODE_0640x0400x85HZ;
}
else if (MODE_0720x0400x70HZ == m)
{
if (1 == bHpole_Curr && 0 == bVpole_Curr)
m = Data[0] ? MODE_0640x0350x70HZ : MODE_0720x0350x70HZ;
else if ((stGUD1.FUNCTION & 0x10)==0) //else if (stGUD1.INPUT_SOURCE & 0x80) //anson
// else if (stGUD1.FUNCTION & 0x10) //else if (stGUD1.INPUT_SOURCE & 0x80)
m = MODE_0640x0400x70HZ;
}
else if (MODE_1024x0768x59HZ == m)
{
if(HS_Pulse > 45)
m = MODE_1024x0768x60HZ;
}
else if (MODE_1024x0768x60HZ == m)
{
if(HS_Pulse <= 45)
m = MODE_1024x0768x59HZ;
}
else if(MODE_1024x0768x72HZ == m) //anson 05_0321
{
if(ucRefresh <= 71)
m = MODE_1024x0768x70HZ;
}
ucMode_Temp = m;
}
}
}
while ((0 != --m) && (MODE_NOSUPPORT == ucMode_Temp));
// Search for User Mode
if (MODE_NOSUPPORT == ucMode_Temp)
{
usIPV_ACT_LEN = 0;
m = MODE_USER1280x1024; //anson
// m = MODE_USER1600x1200;
do
{
if ((usVsync >= VGA_Mode[m][2]) && (usVsync <= VGA_Mode[m][3]))
{
usIPV_ACT_LEN = CAP_WIN[m][4];
if ((usHsync >= VGA_Mode[m][0]) && (usHsync <= VGA_Mode[m][1]))
{
ucMode_Temp = m; // Support User Mode
}
}
}
while ((MODE_USER720x400 <= --m) && (MODE_NOSUPPORT == ucMode_Temp));
}
return ucMode_Temp;
}
unsigned char Partial_Display(void)
{
unsigned char ucMode_Temp;
if (DISP_LEN < usIPV_ACT_LEN) // V Scale-down
{
// Estimate display clock rate for full screen
// DCLK = (24.576MHz / usHsync) * DCLK per display line * (display image lines / input image lines)
((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])
{
// If clock rate for full-screen display is too high, we can try partial-V display.
// Estimate clock for partial-V display
// DCLK = (24.576MHz / usHsync) * DCLK per display line * (min. display total lines / input total lines)
((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
{
ucMode_Temp = MODE_UNDEFINED1 | 0x80; // Scale-down and partial-V display
}
}
else
ucMode_Temp = MODE_UNDEFINED1; // Scale-down and full-V display
}
if (DISP_LEN >= usIPV_ACT_LEN) // V 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])
ucMode_Temp = MODE_NOSUPPORT; // Cannot display
else
ucMode_Temp = MODE_UNDEFINED0 | 0x80; // Scale-up and partial-V display
}
else
ucMode_Temp = MODE_UNDEFINED0; // Scale-up and full-V display
}
return ucMode_Temp;
}
void Sync_Type_Switch(void)
{
if (MODE_NOSIGNAL == ucMode_Curr)
{
if (SYNC_CS == ucSync_Type) // CS->SS
{
RTDCodeW(VGA_SET_SS);
bVpole_Curr = 1;
bHpole_Curr = 1;
ucSync_Type = SYNC_SS;
}
else if (SYNC_SS == ucSync_Type) // SS->SOG
{
RTDCodeW(VGA_SET_SOG);
bVpole_Curr = 1;
bHpole_Curr = 1;
ucSync_Type = SYNC_SOG;
}
else // SOG->CS
{
RTDCodeW(VGA_SET_CS);
bVpole_Curr = 1;
bHpole_Curr = 1;
ucSync_Type = SYNC_CS;
}
}
}
void Sync_Type_Confirm(void)
{
#if(SOURCE_AUTO_SCAN == _FALSE)
unsigned char m;
// To prevent from mistaking CS (with VS) for SS, we check SYNC type once when finding a mode in SS.
if (SYNC_SS == ucSync_Type)
{
RTDSetByte(SYNC_CTRL_4B, 0x55);
RTDSetByte(SYNC_POR_4C, 0x22);
m = (MODE_DETECT_FREQ + 1) * 20;
do
{
Delay_Xms(1);
RTDRead(SYNC_POR_4C, 0x05, Y_INC);
}
while ((Data[0] & 0x02) && (--m));
Data[5] = Data[3];
Data[4] = Data[4] & 0x87;
Data[3] = Data[1];
Data[2] = Data[2] & 0x8f;
if ((0 == ((unsigned int *)Data)[1]) || (0x07ff <= ((unsigned int *)Data)[1]) ||
(0 == ((unsigned int *)Data)[2]) || (0x07ff <= ((unsigned int *)Data)[2]) ||
(0 == m))
{
ucSync_Type = SYNC_SS;
RTDSetByte(SYNC_CTRL_4B, 0x14);
}
else
{
ucSync_Type = SYNC_CS;
RTDCodeW(VGA_SET_CS);
bVpole_Curr = 1;
bHpole_Curr = 1;
}
}
else if (SYNC_SOG == ucSync_Type)
{
RTDSetByte(SYNC_CTRL_4B, 0x14);
Delay_Xms(8);
RTDSetByte(SYNC_POR_4C, 0x00);
RTDSetByte(SYNC_POR_4C, 0x02);
m = (MODE_DETECT_FREQ + 1) * 20;
do
{
Delay_Xms(1);
RTDRead(SYNC_POR_4C, 0x05, Y_INC);
}
while ((Data[0] & 0x02) && (--m));
Data[5] = Data[3];
Data[4] = Data[4] & 0x87;
Data[3] = Data[1];
Data[2] = Data[2] & 0x8f;
if ((0 == ((unsigned int *)Data)[1]) || (0x07ff <= ((unsigned int *)Data)[1]) ||
(0 == ((unsigned int *)Data)[2]) || (0x07ff <= ((unsigned int *)Data)[2]) ||
(0 == m))
{
ucSync_Type = SYNC_SOG;
RTDSetByte(SYNC_CTRL_4B, 0x57);
//RTDSetByte(VGIP_SIGINV_05, 0x40);
Delay_Xms(8);
RTDSetByte(SYNC_POR_4C,0x32);
Delay_Xms(20);
RTDSetByte(SYNC_POR_4C, 0x00);
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -