mstar.lst

来自「MSTARXX.rar」· LST 代码 · 共 1,506 行 · 第 1/5 页

LST
1,506
字号
1160   1          #if VGA_ENABLE
1161   1          if( IsVGAInUse())
1162   1          {
1163   2              if( g_bInputTimingChangeFlag || SyncLossState() || UnsupportedModeFlag )
1164   2                  return FALSE;
1165   2          }
1166   1          else // Digital port
1167   1          #endif
C51 COMPILER V8.18   MSTAR                                                                 09/29/2009 23:58:02 PAGE 20  

1168   1          {
1169   2              if( (SIG_NONE == g_VdInfo.ucVideoSystem)
1170   2                ||(0 ==(g_VdInfo.wVideoStatus&VD_HSYNC_LOCKED)))
1171   2                  return FALSE;
1172   2          }
1173   1          return TRUE;
1174   1      }
1175          
1176          
1177          void SetOutputTimingAndWindow( BYTE ucOutputTimingCtl )
1178          {
1179   1          // Get input sync info
1180   1          if( IsSrcHasSignal() || (ucOutputTimingCtl&OUTPUT_SNOW) ) // Has signal or snow
1181   1          {
1182   2              GetInputSignalHV();
1183   2          }
1184   1          else // No signal or Freerun
1185   1          {
1186   2              g_InOutCtl.inOutVFreq = 60;
1187   2      
1188   2              if( g_InOutCtl.inOutVFreq == 50 )
1189   2              {
1190   3                  g_InOutCtl.inHFreq = 15625;
1191   3                  g_InOutCtl.inVTotal = 625;
1192   3              }
1193   2              else // 60 Hz
1194   2              {
1195   3                  g_InOutCtl.inHFreq = 15734;
1196   3                  g_InOutCtl.inVTotal = 525;
1197   3              }
1198   2              g_InOutCtl.inHPeriod = MST_CLOCK_HZ/g_InOutCtl.inHFreq;
1199   2          }
1200   1      
1201   1          msProgWindow( ucOutputTimingCtl );
1202   1          msSetOutputTiming( ucOutputTimingCtl ); // This function must after msProgWindow()
1203   1      
1204   1          #if (PANEL_TYPE>=PanelSHARP08_DT) //for digital panel only
                  if(ucOutputTimingCtl&OUTPUT_SNOW) // Has signal or snow
                      msWriteRegsTbl(tTVSnowModeTbl);
                  #endif
1208   1      }
1209          
1210          void msSetScaler(void)
1211          {
1212   1      #if (!WidePanel)
                 msLoadModeIndexTBL(tModeIndexTbl);
              #else
1215   1      
1216   1        BYTE  ucBank;
1217   1        WORD  ulNewHsize,uwInput_H_Resol,uwTemp;
1218   1        DWORD ulH_Scaling_Factor, ulTemp;
1219   1      
1220   1          ucBank = msReadByte(BK0_00_REGBK); // store bank
1221   1          msWriteByte( BK0_00_REGBK, REG_BANK_SCALER); // bank 1
1222   1      
1223   1          if (g_VideoSetting.Scaling==Scaling_Full)
1224   1          {
1225   2          #if VGA_ENABLE
1226   2              if(IsVGAInUse())
1227   2                      SetScalingRatio( g_InOutCtl.bInterlace );
1228   2              else
1229   2          #endif
C51 COMPILER V8.18   MSTAR                                                                 09/29/2009 23:58:02 PAGE 21  

1230   2             SetScalingRatio( 1 );
1231   2             msWriteWord(BK0_49_SIHST_H, PanelHStart);         // horizontal DE start
1232   2             msWriteWord(BK0_43_HFDEST_H, PanelHStart);         // horizontal DE start
1233   2             msWriteWord(BK0_4D_SIHEND_H, (PanelHStart + PanelWidth - 1)); // Image H end
1234   2             msWriteWord(BK0_47_HFDEEND_H, (PanelHStart+ PanelWidth - 1));   // horizontal DE end
1235   2      
1236   2             msLoadModeIndexTBL(tModeIndexTbl);
1237   2             //printMsg("test 169");
1238   2          }
1239   1          else
1240   1          {
1241   2            msWriteByte(BK0_38_NLDTI, 0x00);                          // Disable Nonlinear scaling function
1242   2      
1243   2            //ulNewHsize=PANEL_DOT_HEIGHT;//X*4/3=>4:3,X/3=>3dot in 1 pixel
1244   2            //ulNewHsize=ulNewHsize*PanelHeight;
1245   2            //ulNewHsize=ulNewHsize/PANEL_DOT_WIDTH;
1246   2            //ulNewHsize=(ulNewHsize*SCAL_RATIO_NUMERATOR)/(SCAL_RATIO_DENOMINATOR*3);
1247   2            ulNewHsize=PanelWidth*3/4;
1248   2      
1249   2            uwInput_H_Resol = msReadWord(BK0_0C_SPRHDC_H);//Get Input H resolution
1250   2      
1251   2            //New start point
1252   2            uwTemp = PanelHStart+ (PanelWidth- ulNewHsize )/2;
1253   2            msWriteWord(BK0_49_SIHST_H,uwTemp);//new Start    //BK0_48_SIHST_L, BK0_49_SIHST_H
1254   2            msWriteWord(BK0_43_HFDEST_H,uwTemp);
1255   2      
1256   2            // New end point
1257   2            msWriteWord(BK0_4D_SIHEND_H,uwTemp+ulNewHsize);//new End //BK0_4C_SIHEND_L, BK0_4D_SIHEND_H
1258   2            msWriteWord(BK0_47_HFDEEND_H,uwTemp+ulNewHsize);
1259   2      
1260   2            // Get new scaling factor
1261   2            ulH_Scaling_Factor = (DWORD)ulNewHsize <<20 ;
1262   2            ulTemp = (DWORD)uwInput_H_Resol*(SCAL_CUTOFF_RESOL - SCAL_CUTOFF_H_PER);
1263   2            ulH_Scaling_Factor /= (ulTemp/SCAL_CUTOFF_RESOL);
1264   2      
1265   2            // Mask the front and back block
1266   2            // msWriteWord(BK0_5D_FRAME_COLOR_2,0);//BK0_5C_FRAME_COLOR_1, BK0_5D_FRAME_COLOR_2
1267   2      
1268   2            ulH_Scaling_Factor += 0xC00;//0xc00 get from fine tune
1269   2      
1270   2            msWriteWord(BK0_31_SRH_M,(unsigned int)(ulH_Scaling_Factor&0xFFF000) );//BK0_30_SRH_L,BK0_31_SRH_M
1271   2            msWriteByte(BK0_32_SRH_H,(unsigned char)((ulH_Scaling_Factor&0x0F0000)>>16)+0xC0);
1272   2            //printMsg("test 43");
1273   2          }
1274   1      
1275   1          msWriteByte( BK0_00_REGBK, ucBank); // bank 1
1276   1      #endif
1277   1      }
1278          
1279          
1280          void msSetLineBufferClock( BYTE ucModeIdx, BYTE ucOutputClock )
1281          {
1282   1          BYTE ucInputClock;
1283   1          BYTE ucBank;
1284   1          BYTE ucBk0_36_val = 0; // Use default clock
1285   1      
1286   1          ucInputClock = ((float)GetStdModeHTotal(ucModeIdx)*GetStdModeHFreq(ucModeIdx))/10000;
1287   1      
1288   1      #ifndef D800480PANEL
1289   1          if( ucInputClock > 50 )
1290   1              ucBk0_36_val = 0x80; // Using input clock
1291   1          else
C51 COMPILER V8.18   MSTAR                                                                 09/29/2009 23:58:02 PAGE 22  

1292   1      #endif
1293   1              ucInputClock = 50;
1294   1      
1295   1          if( ucOutputClock > ucInputClock )
1296   1              ucBk0_36_val = 0x40; // Using output clock
1297   1      
1298   1          ucBank = msReadByte( BK0_00_REGBK);
1299   1          msWriteByte( BK0_00_REGBK, 0 );
1300   1          msWriteByteMask( BK0_36_VDSUSG, ucBk0_36_val, 0xC0 );
1301   1          msWriteByte( BK0_00_REGBK, ucBank );
1302   1      }
1303          
1304          void msSetOutputFreeRunClock( BYTE ucVFreq )
1305          {
1306   1          BYTE ucBank = msReadByte( BK0_00_REGBK);
1307   1      
1308   1          msWriteByte( BK0_00_REGBK, REG_BANK_SCALER);
1309   1      
1310   1      #if PANEL_ANALOG_TCON
1311   1          if( ucVFreq != 60 )
1312   1              msWrite3Bytes( BK0_27_OPL_SET2, PANEL_FREE_RUN_DCLK_FACTOR*60/ucVFreq/3 );
1313   1          else
1314   1              msWrite3Bytes( BK0_27_OPL_SET2, PANEL_FREE_RUN_DCLK_FACTOR/3 );
1315   1      #else
                  if( ucVFreq != 60 )
                      msWrite3Bytes( BK0_27_OPL_SET2, PANEL_FREE_RUN_DCLK_FACTOR*60/ucVFreq );
                  else
                      msWrite3Bytes( BK0_27_OPL_SET2, PANEL_FREE_RUN_DCLK_FACTOR );
              #endif
1321   1      
1322   1          msSetLineBufferClock( MD_720x480_60I, PANEL_FREE_RUN_DCLK/1000000);
1323   1      
1324   1          msWriteByte( BK0_00_REGBK, ucBank );
1325   1      }
1326          
1327          void SetOutputClock( BYTE ucOutputTimingCtl )
1328          {
1329   1          //printf("\r\nmsSetOutputClock(%x)", ucOutputTimingCtl);
1330   1      
1331   1          WatchDogClear();
1332   1      
1333   1          if( ucOutputTimingCtl&OUTPUT_FREERUN )
1334   1          {
1335   2              msSetOutputFreeRunClock( 60 );
1336   2          }
1337   1          else
1338   1          {
1339   2              msLCDSetClock();
1340   2          }
1341   1      
1342   1          WatchDogClear();
1343   1      }
1344          
1345          void msLCDSetClock(void)
1346          {
1347   1          BYTE ucBank;
1348   1          XDATA WORD wInputHPeriod; // horizontal period
1349   1          XDATA WORD wOutputClock;
1350   1          XDATA DWORD dwClockFactor; // clock factor
1351   1      
1352   1          wInputHPeriod = g_InOutCtl.inHPeriod;
1353   1      
C51 COMPILER V8.18   MSTAR                                                                 09/29/2009 23:58:02 PAGE 23  

1354   1          ucBank = msReadByte( BK0_00_REGBK);
1355   1          msWriteByte( BK0_00_REGBK, REG_BANK_SCALER );
1356   1      
1357   1          if( IsVGAInUse() )
1358   1          {
1359   2              // get more accurate horzontal total for output
1360   2              if( wInputHPeriod > (MST_H_PERIOD_MASK / 16) ) // check overflow
1361   2              {
1362   3                  wInputHPeriod = wInputHPeriod * 16;
1363   3              }
1364   2              else // general
1365   2              {
1366   3                  WORD wVSyncTime; // VSync time
1367   3      
1368   3                  msWriteBit( BK0_E8_HSTOL, 1, _BIT6 ); // enable 16 line to calculate hsync period
1369   3      
1370   3                  wVSyncTime = ((WORD)msCalculateVSyncTime() * 3);
1371   3                  Delay1ms(wVSyncTime); // delay for stable
1372   3      
1373   3                  wInputHPeriod = msGetHorizontalPeriod();
1374   3                  if (abs((wInputHPeriod / 16) - g_wHorizontalPeriod) > 5)
1375   3                      wInputHPeriod = g_wHorizontalPeriod * 16;
1376   3      
1377   3                  msWriteBit( BK0_E8_HSTOL, 0, _BIT6 ); // recovry one line to calculate hsync period
1378   3                  Delay1ms(wVSyncTime);
1379   3              }
1380   2          }
1381   1          else
1382   1          {
1383   2              wInputHPeriod *= 16;
1384   2          }
1385   1      
1386   1          // Cal output clock
1387   1          {
1388   2              // if expansion, chip will assume output clock is faster than input clock,
1389   2      #if (SCALING_FORMULA)
1390   2              wOutputClock = (((float)PanelMinHTotal * (PanelHeight-1) * MST_CLOCK_KHZ * 16) + 500) /
1391   2                              ((float)wInputHPeriod * (g_WindowInfo.V_CapSize-1) * 1000);
1392   2      #else
                      wOutputClock = (((float)PanelMinHTotal * (PanelHeight) * MST_CLOCK_KHZ * 16) + 500) /
                                      ((float)wInputHPeriod * (g_WindowInfo.V_CapSize) * 1000);
              #endif
1396   2              if( g_InOutCtl.bInterlace )
1397   2              {
1398   3                  wOutputClock *= 2;
1399   3              }
1400   2          }
1401   1      
1402   1      #if (SCALING_FORMULA)
1403   1          dwClockFactor = ((float)wInputHPeriod*(g_WindowInfo.V_CapSize-1)*524288ul*PANEL_MASTER_PLL_DIVIDER)/
1404   1                          ((float)PanelMinHTotal*(PanelHeight-1)*16);
1405   1      #else
                  dwClockFactor = ((float)wInputHPeriod*(g_WindowInfo.V_CapSize)*524288ul*PANEL_MASTER_PLL_DIVIDER)/
                                  ((float)PanelMinHTotal*(PanelHeight)*16);
              #endif
1409   1      
1410   1          if( g_InOutCtl.bInterlace )
1411   1          {
1412   2              dwClockFactor /= 2;
1413   2          }
1414   1      
1415   1      #if (PANEL_ANALOG_TCON)
C51 COMPILER V8.18   MSTAR                                                                 09/29/2009 23:58:02 PAGE 24  

1416   1              dwClockFactor /= 3;
1417   1      #endif
1418   1      
1419   1          printf("\r\nDclk %dMhz", (DClkFactor+dwClockFactor/2)/dwClockFactor/2);
1420   1      
1421   1          msWrite3Bytes( BK0_27_OPL_SET2, dwClockFactor );
1422   1          msSetLineBufferClock( g_ucSrcModeIndex, wOutputClock );
1423   1          msWriteByte( BK0_00_REGBK, ucBank );
1424   1      }
1425          
1426          #if(ENABLE_MONITOR_VTOTAL)
              XDATA WORD g_wMsMonitorVTotal_OriginalVCapsize;
              XDATA WORD g_wMsMonitorVTotal_LastVTotal;
              XDATA WORD g_wMsMonitorVTotal_VTotalChangeCnt;
              void msMonitorVTotal( BYTE ucFlag )
              {
                  BYTE ucBank;
                  WORD wCurVTotal;
                  bit bVTotalChange = 0;
              
              
                  ucBank = msReadByte( BK0_00_REGBK);
                  msWriteByte( BK0_00_REGBK, REG_BANK_SCALER);
              
                  wCurVTotal = msVDGetVTotal();
              
                  if( ucFlag&1 ) // Reset
                  {
                      g_wMsMonitorVTotal_OriginalVCapsize = msReadWord( BK0_0A_SPRVDC_H);
                      g_wMsMonitorVTotal_VTotalChangeCnt = 0;
                          g_wMsMonitorVTotal_LastVTotal = 0;
            

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?