⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mode_detect.c

📁 液晶显示器程序代码
💻 C
📖 第 1 页 / 共 5 页
字号:

#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 + -