Mode_Detect.~c
上传用户:xmyjxjd
上传日期:2013-05-04
资源大小:1517k
文件大小:90k
开发平台:

C/C++

  1. #define __MODEDETECT__
  2. #include "HeaderLcd_func.h"
  3. #include "HeaderLcd_Main.h"
  4. #include "HeaderAccess.h"
  5. #include "Headerconfig.h"
  6. #include "HeaderOSD.h"
  7. #include "HeaderLcd_Auto.h"
  8. #include "HeaderFrame_Sync.h"
  9. #include "HeaderSrc_Ctrl.h"
  10. #include "HeaderLCD_OSD.h"
  11. /////////////////////////////////////////////////////////
  12. //-------------------  Mode Detector  -----------------//
  13. /////////////////////////////////////////////////////////
  14. void Mode_Detector(void)
  15. {
  16.     switch (stGUD1.INPUT_SOURCE & 0x07)
  17.     {
  18.     case SOURCE_VGA :
  19.         // Save previous values of ucMode_Curr, bHpole_Curr and bVpole_Curr
  20.         bHpole_Prev = bHpole_Curr;
  21.         bVpole_Prev = bVpole_Curr;
  22.         
  23.         if ((MODE_NOSIGNAL == ucMode_Curr) || (MODE_NOSUPPORT == ucMode_Curr))
  24.             Detect_VGA_Mode();
  25.         else
  26.             Check_VGA_Mode();
  27.         break;
  28.      case SOURCE_DVI :
  29.         // Save previous values of ucMode_Curr, bHpole_Curr and bVpole_Curr
  30.         bHpole_Prev = bHpole_Curr;
  31.         bVpole_Prev = bVpole_Curr;
  32.         
  33.         if ((MODE_NOSIGNAL == ucMode_Curr) || (MODE_NOSUPPORT == ucMode_Curr))
  34.             Detect_DVI_Mode();
  35.         else
  36.             Check_DVI_Mode();
  37.         break;
  38.    default :
  39.         if ((MODE_NOSIGNAL == ucMode_Curr) || (MODE_NOSUPPORT == ucMode_Curr))
  40.             Detect_Video_Mode();        // Set default polarity 
  41.         else
  42.             Check_Video_Mode();         // Set polarity after measure
  43.         break;
  44.     }
  45.     Measure_Mode();     // Measure mode-timing
  46. }
  47. void Measure_Mode(void)
  48. {
  49.     
  50.     switch (stGUD1.INPUT_SOURCE & 0x07)
  51.     {
  52.     RTDSetByte(SYNC_CTRL_4A,0x00);
  53.     case SOURCE_VGA :
  54.         RTDSetByte(SYNC_POR_4C, (SYNC_SS == ucSync_Type) ? 0x02 : 0x32);
  55.         break;
  56.  case SOURCE_DVI :
  57.         RTDSetByte(SYNC_POR_4C, 0x02);
  58.         break;
  59.     default :
  60.         RTDSetByte(SYNC_POR_4C, 0x02);
  61.         break;
  62.     }
  63. }
  64. #if(SOURCE_AUTO_SCAN)
  65. /////////////////////////////////////////////////////////
  66. //---Detect which source with valid signal-------------//
  67. /////////////////////////////////////////////////////////
  68. void Measure_Source(unsigned char SOURCE)
  69. {
  70.    switch(SOURCE)
  71.    {
  72.    case SOURCE_VGA:
  73. RTDSetByte(SYNC_CTRL_4A,0x01);
  74. break;
  75.    case SOURCE_DVI:
  76. RTDSetByte(SYNC_CTRL_4A,0x03);
  77. break;
  78.    case SOURCE_AV:
  79.         I2CWrite(V_ENABLE);
  80.         I2CWrite(AV_DETECT);
  81.         break;
  82.    case SOURCE_SV:
  83.         I2CWrite(V_ENABLE);
  84.         I2CWrite(SV_DETECT);
  85. break;
  86.    }
  87.    //RTDSetByte(SYNC_POR_4C, 0x32);
  88.    //RTDSetByte(SYNC_POR_4C, 0x02);
  89.    //RTDSetByte(SYNC_POR_4C, (stGUD1.INPUT_SOURCE & 0x07) == SOURCE_VGA ? 0x32 : 0x02);
  90.    
  91.    if(((stGUD1.INPUT_SOURCE & 0x07) == SOURCE_VGA) && (SYNC_SS != ucSync_Type))
  92.        RTDSetByte(SYNC_POR_4C,0x32);
  93.    else
  94.        RTDSetByte(SYNC_POR_4C,0x02);
  95.    
  96.    Delay_Xms(35);
  97.    //Delay_Xms(24);
  98.    
  99. }
  100. #endif
  101. /////////////////////////////////////////////////////////
  102. //------------------  Detect VGA Mode  ----------------//
  103. /////////////////////////////////////////////////////////
  104. void Detect_VGA_Mode(void)
  105. {
  106.     unsigned char   ucMode_Temp, m;
  107.     unsigned int    usHS_Pulse;
  108.     RTDRead(SYNC_POR_4C, 0x09, Y_INC);
  109.     if (Data[0] & 0x02)
  110.     {
  111.         // Reset Sync Processor when sync signal timeout
  112.         RTDSetByte(SYNC_POR_4C, 0x20);
  113.         // Treat sync signal timeout as no signal
  114.         ucMode_Temp     = MODE_NOSIGNAL;
  115.     }
  116.     else
  117.     {
  118. //        ucMode_Temp = (Data[8] & 0xe0 ) >> 5;
  119. //        if(ucMode_Temp == 0 || ucMode_Temp >=4) //Test which edge of Hsync to latch Vsync will be safe
  120. // {
  121. //           RTDSetBit(MEAS_VS_HI_54,0xf7,0x08);  //Use positive edge of Hsync to latch Vsync
  122. //    ucDebug_Value0 = 0x08;
  123. // }
  124. // else
  125. // {
  126. //    RTDSetBit(MEAS_VS_HI_54,0xf7,0x00);  //Use negtive edge of Hsync to latch Vsync
  127. //    ucDebug_Value0 = 0x18;
  128. // }
  129.         
  130.         usStdHS   = usHsync;  // Save previous usHsync in usStdHS
  131.         usStdVS   = usVsync;  // Save previous usVsync in usStdVS
  132.         bVpole_Curr = (bit)(Data[0] & 0x08);    // Save current usVsync polarity
  133.         bHpole_Curr = (bit)(Data[0] & 0x04);    // Save current usHsync polarity
  134.         Data[7] = Data[5];
  135.         Data[6] = Data[6] & 0x0f;
  136.         Data[5] = Data[3];
  137.         Data[4] = Data[4] & 0x87;
  138.         Data[3] = Data[1];
  139.         Data[2] = Data[2] & 0x8f;
  140.         usHsync     = ((unsigned int *)Data)[1];    // Current HSYNC timing
  141.         usVsync     = ((unsigned int *)Data)[2];    // Current VSYNC timing
  142.         usHS_Pulse  = ((unsigned int *)Data)[3];    // Current HSYNC pulse width
  143.         // Calculate Vertical Refresh Rate
  144.         // Original Formula :
  145.         // ucRefresh = 24.576M / (usHsync * usVsync)
  146.         // Use Data[0~3] as a temporary long variable
  147.         ((unsigned long *)Data)[0]  = (unsigned long)usHsync * usVsync;
  148.         ucRefresh   = (unsigned long)49152000 / ((unsigned long *)Data)[0];
  149.         ucRefresh   = (ucRefresh & 0x01) ? ((ucRefresh + 1) >> 1) : (ucRefresh >> 1);
  150.         // Treat small change of usHsync/usVsync as no change
  151.         if (usStdHS <= usHsync && (usStdHS + 2) >= usHsync)     usHsync = usStdHS;
  152.         if (usStdVS <= usVsync && (usStdVS + 2) >= usVsync)     usVsync = usStdVS;
  153.         // Polarity must be correct
  154.         if ((bVpole_Curr != bVpole_Prev) || (bHpole_Curr != bHpole_Prev))
  155.         {  
  156.             RTDRead(VGIP_SIGINV_05, 0x01, N_INC);
  157.             Data[0] &= 0xd7;  // HS_RAW & VS positive
  158.             if (!bHpole_Curr)    Data[0] |= 0x20;
  159.             
  160.             if (!bVpole_Curr && SYNC_SS == ucSync_Type)     Data[0] |= 0x08;    // Seperate sync
  161.             
  162.             RTDSetByte(VGIP_SIGINV_05, Data[0]);
  163.             ucMode_Temp     = MODE_NOSUPPORT;
  164.         }
  165.         else
  166.         {
  167.             if (0x07ff <= usHsync || 0x07ff <= usVsync || 0 == usHsync || 0 == usVsync)
  168.             {
  169.                 ucMode_Temp     = MODE_NOSIGNAL;        // Treat overflow as no signal
  170.             }
  171.             else
  172.             {
  173.                 Data[0] = usHS_Pulse * 12 / usHsync;    // 0 : 720x350; 1 : 640x350;
  174.                 ucMode_Temp = MODE_NOSUPPORT;
  175.                 // Search for Standard Mode
  176.                 m   = MODE_1600x1200x60HZ;
  177.                 do
  178.                 {
  179.                     if ((usHsync > VGA_Mode[m][0]) && (usHsync < VGA_Mode[m][1]))
  180.                     {   
  181.                         if ((usVsync >= VGA_Mode[m][2]) && (usVsync <= VGA_Mode[m][3]))
  182.                         {
  183.                             if (MODE_1280x1024x75HZ == m)
  184.                             {
  185.                                 if (0 == (bVpole_Curr | bHpole_Curr))   m   = MODE_1280x1024x76HZ;  // SUN 1024-76
  186.                             }                            
  187.                             else if (MODE_1024x0768x75HZ == m)
  188.                             {
  189.                                 if (0 == (bVpole_Curr | bHpole_Curr))   m   = MODE_1024x0768x74HZ;  // MAC768-75
  190.                             }         
  191.                             else if (MODE_0640x0480x60HZ == m && bVpole_Curr != bHpole_Curr)
  192.                             {
  193.                                 // MODE_VGA350x60Hz         : 640x350 60Hz
  194.                                 // MODE_VGA350x60Hz | 0x40  : 720x350 60Hz
  195.                                 // MODE_VGA400x60Hz         : 640x400 60Hz
  196.                                 // MODE_VGA400x60Hz | 0x40  : 720x400 60Hz
  197.                                 if (bHpole_Curr)
  198.                                     m   = Data[0] ? MODE_VGA350x60Hz : MODE_VGA350x60Hz | 0x40;
  199.                                 else
  200.                                     m   = (stGUD1.FUNCTION & 0x10) ? MODE_VGA400x60Hz : MODE_VGA400x60Hz | 0x40;
  201.                                     //m   = (stGUD1.INPUT_SOURCE & 0x80) ? MODE_VGA400x60Hz : MODE_VGA400x60Hz | 0x40;
  202.                             }
  203.                             else if (MODE_0640x0480x50HZ == m && bVpole_Curr != bHpole_Curr)
  204.                             {
  205.                                 // MODE_VGA350x50Hz         : 640x350 50Hz
  206.                                 // MODE_VGA350x50Hz | 0x40  : 720x350 50Hz
  207.                                 // MODE_VGA400x50Hz         : 640x400 50Hz
  208.                                 // MODE_VGA400x50Hz | 0x40  : 720x400 50Hz
  209.                                 if (bHpole_Curr)
  210.                                     m   = Data[0] ? MODE_VGA350x50Hz : MODE_VGA350x50Hz | 0x40;
  211.                                 else
  212.                                     m   = (stGUD1.FUNCTION & 0x10) ? MODE_VGA400x50Hz : MODE_VGA400x50Hz | 0x40;
  213.                                     //m   = (stGUD1.INPUT_SOURCE & 0x80) ? MODE_VGA400x50Hz : MODE_VGA400x50Hz | 0x40;
  214.                             }
  215.                             else if (MODE_0720x0400x85HZ == m)
  216.                             {
  217.                                 if (1 == bHpole_Curr && 0 == bVpole_Curr)
  218.                                     m   = MODE_0640x0350x85HZ;
  219.                                 else if (stGUD1.FUNCTION & 0x10)     //else if (stGUD1.INPUT_SOURCE & 0x80)     
  220.                                     m   = MODE_0640x0400x85HZ;
  221.                             }
  222.                             else if (MODE_0720x0400x70HZ == m)
  223.                             {
  224.                                 if (1 == bHpole_Curr && 0 == bVpole_Curr)
  225.                                     m   = Data[0] ? MODE_0640x0350x70HZ : MODE_0720x0350x70HZ;
  226.                                 else if (stGUD1.FUNCTION & 0x10)//else if (stGUD1.INPUT_SOURCE & 0x80)
  227.                                     m   = MODE_0640x0400x70HZ;
  228.                             }
  229.                             ucMode_Temp     = m;
  230.                         }
  231.                     }
  232.                 }
  233.                 while ((0 != --m) && (MODE_NOSUPPORT == ucMode_Temp));
  234.                 
  235.                 // Search for User Mode
  236.                 if (MODE_NOSUPPORT == ucMode_Temp)
  237.                 {
  238.                     usIPV_ACT_LEN   = 0;
  239.                     m   = MODE_USER1600x1200;
  240.                     do
  241.                     {
  242.                         if ((usVsync >= VGA_Mode[m][2]) && (usVsync <= VGA_Mode[m][3]))
  243.                         {
  244.                             usIPV_ACT_LEN   = CAP_WIN[m][4];
  245.                             
  246.                             if ((usHsync >= VGA_Mode[m][0]) && (usHsync <= VGA_Mode[m][1]))
  247.                             {
  248.                                 ucMode_Temp     = m;    // Support User Mode
  249.                             }
  250.                         }
  251.                     }
  252.                     while ((MODE_USER720x400 <= --m) && (MODE_NOSUPPORT == ucMode_Temp));
  253.                 }
  254.                 if (48 > ucRefresh || MAX_RATE < ucRefresh)
  255.                 {
  256.                     ucMode_Temp = MODE_NOSUPPORT;   // We don't support vertical refresh rate lower than 50Hz
  257.                 }
  258.                 else if (MODE_NOSUPPORT == ucMode_Temp && 0 != usIPV_ACT_LEN)
  259.                 {
  260.                     if (DISP_LEN < usIPV_ACT_LEN)   // V Scale-down
  261.                     {
  262.                         // Estimate display clock rate for full screen
  263.                         // DCLK = (24.576MHz / usHsync) * DCLK per display line * (display image lines / input image lines)
  264.                         ((unsigned int *)Data)[0]   = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED1][0] * DISP_LEN 
  265.                                                     / ((unsigned long)100 * usIPV_ACT_LEN * usHsync);
  266.                         if (MAX_DCLK < ((unsigned int *)Data)[0])
  267.                         {
  268.                             // If clock rate for full-screen display is too high, we can try partial-V display.
  269.                             // Estimate clock for partial-V display
  270.                             // DCLK = (24.576MHz / usHsync) * DCLK per display line * (min. display total lines / input total lines)
  271.                             ((unsigned int *)Data)[1]   = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED1][0] * MIN_DV_TOTAL
  272.                                                         / ((unsigned long)100 * (usVsync - 1) * usHsync);
  273.                             if (MAX_DCLK < ((unsigned int *)Data)[1])
  274.                             {
  275.                                 // Decrease usIPV_ACT_LEN to DISP_LEN and go further to check if it can be displayed.
  276.                                 usIPV_ACT_LEN   = DISP_LEN;
  277.                             }
  278.                             else
  279.                             {
  280.                                 ucMode_Temp     = MODE_UNDEFINED1 | 0x80;   // Scale-down and partial-V display
  281.                             }
  282.                         }
  283.                         else
  284.                             ucMode_Temp     = MODE_UNDEFINED1;              // Scale-down and full-V display
  285.                     }
  286.                     
  287.                     if (DISP_LEN >= usIPV_ACT_LEN)  // V Scale-up
  288.                     {
  289.                         ((unsigned int *)Data)[0]   = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED0][0] * DISP_LEN 
  290.                                                     / ((unsigned long)100 * usIPV_ACT_LEN * usHsync);
  291.                         if (MAX_DCLK < ((unsigned int *)Data)[0])
  292.                         {
  293.                             if (MIN_DV_TOTAL >= (usVsync - 1))
  294.                             {
  295.                                 ((unsigned int *)Data)[1]   = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED0][0] * MIN_DV_TOTAL
  296.                                                             / ((unsigned long)100 * (usVsync - 1) * usHsync);
  297.                             }
  298.                             else
  299.                             {
  300.                                 ((unsigned int *)Data)[1]   = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED0][0]
  301.                                                             / ((unsigned long)100 * usHsync);
  302.                             }
  303.                             
  304.                             if (MAX_DCLK < ((unsigned int *)Data)[1])   
  305.                                 ucMode_Temp = MODE_NOSUPPORT;           // Cannot display
  306.                             else
  307.                                 ucMode_Temp = MODE_UNDEFINED0 | 0x80;   // Scale-up and partial-V display
  308.                         }
  309.                         else
  310.                             ucMode_Temp = MODE_UNDEFINED0;              // Scale-up and full-V display
  311.                     }
  312.                 }
  313.             }
  314.         }
  315.     }
  316.     if (SYNC_SOG == ucSync_Type && 0 != (usHS_Pulse * 7 / usHsync))
  317.     {
  318.         // To prevent from SOG mode mistake
  319.         // HSYNC pulse width will never longer than 1/7*HSYNC period
  320.         ucMode_Temp = MODE_NOSIGNAL;
  321.     }
  322.     //-------------Check result-----------------------------------------
  323.     if (MODE_NOSUPPORT == ucMode_Temp || MODE_NOSIGNAL == ucMode_Temp)
  324.     {
  325.         // Treat illegal signal as no signal when SOG
  326.         if (SYNC_SOG == ucSync_Type)    ucMode_Temp = MODE_NOSIGNAL;
  327.         if (MODE_NOSUPPORT != ucMode_Found && MODE_NOSIGNAL != ucMode_Found)    ucMode_Times    = 0;
  328.         ucMode_Found    = ucMode_Temp;
  329.         if (NO_MODE_TIMES > ucMode_Times)
  330.         {
  331.             // Wait for signal stable
  332.             ucMode_Times ++;
  333.         }
  334.         else
  335.         {
  336.             bStable         = (ucMode_Curr == ucMode_Found) ? 1 : 0;    // bStable must be cleared when mode changed
  337.             ucMode_Curr     = ucMode_Found;
  338.             ucMode_Times    = NO_MODE_TIMES - 2;
  339.             if (MODE_NOSIGNAL == ucMode_Curr)
  340.             {
  341.                 if (SYNC_CS == ucSync_Type)         // CS->SS
  342.                 {
  343.                     RTDCodeW(VGA_SET_SS);
  344.                     bVpole_Curr = 1;
  345.                     bHpole_Curr = 1;
  346.                     ucSync_Type = SYNC_SS;
  347.                 }
  348.                 else if (SYNC_SS == ucSync_Type)    // SS->SOG
  349.                 {
  350.                     RTDCodeW(VGA_SET_SOG);
  351.                     bVpole_Curr = 1;
  352.                     bHpole_Curr = 1;
  353.                     ucSync_Type = SYNC_SOG;
  354.                     
  355.                 }
  356.                 else                                // SOG->CS
  357.                 {
  358.                     RTDCodeW(VGA_SET_CS);
  359.                     bVpole_Curr = 1;
  360.                     bHpole_Curr = 1;
  361.                     ucSync_Type = SYNC_CS;
  362.                     
  363.                 }
  364.             }
  365.         }
  366.     }
  367.     else
  368.     {
  369.         if (ucMode_Found != ucMode_Temp)
  370.         {
  371.             ucMode_Times    = 1;
  372.             ucMode_Found    = ucMode_Temp;
  373. #if(SOURCE_AUTO_SCAN == _FALSE)
  374.             // To prevent from mistaking CS (with VS) for SS, we check SYNC type once when finding a mode in SS.
  375.             if (SYNC_SS == ucSync_Type)
  376.             {           
  377.                 RTDSetByte(SYNC_CTRL_4B, 0x55);
  378.                 RTDSetByte(SYNC_POR_4C, 0x22);
  379.                 m   = (MODE_DETECT_FREQ + 1) * 20;       
  380.                 do
  381.                 {   
  382.                     Delay_Xms(1);
  383.                     RTDRead(SYNC_POR_4C, 0x05, Y_INC);
  384.                 }
  385.                 while ((Data[0] & 0x02) && (--m));
  386.  
  387.                 Data[5] = Data[3];
  388.                 Data[4] = Data[4] & 0x87;
  389.                 Data[3] = Data[1];
  390.                 Data[2] = Data[2] & 0x8f;
  391.                 if ((0 == ((unsigned int *)Data)[1]) || (0x07ff <= ((unsigned int *)Data)[1]) ||
  392.                     (0 == ((unsigned int *)Data)[2]) || (0x07ff <= ((unsigned int *)Data)[2]) ||
  393.                     (0 == m))
  394.                 {
  395.                     ucSync_Type = SYNC_SS;
  396.                     RTDSetByte(SYNC_CTRL_4B, 0x14);
  397.                 }
  398.                 else
  399.                 {
  400.                     ucSync_Type = SYNC_CS;
  401.                     RTDCodeW(VGA_SET_CS);
  402.                     bVpole_Curr = 1;
  403.                     bHpole_Curr = 1;
  404.                 }
  405.             }
  406.             else if (SYNC_SOG == ucSync_Type)
  407.             {
  408.                 RTDSetByte(SYNC_CTRL_4B, 0x14);
  409.                 Delay_Xms(8);
  410.                 RTDSetByte(SYNC_POR_4C, 0x00);
  411.                 RTDSetByte(SYNC_POR_4C, 0x02);
  412.                 m   = (MODE_DETECT_FREQ + 1) * 20;       
  413.                 do
  414.                 {   
  415.                     Delay_Xms(1);
  416.                     RTDRead(SYNC_POR_4C, 0x05, Y_INC);
  417.                 }
  418.                 while ((Data[0] & 0x02) && (--m));
  419.  
  420.                 Data[5] = Data[3];
  421.                 Data[4] = Data[4] & 0x87;
  422.                 Data[3] = Data[1];
  423.                 Data[2] = Data[2] & 0x8f;
  424.                 if ((0 == ((unsigned int *)Data)[1]) || (0x07ff <= ((unsigned int *)Data)[1]) ||
  425.                     (0 == ((unsigned int *)Data)[2]) || (0x07ff <= ((unsigned int *)Data)[2]) ||
  426.                     (0 == m))
  427.                 {
  428.                     ucSync_Type = SYNC_SOG;
  429.                     RTDSetByte(SYNC_CTRL_4B, 0x57);
  430.                     //RTDSetByte(VGIP_SIGINV_05, 0x40);
  431.                     Delay_Xms(8);
  432.                     
  433.                     RTDSetByte(SYNC_POR_4C,0x32);
  434.                     Delay_Xms(20);
  435.                     RTDSetByte(SYNC_POR_4C, 0x00);
  436.                 }
  437.                 else
  438.                 {
  439.                     ucSync_Type = SYNC_SS;
  440.                     RTDCodeW(VGA_SET_SS);
  441.                     bVpole_Curr = 1;
  442.                     bHpole_Curr = 1;
  443.                 }
  444.             }
  445. #endif
  446.         }
  447.         else
  448.         {   
  449.             if (VGA_SEARCH_TIMES > ucMode_Times)
  450.             {
  451.                 ucMode_Times ++;
  452.             }
  453.             else
  454.             {
  455.                 bLIGHT_PWR  = LIGHT_OFF;        // Turn off BackLight for reset display
  456.               
  457.                 RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
  458.                 RTDCodeW(OSD_Reset);            // Clear OSD
  459.                 ucMode_Curr     = ucMode_Found; // Supported mode found
  460.                 ucMode_Times    = 0;            // Reset mode timer
  461.                 bStable         = 0;            // bStable must be cleared when mode changed
  462.                 Display_VGA_Set();              // Set VGA Mode registers
  463. #if (RTDDEBUG)
  464.                 if (ucMode_PrevAct == ucMode_Curr)
  465.                 {
  466.                     if (0xff > ucMode_QuitCnt)      ucMode_QuitCnt += 1;
  467.                 }
  468.                 else
  469.                 {
  470.                     ucMode_PrevAct  = ucMode_Curr;
  471.                     ucMode_QuitCnt  = 0;
  472.                     ucDebug         = 0;
  473.                 }
  474. #endif                
  475.             }
  476.         }
  477.     }
  478. }
  479. //-------------------  Check VGA Mode  -------------------//
  480. void Check_VGA_Mode(void)
  481. {    
  482.     RTDRead(SYNC_POR_4C, 0x05, Y_INC);
  483.     if (Data[0] & 0x02)
  484.     {
  485.         RTDSetByte(SYNC_POR_4C, 0x20);          // Input signal time-out. Reset sync-processor
  486.         ucMode_Found    = MODE_NOSUPPORT;
  487.     }
  488.     else
  489.     {
  490.         bVpole_Curr = (bit)(Data[0] & 0x08);    // Current usVsync polarity
  491.         bHpole_Curr = (bit)(Data[0] & 0x04);    // Current usHsync polarity
  492.         Data[5] = Data[3];
  493.         Data[4] = Data[4] & 0x87;
  494.         Data[3] = Data[1];
  495.         Data[2] = Data[2] & 0x8f;
  496.         usHsync = ((unsigned int *)Data)[1];    // Current usHsync timing
  497.         usVsync = ((unsigned int *)Data)[2];    // Current usVsync timing
  498.         // Polarity must be correct
  499.         if ((bVpole_Curr != bVpole_Prev) || (bHpole_Curr != bHpole_Prev))
  500.         {
  501.             RTDRead(VGIP_SIGINV_05, 0x01, N_INC);
  502.             
  503.             Data[0] &= 0xd7;    // HS_RAW & VS positive
  504.             if (!bHpole_Curr)   Data[0] |= 0x20;
  505.             if (!bVpole_Curr && SYNC_SS == ucSync_Type)     Data[0] |= 0x08;    // Seperate sync
  506.             
  507.             RTDSetByte(VGIP_SIGINV_05, Data[0]);
  508.             ucMode_Found    = MODE_NOSUPPORT;
  509.         }
  510.         else
  511.         {
  512.             if (0x07ff <= usHsync || 0x07ff <= usVsync || 0 == usHsync || 0 == usVsync)     // Check overflow
  513.             {
  514.                 ucMode_Found    = MODE_NOSUPPORT;
  515.             }
  516.             else
  517.             {
  518.                 if ((usHsync < (usStdHS - 1)) || (usHsync > (usStdHS + 3)) ||
  519.                     (usVsync < (usStdVS - 1)) || (usVsync > (usStdVS + 3)))
  520.                 {   
  521.                     ucMode_Found    = MODE_NOSUPPORT;
  522.                 }
  523.                 else
  524.                 {
  525.                     ucMode_Found    = ucMode_Curr;
  526.                 }
  527.             }
  528.         }
  529.     }
  530.     
  531.     if (MODE_NOSUPPORT == ucMode_Found)
  532.         Reset_Mode();
  533.     else
  534. {
  535.         bStable = 1;    // Set bStable to 1 when signal timing is stable.
  536. #if(AS_NON_FRAMESYNC)
  537.         RTDSetByte(STATUS0_01, 0x00);  // Clear status
  538.         RTDSetByte(STATUS1_1F, 0x00);  // Clear status
  539.         if(bFrameSync)
  540.            RTDSetBit(ODD_CTRL_8E,0xef,0x10);
  541. #endif
  542.     }
  543. }
  544. /////////////////////////////////////////////////////////
  545. //------------------  Detect DVI Mode  ----------------//
  546. /////////////////////////////////////////////////////////
  547. void Detect_DVI_Mode(void)
  548. {
  549. #if(TMDS_ENABLE)
  550.     unsigned char   ucMode_Temp, m;
  551.     RTDRead(SYNC_POR_4C, 0x05, Y_INC);
  552.     if (Data[0] & 0x02)
  553.     {
  554.         RTDSetByte(SYNC_POR_4C, 0x00);          // Input signal time-out. Reset sync-processor
  555.         ucMode_Temp = MODE_NOSIGNAL;
  556.     }
  557.     else
  558.     {
  559.         usStdHS   = usHsync;  // Save previous usHsync in usStdHS
  560.         usStdVS   = usVsync;  // Save previous usVsync in usStdVS
  561.         bVpole_Curr = (bit)(Data[0] & 0x08);    // Save current usVsync polarity
  562.         bHpole_Curr = (bit)(Data[0] & 0x04);    // Save current usHsync polarity
  563.         Data[5] = Data[3];
  564.         Data[4] = Data[4] & 0x87;
  565.         Data[3] = Data[1];
  566.         Data[2] = Data[2] & 0x8f;
  567.         usHsync = ((unsigned int *)Data)[1];    // Current usHsync timing
  568.         usVsync = ((unsigned int *)Data)[2];    // Current usVsync timing
  569.         // Calculate Vertical Refresh Rate
  570.         // Original Formula :
  571.         // ucRefresh = 24.576M / (usHsync * usVsync)
  572.         // Use Data[0~3] as a temporary long variable
  573.         ((unsigned long *)Data)[0]  = (unsigned long)usHsync * usVsync;
  574.         ucRefresh   = (unsigned long)49152000 / ((unsigned long *)Data)[0];
  575.         ucRefresh   = (ucRefresh & 0x01) ? ((ucRefresh + 1) >> 1) : (ucRefresh >> 1);
  576.         // Treat small change of usHsync/usVsync as no change
  577.         if (usStdHS <= usHsync && (usStdHS + 2) >= usHsync)     usHsync = usStdHS;
  578.         if (usStdVS <= usVsync && (usStdVS + 2) >= usVsync)     usVsync = usStdVS;
  579.         // Set correct polarity
  580.         if ((bVpole_Curr != bVpole_Prev) || (bHpole_Curr != bHpole_Prev))
  581.         {  
  582.             RTDRead(VGIP_SIGINV_05, 0x01, N_INC);
  583.             Data[0] &= 0xf3;  // VS & HS positive
  584.             if (!bVpole_Curr)    Data[0] |= 0x08;
  585.             if (!bHpole_Curr)    Data[0] |= 0x04;
  586.             RTDSetByte(VGIP_SIGINV_05, Data[0]);            
  587.         }
  588.             
  589.         if (0x07ff <= usHsync || 0x07ff <= usVsync || 0 == usHsync || 0 == usVsync)
  590.         {
  591.             ucMode_Temp = MODE_NOSIGNAL;    // Treat overflow as no signal
  592.         }
  593.         else
  594.         {
  595.             ucMode_Temp     = MODE_NOSUPPORT;
  596.             // Search for Standard Mode
  597.             m   = MODE_1600x1200x60HZ;
  598.             do
  599.             {
  600.                 if ((usHsync > VGA_Mode[m][0]) && (usHsync < VGA_Mode[m][1]))
  601.                 {   
  602.                     if ((usVsync >= VGA_Mode[m][2]) && (usVsync <= VGA_Mode[m][3]))
  603.                     {
  604.                         ucMode_Temp     = m;    // Support mode
  605.                     }
  606.                 }
  607.             }
  608.             while ((0 != --m) && (MODE_NOSUPPORT == ucMode_Temp));
  609.      
  610.             if (MODE_NOSUPPORT == ucMode_Temp)
  611.             {
  612.                 // Search for User Mode
  613.                 m   = MODE_USER1600x1200;
  614.                 do
  615.                 {
  616.                     if ((usHsync >= VGA_Mode[m][0]) && (usHsync <= VGA_Mode[m][1]))
  617.                     {   
  618.                         if ((usVsync >= VGA_Mode[m][2]) && (usVsync <= VGA_Mode[m][3]))
  619.                         {
  620.                             ucMode_Temp     = m;    // Support User Mode
  621.                         }
  622.                     }
  623.                 }
  624.                 while ((MODE_USER720x400 <= --m) && (MODE_NOSUPPORT == ucMode_Temp));
  625.             }
  626.             
  627.             if (48 > ucRefresh || MAX_RATE < ucRefresh)
  628.                 ucMode_Temp = MODE_NOSUPPORT;               // We don't support vertical refresh rate lower than 50Hz
  629.             else
  630.                 ucMode_Temp = Seek_DVI_Mode(ucMode_Temp);   // Seek mode in according to data enable width and height
  631.         }
  632.     }
  633.     //-------------Check result--------------
  634.     if (MODE_NOSUPPORT == ucMode_Temp || MODE_NOSIGNAL == ucMode_Temp)  // No Detect
  635.     {
  636.         if (MODE_NOSUPPORT != ucMode_Found && MODE_NOSIGNAL != ucMode_Found)    ucMode_Times    = 0;
  637.         ucMode_Found    = ucMode_Temp;
  638.         if (NO_MODE_TIMES > ucMode_Times)
  639.         {
  640.             ucMode_Times ++;
  641.             
  642. //Enable the TMDS Hsync & Vsync error correction to improve the long cable image quality
  643.             RTDSetByte(TMDS_CORRECTION_FF,0x03); 
  644.         }
  645.         else
  646.         {
  647.     //Disable the TMDS Hsync & Vsync error correction
  648.             RTDSetByte(TMDS_CORRECTION_FF,0x00);
  649.             bStable         = (ucMode_Curr == ucMode_Found) ? 1 : 0;    // bStable must be cleared when mode changed
  650.             ucMode_Curr     = ucMode_Found;
  651.             ucMode_Times    = NO_MODE_TIMES - 2;
  652.         }
  653.     }
  654.     else
  655.     {
  656.         if (ucMode_Found != ucMode_Temp)
  657.         {
  658.             ucMode_Times    = 1;
  659.             ucMode_Found    = ucMode_Temp;
  660.         }
  661.         else
  662.         {   
  663.             if (DVI_SEARCH_TIMES > ucMode_Times)
  664.             {
  665.                 ucMode_Times ++;
  666.             }
  667.             else
  668.             {
  669.                 bLIGHT_PWR  = LIGHT_OFF;        // Turn off BackLight for reset display
  670.                 RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
  671.                 RTDCodeW(OSD_Reset);            // Clear OSD
  672.                 ucMode_Curr     = ucMode_Found; // Search mode OK
  673.                 ucMode_Times    = 0;            // Reset mode timer
  674.                 bStable         = 0;            // bStable must be cleared when mode changed
  675.                 Display_DVI_Set();              // Set VGA Mode registers
  676. #if (RTDDEBUG)
  677.                 if (ucMode_PrevAct == ucMode_Curr)
  678.                 {
  679.                     if (0xff > ucMode_QuitCnt)      ucMode_QuitCnt += 1;
  680.                 }
  681.                 else
  682.                 {
  683.                     ucMode_PrevAct  = ucMode_Curr;
  684.                     ucMode_QuitCnt  = 0;
  685.                     ucDebug         = 0;
  686.                 }
  687. #endif                
  688.             }
  689.         }
  690.     }
  691. #else
  692.      Display_DVI_Set();
  693. #endif
  694. }
  695. unsigned char Seek_DVI_Mode(unsigned char mode)
  696. {
  697. #if(TMDS_ENABLE)
  698.     unsigned char   Wait_Time_Cnt;
  699.     RTDSetByte(SYNC_POR_4C, 0x03);  // Measure data enable width and height
  700.     Wait_Time_Cnt  = 60;       
  701.     do
  702.     {   
  703.         Delay_Xms(1);
  704.         RTDRead(SYNC_POR_4C, 0x07, Y_INC);
  705.     }
  706.     while ((Data[0] & 0x02) && (--Wait_Time_Cnt));
  707.     Data[7] = Data[5];
  708.     Data[6] = Data[6] & 0x0f;
  709.     Data[5] = Data[3];
  710.     Data[4] = Data[4] & 0x87;
  711.     Data[3] = Data[1];
  712.     Data[2] = Data[2] & 0x8f;
  713.     // Measure Failed !!!
  714.     if ((0 == ((unsigned int *)Data)[1]) || (0x07ff <= ((unsigned int *)Data)[1]) ||
  715.         (0 == ((unsigned int *)Data)[2]) || (0x07ff <= ((unsigned int *)Data)[2]) ||
  716.         (0 == Wait_Time_Cnt))
  717.     {
  718.         RTDSetByte(SYNC_POR_4C, 0x00);
  719.         return MODE_NOSUPPORT;
  720.     }
  721.     // Save IH_TOTAL in usADC_Clock
  722.     usADC_Clock     = ((unsigned int *)Data)[1] * 2;
  723.     // Save input data enable width and height
  724.     usIPV_ACT_LEN   = ((unsigned int *)Data)[2];
  725.     usIPH_ACT_WID   = ((unsigned int *)Data)[3] * 2;
  726.     // We don't support input image less than 350 active lines
  727.     if (350 > usIPV_ACT_LEN)    return MODE_NOSUPPORT;
  728.     // We only support 8N active width
  729.     usIPH_ACT_WID   = (2 < (usIPH_ACT_WID & 0x0007)) ? ((usIPH_ACT_WID + 8) & 0xfff8) : (usIPH_ACT_WID & 0xfff8);
  730.     // We only support active width not larger than 1280
  731.     if (1280 < usIPH_ACT_WID)   usIPH_ACT_WID   = 1280;
  732.     // Calculate maximum usIPV_ACT_LEN limitation
  733.     ((unsigned int *)Data)[0]   = (unsigned long)(usVsync - 1) * DISP_LEN / MIN_DV_TOTAL;
  734.     if (((unsigned int *)Data)[0] < usIPV_ACT_LEN)      usIPV_ACT_LEN   = ((unsigned int *)Data)[0];
  735.     if (MODE_NOSUPPORT == mode)
  736.     {
  737.         mode    = MODE_UNDEFINED0;
  738.     }
  739.     else if (CAP_WIN[mode][2] != usIPH_ACT_WID || CAP_WIN[mode][4] != usIPV_ACT_LEN)
  740.     {
  741.         switch (usIPV_ACT_LEN)
  742.         {
  743.         case 350 :
  744.             if (MODE_0640x0350x70HZ <= mode && MODE_0720x0400x70HZ >= mode)
  745.             {
  746.                 mode    = (716 > usIPH_ACT_WID) ? MODE_0640x0350x70HZ : MODE_0720x0350x70HZ;
  747.             }
  748.             else if (MODE_0640x0350x85HZ <= mode && MODE_0720x0400x85HZ >= mode)
  749.             {
  750.                 mode    = MODE_0640x0350x85HZ;
  751.             }
  752.             else if (MODE_0640x0480x50HZ == mode)
  753.             {
  754.                 mode    = MODE_VGA350x50Hz;
  755.             }
  756.             else if (MODE_0640x0480x60HZ == mode)
  757.             {
  758.                 mode    = MODE_VGA350x60Hz;
  759.             }
  760.             else
  761.             {
  762.                 mode    = MODE_UNDEFINED0;
  763.             }
  764.             break;
  765.         case 400 :
  766.             if (MODE_0640x0350x70HZ <= mode && MODE_0720x0400x70HZ >= mode)
  767.             {
  768.                 mode    = (716 > usIPH_ACT_WID) ? MODE_0640x0400x70HZ : MODE_0720x0400x70HZ;
  769.             }
  770.             else if (MODE_0640x0350x85HZ <= mode && MODE_0720x0400x85HZ >= mode)
  771.             {
  772.                 mode    = (716 > usIPH_ACT_WID) ? MODE_0640x0400x85HZ : MODE_0720x0400x85HZ;
  773.             }
  774.             else if (MODE_0640x0480x50HZ == mode)
  775.             {
  776.                 mode    = MODE_VGA400x50Hz;
  777.             }
  778.             else if (MODE_0640x0480x60HZ == mode)
  779.             {
  780.                 mode    = MODE_VGA400x60Hz;
  781.             }
  782.             else if (MODE_USER720x400 != mode)
  783.             {
  784.                 mode    = MODE_UNDEFINED0;
  785.             }
  786.             break;
  787.         case 480 :
  788.             if ((MODE_USER640x480 != mode) && ((MODE_0640x0480x50HZ > mode) || (MODE_0640x0480x85HZ < mode)))
  789.                 mode    = MODE_UNDEFINED0;
  790.             break;
  791.         case 600 :
  792.             if ((MODE_USER800x600 != mode) && ((MODE_0800x0600x56HZ > mode) || (MODE_0800x0600x85HZ < mode)))
  793.                 mode    = MODE_UNDEFINED0;
  794.             break;
  795.         case 624 :
  796.             if (MODE_0832x0624x75HZ != mode)    
  797.                 mode    = MODE_UNDEFINED0;
  798.             break;
  799.         case 768 :
  800.             if ((MODE_USER1024x768 != mode) && ((MODE_1024x0768x60HZ > mode) || (MODE_1024x0768x85HZ < mode)))
  801.                 mode    = MODE_UNDEFINED0;
  802.             break;
  803.         case 800 :
  804.             if (MODE_1024x0800x84HZ != mode)
  805.                 mode    = MODE_UNDEFINED0;
  806.             break;
  807.         case 864 :
  808.             if ((MODE_USER1152x864 != mode) && (MODE_1152x0864x75HZ != mode))   
  809.                 mode    = MODE_UNDEFINED0;
  810.             break;
  811.         case 870 :
  812.             if (MODE_1152x0870x75HZ != mode)
  813.                 mode    = MODE_UNDEFINED0;
  814.             break;
  815.         case 900 :
  816.             if ((MODE_USER1152x900 != mode) && ((MODE_1152x0900x66HZ > mode) || (MODE_1152x0900x76HZ < mode)))
  817.                 mode    = MODE_UNDEFINED0;
  818.             break;
  819.         case 960 :
  820.             if ((MODE_USER1280x960 != mode) && ((MODE_1280x0960x60HZ > mode) || (MODE_1280x0960x85HZ < mode)))
  821.                 mode    = MODE_UNDEFINED0;
  822.             break;
  823.         case 1024 :
  824.             if ((MODE_USER1280x1024 != mode) && ((MODE_1280x1024x60HZ > mode) || (MODE_1280x1024x85HZ < mode)))
  825.                 mode    = MODE_UNDEFINED0;
  826.             break;
  827.         case 1600 :
  828.             if ((MODE_USER1600x1200 != mode) && (MODE_1600x1200x60HZ != mode))
  829.                 mode    = MODE_UNDEFINED0;
  830.             break;
  831.         default :
  832.             mode    = MODE_UNDEFINED0;
  833.             break;
  834.         }
  835.     }
  836.     if (MODE_UNDEFINED0 == mode)
  837.     {
  838.         // First, we try user-mode to fit the undefined mode for full-screen display.
  839.         Wait_Time_Cnt   = MODE_USER720x400;
  840.         do
  841.         {
  842.             if (Mode_Preset[Wait_Time_Cnt][2] < CAP_WIN[Wait_Time_Cnt][4])   // V scale-down
  843.             {
  844.                 // Larger scale-down ratio may need a larger DH_TOTAL. 
  845.                 // So usIPV_ACT_LEN should not be too larger than pre-set capture window length
  846.                 if (Mode_Preset[Wait_Time_Cnt][2] > usIPV_ACT_LEN || (CAP_WIN[Wait_Time_Cnt][4] + 24) < usIPV_ACT_LEN)   continue;
  847.             }
  848.             else
  849.             {
  850.                 if (Mode_Preset[Wait_Time_Cnt][2] < usIPV_ACT_LEN)   continue;
  851.             }
  852.             ((unsigned int *)Data)[0]   = (unsigned long)2458 * Mode_Preset[Wait_Time_Cnt][0] * Mode_Preset[Wait_Time_Cnt][2]
  853.                                         / ((unsigned long)100 * usIPV_ACT_LEN * usHsync);
  854.             
  855.             // Return if we find out a suitable user-mode.
  856.             if (MAX_DCLK > ((unsigned int *)Data)[0])   return Wait_Time_Cnt;
  857.         }
  858.         while (MODE_USER1600x1200 >= ++Wait_Time_Cnt);
  859.         // If failed, we try partial-screen display.
  860.         if (DISP_LEN < usIPV_ACT_LEN)   // Scale-down
  861.         {
  862.             ((unsigned int *)Data)[0]   = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED1][0] * DISP_LEN 
  863.                                         / ((unsigned long)100 * usIPV_ACT_LEN * usHsync);
  864.             if (MAX_DCLK < ((unsigned int *)Data)[0])
  865.             {
  866.                 ((unsigned int *)Data)[1]   = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED1][0] * MIN_DV_TOTAL
  867.                                             / ((unsigned long)100 * (usVsync - 1) * usHsync);
  868.                 if (MAX_DCLK < ((unsigned int *)Data)[1])
  869.                 {
  870.                     // Decrease usIPV_ACT_LEN to DISP_LEN and go further to check if it can be displayed.
  871.                     usIPV_ACT_LEN   = DISP_LEN;
  872.                 }
  873.                 else
  874.                 {                 
  875.                     mode    = MODE_UNDEFINED1 | 0x80;   // Scale-down and partial-V display
  876.                 }
  877.             }
  878.             else
  879.                 mode    = MODE_UNDEFINED1;              // Scale-down and full-V display
  880.         }
  881.         if (DISP_LEN >= usIPV_ACT_LEN)  // Scale-up
  882.         {
  883.             ((unsigned int *)Data)[0]   = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED0][0] * DISP_LEN 
  884.                                         / ((unsigned long)100 * usIPV_ACT_LEN * usHsync);
  885.             if (MAX_DCLK < ((unsigned int *)Data)[0])
  886.             {
  887.                 if (MIN_DV_TOTAL >= (usVsync - 1))
  888.                 {
  889.                     ((unsigned int *)Data)[1]   = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED0][0] * MIN_DV_TOTAL 
  890.                                                 / ((unsigned long)100 * (usVsync - 1) * usHsync);
  891.                 }
  892.                 else
  893.                 {
  894.                     ((unsigned int *)Data)[1]   = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED0][0]
  895.                                                 / ((unsigned long)100 * usHsync);
  896.                 }
  897.                 if (MAX_DCLK < ((unsigned int *)Data)[1])
  898.                     mode    = MODE_NOSUPPORT;           // Cannot display
  899.                 else
  900.                     mode    = MODE_UNDEFINED0 | 0x80;   // Scale-up and partial-screen display
  901.             }
  902.             else
  903.                 mode    = MODE_UNDEFINED0;          // Scale-up and full-screen display
  904.         }
  905.     }
  906.     return  mode;
  907. #else
  908.     mode    = MODE_UNDEFINED0;
  909.     return  0;
  910. #endif
  911. }
  912. //-------------------  Check DVI Mode  -------------------//
  913. void Check_DVI_Mode(void)
  914. {    
  915. #if(TMDS_ENABLE)
  916.     RTDRead(SYNC_POR_4C, 0x05, Y_INC);
  917.     if (Data[0] & 0x02)
  918.     {
  919.         RTDSetByte(SYNC_POR_4C, 0x00);      // Reset Sync Processor
  920.         ucMode_Found    = MODE_NOSUPPORT;
  921.     }
  922.     else
  923.     {
  924.         bVpole_Curr = (bit)(Data[0] & 0x08);    // Current usVsync polarity
  925.         bHpole_Curr = (bit)(Data[0] & 0x04);    // Current usHsync polarity
  926.         Data[5] = Data[3];
  927.         Data[4] = Data[4] & 0x87;
  928.         Data[3] = Data[1];
  929.         Data[2] = Data[2] & 0x8f;
  930.         usHsync = ((unsigned int *)Data)[1];    // Current usHsync timing
  931.         usVsync = ((unsigned int *)Data)[2];    // Current usVsync timing
  932.         // Polarity must be correct
  933.         if ((bVpole_Curr != bVpole_Prev) || (bHpole_Curr != bHpole_Prev))
  934.         {
  935.             RTDRead(VGIP_SIGINV_05, 0x01, N_INC);
  936.             
  937.             Data[0] &= 0xf3;  // VS & HS positive
  938.             if (!bVpole_Curr)    Data[0] |= 0x08;
  939.             if (!bHpole_Curr)    Data[0] |= 0x04;
  940.             
  941.             RTDSetByte(VGIP_SIGINV_05, Data[0]);
  942.             ucMode_Found    = MODE_NOSUPPORT;
  943.         }
  944.         else
  945.         {
  946.             if (0x07ff <= usHsync || 0x07ff <= usVsync || 0 == usHsync || 0 == usVsync)     // Check overflow
  947.             {
  948.                 ucMode_Found    = MODE_NOSUPPORT;
  949.             }
  950.             else
  951.             {
  952.                 if ((usHsync < (usStdHS - 1)) || (usHsync > (usStdHS + 3)) ||
  953.                     (usVsync < (usStdVS - 1)) || (usVsync > (usStdVS + 3)))
  954.                 {   
  955.                     ucMode_Found    = MODE_NOSUPPORT;
  956.                 }
  957.                 else
  958.                 {
  959.                     ucMode_Found    =  ucMode_Curr;
  960.                 }
  961.             }
  962.         }
  963.     }
  964.     
  965.     if (MODE_NOSUPPORT == ucMode_Found)
  966.         Reset_Mode();
  967.     else
  968.         bStable = 1;    // Set bStable to 1 when signal timing is stable.
  969. #endif
  970. }
  971. /////////////////////////////////////////////////////////
  972. //------------------ Detect VIDEO Mode ----------------//
  973. /////////////////////////////////////////////////////////
  974. void Detect_Video_Mode(void)
  975. {
  976. #if(VIDEO_CHIP != VDC_NONE)
  977.     I2CRead(ADDR_VIDEO, 0x1f, 0x01);
  978.     //------ Check Horizontal Lock & Frequency ------
  979.     if (0 == (Data[0] & 0x40))
  980.     {   
  981.         if ((Data[0] & 0x20) && (0x01 != (ucAV_Mode & 0x0f)))
  982.         {
  983.             // Field rate changed to 60Hz
  984.             ucAV_Mode       = 0x01;
  985.             ucMode_Found    = MODE_NOSUPPORT;
  986.             ucMode_Times    = 0;
  987.             Data[0] = 4;
  988.             Data[1] = ADDR_VIDEO;
  989.             Data[2] = 0x0e;
  990.             Data[3] = 0x08;     // Start color search from NTSC-M
  991.             I2CWrite(Data);
  992.         }
  993.         else if ((0 == (Data[0] & 0x20)) && (0x02 != (ucAV_Mode & 0x02)))
  994.         {
  995.             // Field rate changed to 50Hz
  996.             ucAV_Mode       = 0x02; 
  997.             ucMode_Found    = MODE_NOSUPPORT;
  998.             ucMode_Times    = 0;
  999.             
  1000.             Data[0] = 4;
  1001.             Data[1] = ADDR_VIDEO;
  1002.             Data[2] = 0x0e;
  1003.             Data[3] = 0x08;     // Start color search from PAL-BDGHI
  1004.             I2CWrite(Data);
  1005.         }
  1006.         else
  1007.         {    
  1008.             //------ Check Lock Color ------
  1009.             if (0x01 == (Data[0] & 0x01))
  1010.             {   
  1011.                 // Lock Color
  1012.                 if (ucAV_Mode & 0x01)
  1013.                 {
  1014.                     if (MODE_VIDEO60HZ == ucMode_Found)
  1015.                     {
  1016.                         ucMode_Times ++;
  1017.                     }
  1018.                     else
  1019.                     {
  1020.                         ucMode_Found    = MODE_VIDEO60HZ;
  1021.                         ucMode_Times    = 0;
  1022.                     }
  1023.                 }
  1024.                 else
  1025.                 {
  1026.                     if (MODE_VIDEO50HZ == ucMode_Found)
  1027.                     {
  1028.                         ucMode_Times ++;
  1029.                     }
  1030.                     else
  1031.                     {
  1032.                         ucMode_Found    = MODE_VIDEO50HZ;
  1033.                         ucMode_Times    = 0;
  1034.                     }
  1035.                 }
  1036.             }
  1037.             else
  1038.             {
  1039.                 // Non Lock Color
  1040.                 if (MODE_NOSUPPORT != ucMode_Found)
  1041.                 {
  1042.                     ucMode_Found    = MODE_NOSUPPORT;
  1043.                     ucMode_Times    = 0;
  1044.                 }
  1045.                 
  1046.                 Data[0] = 4;
  1047.                 Data[1] = ADDR_VIDEO;
  1048.                 Data[2] = 0x0e;
  1049.                 
  1050.                 if (0x03 == (ucAV_Mode & 0x03))
  1051.                 {
  1052.                     // SECAM -> PAL-BDGHI(50Hz)
  1053.                     Data[3] = 0x08;
  1054.                     I2CWrite(Data);                    
  1055.                     ucAV_Mode   = 0x02;
  1056.                 }
  1057.                 else
  1058.                 {
  1059.                     if (ucMode_Times & 0x01)    // Every 2-times , change color
  1060.                     {
  1061.                         switch (ucAV_Mode & 0x70)
  1062.                         {
  1063.                         case 0x00:  
  1064.                             Data[3] = 0x18; // NTSC-4.43(50Hz)  // PAL-4.43(60Hz)
  1065.                             I2CWrite(Data);
  1066.                             ucAV_Mode   = (ucAV_Mode & 0x0f) | 0x10;
  1067.                             break;
  1068.                         case 0x10:
  1069.                             Data[3] = 0x28; // PAL-N(50Hz)      // NTSC-4.43(60Hz)
  1070.                             I2CWrite(Data);
  1071.                             ucAV_Mode   = (ucAV_Mode & 0x0f) | 0x20;
  1072.                             break;
  1073.                         case 0x20:
  1074.                             Data[3] = 0x38; // NTSC-N(50Hz)     // PAL-M(60Hz)
  1075.                             I2CWrite(Data);
  1076.                             ucAV_Mode   = (ucAV_Mode & 0x0f) | 0x30;
  1077.                             break;
  1078.                         case 0x30:
  1079.                             if (ucAV_Mode & 0x02)
  1080.                             {
  1081.                                 // NTSC-N -> SECAM (50Hz)
  1082.                                 Data[3]     = 0x5c;
  1083.                                 I2CWrite(Data);
  1084.                                 ucAV_Mode   = 0x03;
  1085.                             }
  1086.                             else
  1087.                             {
  1088.                                 // PAL-M -> NTSC_M (60Hz)
  1089.                                 Data[3]     = 0x08;
  1090.                                 I2CWrite(Data);
  1091.                                 ucAV_Mode   = ucAV_Mode & 0x0f | 0x00;
  1092.                             }    
  1093.                         default:
  1094.                             break;
  1095.                         }//end of "switch (ucAV_Mode & 0x70)"
  1096.                     }//end of "if (ucMode_Times & 0x01)"
  1097.                 }//end of "if (0x03 == (ucAV_Mode & 0x03)) else"
  1098.             }//end of "Non Lock color
  1099.         }//end of "Check Lock Color"
  1100.     }//end of "if (0==(Data[0] & 0x40))"
  1101.     else
  1102.     {   
  1103.         // Non Horizontal Lock
  1104.         ucAV_Mode   = 0;
  1105.         
  1106.         if (ucMode_Found != MODE_NOSUPPORT)
  1107.         {
  1108.             ucMode_Found    = MODE_NOSUPPORT;
  1109.             ucMode_Times    = 0;
  1110.         }
  1111.     }
  1112.     
  1113.     //-------------Check result--------------
  1114.     if (MODE_NOSUPPORT != ucMode_Found)
  1115.     {   
  1116.         if (VIDEO_SEARCH_TIMES < ucMode_Times)
  1117.         {
  1118.             bLIGHT_PWR  = LIGHT_OFF;        // Turn off BackLight for reset display
  1119.             
  1120.             RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
  1121.             RTDCodeW(OSD_Reset);            // Clear OSD
  1122.             
  1123.             if (SOURCE_YUV == (stGUD1.INPUT_SOURCE & 0x07))
  1124.                 ucMode_Curr = (ucAV_Mode & 0x02) ? MODE_YUV50HZ : MODE_YUV60HZ;
  1125.             else
  1126.                 ucMode_Curr = ucMode_Found;
  1127.                     
  1128.             ucMode_Times    = 0;
  1129.             bStable         = 0;            // bStable must be cleared when mode changed
  1130.             Display_Video_Set();            
  1131.         }
  1132.     }
  1133.     else
  1134.     {
  1135.         ucMode_Times ++;
  1136.         
  1137.         if (ucAV_Mode)
  1138.         {
  1139.             // Force to display although we cannot lock color
  1140.             if (VIDEO_SEARCH_TIMES < ucMode_Times 
  1141.                 && (NO_COLOR_TIMES < ucMode_Times || SOURCE_YUV == (stGUD1.INPUT_SOURCE & 0x07)))
  1142.             {
  1143.                 bLIGHT_PWR  = LIGHT_OFF;        // Turn off BackLight for reset display
  1144.                 RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
  1145.                 RTDCodeW(OSD_Reset);            // Clear OSD
  1146.                 
  1147.                 ucAV_Mode       = (ucAV_Mode & 0x02) ? 0x82 : 0x81;
  1148.                 if (SOURCE_YUV != (stGUD1.INPUT_SOURCE & 0x07))
  1149.                     ucMode_Curr = (ucAV_Mode & 0x02) ? MODE_VIDEO50HZ : MODE_VIDEO60HZ;
  1150.                 else
  1151.                     ucMode_Curr = (ucAV_Mode & 0x02) ? MODE_YUV50HZ : MODE_YUV60HZ;
  1152.                 ucMode_Times    = 0;
  1153.                 bStable         = 0;    // bStable must be cleared when mode changed
  1154.                 Display_Video_Set();
  1155.             }
  1156.         }
  1157.         else
  1158.         {
  1159.             if (NO_MODE_TIMES < ucMode_Times)
  1160.             {
  1161.                 bStable         = 1;    // Set bStable to 1 when signal timing is stable.
  1162.                 ucMode_Times    = NO_MODE_TIMES - 1;
  1163.             }
  1164.         }
  1165.     }
  1166. #else
  1167.     Display_Video_Set();
  1168. #endif
  1169. }
  1170. //-------------------  Check AV Mode  -------------------//
  1171. void Check_Video_Mode(void)
  1172. {   
  1173. #if(VIDEO_CHIP != VDC_NONE)
  1174.     I2CRead(ADDR_VIDEO, 0x1f, 0x01);
  1175.     
  1176.     // Check color
  1177.     if (0 == (ucAV_Mode & 0x80))
  1178.     {
  1179.         if (0 == (Data[0] & 0x01))      ucMode_Curr = MODE_NOSIGNAL;    // Color standard changed
  1180.     }
  1181.     else
  1182.     {
  1183.         if (0 == (Data[0] & 0x01))
  1184.         {
  1185.             ucMode_Times    = 0;
  1186.         }
  1187.         else
  1188.         {
  1189.             // When we cannot lock color, we set color standard to PAL-BDGHI if field rate is 50Hz, 
  1190.             // and to NTSC-M if it is 60Hz.
  1191.             // If we find color is locked, we should update ucAV_Mode to indicate we now get color.
  1192.             if (VIDEO_SEARCH_TIMES < ++ucMode_Times)    ucAV_Mode = ucAV_Mode & 0x0f;
  1193.         }
  1194.     }
  1195.     // Check field rate
  1196.     if (Data[0] & 0x40)
  1197.     {
  1198.         ucMode_Curr = MODE_NOSIGNAL;
  1199.     }
  1200.     else
  1201.     {
  1202.         if (ucAV_Mode & 0x02)       // 50Hz
  1203.         {   
  1204.             if (0x00 != (Data[0] & 0x20))   ucMode_Curr = MODE_NOSIGNAL;
  1205.         } 
  1206.         else                        // 60Hz
  1207.         {
  1208.             if (0x00 == (Data[0] & 0x20))   ucMode_Curr = MODE_NOSIGNAL;
  1209.         }
  1210.     }
  1211.    
  1212.     // Check result
  1213.     if (MODE_NOSIGNAL == ucMode_Curr)
  1214.         Reset_Mode();
  1215.     else
  1216.         bStable = 1;    // Set bStable to 1 when signal timing is stable.
  1217. #endif
  1218. }
  1219. void Initial_Mode(void)
  1220. {
  1221.     unsigned char   ucOption;
  1222.     unsigned int    usDispLen;
  1223.     // bit 7 of ucMode_Curr : partial-V display.
  1224.     // bit 6 of ucMode_Curr : select 720x350 or 720x400 for VGA-50Hz and VGA-60Hz
  1225.     ucOption    = ucMode_Curr & 0xc0;
  1226.     ucMode_Curr = ucMode_Curr & 0x3f;
  1227.     
  1228. RTDSetBit(SD_CTRL_70, 0xf9, VGA_ICLK_DELAY);
  1229.     if (SOURCE_DVI == (stGUD1.INPUT_SOURCE & 0x07))
  1230.     {
  1231.         RTDSetBit(SD_CTRL_70, 0xf9, TMDS_ICLK_DELAY);
  1232.         usIPH_ACT_STA   = CAP_WIN[ucMode_Curr][1];
  1233.     }
  1234.     else
  1235.     {
  1236. if (ucOption & 0x40)
  1237. {
  1238. // Only VGA-50Hz and VGA-60Hz mode will set bit 6 of ucMode_Curr to indicate 720-pixel capture width
  1239. // In these case, we should use 720 horizontal settings instead of 640 horizontal settings in table.
  1240. usADC_Clock     = CAP_WIN[MODE_0720x0400x70HZ][0];
  1241. usIPH_ACT_STA   = CAP_WIN[MODE_0720x0400x70HZ][1];
  1242. usIPH_ACT_WID   = CAP_WIN[MODE_0720x0400x70HZ][2];
  1243. }
  1244. else
  1245. {
  1246. usADC_Clock     = CAP_WIN[ucMode_Curr][0];
  1247. usIPH_ACT_STA   = CAP_WIN[ucMode_Curr][1];
  1248. usIPH_ACT_WID   = CAP_WIN[ucMode_Curr][2];
  1249. // Calculate pixel clock rate (round to MHz)
  1250. usDispLen   = (unsigned long)24576 * usADC_Clock / ((unsigned long)usHsync * 500);
  1251. usDispLen   = (usDispLen >> 1) + (usDispLen & 0x01);
  1252. // Use ADC to do H scale-down if pixel clock rate is over spec.
  1253. if (MAX_ADC_FREQ < usDispLen && MODE_USER1152x864 <= ucMode_Curr && MODE_USER1600x1200 >= ucMode_Curr)
  1254. {
  1255. usADC_Clock     = ADC_SD_SET[ucMode_Curr - MODE_USER1152x864][0];
  1256. usIPH_ACT_STA   = ADC_SD_SET[ucMode_Curr - MODE_USER1152x864][1];
  1257. usIPH_ACT_WID   = ADC_SD_SET[ucMode_Curr - MODE_USER1152x864][2];
  1258. }
  1259. } //if (ucOption & 0x40)
  1260. // Calculate pixel clock rate (round to MHz)
  1261. usDispLen   = (unsigned long)24576 * usADC_Clock / ((unsigned long)usHsync * 500);
  1262. usDispLen   = (usDispLen >> 1) + (usDispLen & 0x01);
  1263. // To improve ADC performance ,when the data rate is slow, use single channel,otherwise, use dual channel
  1264. RTDSetBit(ADC_REG_CLK_EA,0xe0,(45 > usDispLen) ? 0x10 | (ADC_RED_PHASE_FT & 0x0c) |( ADC_BLUE_PHASE_FT & 0x03): 
  1265.                                                  0x00 | (ADC_RED_PHASE_FT & 0x0c) |( ADC_BLUE_PHASE_FT & 0x03)); 
  1266. // To imporve the FIFO efficiency only when input data rate is slow, and display data rate is high.
  1267. // RTDSetBit(VGIP_CTRL_04, 0xe3, (40 > usDispLen) ? 0x14 : 0x00);
  1268.     RTDSetBit(VGIP_CTRL_04, 0xf3, (60 > usDispLen) ? 0x08 : 0x00);
  1269. RTDSetByte(PE_CONTROL_3C, 0x00);    // HSYNC positive/negtive tracking
  1270.     RTDSetByte(ADC_FRAME_MODULE_EB,0x06);
  1271. //  RTDSetByte(ADC_FRAME_MODULE_EB,(usIPH_ACT_WID == 1280) ? 0x04 : 0x00);
  1272.   // Set ADC bandwidth to reduce high frequency noise
  1273. //  RTDSetByte(ADC_REG_TEST_E9, (35 > usDispLen) ? 0x08 : (150 > usDispLen) ? 0x10 : 0x18);
  1274. #if(ADC_DEFFERENTIAL)
  1275.     RTDSetBit(ADC_DIFF_MODE_EC,0xff,0x40); //Differential mode
  1276. #else
  1277.     RTDSetBit(ADC_DIFF_MODE_EC,0xbf,0x00); //Single endded mode
  1278. #endif
  1279. RTDSetByte(ADC_REG_CUR_H_E8, 0x0d | (ADC_GREEN_PHASE_FT & 0x30));
  1280.     RTDSetBit(ADC_FRAME_MODULE_EB,0xc7, ((ADC_RED_PHASE_FT & 0x10) << 1) | ((ADC_GREEN_PHASE_FT & 0x40) << 2) 
  1281.                                    |((ADC_BLUE_PHASE_FT & 0x04) << 1));
  1282.     RTDSetBit(TMDS_CORRECTION_FF,0xff,0x04); //Enable the ADC digital filter
  1283.     if(ucMode_Curr < MODE_1024x0768x70HZ)
  1284.      RTDSetByte(ADC_REG_TEST_E9, 0x08);
  1285.     else 
  1286.         RTDSetByte(ADC_REG_TEST_E9, 0x10);
  1287. // Get usIPV_ACT_LEN
  1288. if (MODE_UNDEFINED0 > ucMode_Curr)
  1289. {
  1290. // We've already decided usIPV_ACT_LEN in Detect_VGA_Mode() for undefined SU/SD mode.
  1291. // Only defined modes need to decide usIPV_ACT_LEN here.
  1292. usIPV_ACT_LEN   = CAP_WIN[ucMode_Curr][4];
  1293. }
  1294.     
  1295.     } //if (SOURCE_DVI == (stGUD1.INPUT_SOURCE & 0x07))
  1296.     // Get standard usIPV_ACT_STA 
  1297.     RTDSetByte(IVS_DELAY_8C, PROGRAM_VDELAY);
  1298.     usIPV_ACT_STA   = CAP_WIN[ucMode_Curr][3] - PROGRAM_VDELAY - 1;
  1299.     RTDSetByte(IHS_DELAY_8D, PROGRAM_HDELAY);
  1300. //    usIPH_ACT_STA   = usIPH_ACT_STA + CAPTURE_HDELAY - PROGRAM_HDELAY;
  1301.     if(ucMode_Curr < MODE_0800x0600x75HZ)
  1302. Data[0] = 2;
  1303.     else if(ucMode_Curr < MODE_1280x1024x75HZ)
  1304. Data[0] = 5;
  1305.     else
  1306. Data[0] = 3;
  1307. //    Data[0] = 5;
  1308.     usIPH_ACT_STA   = usIPH_ACT_STA + Data[0] - PROGRAM_HDELAY;
  1309.     // Decide display length (height) and store to usDispLen
  1310.     usDispLen   = Mode_Preset[ucMode_Curr][2];
  1311.     if (MODE_UNDEFINED0 == ucMode_Curr)         // partical-screen scale-up mode
  1312.     {
  1313.         if (ucOption & 0x80)    // partial-V
  1314.         {           
  1315. if (MIN_DV_TOTAL > (usVsync - 1))
  1316.                 usDispLen   = (unsigned long)usIPV_ACT_LEN * MIN_DV_TOTAL / (usVsync - 1);
  1317.             else
  1318.                 usDispLen   = usIPV_ACT_LEN;    // No V scale-up
  1319.         }
  1320.     }
  1321.     else if (MODE_UNDEFINED1 == ucMode_Curr)    // partial-screen scale-down mode
  1322.     {
  1323.         if (ucOption & 0x80)    // partial-V
  1324.         {
  1325.             usDispLen   = (unsigned long)usIPV_ACT_LEN * MIN_DV_TOTAL / (usVsync - 1);
  1326.         }
  1327.     } //if (MODE_UNDEFINED0 == ucMode_Curr)         // partical-screen scale-up mode
  1328.     if (Mode_Preset[ucMode_Curr][2] < usDispLen)    usDispLen   = Mode_Preset[ucMode_Curr][2];
  1329.     // This F/W do not support V scale-up(or bypass) and H scale-down simultaneously
  1330.     if (usDispLen >= usIPV_ACT_LEN && Mode_Preset[ucMode_Curr][1] < usIPH_ACT_WID)
  1331.     {
  1332.         usIPH_ACT_WID   = Mode_Preset[ucMode_Curr][1];
  1333.     }
  1334.     if (usDispLen > usIPV_ACT_LEN)                      ucOption    |= 0x01;    // bit 0 : V scale-up
  1335.     if (usDispLen < usIPV_ACT_LEN)                      ucOption    |= 0x02;    // bit 1 : V scale-down
  1336.     if (Mode_Preset[ucMode_Curr][1] > usIPH_ACT_WID)    ucOption    |= 0x04;    // bit 2 : H scale-up
  1337.     if (Mode_Preset[ucMode_Curr][1] < usIPH_ACT_WID)    ucOption    |= 0x08;    // bit 3 : H scale-down
  1338.     // Set capture window
  1339.     Data[0]     = 11;
  1340.     Data[1]     = Y_INC;
  1341.     Data[2]     = IPH_ACT_STA_06;
  1342.     Data[3]     = (unsigned char)usIPH_ACT_STA;
  1343.     Data[4]     = (unsigned char)(usIPH_ACT_STA >> 8);
  1344.     Data[5]     = (unsigned char)usIPH_ACT_WID;
  1345.     Data[6]     = (unsigned char)(usIPH_ACT_WID >> 8);
  1346.     Data[7]     = (unsigned char)usIPV_ACT_STA;
  1347.     Data[8]     = (unsigned char)(usIPV_ACT_STA >> 8);
  1348.     Data[9]     = (unsigned char)usIPV_ACT_LEN;
  1349.     Data[10]    = (unsigned char)(usIPV_ACT_LEN >> 8);
  1350.     Data[11]    = 0;
  1351.     RTDWrite(Data);
  1352.     // Set window size before scale-up
  1353.     Data[0] = 7;
  1354.     Data[1] = Y_INC;
  1355.     Data[2] = DRW_BSU_40;
  1356.     if (ucOption & 0x08)
  1357.     {
  1358.         // H scale-down
  1359.         Data[3] = (unsigned char)Mode_Preset[ucMode_Curr][1];
  1360.         Data[4] = (unsigned char)(Mode_Preset[ucMode_Curr][1] >> 8);
  1361.     }
  1362.     else
  1363.     {
  1364.         // No H scale-down
  1365.         Data[3] = Data[5];  // (unsigned char)usIPH_ACT_WID;
  1366.         Data[4] = Data[6];  // (unsigned char)(usIPH_ACT_WID >> 8);
  1367.     }
  1368.     if (ucOption & 0x02)
  1369.     {
  1370.         // V scale-down
  1371.         Data[5] = (unsigned char)usDispLen;
  1372.         Data[6] = (unsigned char)(usDispLen >> 8);
  1373.     }
  1374.     else
  1375.     {
  1376.         // No V scale-down
  1377.         Data[5] = Data[9];  // (unsigned char)usIPV_ACT_LEN;
  1378.         Data[6] = Data[10]; // (unsigned char)(usIPV_ACT_LEN >> 8);
  1379.     }
  1380.     Data[7] = 0;
  1381.     RTDWrite(Data);
  1382.     // Config scaling
  1383.     if (ucOption & 0x0a)
  1384.         RTDSetBit(SD_CTRL_70, 0xff, 0x01);      // Turn on scale-down
  1385.     else
  1386.         RTDSetBit(SD_CTRL_70, 0xfe, 0x00);      // Turn off scale-down
  1387.     if (ucOption & 0x01)
  1388.         RTDSetBit(SCALE_CTRL_15, 0xff, 0x02);   // Turn on V scale-up
  1389.     else
  1390.         RTDSetBit(SCALE_CTRL_15, 0xfd, 0x00);   // Turn off V scale-up
  1391.     if (ucOption & 0x04)
  1392.         RTDSetBit(SCALE_CTRL_15, 0xff, 0x01);   // Turn on H scale-up
  1393.     else
  1394.         RTDSetBit(SCALE_CTRL_15, 0xfe, 0x00);   // Turn off H scale-up
  1395.     // Set scale-down coefficient
  1396.     Data[0] = 7;
  1397.     Data[1] = Y_INC;
  1398.     Data[2] = H_SCALE_DL_71;
  1399.     if (ucOption & 0x08)    // H scale-down
  1400.     {
  1401.         // Data[12~15]
  1402.         ((unsigned long *)Data)[3]  = (unsigned long)256 * 4096 * usIPH_ACT_WID / Mode_Preset[ucMode_Curr][1];
  1403.         // Data[4~5]
  1404.         ((unsigned int *)Data)[2]   = (((unsigned long *)Data)[3] >> 8) + 2;
  1405.         // H scale-down factor is stored in Data[4] (high-byte) and Data[5] (low-byte)
  1406.         Data[3] = Data[5];
  1407.         RTDSetBit(VGIP_CTRL_04, 0xff, 0x40);    // Enable H scale-down compensation
  1408.     }
  1409.     else
  1410.     {
  1411.         Data[3] = 0x00;
  1412.         Data[4] = 0x10;
  1413.         RTDSetBit(VGIP_CTRL_04, 0xbf, 0x00);    // Diable H scale-down compensation
  1414.     }
  1415.     if (ucOption & 0x02)    // V scale-down
  1416.     {
  1417.         // Data[12~15]
  1418.         ((unsigned long *)Data)[3]  = (unsigned long)256 * 4096 * usIPV_ACT_LEN / usDispLen;
  1419.         // Data[6~7]
  1420.         ((unsigned int *)Data)[3]   = (((unsigned long *)Data)[3] >> 8);
  1421.         if (0 == Data[15])      ((unsigned int *)Data)[3]   = ((unsigned int *)Data)[3] - 1;
  1422.         // V scale-down factor is stored in Data[6] (high-byte) and Data[7] (low-byte)
  1423.         Data[5] = Data[7];
  1424.         RTDSetBit(VGIP_CTRL_04, 0xff, 0x80);    // Enable V scale-down compensation
  1425.     }
  1426.     else
  1427.     {
  1428.         Data[5] = 0x00;
  1429.         Data[6] = 0x10;
  1430.         RTDSetBit(VGIP_CTRL_04, 0x7f, 0x00);    // Diable V scale-down compensation
  1431.     }
  1432.     Data[7] = 0;
  1433.     RTDWrite(Data);
  1434.     // Set scale-up coefficient
  1435.     Data[0] = 8;
  1436.     Data[1] = Y_INC;
  1437.     Data[2] = HOR_SCA_16;
  1438.     if (ucOption & 0x04)    // H scale-up
  1439.     {
  1440.         // Data[12~15]
  1441.         ((unsigned long *)Data)[3]  = (unsigned long)2 * 262144 * usIPH_ACT_WID / Mode_Preset[ucMode_Curr][1];
  1442.         ((unsigned long *)Data)[3]  = ((((unsigned long *)Data)[3] >> 1) + (((unsigned long *)Data)[3] & 0x01)) << 6;
  1443.         Data[3] = Data[14];
  1444.         Data[4] = Data[13];
  1445.         Data[7] = Data[15];
  1446.     }
  1447.     else
  1448.     {
  1449.         Data[3] = 0xff;
  1450.         Data[4] = 0xff;
  1451.         Data[7] = 0;
  1452.     }
  1453.     if (ucOption & 0x01)    // V scale-up
  1454.     {
  1455.         // Data[12~15]
  1456.         ((unsigned long *)Data)[3]  = (unsigned long)2 * 262144 * usIPV_ACT_LEN / usDispLen;
  1457.         ((unsigned long *)Data)[3]  = ((((unsigned long *)Data)[3] >> 1) + (((unsigned long *)Data)[3] & 0x01)) << 6;
  1458.         Data[5] = Data[14];
  1459.         Data[6] = Data[13];
  1460.         Data[7] = Data[7] | (Data[15] >> 4);
  1461.     }
  1462.     else
  1463.     {
  1464.         Data[5] = 0xff;
  1465.         Data[6] = 0xff;
  1466.     }
  1467.     Data[8] = 0;
  1468.     RTDWrite(Data);
  1469.     // Set RTD display
  1470.     // Switch to FrameSync 1 mode and diable display
  1471.     RTDSetByte(VDIS_CTRL_20, 0x28 | DISP_BIT | DISPLAY_PORT);
  1472.     Data[0]     = 5;
  1473.     Data[1]     = Y_INC;
  1474. #if (DISP_ALIGN)
  1475.     Data[2]     = DH_ACT_STA_27;
  1476.     // DH_ACT_STA store in Data[4~5] (H~L)
  1477.     ((unsigned int *)Data)[2]   = (unsigned int)DH_ACT_END_POS - Mode_Preset[ucMode_Curr][1];
  1478.     Data[3]     = Data[5];
  1479. #else
  1480.     Data[2]     = DH_ACT_END_29;
  1481.     // DH_ACT_STA store in Data[4~5] (H~L)
  1482.     ((unsigned int *)Data)[2]   = (unsigned int)DH_ACT_STA_POS + Mode_Preset[ucMode_Curr][1];
  1483.     Data[3]     = Data[5];
  1484. #endif
  1485.     Data[5]     = 5;
  1486.     Data[6]     = Y_INC;
  1487.     Data[7]     = DV_ACT_END_34;
  1488.     // DV_ACT_END store in Data[10~11] (H~L)
  1489.     ((unsigned int *)Data)[5]   = (unsigned int)DV_ACT_STA_POS + usDispLen;
  1490.     Data[8]     = Data[11];
  1491.     Data[9]     = Data[10];
  1492.     Data[10]    = 0;
  1493.     RTDWrite(Data);
  1494.     // Get standard DH_TOTAL
  1495.     usDH_Total  = Mode_Preset[ucMode_Curr][0];
  1496.     // Switch to FrameSync 1 mode and enable display
  1497. //    if (PANEL_OFF == bPANEL_PWR)
  1498.     if (_OFF == bPanel_Status)
  1499.         RTDSetByte(VDIS_CTRL_20, 0x29 | DISP_BIT | DISPLAY_PORT);
  1500.     else
  1501.         RTDSetByte(VDIS_CTRL_20, 0x2b | DISP_BIT | DISPLAY_PORT);
  1502.     if (Mode_Preset[ucMode_Curr][3])
  1503.     {
  1504.         // Use preset DCLK M/N code
  1505.         Data[0] = 6;
  1506.         Data[1] = Y_INC;
  1507.         Data[2] = DPLL_CTRL_D0;
  1508.         Data[3] = 0x11;
  1509.         Data[4] = (unsigned char)(Mode_Preset[ucMode_Curr][3] >> 8);
  1510.         Data[5] = (unsigned char)Mode_Preset[ucMode_Curr][3];
  1511.         Data[6] = 0;
  1512.         RTDWrite(Data);
  1513.     }
  1514.     else
  1515.     {
  1516.      /*
  1517.         if (VGA_Mode[ucMode_Curr][4])
  1518.         {
  1519.             ((unsigned int *)Data)[0]   = (unsigned long)8 * usDH_Total * USER_MODE_NCODE * usDispLen 
  1520.                                         / ((unsigned long)usIPV_ACT_LEN * VGA_Mode[ucMode_Curr][4]);
  1521.         }
  1522.         else
  1523.         {
  1524. */
  1525.             ((unsigned int *)Data)[0]   = (unsigned long)8 * usDH_Total * USER_MODE_NCODE * usDispLen 
  1526.                                         / ((unsigned long)usIPV_ACT_LEN * usHsync);
  1527. //        }
  1528.         //Original Formula : DPM/Ich = 17.6 must be constant
  1529. //Ich = DPM * 10 / 176
  1530. //2*Ich = DPM * 20 / 176 , set D0[0] to 0, then I = 2 * Ich
  1531. //I  = 2 * Ich = 2.5u + D0[3]*2.5u + D0[4]*5u + D0[5]*10u + D0[6]*20u + D0[7]*30u(A)
  1532. //2I = 4 * Ich = 5u + D0[3]*5u + D0[4]*10u + D0[5]*20u + D0[6]*40u + D0[7]*60u(A)
  1533.         Data[15] = ((unsigned int *)Data)[0] >> 2;
  1534. Data[5] = (unsigned int)Data[15] * 40 / 176 - 5; //Calculate the 4*Ich,
  1535. Data[6] = 0x00;
  1536. if(Data[5] > 60)
  1537. {
  1538.     Data[5] -= 60;
  1539. Data[6] |= 0x80; 
  1540. }
  1541. if(Data[5] > 40)
  1542. {
  1543.     Data[5] -= 40;
  1544. Data[6] |= 0x40;
  1545. }
  1546.  
  1547.         if(Data[5] > 20)
  1548. {
  1549.     Data[5] -= 20;
  1550. Data[6] |= 0x20;
  1551. }
  1552. if(Data[5] > 10)
  1553. {
  1554.     Data[5] -= 10;
  1555. Data[6] |= 0x10;
  1556. }
  1557. if(Data[5] > 5)
  1558. {
  1559.     Data[5] -= 5;
  1560. Data[6] |= 0x08;
  1561. }
  1562. Data[0] = 7;
  1563. Data[1] = Y_INC;
  1564. Data[2] = DPLL_CTRL_D0;
  1565. Data[3] = Data[6];
  1566. Data[4] = Data[15] - 2;
  1567. Data[5] = 0x10 | (USER_MODE_NCODE - 2);//Offset Frequency Direction set to Downward
  1568. //Data[5] = (USER_MODE_NCODE - 2);//Offset Frequency Direction set to Downward
  1569. Data[6] = 0x04;
  1570. Data[7] = 0;
  1571. RTDWrite(Data);
  1572.  
  1573. //        ucDebug_Value0 = Data[4];
  1574.    //     ucDebug_Value1 = Data[5];
  1575.        
  1576.         //More precise Dclk in KHz
  1577. ((unsigned long*)Data)[0] = (unsigned long)24576000 / usIPV_ACT_LEN * usDispLen / usHsync * usDH_Total ;
  1578.         //((unsigned long*)Data)[0] = (unsigned long)49152000 / usIPV_ACT_LEN * usDispLen / usHsync * usDH_Total ;
  1579. //set M/N code Dclk
  1580. ((unsigned long*)Data)[1] = (unsigned long)12288000 * (Data[15] + 1) / USER_MODE_NCODE;
  1581.         //((unsigned long*)Data)[1] = (unsigned long)24576000 * (Data[15] + 1) / USER_MODE_NCODE;
  1582. ((unsigned long*)Data)[2] = ((unsigned long*)Data)[1] - ((unsigned long*)Data)[0]; //Dclk offset
  1583. ((unsigned long*)Data)[3] = ((unsigned long*)Data)[1] >> 15; //Offset resolution equal to (Dclk / 2^15)
  1584.         
  1585. ((unsigned long*)Data)[3] = ((((unsigned long*)Data)[2] << 1)/ ((unsigned long*)Data)[3]) & 0x00000fff; //Calculate the Dclk offset
  1586.         //((unsigned long*)Data)[3] = (((unsigned long*)Data)[2] / ((unsigned long*)Data)[3]) & 0x00000fff; //Calculate the Dclk offset
  1587. RTDSetByte(DCLK_OFFSET_LSB_9A,(unsigned char)((unsigned long*)Data)[3]);  //Set the Dclk offset
  1588. //        ucDebug_Value0 = (unsigned char)(((unsigned long*)Data)[3]);
  1589. //RTDSetBit(DCLK_OFFSET_MSB_9B,0xf0,(unsigned char)(((unsigned long*)Data)[3] >> 8) | 0x20);
  1590. RTDSetBit(DCLK_OFFSET_MSB_9B,0xf0,(unsigned char)(((unsigned long*)Data)[3] >> 8) | 0x20);
  1591. //        ucDebug_Value1 = (unsigned char)((((unsigned long*)Data)[3] >> 8) | 0x20);
  1592.         RTDSetBit(FX_LST_LEN_H_5A,0xff,0x08); //Enable DDS Spread Spectrum Output Function
  1593. RTDSetBit(DPLL_N_D2,0xff,0x20); //DPLL Spread Spectrum Enable
  1594. RTDSetBit(DPLL_FILTER_D3,0x7f,0x00); //Enable DPll output
  1595. }
  1596.         
  1597.    
  1598.     //usDH_Total  = usDH_Total - 2;
  1599.     // Set DH_TOTAL
  1600.     Data[0] = 5;
  1601.     Data[1] = Y_INC;
  1602.     Data[2] = DH_TOTAL_22;
  1603.     Data[3] = (unsigned char)(usDH_Total - 2);
  1604.     Data[4] = (unsigned char)((usDH_Total - 2) >> 8);
  1605.     Data[5] = 0;
  1606.     RTDWrite(Data);
  1607.     //Calculate DV_TOTAL
  1608. if((ucOption & 0x01) || (ucOption & 0x02))    // V scale up or scale down
  1609. {
  1610. #if(DISP_SIZE == DISP_800x600)
  1611. usDV_Total = (unsigned long)usVsync * 600 / (unsigned long)usIPV_ACT_LEN + 64;
  1612. #endif
  1613. #if(DISP_SIZE == DISP_1024x768)
  1614. usDV_Total = (unsigned long)usVsync * 768 / (unsigned long)usIPV_ACT_LEN + 64;
  1615. #endif
  1616. #if(DISP_SIZE == DISP_1280x1024)
  1617. usDV_Total = (unsigned long)usVsync * 1024 / (unsigned long)usIPV_ACT_LEN + 64;
  1618. #endif
  1619. }
  1620. else
  1621. usDV_Total = usVsync + 64;
  1622.     //Set DV_TOTAL
  1623. Data[0] = 5;
  1624. Data[1] = Y_INC;
  1625. Data[2] = DV_TOTAL_2D;
  1626. Data[3] = (unsigned char)usDV_Total;
  1627. Data[4] = (unsigned char)((usDV_Total >> 8) & 0x07);
  1628. Data[5] = 0;
  1629. RTDWrite(Data);
  1630.     // Calculate suitable IVS to DVS delay
  1631.     // CR[38] : IVS to DVS delay in IHS lines
  1632.     // CR[1E] : IVS to DVS delay in ICLK * 16
  1633.     ((unsigned int *)Data)[0]   = (unsigned long)32 * DV_ACT_STA_POS * usIPV_ACT_LEN / usDispLen;
  1634.     if (ucOption & 0x01)
  1635.     {
  1636.         if ((usIPV_ACT_STA + 1) < (((unsigned int *)Data)[0] >> 5))
  1637.         {
  1638.             // You should never get into this code ....
  1639.             usIPV_ACT_STA   = (((unsigned int *)Data)[0] >> 5) - 1;
  1640.             RTDSetByte(IPV_ACT_STA_0A, (unsigned char)usIPV_ACT_STA);
  1641.             RTDSetByte(IPV_ACT_STA_0A + 1, (unsigned char)(usIPV_ACT_STA >> 8));
  1642.         }
  1643.         ucDV_Delay  = usIPV_ACT_STA + 2 - (((unsigned int *)Data)[0] >> 5);     // V scale-up. Target 2.5~2.6 IHS delay
  1644.         // Too large IVS to DVS delay (2 + (22 / 32) = 86/32 = 2.6875 IHS); decrese ucDV_Delay
  1645.         if (22 < (((unsigned int *)Data)[0] & 0x001f))      ucDV_Delay  -= 1;
  1646.         ((unsigned int *)Data)[0]   = ((unsigned int *)Data)[0] + (ucDV_Delay * 32) - (usIPV_ACT_STA * 32);
  1647.         if (79 <= ((unsigned int *)Data)[0])
  1648.         {
  1649.             // Suitable IVS to DVS delay (79 / 32 = 2.46875). Fine-delay (CR[1E]) is not necessary
  1650.             RTDSetByte(FS_FT_DELAY_1E, 0x00);       // Disable fine-tune delay
  1651.         }
  1652.         else
  1653.         {
  1654.             // Fine tuning (CR[1E]) IVS to DVS delay to 2.5 (80/32) IHS.
  1655.             // Original Formula : Data[0] = usADC_Clock * ((80 - x) / 32) / 16
  1656.             Data[0] = (unsigned long)usADC_Clock * (80 - ((unsigned int *)Data)[0]) / 512;
  1657.             RTDSetByte(FS_FT_DELAY_1E, Data[0]);    // Enable fine-tune delay
  1658.         }
  1659.     }
  1660.     else
  1661.     {
  1662. #if (FULL_LINE_BUFFER)
  1663.         if ((usIPV_ACT_STA + 3) < (((unsigned int *)Data)[0] >> 5))
  1664.         {
  1665.             // You should never get into this code ....
  1666.             usIPV_ACT_STA   = (((unsigned int *)Data)[0] >> 5) - 3;
  1667.             RTDSetByte(IPV_ACT_STA_0A, (unsigned char)usIPV_ACT_STA);
  1668.             RTDSetByte(IPV_ACT_STA_0A + 1, (unsigned char)(usIPV_ACT_STA >> 8));
  1669.         }
  1670.         ucDV_Delay  = usIPV_ACT_STA + 3 - (((unsigned int *)Data)[0] >> 5);     // V no scale-up. Target 3.8~4.0 IHS delay
  1671.         ((unsigned int *)Data)[0]   = ((unsigned int *)Data)[0] + (ucDV_Delay * 32) - (usIPV_ACT_STA * 32);
  1672.         if (121 <= ((unsigned int *)Data)[0])
  1673.         {
  1674.             // Suitable IVS to DVS delay (121 / 32 = 3.78125). Fine-delay (CR[1E]) is not necessary
  1675.             RTDSetByte(FS_FT_DELAY_1E, 0x00);       // Disable fine-tune delay
  1676.         }
  1677.         else
  1678.         {
  1679.             // Fine tuning (CR[1E]) IVS to DVS delay to 3.8 (122/32) IHS.
  1680.             // Original Formula : Data[0] = usADC_Clock * ((122 - usScaleFactor) / 32) / 16
  1681.             Data[0] = (unsigned long)usADC_Clock * (122 - ((unsigned int *)Data)[0]) / 512;
  1682.             RTDSetByte(FS_FT_DELAY_1E, Data[0]);    // Enable fine-tune delay
  1683.         }
  1684. #else
  1685.         if ((usIPV_ACT_STA + 1) < (((unsigned int *)Data)[0] >> 5))
  1686.         {
  1687.             // You should never get into this code ....
  1688.             usIPV_ACT_STA   = (((unsigned int *)Data)[0] >> 5) - 1;
  1689.             RTDSetByte(IPV_ACT_STA_0A, (unsigned char)usIPV_ACT_STA);
  1690.             RTDSetByte(IPV_ACT_STA_0A + 1, (unsigned char)(usIPV_ACT_STA >> 8));
  1691.         }
  1692.         if (ucOption & 0x02)
  1693.         {
  1694.             // V scale-down            
  1695.             ucDV_Delay  = usIPV_ACT_STA + 1 - (((unsigned int *)Data)[0] >> 5);     // V scale-down. Target 2.5~2.6 IHS delay
  1696.             ((unsigned int *)Data)[0]   = ((unsigned int *)Data)[0] + (ucDV_Delay * 32) - (usIPV_ACT_STA * 32);
  1697.             if (81 <= ((unsigned int *)Data)[0])
  1698.             {
  1699.                 // Suitable IVS to DVS delay (81 / 32 = 2.53125). Fine-delay (CR[1E]) is not necessary
  1700.                 RTDSetByte(FS_FT_DELAY_1E, 0x00);       // Disable fine-tune delay
  1701.             }
  1702.             else
  1703.             {
  1704.                 // Fine tuning (CR[1E]) IVS to DVS delay to 2.5625 (82/32) IHS.
  1705.                 // Original Formula : Data[0] = usADC_Clock * ((82 - x) / 32) / 16
  1706.                 Data[0] = (unsigned long)usADC_Clock * (82 - ((unsigned int *)Data)[0]) / 512;
  1707.                 RTDSetByte(FS_FT_DELAY_1E, Data[0]);    // Enable fine-tune delay
  1708.             }
  1709.         }
  1710.         else
  1711.         {
  1712. /*
  1713.             // V no scale-down
  1714.             ucDV_Delay  = usIPV_ACT_STA + 1 - (((unsigned int *)Data)[0] >> 5);     // V no scale-down. Target 1.5~1.6 IHS delay
  1715.             // Too large IVS to DVS delay (1 + (22 / 32) = 54/32 = 1.6875 IHS); decrese ucDV_Delay
  1716.             if (22 < (((unsigned int *)Data)[0] & 0x001f))      ucDV_Delay  -= 1;
  1717.             ((unsigned int *)Data)[0]   = ((unsigned int *)Data)[0] + (ucDV_Delay * 32) - (usIPV_ACT_STA * 32);
  1718.         
  1719.             if (47 <= ((unsigned int *)Data)[0])
  1720.             {
  1721.                 // Suitable IVS to DVS delay (47 / 32 = 1.46875). Fine-delay (CR[1E]) is not necessary
  1722.                 RTDSetByte(FS_FT_DELAY_1E, 0x00);       // Disable fine-tune delay
  1723.             }
  1724.             else
  1725.             {
  1726.                 // Fine tuning (CR[1E]) IVS to DVS delay to 1.5 (48/32) IHS.
  1727.                 // Original Formula : Data[0] = usADC_Clock * ((48 - x) / 32) / 16
  1728.                 Data[0] = (unsigned long)usADC_Clock * (48 - ((unsigned int *)Data)[0]) / 512;
  1729.                 RTDSetByte(FS_FT_DELAY_1E, Data[0]);    // Enable fine-tune delay
  1730.             }
  1731. */
  1732.                     // The code below is also fine (written by Forster)
  1733. ucDV_Delay  = usIPV_ACT_STA + 1 - (((unsigned int *)Data)[0] >> 5);     // V no scale-up. Target 1.9 IHS delay
  1734. ((unsigned int *)Data)[0]   = ((unsigned int *)Data)[0] + (ucDV_Delay * 32) - (usIPV_ACT_STA * 32);
  1735. if (61 <= ((unsigned int *)Data)[0])
  1736. {
  1737. // Suitable IVS to DVS delay (61 / 32 = 1.90625). Fine-delay (CR[1E]) is not necessary
  1738. RTDSetByte(FS_FT_DELAY_1E, 0x00);       // Disable fine-tune delay
  1739. }
  1740. else
  1741. {
  1742. // Fine tuning (CR[1E]) IVS to DVS delay to 1.9375 (62/32) IHS.
  1743. // Original Formula : Data[0] = usADC_Clock * ((62 - usScaleFactor) / 32) / 16
  1744. Data[0] = (unsigned long)usADC_Clock * (62 - ((unsigned int *)Data)[0]) / 512;
  1745. RTDSetByte(FS_FT_DELAY_1E, Data[0]);    // Enable fine-tune delay
  1746. }
  1747.         }
  1748. #endif
  1749.     }
  1750. #if (FULL_LINE_BUFFER)
  1751.     // Turn on full-line buffer when no V scale-up
  1752.     RTDSetBit(OP_CRC_CTRL_68, 0xfc, (ucOption & 0x01) ? 0x00 : 0x02);
  1753. #else
  1754.     RTDSetBit(OP_CRC_CTRL_68, 0xfc, 0x00);
  1755. #endif
  1756.     // Set ucDV_Delay
  1757.     RTDSetByte(IV_DV_LINES_38, ucDV_Delay);
  1758. RTDSetByte(STATUS0_01, 0x00);  // Clear status
  1759.     RTDSetByte(STATUS1_1F, 0x00);  // Clear status
  1760.     // Switch to FrameSync 1 mode and enable display
  1761. //    if (PANEL_OFF == bPANEL_PWR)
  1762. //        RTDSetByte(VDIS_CTRL_20, 0x29 | DISP_BIT | DISPLAY_PORT);
  1763. //    else
  1764. //        RTDSetByte(VDIS_CTRL_20, 0x2b | DISP_BIT | DISPLAY_PORT);
  1765.     // Input Run Enable
  1766.     RTDSetBit(VGIP_CTRL_04, 0xff, 0x01);
  1767. }
  1768. void Display_VGA_Set(void)
  1769. {
  1770.     unsigned char   Wait_Time_Cnt;
  1771. // unsigned char   ucI_Corr0,ucI_Corr1;
  1772.     Initial_Mode();
  1773. Sharpness();
  1774.     if((usIPH_ACT_WID == 1280) && (DISP_SIZE == DISP_1280x1024) && (stGUD1.FILTER == 0x02))
  1775.          RTDSetBit(SCALE_CTRL_15, 0xff, 0x01);   // Turn on H scale-up
  1776.     
  1777.     PowerDown_ADC();
  1778.     //Device_Power(ADC_POWER,OFF);
  1779.     // Set user's ADC gain and offset settings
  1780.     SetADC_GainOffset();
  1781.     Set_Gamma();
  1782.     Set_Dithering();
  1783.     Set_Bright_Contrast();
  1784. //    Sharpness();
  1785.     Load_MUD(ucMode_Curr);      // Read mode default settings from 24C04
  1786.     // For jitter adjust
  1787.     ucPE_Level      = 0;
  1788. //    ucPE_Count      = 0;
  1789.     // Check Clock
  1790.     if (28 > stMUD.CLOCK || 228 < stMUD.CLOCK)      stMUD.CLOCK = 128;
  1791.     
  1792.     // Update Clock Twice
  1793.     Set_Clock();
  1794. // Calculate the P correction and I correction according to the CE value
  1795.     Delay_Xms(6);
  1796.     if(ucCE_Value ==  0)
  1797.     {
  1798.        RTDRead(I_CODE_MB_CA,1,N_INC);
  1799.    RTDSetByte(I_CODE_MB_CA, 0x0d);
  1800.    Delay_Xms(4);
  1801.    RTDRead(PLL_CALIBRATION_CE,1,N_INC);
  1802.    ucP_Corr = (unsigned char)((unsigned int)(Data[0] * 200) >> (29 - P_Code));
  1803.    ucCE_Value = Data[0];  //CE value  
  1804. }
  1805. if(ucI_Code == 0)
  1806.    Adjust_I_Code();
  1807.     
  1808.     Set_Clock();
  1809.     // Check Phase
  1810. //    stMUD.PHASE &= 0x7c;    // Phase 0~31
  1811.     // Update Phase
  1812. //    Set_Phase(stMUD.PHASE);
  1813.     ucH_Max_Margin  = 128 + 50;
  1814.     ucH_Min_Margin  = 128 - 50;
  1815. //Read the usIPH_ACT_STA offset
  1816.     I2CRead(ADDR_EROM1,(ucMode_Curr - 1),0x01);
  1817. if(Data[0] > 228)
  1818.    Data[0] = 0;
  1819.     usIPH_ACT_STA   = (Data[0] & 0x80) ? usIPH_ACT_STA - 50 - (Data[0] - 0x80) : usIPH_ACT_STA + Data[0] - 50;
  1820.         
  1821.     Data[0] = 5;
  1822.     Data[1] = Y_INC;
  1823.     Data[2] = IPH_ACT_STA_06;
  1824.     Data[3] = (unsigned char)usIPH_ACT_STA;
  1825.     Data[4] = (unsigned char)(usIPH_ACT_STA >> 8);
  1826.     Data[5] = 0;    
  1827.     RTDWrite(Data);
  1828.     // Check H-Position
  1829.     if (ucH_Max_Margin < stMUD.H_POSITION)
  1830.         stMUD.H_POSITION    = ucH_Max_Margin;
  1831.     else if (ucH_Min_Margin > stMUD.H_POSITION)
  1832.         stMUD.H_POSITION    = ucH_Min_Margin;
  1833.     // Update H-Position
  1834.     Set_H_Position();
  1835.        // Check Phase
  1836.     stMUD.PHASE &= 0x7c;    // Phase 0~31
  1837.     // Update Phase
  1838.     Set_Phase(stMUD.PHASE);
  1839.     // Start auto-tracking function once
  1840.     RTDSetByte(AUTO_ADJ_CTRL_7F, 0x01);
  1841.     Delay_Xms(40);
  1842.     // Force to stop auto-tracking function
  1843.     RTDSetByte(AUTO_ADJ_CTRL_7F, 0x00);
  1844.     Delay_Xms(40);
  1845.     // Measure actual number of scan line in each frame
  1846.     Data[0]     = 14;
  1847.     Data[1]     = Y_INC;
  1848.     Data[2]     = H_BND_STA_L_75;
  1849.     Data[3]     = 0x00;
  1850.     Data[4]     = 0xff;
  1851.     Data[5]     = 0x07;
  1852.     Data[6]     = 0x00;
  1853.     Data[7]     = 0x00;
  1854.     Data[8]     = 0x00;
  1855.     Data[9]     = 0x00;
  1856.     Data[10]    = 0x00;
  1857.     Data[11]    = 0x00;
  1858.     Data[12]    = 0x00;
  1859.     Data[13]    = 0x01;
  1860.     Data[14]    = 0;
  1861.     RTDWrite(Data);
  1862.     Wait_Time_Cnt  = 60;    // Tracking timeout 60ms        
  1863.     do
  1864.     {   
  1865.         Delay_Xms(1);
  1866.         RTDRead(AUTO_ADJ_CTRL_7F, 0x01, N_INC);
  1867.     }
  1868.     while ((Data[0] & 0x01) && (--Wait_Time_Cnt));
  1869.     RTDSetByte(AUTO_ADJ_CTRL_7F, 0x00);
  1870.     
  1871.     if (Wait_Time_Cnt)
  1872.     {
  1873.         RTDRead(VER_START_80, 0x04, Y_INC);
  1874.         Data[0] = Data[3] & 0x0f;
  1875.         Data[1] = Data[2];
  1876.         usVer_End   = (usVsync < ((unsigned int *)Data)[0]) ? ((unsigned int *)Data)[0] : usVsync;
  1877.     }
  1878.     else
  1879.     {
  1880.         usVer_End   = usVsync;
  1881.     }
  1882.     // Update to reasonable usIPV_ACT_STA for user mode
  1883.     if (MODE_USER720x400 <= ucMode_Curr)
  1884.     {
  1885.         ((unsigned int *)Data)[0]   = usVer_End - VGA_Mode[ucMode_Curr][2];
  1886.         if (254 < ((unsigned int *)Data)[0] + ucDV_Delay)   ((unsigned int *)Data)[0]   = 254 - ucDV_Delay;
  1887.         usIPV_ACT_STA   += ((unsigned int *)Data)[0];
  1888.         ucDV_Delay      += ((unsigned int *)Data)[0];
  1889.     }
  1890.     // Set the ucV_Min_Margin/ucV_Max_Margin
  1891.     ucV_Min_Margin  = (128 < usIPV_ACT_STA) ? 0 : 128 - usIPV_ACT_STA + 1;
  1892.     if ((128 - 50) > ucV_Min_Margin)    ucV_Min_Margin  = 128 - 50;
  1893.     ((unsigned int *)Data)[0]   = (usVer_End + 128 - 2) - (usIPV_ACT_STA + usIPV_ACT_LEN);
  1894.     ucV_Max_Margin  = (((unsigned int *)Data)[0] > 0x00ff) ? 0xff : ((unsigned int *)Data)[0];
  1895.     // Check ucV_Min_Margin/ucV_Max_Margin :
  1896.     // ucDV_Delay can only range from 0 to 254
  1897.     // Original Formula :
  1898.     // 128 - ucV_Min_Margin >= ucDV_Delay
  1899.     // ucV_Max_Margin - 128 >= 254 - ucDV_Delay
  1900.     if ((unsigned int)128 > ((unsigned int)ucV_Min_Margin + ucDV_Delay))    ucV_Min_Margin  = 128 - ucDV_Delay;
  1901.     if ((unsigned int)382 < ((unsigned int)ucV_Max_Margin + ucDV_Delay))    ucV_Max_Margin  = 382 - ucDV_Delay;
  1902.     if ((128 + 50) < ucV_Max_Margin)    ucV_Max_Margin  = 128 + 50;
  1903.     // Check V-Position
  1904.     if (ucV_Min_Margin > stMUD.V_POSITION)
  1905.         stMUD.V_POSITION    = ucV_Min_Margin;
  1906.     else if ((unsigned int)256 - ucV_Min_Margin < stMUD.V_POSITION)
  1907.         stMUD.V_POSITION    = (unsigned int)256 - ucV_Min_Margin;
  1908.     // Update V-Position
  1909.     Set_V_Position();
  1910.     // Re-calculate actual refresh rate
  1911.     ((unsigned long *)Data)[0]  = (unsigned long)usHsync * usVer_End;
  1912.     ucRefresh   = (unsigned long)49152000 / ((unsigned long *)Data)[0];
  1913.     ucRefresh   = (ucRefresh & 0x01) ? ((ucRefresh + 1) >> 1) : (ucRefresh >> 1);
  1914.     
  1915. if(ucRefresh > V_OVERSPEC_FREQ)
  1916.     bOverSpec = _TRUE;
  1917. if((unsigned int)24576/usHsync > H_OVERSPEC_FREQ)
  1918.     bOverSpec = _TRUE;
  1919.     Data[0] = Frame_Sync();
  1920.     if (1 == Data[0])
  1921.     {
  1922.        Delay_Xms(10);
  1923.        Data[0] = Frame_Sync();     // Fail. Try again       
  1924.     }
  1925.     bFrameSync      = Data[0] ? 0 : 1;              // 0 : fail, 1 : pass
  1926.     ucSyncErrorCnt  = 0;
  1927.     RTDSetBit(OVL_CTRL_6D,0x3f,0x00);
  1928.     RTDSetByte(BGCOLOR_CONTROL_6C,0x00);
  1929. RTDSetBit(OVL_CTRL_6D,0x3f,0x40);
  1930.     RTDSetByte(BGCOLOR_CONTROL_6C,0x00);
  1931. RTDSetBit(OVL_CTRL_6D,0x3f,0x80);
  1932.     RTDSetByte(BGCOLOR_CONTROL_6C,0x00);
  1933. //    RTDSetBit(VDIS_CTRL_20, 0x5f, DHS_MASK);        // Normal display
  1934.       RTDSetBit(VDIS_CTRL_20, 0x7f, 0x20 | DHS_MASK);        // Normal display
  1935. #if(AS_PLL_NONLOCK)
  1936.    if(bFrameSync)
  1937.         RTDSetBit(ODD_CTRL_8E,0xdf,0x20);
  1938. #endif
  1939. }
  1940. void Display_DVI_Set(void)
  1941. {
  1942. #if(TMDS_ENABLE)
  1943.     unsigned char   Wait_Time_Cnt;
  1944.     Initial_Mode();
  1945.     // Set the ucV_Min_Margin/ucV_Max_Margin
  1946.     ucV_Min_Margin  = (128 < usIPV_ACT_STA) ? 0 : 128 - usIPV_ACT_STA + 1;
  1947.     // Use Data[8],Data[9] as a temporary 16-bit variable.
  1948.     ((unsigned int *)Data)[4]   = (usVsync + 128 - 2) - (usIPV_ACT_STA + usIPV_ACT_LEN);
  1949.     ucV_Max_Margin  = (0x00ff <  ((unsigned int *)Data)[4]) ? 0xff :  ((unsigned int *)Data)[4];
  1950.     // Check ucV_Min_Margin/ucV_Max_Margin :
  1951.     // ucDV_Delay can only range from 0 to 254
  1952.     // Original Formula :
  1953.     // 128 - ucV_Min_Margin <= ucDV_Delay
  1954.     // ucV_Max_Margin - 128 <= 254 - ucDV_Delay
  1955.     if ((unsigned int)128 > ((unsigned int)ucV_Min_Margin + ucDV_Delay))    ucV_Min_Margin  = 128 - ucDV_Delay;
  1956.     if ((unsigned int)382 < ((unsigned int)ucV_Max_Margin + ucDV_Delay))    ucV_Max_Margin  = 382 - ucDV_Delay;
  1957.     // Read mode default settings from 24C04
  1958.     Load_MUD(ucMode_Curr);
  1959.     Set_Gamma();
  1960.     Set_Dithering();
  1961.     Set_Bright_Contrast();
  1962.     Sharpness();
  1963.     // Issac :
  1964.     // RTD controller can support both digital mode and analog mode to capture input image data.
  1965.     // In digital mode, input image data is captured according to input data enable (IDEN) signal;
  1966.     // In analog mode, input image data is captured according to capture window settings;
  1967.     // Although can support both of them, I always use analog mode to capture input image in this F/W.
  1968.     // Because RTD controller can measure the position and size of IDEN signal, we can just set our
  1969.     // capture window to be the same size and position as IDEN.
  1970.     Data[0]     = 14;
  1971.     Data[1]     = Y_INC;
  1972.     Data[2]     = H_BND_STA_L_75;
  1973.     Data[3]     = 0x02;
  1974.     Data[4]     = usADC_Clock - 2;
  1975.     Data[5]     = (usADC_Clock - 2) >> 8;
  1976.     Data[6]     = 0x02;
  1977.     Data[7]     = usVsync - 2;
  1978.     Data[8]     = (usVsync - 2) >> 8;
  1979.     Data[9]     = 0;
  1980.     Data[10]    = 0;
  1981.     Data[11]    = 0;
  1982.     Data[12]    = 0;
  1983.     Data[13]    = 0x81;     // Measure IDEN position
  1984.     Data[14]    = 0;
  1985.     RTDWrite(Data);
  1986.     Wait_Time_Cnt  = 60;    // Tracking timeout 60ms        
  1987.     do
  1988.     {   
  1989.         Delay_Xms(1);
  1990.         RTDRead(AUTO_ADJ_CTRL_7F, 0x01, N_INC);
  1991.     }
  1992.     while ((Data[0] & 0x01) && (--Wait_Time_Cnt));
  1993.     
  1994.     if (0 == Wait_Time_Cnt)
  1995.     {
  1996.         RTDSetByte(AUTO_ADJ_CTRL_7F, 0x00);
  1997.         Reset_Mode();
  1998.     }
  1999.     else
  2000.     {
  2001.         // Read IDEN position information
  2002.         RTDRead(VER_START_80, 0x08, Y_INC);
  2003.         
  2004.         // IDEN horizontal Start
  2005.         usIPH_ACT_STA   = (unsigned int)Data[4] + ((unsigned int)Data[5] << 8) - 2;
  2006.         // IDEN vertical Start
  2007.         ((unsigned int *)Data)[0]   = (unsigned int)Data[0] + ((unsigned int)Data[1] << 8) - 1;
  2008.         if (((unsigned int *)Data)[0] > (usIPV_ACT_STA + ucV_Max_Margin - 0x80))
  2009.         {
  2010.             ((unsigned int *)Data)[1]   = (usVsync + 128 - 2) - (usIPV_ACT_STA + usIPV_ACT_LEN);    // Actual V max. Margin
  2011.             ucDV_Delay      = (unsigned char)((unsigned int)ucDV_Delay + ucV_Max_Margin - 0x80);
  2012.             usIPV_ACT_STA   = usIPV_ACT_STA + ucV_Max_Margin - 0x80;
  2013.             if (ucV_Max_Margin < ((unsigned int *)Data)[1])
  2014.             {
  2015.                 // We have to increase IVS delay to fix ucV_Max_Margin
  2016.                 if ((((unsigned int *)Data)[1] - ucV_Max_Margin) >= (((unsigned int *)Data)[0] - usIPV_ACT_STA))
  2017.                     ((unsigned int *)Data)[1]   = ((unsigned int *)Data)[0] - usIPV_ACT_STA + PROGRAM_VDELAY;
  2018.                 else
  2019.                     ((unsigned int *)Data)[1]   = usIPV_ACT_STA + ((unsigned int *)Data)[1] - ucV_Max_Margin + PROGRAM_VDELAY;
  2020.                 if (126 < ((unsigned int *)Data)[1])    ((unsigned int *)Data)[1]  = 126;
  2021.                 RTDSetByte(IVS_DELAY_8C, 0x80 | ((unsigned int *)Data)[1]);
  2022.             }
  2023.         }
  2024.         else if (((unsigned int *)Data)[0] < (usIPV_ACT_STA + ucV_Min_Margin - 0x80))
  2025.         {
  2026.             ucDV_Delay      = (unsigned char)((unsigned int)ucDV_Delay + ucV_Min_Margin - 0x80);
  2027.             usIPV_ACT_STA   = usIPV_ACT_STA + ucV_Min_Margin - 0x80;
  2028.             ((unsigned int *)Data)[1]   = usIPV_ACT_STA - ((unsigned int *)Data)[0];
  2029.             // We have to decrease IVS delay to fix ucV_Min_Margin
  2030.             if (PROGRAM_VDELAY <= ((unsigned int *)Data)[1])
  2031.                 RTDSetByte(IVS_DELAY_8C, 0x00);
  2032.             else
  2033.                 RTDSetByte(IVS_DELAY_8C, 0x80 | (PROGRAM_VDELAY - ((unsigned int *)Data)[1]));
  2034.         }
  2035.         else
  2036.         {
  2037.             ucDV_Delay      = ((unsigned int *)Data)[0] + ucDV_Delay - usIPV_ACT_STA ;
  2038.             usIPV_ACT_STA   = ((unsigned int *)Data)[0];
  2039.         }
  2040. RTDRead(TMDS_CORRECTION_FF,0x01,N_INC);
  2041. if(Data[0] & 0x03)
  2042.     usIPH_ACT_STA -= 14;//if TMDS error correction enable, then compensate the IPH_ACT_STA offset.
  2043.         Data[0]     = 5;
  2044.         Data[1]     = Y_INC;
  2045.         Data[2]     = IPH_ACT_STA_06;
  2046.         Data[3]     = (unsigned char)(usIPH_ACT_STA & 0x00ff);
  2047.         Data[4]     = (unsigned char)((usIPH_ACT_STA >> 8) & 0x00ff);
  2048.         Data[5]     = 5;
  2049.         Data[6]     = Y_INC;
  2050.         Data[7]     = IPV_ACT_STA_0A;
  2051.         Data[8]     = (unsigned char)(usIPV_ACT_STA & 0x00ff);
  2052.         Data[9]     = (unsigned char)((usIPV_ACT_STA >> 8) & 0x00ff);
  2053.         Data[10]    = 4;
  2054.         Data[11]    = N_INC;
  2055.         Data[12]    = IV_DV_LINES_38;
  2056.         Data[13]    = ucDV_Delay;
  2057.         Data[14]    = 0;
  2058.         RTDWrite(Data);
  2059.         Wait_For_Event(EVENT_DVS);
  2060.         Data[0] = Frame_Sync();
  2061.         
  2062.         if (1 == Data[0])   Data[0] = Frame_Sync();     // Fail. Try again
  2063.         bFrameSync      = Data[0] ? 0 : 1;              // 0 : fail, 1 : pass
  2064.         ucSyncErrorCnt  = 0;
  2065.         //RTDSetBit(VDIS_CTRL_20, 0x5f, DHS_MASK);        // Normal display
  2066. RTDSetBit(VDIS_CTRL_20, 0x7f, 0x20 | DHS_MASK);        // Normal display
  2067.     }
  2068. #else
  2069.     Seek_DVI_Mode(0);
  2070. #endif
  2071. }
  2072. void Set_Video_Mode(void)
  2073. {
  2074. #if(VIDEO_CHIP != VDC_NONE)
  2075. #if (VIDEO_CHIP == VDC_SAA7114 || VIDEO_CHIP == VDC_SAA7115 || VIDEO_CHIP == VDC_SAA7118)
  2076.     I2CWrite(V_DISABLE);
  2077.     I2CWrite(VIDEO_ALL);
  2078.     I2CWrite((ucAV_Mode & 0x02) ? VIDEO_50 : VIDEO_60);
  2079. #endif
  2080.     RTDCodeW((ucAV_Mode & 0x02) ? RTD_VIDEO_50 : RTD_VIDEO_60);
  2081. //    if (PANEL_OFF == MCU_ReadPanelPower())
  2082.     if (OFF == bPanel_Status)
  2083.     {
  2084.         RTDSetByte(VDIS_SIGINV_21, 0x00 | DISP_EO_SWAP | DISP_RB_SWAP | DISP_ML_SWAP);       // DHS, DVS, DEN, DCLK MUST NOT be inverted.
  2085.         RTDSetBit(VDIS_CTRL_20, 0xfd, 0x01);    // DHS, DVS, DEN, DCLK and data are clamped to 0
  2086.     }
  2087. //#if (SPREAD_SPECTRUM)
  2088. //    RTDSetBit(DPLL_CTRL_D0, 0x01, 0x08);
  2089. //    RTDRead(DPLL_M_D1, 0x01, Y_INC);
  2090. //    if (0xd2 < Data[0])
  2091. //        Data[1] = 0x09;
  2092. //    else if (0x8d < Data[0])
  2093. //        Data[1] = 0x0a;
  2094. //    else if (0x6d < Data[0])
  2095. //        Data[1] = 0x0b;
  2096. //    else if (0x57 < Data[0])
  2097. //        Data[1] = 0x0c;
  2098. //    else if (0x47 < Data[0])
  2099. //        Data[1] = 0x0d;
  2100. //    else if (0x37 < Data[0])
  2101. //        Data[1] = 0x0e;
  2102. //    else
  2103. //        Data[1] = 0x0f;
  2104. //    RTDSetByte(DPLL_FILTER_D3, Data[1]);
  2105. //    RTDSetByte(DPLL_SSP_D4, 0xf7);
  2106. //#endif
  2107. #if (VIDEO_CHIP == VDC_SAA7118)
  2108.     if (SOURCE_YUV == (stGUD1.INPUT_SOURCE & 0x07))
  2109.     {
  2110.         I2CWrite(VIDEO_YUV);
  2111.     }
  2112.     else
  2113. #endif
  2114.     {
  2115.         Data[0] = (SOURCE_SV == (stGUD1.INPUT_SOURCE & 0x07)) ? 0 : 1;
  2116.         switch (ucAV_Mode)
  2117.         {
  2118.         case 0x01:          //(60Hz) NTSC-M, JAPAN(7111A)
  2119.         case 0x81:          //(60Hz) Default
  2120.             I2CWrite(Data[0] ? AV_60_0 : SV_60_0);
  2121.             break;
  2122.         case 0x11:          //(60Hz) PAL-4.43
  2123.             I2CWrite(Data[0] ? AV_60_1 : SV_60_1);
  2124.             break;
  2125.         case 0x21:          //(60Hz) NTSC-4.43
  2126.             I2CWrite(Data[0] ? AV_60_2 : SV_60_2);
  2127.             break;
  2128.         case 0x31:          //(60Hz) PAL-M
  2129.             I2CWrite(Data[0] ? AV_60_3 : SV_60_3);
  2130.             break;
  2131.         case 0x41:          //(60Hz) NTSC-JAPAN(7114)
  2132.             I2CWrite(Data[0] ? AV_60_4 : SV_60_4);
  2133.             break;
  2134.         case 0x02:          //(50Hz) PAL-BGHI
  2135.         case 0x82:          //(50Hz) Default
  2136.             I2CWrite(Data[0] ? AV_50_0 : SV_50_0);
  2137.             RTDSetBit(VGIP_SIGINV_05,0xff,0x10);
  2138.             break;
  2139.         case 0x12:          //(50Hz) NTSC-4.43
  2140.             I2CWrite(Data[0] ? AV_50_1 : SV_50_1);
  2141.             break;
  2142.         case 0x22:          //(50Hz) PAL-N
  2143.             I2CWrite(Data[0] ? AV_50_2 : SV_50_2);
  2144.             break;
  2145.         case 0x32:          //(50Hz) NTSC-N
  2146.             I2CWrite(Data[0] ? AV_50_3 : SV_50_3);
  2147.             break;
  2148.         case 0x42:          //Reserved
  2149.             I2CWrite(Data[0] ? AV_50_4 : SV_50_4);
  2150.             break;
  2151.         case 0x03:          //(50Hz) SECAM
  2152.             I2CWrite(Data[0] ? AV_SECAM : SV_SECAM);
  2153. RTDSetBit(VGIP_SIGINV_05,0xff,0x10);
  2154.             break;
  2155.         default:    
  2156.             break;
  2157.         }
  2158.     }
  2159. #endif
  2160. }
  2161. void Display_Video_Set(void)
  2162. {    
  2163. #if(VIDEO_CHIP != VDC_NONE)
  2164.     unsigned char ucCounter;
  2165.     Load_MUD(ucMode_Curr);      // Read mode default settings from 24C04
  2166.     Set_Video_Mode();
  2167.     if (SOURCE_TV == (stGUD1.INPUT_SOURCE & 0x07))      I2CWrite(TV_SOURCE_SEL);
  2168.     // Read H,V Standard Start Position and H Width
  2169.     RTDRead(IPH_ACT_STA_06, 0x08, Y_INC);
  2170.     usIPH_ACT_STA   = (unsigned int)Data[0] + ((unsigned int)Data[1] << 8);
  2171.     usIPH_ACT_STA   = usIPH_ACT_STA & 0x07ff;
  2172.     usIPH_ACT_WID   = (unsigned int)Data[2] + ((unsigned int)Data[3] << 8);
  2173.     usIPH_ACT_WID   = usIPH_ACT_WID & 0x07ff;
  2174.     usIPV_ACT_STA   = (unsigned int)Data[4] + ((unsigned int)Data[5] << 8);
  2175.     usIPV_ACT_STA   = usIPV_ACT_STA & 0x07ff;
  2176.     usIPV_ACT_LEN   = (unsigned int)Data[6] + ((unsigned int)Data[7] << 8);
  2177.     usIPV_ACT_LEN   = usIPV_ACT_LEN & 0x07ff;
  2178.     // Read ucDH_TOTAL
  2179.     RTDRead(DH_TOTAL_22, 2, Y_INC);
  2180.     usDH_Total  = ((unsigned int)(Data[1] & 0x07) << 8) + Data[0];
  2181.     
  2182.     // Read ucDV_Delay
  2183.     RTDRead(IV_DV_LINES_38, 1, N_INC);
  2184.     ucDV_Delay  = Data[0];
  2185.     ucV_Max_Margin  = 0x80;
  2186.     ucV_Min_Margin  = 0x80;
  2187.     Set_Gamma();
  2188.     Set_Dithering();
  2189.     Set_Bright_Contrast();
  2190.     Sharpness();
  2191.     // Update VDC's Contrast/Brightness/Hue/Saturation
  2192.     SetVDC_Color();
  2193.     ucCounter   = 28;
  2194.     do
  2195.     {
  2196.         RTDSetByte(SYNC_POR_4C, 0x00);  // Reset Sync Processor
  2197.         Measure_Mode();
  2198.         Delay_Xms(80);
  2199.         RTDRead(SYNC_POR_4C, 0x05, Y_INC);
  2200.         if (Data[0] & 0x02)
  2201.         {
  2202.             usHsync = 0;
  2203.             usVsync = 0;
  2204.         }
  2205.         else
  2206.         {
  2207.             Data[5] = Data[3];
  2208.             Data[4] = Data[4] & 0x87;
  2209.             Data[3] = Data[1];
  2210.             Data[2] = Data[2] & 0x8f;
  2211.             usHsync = ((unsigned int *)Data)[1];    // Current usHsync timing
  2212.             usVsync = ((unsigned int *)Data)[2];    // Current usVsync timing
  2213.             if (0x07ff <= usHsync || 0x07ff <= usVsync || 0 == usHsync || 0 == usVsync)
  2214.             {
  2215.                 usHsync = 0;
  2216.                 usVsync = 0;
  2217.             }
  2218.             else
  2219.             {
  2220.                 break;
  2221.             }
  2222.         }
  2223.     }
  2224.     while (--ucCounter);
  2225. RTDSetByte(STATUS0_01, 0x00);  // Clear status  
  2226.     RTDSetByte(STATUS1_1F, 0x00);  // Clear status
  2227. Data[0] = Frame_Sync();
  2228.     if (1 == Data[0])   Data[0] = Frame_Sync();     // Fail. Try again
  2229.     bFrameSync      = Data[0] ? 0 : 1;              // 0 : fail, 1 : pass
  2230.    
  2231.     ucSyncErrorCnt  = 0;
  2232. // RTDSetBit(VDIS_CTRL_20, 0x5f, DHS_MASK);        // Normal display
  2233.     RTDSetBit(VDIS_CTRL_20, 0x7f, 0x20 | DHS_MASK);        // Normal display
  2234. #else
  2235.     Set_Video_Mode();
  2236. #endif
  2237. }
  2238. void Input_Mode_Detector(void)
  2239. {
  2240.  RTDRead(SYNC_POR_4C, 0x01, N_INC);
  2241.             
  2242.             if (0 == (Data[0] & 0x02))      ucModeCnt   = 0;
  2243.             if (ucModeCnt)
  2244.             {                  
  2245.      ucModeCnt   -= 1;
  2246.             }
  2247.             else
  2248.             {
  2249.                 ucModeCnt   = MODE_DETECT_FREQ;
  2250. #if(SOURCE_AUTO_SCAN) 
  2251.                 Source_Auto_Scan();
  2252. #else
  2253.                 Mode_Detector();
  2254. #endif
  2255.                 if (!bStable)
  2256.                 {
  2257.                     bReload     = 1;            // Reload user's font
  2258.                     Set_Task(STATE_MODECHANGE); // Notify Task State Machine
  2259.                 }
  2260.             }
  2261. }