📄 modectrl.lst
字号:
743 2 case DSPPLL_136:x=DNDIV_136;break;
744 2 case DSPPLL_140:x=DNDIV_140;break;
745 2 default:x=DNDIV_108;break;
746 2 }
747 1
748 1 if((float)EepPrivate.wHTotal*32/ m_wBuff[0]>x)
749 1 I2CWriteByte(TW803_P0, 0x70, I2CReadByte(TW803_P0, 0x70)|DCLKI_IS_FASTER); //Input clk faster, enable th
-is bit
750 1 else
751 1 I2CWriteByte(TW803_P0, 0x70, I2CReadByte(TW803_P0,0x70)&~DCLKI_IS_FASTER); //Input clk slower, disable t
-his bit
752 1
753 1 //Horizontal
754 1 m_wBuff[0] = (float)m_wHRes/VGAState.HDispSize * 0x2000;
755 1 I2CWriteByte(TW803_P0, SC_HOR_H1, (uCHAR)m_wBuff[0]);
756 1 I2CWriteByte(TW803_P0, SC_HOR_H2, (uCHAR)(m_wBuff[0]>>8));
757 1
758 1 //Vertical
759 1 if(!(m_cModeStatus & VSYNCOVERRANGE))
760 1 {
761 2 m_wBuff[0] = (float)m_wVRes/(VGAState.VDispSize) * 0x2000;
762 2 }
763 1 else
764 1 {
765 2 m_wBuff[0] = (float)m_wVRes/(VGAState.VDispSize) * 0x2000;
766 2 }
767 1
768 1 I2CWriteByte(TW803_P0, SC_VER_V1, (uCHAR)m_wBuff[0]);
769 1 I2CWriteByte(TW803_P0, SC_VER_V2, (uCHAR)(m_wBuff[0]>>8));
770 1 I2CWriteByte(TW803_P0, 0xDC, (uCHAR)VGAState.HDispSize);
771 1 I2CWriteByte(TW803_P0, 0xDD, (uCHAR)(VGAState.HDispSize>>8));
772 1 I2CWriteByte(TW803_P0, 0xDE, (uCHAR)VGAState.VDispSize);
773 1 I2CWriteByte(TW803_P0, 0xDF, (uCHAR)(VGAState.VDispSize>>8));
774 1 }
775
776 void VGASetPll(void)
777 {
778 1 switch(m_pModeDescriptorPtr->cModeFlags0 & DSPPLL_MASK)
779 1 {
780 2 case bDSPPLL_100:m_cDspPllSwitch=DSPPLL_100;break;
781 2 case bDSPPLL_108:m_cDspPllSwitch=DSPPLL_108;break;
782 2 case bDSPPLL_120:m_cDspPllSwitch=DSPPLL_120;break;
783 2 case bDSPPLL_136:m_cDspPllSwitch=DSPPLL_136;break;
784 2 case bDSPPLL_140:m_cDspPllSwitch=DSPPLL_140;break;
785 2 default:m_cDspPllSwitch=DSPPLL_108;break;
786 2 }
C51 COMPILER V7.50 MODECTRL 10/30/2006 16:14:45 PAGE 14
787 1 switch(m_cDspPllSwitch)
788 1 {
789 2 case DSPPLL_100:I2CWriteByte(TW803_P0, PLLDIV_F,DFDIV_100);break;
790 2 case DSPPLL_108:I2CWriteByte(TW803_P0, PLLDIV_F,DFDIV_108);break;
791 2 case DSPPLL_120:I2CWriteByte(TW803_P0, PLLDIV_F,DFDIV_120);break;
792 2 case DSPPLL_136:I2CWriteByte(TW803_P0, PLLDIV_F,DFDIV_136);break;
793 2 case DSPPLL_140:I2CWriteByte(TW803_P0, PLLDIV_F,DFDIV_140);break;
794 2 default: I2CWriteByte(TW803_P0, PLLDIV_F,DFDIV_108);break;
795 2 }
796 1 I2CWriteByte(TW803_P0, PLLDIV_I,DIDIV);
797 1 I2CWriteByte(TW803_P0, PLLDIV_O,0x10|DODIV);
798 1 /* m_cDspPllSwitch=DSPPLL_140;
799 1 I2CWriteByte(TW803_P0, PLLDIV_F,DFDIV_140);
800 1 I2CWriteByte(TW803_P0, PLLDIV_I,DIDIV);
801 1 I2CWriteByte(TW803_P0, PLLDIV_O,0x10|DODIV); */
802 1 }
803
804
805
806 // ================================================================
807 // VGACalOPTiming Kevin Hsu. Mar. 15th, 2006
808 // ================================================================
809 // Description: Calculate output timming.
810 // Output: None.
811 // ---------------------------------------------------------------
812 #define LB_WIDTH 1280 // For T103
813 void VGACalOPTiming(void)
814 {
815 1 uWORD wDVTotal, wDHTotal, wDVBILK, wTemp;
816 1 float Temp, DNDIV_40_Temp;
817 1
818 1 //~ Calculate PH_TOT and PV_TOT ~//
819 1 m_wBuff[0] = I2CReadByte(TW803_P0, 0x59);
820 1 m_wBuff[0] <<= 8;
821 1 m_wBuff[0] |= I2CReadByte(TW803_P0, 0x58);
822 1 m_wBuff[0] /= 32;
823 1 m_dwBuff[0] = I2CReadByte(TW803_P0, 0x53);
824 1 m_dwBuff[0] <<= 8;
825 1 m_dwBuff[0] |= I2CReadByte(TW803_P0, 0x52);
826 1 m_dwBuff[0] <<= 8;
827 1 m_dwBuff[0] |= I2CReadByte(TW803_P0, 0x51);
828 1 DNDIV_40_Temp = ((float)(I2CReadByte(TW803_P0, PLLDIV_F)+2)/(DIDIV+2)/DRDIV);
829 1 Temp = (27000000.0/m_dwBuff[0])*m_pModeDescriptorPtr->wHTotal*m_pModeDescriptorPtr->wVTotal;
830 1 if(Temp>(DNDIV_40_Temp*27000000.0))
831 1 I2CWriteByte(TW803_P0, 0x70, I2CReadByte(TW803_P0, 0x70)|0x20);
832 1 else
833 1 I2CWriteByte(TW803_P0, 0x70, I2CReadByte(TW803_P0, 0x70)&0xDF);
834 1 wDHTotal=(float)m_wBuff[0]*m_wVRes*DNDIV_40_Temp/VGAState.VDispSize;
835 1 wDVTotal=((DNDIV_40_Temp*(float)XCLK)/(float)(((float)(XCLK)/m_pModeDescriptorPtr->dwVFrameCount)*wDHTota
-l));
836 1
837 1 twdDelay(100);
838 1 m_dwBuff[1]=I2CReadByte(TW803_P0, 0x83);
839 1 m_dwBuff[1] <<= 8;
840 1 m_dwBuff[1]=I2CReadByte(TW803_P0, 0x82);
841 1 m_dwBuff[1] <<= 8;
842 1 m_dwBuff[1] |= I2CReadByte(TW803_P0, 0x81);
843 1 wDVBILK=m_dwBuff[1];
844 1
845 1 //~ Calculate back porch "DWHS" ~//
846 1 wTemp = ((wDHTotal - DWHSZ - DISP_DFLT_HSWIDTH)>>1);
847 1
C51 COMPILER V7.50 MODECTRL 10/30/2006 16:14:45 PAGE 15
848 1 I2CWriteByte(TW803_P0, 0xB0, wTemp);
849 1 I2CWriteByte(TW803_P0, 0xB1, wTemp>>8);//Horizontal back porch
850 1 I2CWriteByte(TW803_P0, 0xB2, DISP_DFLT_VDS);
851 1 I2CWriteByte(TW803_P0, 0xB3, DISP_DFLT_VDS>>8);//Vertical back porch
852 1 I2CWriteByte(TW803_P0, 0xB4,(uCHAR)(DWHSZ));
853 1 I2CWriteByte(TW803_P0, 0xB5,(uCHAR)(DWHSZ>>8));//Horizontal width
854 1 I2CWriteByte(TW803_P0, 0xB6,(uCHAR)(DWVSZ));
855 1 I2CWriteByte(TW803_P0, 0xB7,(uCHAR)(DWVSZ>>8));//Vertical height
856 1 I2CWriteByte(TW803_P0, 0xB8,(uCHAR) wDHTotal);
857 1 I2CWriteByte(TW803_P0, 0xB9,(uCHAR)(wDHTotal>>8));//Htotal
858 1 I2CWriteByte(TW803_P0, 0xBA,(uCHAR) wDVTotal);
859 1 I2CWriteByte(TW803_P0, 0xBB,(uCHAR)(wDVTotal>>8));//Vtotal
860 1 I2CWriteByte(TW803_P0, 0xBC,(uCHAR) DISP_DFLT_HSWIDTH);
861 1 I2CWriteByte(TW803_P0, 0xBD,(uCHAR)(DISP_DFLT_HSWIDTH>>8));//HSYNC Width
862 1 I2CWriteByte(TW803_P0, 0xBE,(uCHAR) DISP_DFLT_VSWIDTH);
863 1 I2CWriteByte(TW803_P0, 0xBF,(uCHAR)(DISP_DFLT_VSWIDTH>>8));//VSYNC Width
864 1
865 1 //~ Calculate line buffer ~//
866 1 if(H_Size>m_wHRes) // HSize in LB
867 1 m_wBuff[1] = m_wHRes;
868 1 else
869 1 m_wBuff[1] = H_Size;
870 1
871 1 if(LB_WIDTH >= (m_wBuff[1]<<1)) //PREFILL Size
872 1 Temp = 4.0;
873 1 else
874 1 {
875 2 Temp = 2.45 - ((float)(m_wVRes)/V_Size)/2.0;
876 2 if(LB_WIDTH>=m_wBuff[1])
877 2 Temp += (LB_WIDTH-m_wBuff[1])/m_wBuff[1];
878 2 else
879 2 Temp += 0;
880 2 }
881 1 m_wBuff[1] = ((Temp-(int)(Temp))*m_wHRes/EepPrivate.wHTotal + (int)(Temp))*m_wBuff[0]; // T_PerFill
882 1 m_wBuff[2] = ((DISP_DFLT_VSWIDTH+DISP_DFLT_VDS+I2CReadByte(TW803_P0, 0xDA))*wDHTotal + DISP_DFLT_HSWIDTH
-+ wTemp + I2CReadByte(TW803_P0, 0xD8))/DNDIV_40_Temp; //VBo_Xclk
883 1 m_dwBuff[1] =I2CReadByte(TW803_P0, 0x53);
884 1 m_dwBuff[1] <<= 8;
885 1 m_dwBuff[1] |=I2CReadByte(TW803_P0, 0x52);
886 1 m_dwBuff[1] <<= 8;
887 1 m_dwBuff[1] |= I2CReadByte(TW803_P0, 0x51);
888 1 Temp = ((m_dwBuff[1]+1)*DNDIV_40_Temp * m_wVRes)/((m_dwBuff[1]/m_wBuff[0]) *VGAState.VDispSize); // Idea
-l PH_TOT
889 1 m_wBuff[0] = (Temp - (float)wDHTotal)*VGAState.VDispSize/DNDIV_40_Temp/2;
890 1 //~ VSDLY_XCLK = T_PreFill + VBi_XClk + (End_LB_Short/2) - VBo_Xclk ~//
891 1 m_dwBuff[0] = m_wBuff[1] + wDVBILK +m_wBuff[0];
892 1 wTemp = m_dwBuff[0]-m_wBuff[2];
893 1 I2CWriteByte(TW803_P0, 0x84, wTemp);
894 1 I2CWriteByte(TW803_P0, 0x85, wTemp>>8);//line buffer delay XClk
895 1
896 1 m_dwBuff[0]=(wDVTotal-m_wVRes-DWVSST-DISP_DFLT_VSWIDTH)*wDHTotal;
897 1 m_dwBuff[1]=wTemp*DNDIV_40_Temp;
898 1 if(m_dwBuff[0]<m_dwBuff[1])
899 1 I2CWriteByte(TW803_P0, 0x70, I2CReadByte(TW803_P0, 0x70)|0x20);
900 1 else
901 1 I2CWriteByte(TW803_P0, 0x70, I2CReadByte(TW803_P0, 0x70)&0xDF);
902 1 }
903
904
905
906 BOOL SyncChangDect()
907 {
C51 COMPILER V7.50 MODECTRL 10/30/2006 16:14:45 PAGE 16
908 1 //~ Detect V/H Sync changed. ~//
909 1 if(I2CReadByte(TW803_P0, 0x32)&0x0C)
910 1 {
911 2 ClosePanel(0x10,0xFF,0x40);
912 2 if(!SrcAnalogProcess())
913 2 {
914 3 I2CWriteByte(TW803_P0, 0x32, 0x0F);
915 3 return FALSE;
916 3 }
917 2 OpenPanel();
918 2 I2CWriteByte(TW803_P0, 0x32, 0x0C);
919 2 return TRUE;
920 2 }
921 1 //~ Detect if V/H Sync lost. ~//
922 1 if((I2CReadByte(TW803_P0, 0x32)&0x03)==0x03)
923 1 {
924 2 ClosePanel(0x10,0xFF,0x40);
925 2 I2CWriteByte(TW803_P0, 0x32, 0x0F);
926 2 return FALSE;
927 2 }
928 1 return TRUE;
929 1
930 1
931 1 }
932
933 BOOL SrcAnalogProcess(void)
934 {
935 1 Sync_Mode_Detect();
936 1 if(!ModeDetect()) return FALSE;
937 1 SetupMode();
938 1 VGASetPll();
939 1 AutoPositionAdj(0xF0);
940 1 VGAState.HDispSize = H_Size;
941 1 VGAState.VDispSize = V_Size;
942 1 VGAState.fHDispSize = H_Size;
943 1 VGAState.fVDispSize = V_Size;
944 1 VGAState.AdjHATV = m_wHRes;
945 1 VGAState.AdjVATV = m_wVRes;
946 1 VGACalOPTiming();
947 1 VGAScaling();
948 1 OpenPanel();
949 1 I2CWriteByte(TW803_P0, INT_STATUS, 0x3f);
950 1 I2CWriteByte(TW803_P0, 0xE2, 0x11);
951 1 AutoPhaseAdj();
952 1 if(!(m_cModeStatus&(DOSMODE|NORMALMODE))) //(OVERRANGE |SYNCERROR))
953 1 {
954 2 return FALSE;
955 2 }
956 1
957 1 I2CWriteByte(TW803_P0, INT_STATUS, 0x3f);
958 1 I2CWriteByte(TW803_P0, 0xE2, 0x11);
959 1 VGAState.PositionH = I2CReadByte(TW803_P0, 0x45);
960 1 VGAState.ADCVBaPorch = I2CReadByte(TW803_P0, VSST_L)|(I2CReadByte(TW803_P0, VSST_H)<<8);
961 1 VGAState.ADCHBaPorch = I2CReadByte(TW803_P0, HSST_L)|(I2CReadByte(TW803_P0, HSST_H)<<8);
962 1 VGAState.HATV = I2CReadByte(TW803_P0, HATVC_L)|(I2CReadByte(TW803_P0, HATVC_H)<<8);
963 1 VGAState.VATV = I2CReadByte(TW803_P0, VATVR_L)|(I2CReadByte(TW803_P0, VATVR_H)<<8);
964 1 return TRUE;
965 1 }
966
967 #endif
968
969
C51 COMPILER V7.50 MODECTRL 10/30/2006 16:14:45 PAGE 17
970
971
972
973
974
975
976
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 8728 ----
CONSTANT SIZE = 3052 ----
XDATA SIZE = 2 55
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -