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

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