7 #include "xf86PciInfo.h"
14 #include <linux/types.h>
15 #include <linux/version.h>
22 #include "vb_struct.h"
28 #define IndexMask 0xff
29 #ifndef XGI_MASK_DUAL_CHIP
30 #define XGI_MASK_DUAL_CHIP 0x04 /* SR3A */
35 BOOLEAN
XGI_IsLCDDualLink(PVB_DEVICE_INFO pVBInfo
);
36 BOOLEAN
XGI_SetCRT2Group301(USHORT ModeNo
, PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
);
37 BOOLEAN
XGI_BacklightByDrv(PVB_DEVICE_INFO pVBInfo
);
39 BOOLEAN
XGI_IsLCDON(PVB_DEVICE_INFO pVBInfo
);
40 BOOLEAN
XGI_DisableChISLCD(PVB_DEVICE_INFO pVBInfo
);
41 BOOLEAN
XGI_EnableChISLCD(PVB_DEVICE_INFO pVBInfo
);
42 BOOLEAN
XGI_AjustCRT2Rate(USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
,USHORT
*i
, PVB_DEVICE_INFO pVBInfo
);
43 BOOLEAN
XGI_SearchModeID( USHORT ModeNo
,USHORT
*ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
);
44 BOOLEAN
XGI_GetLCDInfo(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
);
45 BOOLEAN
XGISetModeNew( PXGI_HW_DEVICE_INFO HwDeviceExtension
, USHORT ModeNo
) ;
46 BOOLEAN
XGI_BridgeIsOn(PVB_DEVICE_INFO pVBInfo
);
47 UCHAR
XGI_GetModePtr( USHORT ModeNo
,USHORT ModeIdIndex
,PVB_DEVICE_INFO pVBInfo
);
48 USHORT
XGI_GetOffset(USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
,PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
);
49 USHORT
XGI_GetRatePtrCRT2( PXGI_HW_DEVICE_INFO pXGIHWDE
, USHORT ModeNo
,USHORT ModeIdIndex
,PVB_DEVICE_INFO pVBInfo
);
50 USHORT
XGI_GetResInfo(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
);
51 USHORT
XGI_GetColorDepth(USHORT ModeNo
,USHORT ModeIdIndex
,PVB_DEVICE_INFO pVBInfo
);
52 USHORT
XGI_GetVGAHT2(PVB_DEVICE_INFO pVBInfo
);
53 USHORT
XGI_GetVCLK2Ptr(USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
,PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
);
54 void XGI_VBLongWait(PVB_DEVICE_INFO pVBInfo
);
55 void XGI_SaveCRT2Info(USHORT ModeNo
, PVB_DEVICE_INFO pVBInfo
);
56 void XGI_GetCRT2Data(USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
);
57 void XGI_GetCRT2ResInfo(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
);
58 void XGI_PreSetGroup1(USHORT ModeNo
,USHORT ModeIdIndex
, PXGI_HW_DEVICE_INFO HwDeviceExtension
,USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
);
59 void XGI_SetGroup1(USHORT ModeNo
,USHORT ModeIdIndex
, PXGI_HW_DEVICE_INFO HwDeviceExtension
,USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
);
60 void XGI_SetLockRegs(USHORT ModeNo
,USHORT ModeIdIndex
, PXGI_HW_DEVICE_INFO HwDeviceExtension
,USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
);
61 void XGI_SetLCDRegs(USHORT ModeNo
,USHORT ModeIdIndex
, PXGI_HW_DEVICE_INFO HwDeviceExtension
,USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
);
62 void XGI_SetGroup2(USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
,PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
);
63 void XGI_SetGroup3(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
);
64 void XGI_SetGroup4(USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
,PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
);
65 void XGI_SetGroup5(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
);
66 void* XGI_GetLcdPtr(USHORT BX
, USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
);
67 void* XGI_GetTVPtr(USHORT BX
, USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
);
68 void XGI_FirePWDEnable(PVB_DEVICE_INFO pVBInfo
);
69 void XGI_EnableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
);
70 void XGI_DisableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
);
71 void XGI_SetPanelDelay(USHORT tempbl
, PVB_DEVICE_INFO pVBInfo
);
72 void XGI_SetPanelPower(USHORT tempah
,USHORT tempbl
, PVB_DEVICE_INFO pVBInfo
);
73 void XGI_EnablePWD( PVB_DEVICE_INFO pVBInfo
);
74 void XGI_DisablePWD( PVB_DEVICE_INFO pVBInfo
);
75 void XGI_AutoThreshold( PVB_DEVICE_INFO pVBInfo
);
76 void XGI_SetTap4Regs( PVB_DEVICE_INFO pVBInfo
);
78 void XGI_DisplayOn(PXGI_HW_DEVICE_INFO
, PVB_DEVICE_INFO pVBInfo
);
79 void XGI_DisplayOff( PXGI_HW_DEVICE_INFO
, PVB_DEVICE_INFO pVBInfo
);
80 void XGI_SetCRT1Group(PXGI_HW_DEVICE_INFO HwDeviceExtension
,USHORT ModeNo
,USHORT ModeIdIndex
,PVB_DEVICE_INFO pVBInfo
);
81 void XGI_SetXG21CRTC(USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
);
82 void XGI_SetXG21LCD(PVB_DEVICE_INFO pVBInfo
,USHORT RefreshRateTableIndex
,USHORT ModeNo
);
83 void XGI_SetXG27CRTC(USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
);
84 void XGI_SetXG27LCD(PVB_DEVICE_INFO pVBInfo
,USHORT RefreshRateTableIndex
,USHORT ModeNo
);
85 void XGI_UpdateXG21CRTC(USHORT ModeNo
, PVB_DEVICE_INFO pVBInfo
, USHORT RefreshRateTableIndex
);
86 void XGI_WaitDisply(PVB_DEVICE_INFO pVBInfo
);
87 void XGI_SenseCRT1(PVB_DEVICE_INFO pVBInfo
);
88 void XGI_SetSeqRegs(USHORT ModeNo
,USHORT StandTableIndex
,USHORT ModeIdIndex
,PVB_DEVICE_INFO pVBInfo
);
89 void XGI_SetMiscRegs(USHORT StandTableIndex
, PVB_DEVICE_INFO pVBInfo
);
90 void XGI_SetCRTCRegs(PXGI_HW_DEVICE_INFO HwDeviceExtension
,USHORT StandTableIndex
, PVB_DEVICE_INFO pVBInfo
);
91 void XGI_SetATTRegs(USHORT ModeNo
,USHORT StandTableIndex
,USHORT ModeIdIndex
,PVB_DEVICE_INFO pVBInfo
);
92 void XGI_SetGRCRegs(USHORT StandTableIndex
, PVB_DEVICE_INFO pVBInfo
);
93 void XGI_ClearExt1Regs(PVB_DEVICE_INFO pVBInfo
);
95 void XGI_SetSync(USHORT RefreshRateTableIndex
,PVB_DEVICE_INFO pVBInfo
);
96 void XGI_SetCRT1CRTC(USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
,PVB_DEVICE_INFO pVBInfo
,PXGI_HW_DEVICE_INFO HwDeviceExtension
);
97 void XGI_SetCRT1Timing_H(PVB_DEVICE_INFO pVBInfo
,PXGI_HW_DEVICE_INFO HwDeviceExtension
);
98 void XGI_SetCRT1Timing_V(USHORT ModeIdIndex
,USHORT ModeNo
,PVB_DEVICE_INFO pVBInfo
);
99 void XGI_SetCRT1DE(PXGI_HW_DEVICE_INFO HwDeviceExtension
,USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
,PVB_DEVICE_INFO pVBInfo
);
100 void XGI_SetCRT1VCLK(USHORT ModeNo
,USHORT ModeIdIndex
,PXGI_HW_DEVICE_INFO HwDeviceExtension
,USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
);
101 void XGI_SetCRT1FIFO(USHORT ModeNo
,PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
);
102 void XGI_SetCRT1ModeRegs(PXGI_HW_DEVICE_INFO HwDeviceExtension
,USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
,PVB_DEVICE_INFO pVBInfo
);
103 void XGI_SetVCLKState(PXGI_HW_DEVICE_INFO HwDeviceExtension
,USHORT ModeNo
,USHORT RefreshRateTableIndex
,PVB_DEVICE_INFO pVBInfo
);
105 void XGI_LoadDAC(USHORT ModeNo
,USHORT ModeIdIndex
,PVB_DEVICE_INFO pVBInfo
);
106 void XGI_WriteDAC(USHORT dl
, USHORT ah
, USHORT al
, USHORT dh
, PVB_DEVICE_INFO pVBInfo
);
107 /*void XGI_ClearBuffer(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo,PVB_DEVICE_INFO pVBInfo);*/
108 void XGI_SetLCDAGroup(USHORT ModeNo
,USHORT ModeIdIndex
,PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
);
109 void XGI_GetLVDSResInfo( USHORT ModeNo
,USHORT ModeIdIndex
,PVB_DEVICE_INFO pVBInfo
);
110 void XGI_GetLVDSData(USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
,PVB_DEVICE_INFO pVBInfo
);
111 void XGI_ModCRT1Regs(USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
,PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
);
112 void XGI_SetLVDSRegs(USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
,PVB_DEVICE_INFO pVBInfo
);
113 void XGI_UpdateModeInfo(PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
);
114 void XGI_GetVGAType(PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
);
115 void XGI_GetVBType(PVB_DEVICE_INFO pVBInfo
);
116 void XGI_GetVBInfo(USHORT ModeNo
,USHORT ModeIdIndex
,PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
);
117 void XGI_GetTVInfo(USHORT ModeNo
,USHORT ModeIdIndex
,PVB_DEVICE_INFO pVBInfo
);
118 void XGI_SetCRT2ECLK( USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
,PVB_DEVICE_INFO pVBInfo
);
119 void InitTo330Pointer(UCHAR
,PVB_DEVICE_INFO pVBInfo
);
120 void XGI_GetLCDSync(USHORT
* HSyncWidth
, USHORT
* VSyncWidth
, PVB_DEVICE_INFO pVBInfo
);
121 void XGI_DisableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
);
122 void XGI_EnableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
);
123 void XGI_SetCRT2VCLK(USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
);
124 void XGI_OEM310Setting(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
);
125 void XGI_SetDelayComp(PVB_DEVICE_INFO pVBInfo
);
126 void XGI_SetLCDCap(PVB_DEVICE_INFO pVBInfo
);
127 void XGI_SetLCDCap_A(USHORT tempcx
,PVB_DEVICE_INFO pVBInfo
);
128 void XGI_SetLCDCap_B(USHORT tempcx
,PVB_DEVICE_INFO pVBInfo
);
129 void SetSpectrum(PVB_DEVICE_INFO pVBInfo
);
130 void XGI_SetAntiFlicker(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
);
131 void XGI_SetEdgeEnhance(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
);
132 void XGI_SetPhaseIncr(PVB_DEVICE_INFO pVBInfo
);
133 void XGI_SetYFilter(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
);
134 void XGI_GetTVPtrIndex2(USHORT
* tempbx
,UCHAR
* tempcl
,UCHAR
* tempch
, PVB_DEVICE_INFO pVBInfo
);
135 USHORT
XGI_GetTVPtrIndex( PVB_DEVICE_INFO pVBInfo
);
136 void XGI_SetCRT2ModeRegs(USHORT ModeNo
,PXGI_HW_DEVICE_INFO
, PVB_DEVICE_INFO pVBInfo
);
137 void XGI_CloseCRTC(PXGI_HW_DEVICE_INFO
, PVB_DEVICE_INFO pVBInfo
);
138 void XGI_OpenCRTC(PXGI_HW_DEVICE_INFO
, PVB_DEVICE_INFO pVBInfo
);
139 void XGI_GetRAMDAC2DATA(USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
);
140 void XGI_UnLockCRT2(PXGI_HW_DEVICE_INFO
, PVB_DEVICE_INFO pVBInfo
);
141 void XGI_LockCRT2(PXGI_HW_DEVICE_INFO
, PVB_DEVICE_INFO pVBInfo
);
142 void XGINew_EnableCRT2(PVB_DEVICE_INFO pVBInfo
);
143 void XGINew_LCD_Wait_Time(UCHAR DelayTime
, PVB_DEVICE_INFO pVBInfo
);
144 void XGI_LongWait(PVB_DEVICE_INFO pVBInfo
);
145 void XGI_SetCRT1Offset( USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
);
146 void XGI_GetLCDVCLKPtr(UCHAR
* di_0
,UCHAR
*di_1
, PVB_DEVICE_INFO pVBInfo
);
147 UCHAR
XGI_GetVCLKPtr(USHORT RefreshRateTableIndex
,USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
);
148 void XGI_GetVCLKLen(UCHAR tempal
,UCHAR
* di_0
,UCHAR
* di_1
, PVB_DEVICE_INFO pVBInfo
);
149 USHORT
XGI_GetLCDCapPtr(PVB_DEVICE_INFO pVBInfo
);
150 USHORT
XGI_GetLCDCapPtr1(PVB_DEVICE_INFO pVBInfo
);
151 XGI301C_Tap4TimingStruct
* XGI_GetTap4Ptr(USHORT tempcx
, PVB_DEVICE_INFO pVBInfo
);
152 void XGI_SetXG21FPBits(PVB_DEVICE_INFO pVBInfo
);
153 void XGI_SetXG27FPBits(PVB_DEVICE_INFO pVBInfo
);
154 UCHAR
XGI_XG21GetPSCValue(PVB_DEVICE_INFO pVBInfo
);
155 UCHAR
XGI_XG27GetPSCValue(PVB_DEVICE_INFO pVBInfo
);
156 void XGI_XG21BLSignalVDD(USHORT tempbh
,USHORT tempbl
, PVB_DEVICE_INFO pVBInfo
);
157 void XGI_XG27BLSignalVDD(USHORT tempbh
,USHORT tempbl
, PVB_DEVICE_INFO pVBInfo
);
158 void XGI_XG21SetPanelDelay(USHORT tempbl
, PVB_DEVICE_INFO pVBInfo
);
159 BOOLEAN
XGI_XG21CheckLVDSMode(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
);
160 void XGI_SetXG21LVDSPara(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
);
161 void XGI_SetXG27LVDSPara(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
);
162 UCHAR
XGI_SetDefaultVCLK( PVB_DEVICE_INFO pVBInfo
);
164 extern void ReadVBIOSTablData( UCHAR ChipType
, PVB_DEVICE_INFO pVBInfo
);
166 /* USHORT XGINew_flag_clearbuffer; 0: no clear frame buffer 1:clear frame buffer */
172 USHORT XGINew_MDA_DAC
[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
173 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
174 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
175 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
176 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
177 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
178 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
179 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F};
181 USHORT XGINew_CGA_DAC
[]={0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15,
182 0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15,
183 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F,
184 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F,
185 0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15,
186 0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15,
187 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F,
188 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F};
190 USHORT XGINew_EGA_DAC
[]={0x00,0x10,0x04,0x14,0x01,0x11,0x05,0x15,
191 0x20,0x30,0x24,0x34,0x21,0x31,0x25,0x35,
192 0x08,0x18,0x0C,0x1C,0x09,0x19,0x0D,0x1D,
193 0x28,0x38,0x2C,0x3C,0x29,0x39,0x2D,0x3D,
194 0x02,0x12,0x06,0x16,0x03,0x13,0x07,0x17,
195 0x22,0x32,0x26,0x36,0x23,0x33,0x27,0x37,
196 0x0A,0x1A,0x0E,0x1E,0x0B,0x1B,0x0F,0x1F,
197 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F};
199 USHORT XGINew_VGA_DAC
[]={0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15,
200 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F,
201 0x00,0x05,0x08,0x0B,0x0E,0x11,0x14,0x18,
202 0x1C,0x20,0x24,0x28,0x2D,0x32,0x38,0x3F,
204 0x00,0x10,0x1F,0x2F,0x3F,0x1F,0x27,0x2F,
205 0x37,0x3F,0x2D,0x31,0x36,0x3A,0x3F,0x00,
206 0x07,0x0E,0x15,0x1C,0x0E,0x11,0x15,0x18,
207 0x1C,0x14,0x16,0x18,0x1A,0x1C,0x00,0x04,
208 0x08,0x0C,0x10,0x08,0x0A,0x0C,0x0E,0x10,
209 0x0B,0x0C,0x0D,0x0F,0x10};
212 /* --------------------------------------------------------------------- */
213 /* Function : InitTo330Pointer */
217 /* --------------------------------------------------------------------- */
218 void InitTo330Pointer( UCHAR ChipType
,PVB_DEVICE_INFO pVBInfo
)
220 pVBInfo
->SModeIDTable
= (XGI_StStruct
*) XGI330_SModeIDTable
;
221 pVBInfo
->StandTable
= (XGI_StandTableStruct
*) XGI330_StandTable
;
222 pVBInfo
->EModeIDTable
= (XGI_ExtStruct
*) XGI330_EModeIDTable
;
223 pVBInfo
->RefIndex
= (XGI_Ext2Struct
*) XGI330_RefIndex
;
224 pVBInfo
->XGINEWUB_CRT1Table
= (XGI_CRT1TableStruct
*) XGI_CRT1Table
;
226 /* add for new UNIVGABIOS */
227 /* XGINew_UBLCDDataTable = (XGI_LCDDataTablStruct *) XGI_LCDDataTable ; */
228 /* XGINew_UBTVDataTable = (XGI_TVDataTablStruct *) XGI_TVDataTable ; */
231 if ( ChipType
>= XG40
)
233 pVBInfo
->MCLKData
= (XGI_MCLKDataStruct
*) XGI340New_MCLKData
;
234 pVBInfo
->ECLKData
= (XGI_ECLKDataStruct
*) XGI340_ECLKData
;
238 pVBInfo
->MCLKData
= (XGI_MCLKDataStruct
*) XGI330New_MCLKData
;
239 pVBInfo
->ECLKData
= (XGI_ECLKDataStruct
*) XGI330_ECLKData
;
242 pVBInfo
->VCLKData
= (XGI_VCLKDataStruct
*) XGI_VCLKData
;
243 pVBInfo
->VBVCLKData
= (XGI_VBVCLKDataStruct
*) XGI_VBVCLKData
;
244 pVBInfo
->ScreenOffset
= XGI330_ScreenOffset
;
245 pVBInfo
->StResInfo
= (XGI_StResInfoStruct
*) XGI330_StResInfo
;
246 pVBInfo
->ModeResInfo
= (XGI_ModeResInfoStruct
*) XGI330_ModeResInfo
;
248 pVBInfo
->pOutputSelect
= &XGI330_OutputSelect
;
249 pVBInfo
->pSoftSetting
= &XGI330_SoftSetting
;
250 pVBInfo
->pSR07
= &XGI330_SR07
;
251 pVBInfo
->LCDResInfo
= 0 ;
252 pVBInfo
->LCDTypeInfo
= 0 ;
253 pVBInfo
->LCDInfo
= 0 ;
254 pVBInfo
->VBInfo
= 0 ;
258 pVBInfo
->SR15
= XGI340_SR13
;
259 pVBInfo
->CR40
= XGI340_cr41
;
260 pVBInfo
->SR25
= XGI330_sr25
;
261 pVBInfo
->pSR31
= &XGI330_sr31
;
262 pVBInfo
->pSR32
= &XGI330_sr32
;
263 pVBInfo
->CR6B
= XGI340_CR6B
;
264 pVBInfo
->CR6E
= XGI340_CR6E
;
265 pVBInfo
->CR6F
= XGI340_CR6F
;
266 pVBInfo
->CR89
= XGI340_CR89
;
267 pVBInfo
->AGPReg
= XGI340_AGPReg
;
268 pVBInfo
->SR16
= XGI340_SR16
;
269 pVBInfo
->pCRCF
= &XG40_CRCF
;
270 pVBInfo
->pXGINew_DRAMTypeDefinition
= &XG40_DRAMTypeDefinition
;
273 pVBInfo
->CR49
= XGI330_CR49
;
274 pVBInfo
->pSR1F
= &XGI330_SR1F
;
275 pVBInfo
->pSR21
= &XGI330_SR21
;
276 pVBInfo
->pSR22
= &XGI330_SR22
;
277 pVBInfo
->pSR23
= &XGI330_SR23
;
278 pVBInfo
->pSR24
= &XGI330_SR24
;
279 pVBInfo
->pSR33
= &XGI330_SR33
;
283 pVBInfo
->pCRT2Data_1_2
= &XGI330_CRT2Data_1_2
;
284 pVBInfo
->pCRT2Data_4_D
= &XGI330_CRT2Data_4_D
;
285 pVBInfo
->pCRT2Data_4_E
= &XGI330_CRT2Data_4_E
;
286 pVBInfo
->pCRT2Data_4_10
= &XGI330_CRT2Data_4_10
;
287 pVBInfo
->pRGBSenseData
= &XGI330_RGBSenseData
;
288 pVBInfo
->pVideoSenseData
= &XGI330_VideoSenseData
;
289 pVBInfo
->pYCSenseData
= &XGI330_YCSenseData
;
290 pVBInfo
->pRGBSenseData2
= &XGI330_RGBSenseData2
;
291 pVBInfo
->pVideoSenseData2
= &XGI330_VideoSenseData2
;
292 pVBInfo
->pYCSenseData2
= &XGI330_YCSenseData2
;
294 pVBInfo
->NTSCTiming
= XGI330_NTSCTiming
;
295 pVBInfo
->PALTiming
= XGI330_PALTiming
;
296 pVBInfo
->HiTVExtTiming
= XGI330_HiTVExtTiming
;
297 pVBInfo
->HiTVSt1Timing
= XGI330_HiTVSt1Timing
;
298 pVBInfo
->HiTVSt2Timing
= XGI330_HiTVSt2Timing
;
299 pVBInfo
->HiTVTextTiming
= XGI330_HiTVTextTiming
;
300 pVBInfo
->YPbPr750pTiming
= XGI330_YPbPr750pTiming
;
301 pVBInfo
->YPbPr525pTiming
= XGI330_YPbPr525pTiming
;
302 pVBInfo
->YPbPr525iTiming
= XGI330_YPbPr525iTiming
;
303 pVBInfo
->HiTVGroup3Data
= XGI330_HiTVGroup3Data
;
304 pVBInfo
->HiTVGroup3Simu
= XGI330_HiTVGroup3Simu
;
305 pVBInfo
->HiTVGroup3Text
= XGI330_HiTVGroup3Text
;
306 pVBInfo
->Ren525pGroup3
= XGI330_Ren525pGroup3
;
307 pVBInfo
->Ren750pGroup3
= XGI330_Ren750pGroup3
;
310 pVBInfo
->TimingH
= (XGI_TimingHStruct
*) XGI_TimingH
;
311 pVBInfo
->TimingV
= (XGI_TimingVStruct
*) XGI_TimingV
;
312 pVBInfo
->UpdateCRT1
= (XGI_XG21CRT1Struct
*) XGI_UpdateCRT1Table
;
314 pVBInfo
->CHTVVCLKUNTSC
= XGI330_CHTVVCLKUNTSC
;
315 pVBInfo
->CHTVVCLKONTSC
= XGI330_CHTVVCLKONTSC
;
316 pVBInfo
->CHTVVCLKUPAL
= XGI330_CHTVVCLKUPAL
;
317 pVBInfo
->CHTVVCLKOPAL
= XGI330_CHTVVCLKOPAL
;
319 /* 310 customization related */
320 if ( ( pVBInfo
->VBType
& VB_XGI301LV
) || ( pVBInfo
->VBType
& VB_XGI302LV
) )
321 pVBInfo
->LCDCapList
= XGI_LCDDLCapList
;
323 pVBInfo
->LCDCapList
= XGI_LCDCapList
;
325 if ( ( ChipType
== XG21
) || ( ChipType
== XG27
) )
326 pVBInfo
->XG21_LVDSCapList
= XGI21_LCDCapList
;
328 pVBInfo
->XGI_TVDelayList
= XGI301TVDelayList
;
329 pVBInfo
->XGI_TVDelayList2
= XGI301TVDelayList2
;
332 pVBInfo
->pXGINew_I2CDefinition
= &XG40_I2CDefinition
;
334 if ( ChipType
>= XG20
)
335 pVBInfo
->pXGINew_CR97
= &XG20_CR97
;
337 if ( ChipType
== XG27
)
339 pVBInfo
->MCLKData
= (XGI_MCLKDataStruct
*) XGI27New_MCLKData
;
340 pVBInfo
->CR40
= XGI27_cr41
;
341 pVBInfo
->pXGINew_CR97
= &XG27_CR97
;
342 pVBInfo
->pSR36
= &XG27_SR36
;
343 pVBInfo
->pCR8F
= &XG27_CR8F
;
344 pVBInfo
->pCRD0
= XG27_CRD0
;
345 pVBInfo
->pCRDE
= XG27_CRDE
;
346 pVBInfo
->pSR40
= &XG27_SR40
;
347 pVBInfo
->pSR41
= &XG27_SR41
;
351 if ( ChipType
>= XG20
)
353 pVBInfo
->pDVOSetting
= &XG21_DVOSetting
;
354 pVBInfo
->pCR2E
= &XG21_CR2E
;
355 pVBInfo
->pCR2F
= &XG21_CR2F
;
356 pVBInfo
->pCR46
= &XG21_CR46
;
357 pVBInfo
->pCR47
= &XG21_CR47
;
367 /* --------------------------------------------------------------------- */
368 /* Function : XGISetModeNew */
372 /* --------------------------------------------------------------------- */
373 BOOLEAN
XGISetModeNew( PXGI_HW_DEVICE_INFO HwDeviceExtension
, USHORT ModeNo
)
376 /* PUCHAR pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ; */
377 VB_DEVICE_INFO VBINF
;
378 PVB_DEVICE_INFO pVBInfo
= &VBINF
;
379 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
380 pVBInfo
->BaseAddr
= (ULONG
)HwDeviceExtension
->pjIOAddress
;
381 pVBInfo
->IF_DEF_LVDS
= 0 ;
382 pVBInfo
->IF_DEF_CH7005
= 0 ;
383 pVBInfo
->IF_DEF_LCDA
= 1 ;
384 pVBInfo
->IF_DEF_CH7017
= 0 ;
385 pVBInfo
->IF_DEF_CH7007
= 0 ; /* [Billy] 2007/05/14 */
386 pVBInfo
->IF_DEF_VideoCapture
= 0 ;
387 pVBInfo
->IF_DEF_ScaleLCD
= 0 ;
388 pVBInfo
->IF_DEF_OEMUtil
= 0 ;
389 pVBInfo
->IF_DEF_PWD
= 0 ;
392 if ( HwDeviceExtension
->jChipType
>= XG20
) /* kuku 2004/06/25 */
394 pVBInfo
->IF_DEF_YPbPr
= 0 ;
395 pVBInfo
->IF_DEF_HiVision
= 0 ;
396 pVBInfo
->IF_DEF_CRT2Monitor
= 0 ;
397 pVBInfo
->VBType
= 0 ; /*set VBType default 0*/
399 else if ( HwDeviceExtension
->jChipType
>= XG40
)
401 pVBInfo
->IF_DEF_YPbPr
= 1 ;
402 pVBInfo
->IF_DEF_HiVision
= 1 ;
403 pVBInfo
->IF_DEF_CRT2Monitor
= 1 ;
407 pVBInfo
->IF_DEF_YPbPr
= 1 ;
408 pVBInfo
->IF_DEF_HiVision
= 1 ;
409 pVBInfo
->IF_DEF_CRT2Monitor
= 0 ;
412 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
413 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
414 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
415 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
416 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
417 pVBInfo
->P3cc
= pVBInfo
->BaseAddr
+ 0x1C ;
418 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
419 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
420 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
421 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
422 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
423 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
424 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
425 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
426 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
427 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
428 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
429 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
431 if ( HwDeviceExtension
->jChipType
== XG21
) /* for x86 Linux, XG21 LVDS */
433 if ( ( XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) & 0xE0 ) == 0xC0 )
435 pVBInfo
->IF_DEF_LVDS
= 1 ;
438 if ( HwDeviceExtension
->jChipType
== XG27
)
440 if ( ( XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) & 0xE0 ) == 0xC0 )
442 if ( XGINew_GetReg1( pVBInfo
->P3d4
, 0x30 ) & 0x20 )
444 pVBInfo
->IF_DEF_LVDS
= 1 ;
449 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
450 XGI_GetVBType( pVBInfo
) ;
452 InitTo330Pointer( HwDeviceExtension
->jChipType
, pVBInfo
) ;
455 ModeNo
= ModeNo
& 0x7F ;
456 /* XGINew_flag_clearbuffer = 0 ; */
460 XGINew_flag_clearbuffer = 1 ;
463 XGINew_SetReg1( pVBInfo
->P3c4
, 0x05 , 0x86 ) ;
465 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 1.Openkey */
466 XGI_UnLockCRT2( HwDeviceExtension
, pVBInfo
) ;
468 XGI_SearchModeID( ModeNo
, &ModeIdIndex
, pVBInfo
) ;
470 XGI_GetVGAType(HwDeviceExtension
, pVBInfo
) ;
472 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
474 XGI_GetVBInfo(ModeNo
, ModeIdIndex
, HwDeviceExtension
, pVBInfo
) ;
475 XGI_GetTVInfo(ModeNo
, ModeIdIndex
, pVBInfo
) ;
476 XGI_GetLCDInfo(ModeNo
, ModeIdIndex
, pVBInfo
) ;
477 XGI_DisableBridge( HwDeviceExtension
,pVBInfo
) ;
478 /* XGI_OpenCRTC( HwDeviceExtension, pVBInfo ) ; */
480 if ( pVBInfo
->VBInfo
& ( SetSimuScanMode
| SetCRT2ToLCDA
) )
482 XGI_SetCRT1Group(HwDeviceExtension
, ModeNo
, ModeIdIndex
, pVBInfo
) ;
484 if ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
)
486 XGI_SetLCDAGroup(ModeNo
, ModeIdIndex
, HwDeviceExtension
, pVBInfo
) ;
491 if ( !( pVBInfo
->VBInfo
& SwitchToCRT2
) )
493 XGI_SetCRT1Group( HwDeviceExtension
, ModeNo
, ModeIdIndex
, pVBInfo
) ;
494 if ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
)
496 XGI_SetLCDAGroup( ModeNo
, ModeIdIndex
, HwDeviceExtension
, pVBInfo
) ;
501 if ( pVBInfo
->VBInfo
& ( SetSimuScanMode
| SwitchToCRT2
) )
503 switch( HwDeviceExtension
->ujVBChipID
)
506 XGI_SetCRT2Group301( ModeNo
, HwDeviceExtension
, pVBInfo
) ; /*add for CRT2 */
510 XGI_SetCRT2Group301(ModeNo
, HwDeviceExtension
, pVBInfo
) ; /*add for CRT2 */
518 XGI_SetCRT2ModeRegs( ModeNo
, HwDeviceExtension
,pVBInfo
) ;
519 XGI_OEM310Setting( ModeNo
, ModeIdIndex
,pVBInfo
) ; /*0212*/
520 XGI_CloseCRTC( HwDeviceExtension
, pVBInfo
) ;
521 XGI_EnableBridge( HwDeviceExtension
,pVBInfo
) ;
527 if ( pVBInfo
->IF_DEF_LVDS
== 1 )
529 if ( !XGI_XG21CheckLVDSMode(ModeNo
, ModeIdIndex
, pVBInfo
) )
535 if ( ModeNo
<= 0x13 )
537 pVBInfo
->ModeType
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
& ModeInfoFlag
;
541 pVBInfo
->ModeType
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
& ModeInfoFlag
;
544 pVBInfo
->SetFlag
= 0 ;
545 if ( pVBInfo
->IF_DEF_CH7007
!= 1 )
547 pVBInfo
->VBInfo
= DisableCRT2Display
;
551 XGI_DisplayOff(HwDeviceExtension
, pVBInfo
) ;
553 XGI_SetCRT1Group(HwDeviceExtension
, ModeNo
, ModeIdIndex
, pVBInfo
) ;
555 XGI_DisplayOn( HwDeviceExtension
, pVBInfo
) ;
557 if( HwDeviceExtension->jChipType == XG21 )
558 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x09 , ~0x80 , 0x80 ) ;
564 if ( ModeNo <= 0x13 )
566 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
570 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
572 pVBInfo->ModeType = modeflag&ModeInfoFlag ;
573 pVBInfo->SetFlag = 0x00 ;
574 pVBInfo->VBInfo = DisableCRT2Display ;
575 temp = XGINew_CheckMemorySize( HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;
580 XGI_DisplayOff( HwDeviceExtension, pVBInfo) ;
581 XGI_SetCRT1Group( HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;
582 XGI_DisplayOn( HwDeviceExtension, pVBInfo) ;
585 XGI_UpdateModeInfo( HwDeviceExtension
, pVBInfo
) ;
587 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
589 XGI_LockCRT2( HwDeviceExtension
, pVBInfo
) ;
596 /* --------------------------------------------------------------------- */
597 /* Function : XGI_SetCRT1Group */
601 /* --------------------------------------------------------------------- */
602 void XGI_SetCRT1Group( PXGI_HW_DEVICE_INFO HwDeviceExtension
, USHORT ModeNo
, USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
604 USHORT StandTableIndex
,
605 RefreshRateTableIndex
,
609 USHORT XGINew_P3cc
= pVBInfo
->P3cc
;
611 /* XGINew_CRT1Mode = ModeNo ; // SaveModeID */
612 StandTableIndex
= XGI_GetModePtr( ModeNo
, ModeIdIndex
, pVBInfo
) ;
613 /* XGI_SetBIOSData(ModeNo , ModeIdIndex ) ; */
614 /* XGI_ClearBankRegs( ModeNo , ModeIdIndex ) ; */
615 XGI_SetSeqRegs( ModeNo
, StandTableIndex
, ModeIdIndex
, pVBInfo
) ;
616 XGI_SetMiscRegs( StandTableIndex
, pVBInfo
) ;
617 XGI_SetCRTCRegs( HwDeviceExtension
, StandTableIndex
, pVBInfo
) ;
618 XGI_SetATTRegs( ModeNo
, StandTableIndex
, ModeIdIndex
, pVBInfo
) ;
619 XGI_SetGRCRegs( StandTableIndex
, pVBInfo
) ;
620 XGI_ClearExt1Regs(pVBInfo
) ;
622 /* if ( pVBInfo->IF_DEF_ExpLink ) */
623 if ( HwDeviceExtension
->jChipType
== XG27
)
625 if ( pVBInfo
->IF_DEF_LVDS
== 0 )
627 XGI_SetDefaultVCLK( pVBInfo
) ;
631 temp
= ~ProgrammingCRT2
;
632 pVBInfo
->SetFlag
&= temp
;
633 pVBInfo
->SelectCRT2Rate
= 0 ;
635 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
637 if ( pVBInfo
->VBInfo
& ( SetSimuScanMode
| SetCRT2ToLCDA
| SetInSlaveMode
) )
639 pVBInfo
->SetFlag
|= ProgrammingCRT2
;
643 RefreshRateTableIndex
= XGI_GetRatePtrCRT2( HwDeviceExtension
, ModeNo
, ModeIdIndex
, pVBInfo
) ;
644 if ( RefreshRateTableIndex
!= 0xFFFF )
646 XGI_SetSync( RefreshRateTableIndex
, pVBInfo
) ;
647 XGI_SetCRT1CRTC( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
, HwDeviceExtension
) ;
648 XGI_SetCRT1DE( HwDeviceExtension
, ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
649 XGI_SetCRT1Offset( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, HwDeviceExtension
, pVBInfo
) ;
650 XGI_SetCRT1VCLK( ModeNo
, ModeIdIndex
, HwDeviceExtension
, RefreshRateTableIndex
, pVBInfo
) ;
653 if ( ( HwDeviceExtension
->jChipType
>= XG20
)&&
654 ( HwDeviceExtension
->jChipType
< XG27
) ) /* fix H/W DCLK/2 bug */
656 if ( ( ModeNo
== 0x00 ) | (ModeNo
== 0x01) )
658 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2B , 0x4E) ;
659 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2C , 0xE9) ;
660 b3CC
=(UCHAR
) XGINew_GetReg2(XGINew_P3cc
) ;
661 XGINew_SetReg3(XGINew_P3cc
, (b3CC
|= 0x0C) ) ;
663 else if ( ( ModeNo
== 0x04) | ( ModeNo
== 0x05) | ( ModeNo
== 0x0D) )
665 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2B , 0x1B) ;
666 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2C , 0xE3) ;
667 b3CC
= (UCHAR
)XGINew_GetReg2(XGINew_P3cc
) ;
668 XGINew_SetReg3(XGINew_P3cc
, (b3CC
|= 0x0C) ) ;
672 if ( HwDeviceExtension
->jChipType
>= XG21
)
674 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
678 /*XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~0x20 ) ;*/ /* Enable write GPIOF */
679 /*XGINew_SetRegAND( pVBInfo->P3d4 , 0x48 , ~0x20 ) ;*/ /* P. DWN */
680 /* XG21 CRT1 Timing */
681 if ( HwDeviceExtension
->jChipType
== XG27
)
682 XGI_SetXG27CRTC( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
);
684 XGI_SetXG21CRTC( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
);
686 XGI_UpdateXG21CRTC( ModeNo
, pVBInfo
, RefreshRateTableIndex
) ;
688 if ( HwDeviceExtension
->jChipType
== XG27
)
689 XGI_SetXG27LCD( pVBInfo
, RefreshRateTableIndex
, ModeNo
);
691 XGI_SetXG21LCD( pVBInfo
, RefreshRateTableIndex
, ModeNo
);
693 if ( pVBInfo
->IF_DEF_LVDS
== 1 )
695 if ( HwDeviceExtension
->jChipType
== XG27
)
696 XGI_SetXG27LVDSPara(ModeNo
,ModeIdIndex
, pVBInfo
);
698 XGI_SetXG21LVDSPara(ModeNo
,ModeIdIndex
, pVBInfo
);
700 /*XGINew_SetRegOR( pVBInfo->P3d4 , 0x48 , 0x20 ) ;*/ /* P. ON */
704 pVBInfo
->SetFlag
&= ( ~ProgrammingCRT2
) ;
705 XGI_SetCRT1FIFO( ModeNo
, HwDeviceExtension
, pVBInfo
) ;
706 XGI_SetCRT1ModeRegs( HwDeviceExtension
, ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
709 /* XGI_LoadCharacter(); //dif ifdef TVFont */
711 XGI_LoadDAC( ModeNo
, ModeIdIndex
, pVBInfo
) ;
712 /* XGI_ClearBuffer( HwDeviceExtension , ModeNo, pVBInfo ) ; */
716 /* --------------------------------------------------------------------- */
717 /* Function : XGI_GetModePtr */
721 /* --------------------------------------------------------------------- */
722 UCHAR
XGI_GetModePtr( USHORT ModeNo
, USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
726 if ( ModeNo
<= 0x13 )
727 index
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_StTableIndex
;
730 if ( pVBInfo
->ModeType
<= 0x02 )
731 index
= 0x1B ; /* 02 -> ModeEGA */
735 return( index
) ; /* Get pVBInfo->StandTable index */
739 /* --------------------------------------------------------------------- */
740 /* Function : XGI_SetBIOSData */
744 /* --------------------------------------------------------------------- */
745 /*UCHAR XGI_SetBIOSData( USHORT ModeNo , USHORT ModeIdIndex )
751 /* --------------------------------------------------------------------- */
752 /* Function : XGI_ClearBankRegs */
756 /* --------------------------------------------------------------------- */
757 /*UCHAR XGI_ClearBankRegs( USHORT ModeNo , USHORT ModeIdIndex )
763 /* --------------------------------------------------------------------- */
764 /* Function : XGI_SetSeqRegs */
768 /* --------------------------------------------------------------------- */
769 void XGI_SetSeqRegs( USHORT ModeNo
, USHORT StandTableIndex
, USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
777 if ( ModeNo
<= 0x13 )
778 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
;
780 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
782 XGINew_SetReg1( pVBInfo
->P3c4
, 0x00 , 0x03 ) ; /* Set SR0 */
783 tempah
=pVBInfo
->StandTable
[ StandTableIndex
].SR
[ 0 ] ;
786 if ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
)
792 if ( pVBInfo
->VBInfo
& ( SetCRT2ToTV
| SetCRT2ToLCD
) )
794 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
799 tempah
|= 0x20 ; /* screen off */
800 XGINew_SetReg1( pVBInfo
->P3c4
, 0x01 , tempah
) ; /* Set SR1 */
802 for( i
= 02 ; i
<= 04 ; i
++ )
804 SRdata
= pVBInfo
->StandTable
[ StandTableIndex
].SR
[ i
- 1 ] ; /* Get SR2,3,4 from file */
805 XGINew_SetReg1( pVBInfo
->P3c4
, i
, SRdata
) ; /* Set SR2 3 4 */
810 /* --------------------------------------------------------------------- */
811 /* Function : XGI_SetMiscRegs */
815 /* --------------------------------------------------------------------- */
816 void XGI_SetMiscRegs( USHORT StandTableIndex
, PVB_DEVICE_INFO pVBInfo
)
820 Miscdata
= pVBInfo
->StandTable
[ StandTableIndex
].MISC
; /* Get Misc from file */
822 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
824 if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
831 XGINew_SetReg3( pVBInfo
->P3c2
, Miscdata
) ; /* Set Misc(3c2) */
835 /* --------------------------------------------------------------------- */
836 /* Function : XGI_SetCRTCRegs */
840 /* --------------------------------------------------------------------- */
841 void XGI_SetCRTCRegs( PXGI_HW_DEVICE_INFO HwDeviceExtension
, USHORT StandTableIndex
, PVB_DEVICE_INFO pVBInfo
)
846 CRTCdata
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x11 ) ;
848 XGINew_SetReg1( pVBInfo
->P3d4
, 0x11 , CRTCdata
) ; /* Unlock CRTC */
850 for( i
= 0 ; i
<= 0x18 ; i
++ )
852 CRTCdata
= pVBInfo
->StandTable
[ StandTableIndex
].CRTC
[ i
] ; /* Get CRTC from file */
853 XGINew_SetReg1( pVBInfo
->P3d4
, i
, CRTCdata
) ; /* Set CRTC( 3d4 ) */
856 if ( ( HwDeviceExtension->jChipType == XGI_630 )&& ( HwDeviceExtension->jChipRevision == 0x30 ) )
858 if ( pVBInfo->VBInfo & SetInSlaveMode )
860 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToTV ) )
862 XGINew_SetReg1( pVBInfo->P3d4 , 0x18 , 0xFE ) ;
870 /* --------------------------------------------------------------------- */
875 /* --------------------------------------------------------------------- */
876 void XGI_SetATTRegs( USHORT ModeNo
, USHORT StandTableIndex
, USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
882 if ( ModeNo
<= 0x13 )
883 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
;
885 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
887 for( i
= 0 ; i
<= 0x13 ; i
++ )
889 ARdata
= pVBInfo
->StandTable
[ StandTableIndex
].ATTR
[ i
] ;
890 if ( modeflag
& Charx8Dot
) /* ifndef Dot9 */
894 if ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
)
898 if ( pVBInfo
->VBInfo
& ( SetCRT2ToTV
| SetCRT2ToLCD
) )
900 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
907 XGINew_GetReg2( pVBInfo
->P3da
) ; /* reset 3da */
908 XGINew_SetReg3( pVBInfo
->P3c0
, i
) ; /* set index */
909 XGINew_SetReg3( pVBInfo
->P3c0
, ARdata
) ; /* set data */
912 XGINew_GetReg2( pVBInfo
->P3da
) ; /* reset 3da */
913 XGINew_SetReg3( pVBInfo
->P3c0
, 0x14 ) ; /* set index */
914 XGINew_SetReg3( pVBInfo
->P3c0
, 0x00 ) ; /* set data */
915 XGINew_GetReg2( pVBInfo
->P3da
) ; /* Enable Attribute */
916 XGINew_SetReg3( pVBInfo
->P3c0
, 0x20 ) ;
920 /* --------------------------------------------------------------------- */
921 /* Function : XGI_SetGRCRegs */
925 /* --------------------------------------------------------------------- */
926 void XGI_SetGRCRegs( USHORT StandTableIndex
, PVB_DEVICE_INFO pVBInfo
)
931 for( i
= 0 ; i
<= 0x08 ; i
++ )
933 GRdata
= pVBInfo
->StandTable
[ StandTableIndex
].GRC
[ i
] ; /* Get GR from file */
934 XGINew_SetReg1( pVBInfo
->P3ce
, i
, GRdata
) ; /* Set GR(3ce) */
937 if ( pVBInfo
->ModeType
> ModeVGA
)
939 GRdata
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3ce
, 0x05 ) ;
940 GRdata
&= 0xBF ; /* 256 color disable */
941 XGINew_SetReg1( pVBInfo
->P3ce
, 0x05 , GRdata
) ;
946 /* --------------------------------------------------------------------- */
947 /* Function : XGI_ClearExt1Regs */
951 /* --------------------------------------------------------------------- */
952 void XGI_ClearExt1Regs(PVB_DEVICE_INFO pVBInfo
)
956 for( i
= 0x0A ; i
<= 0x0E ; i
++ )
957 XGINew_SetReg1( pVBInfo
->P3c4
, i
, 0x00 ) ; /* Clear SR0A-SR0E */
961 /* --------------------------------------------------------------------- */
962 /* Function : XGI_SetDefaultVCLK */
966 /* --------------------------------------------------------------------- */
967 UCHAR
XGI_SetDefaultVCLK( PVB_DEVICE_INFO pVBInfo
)
970 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x31 , ~0x30 , 0x20 ) ;
971 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2B , pVBInfo
->VCLKData
[ 0 ].SR2B
) ;
972 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2C , pVBInfo
->VCLKData
[ 0 ].SR2C
) ;
974 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x31 , ~0x30 , 0x10 ) ;
975 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2B , pVBInfo
->VCLKData
[ 1 ].SR2B
) ;
976 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2C , pVBInfo
->VCLKData
[ 1 ].SR2C
) ;
978 XGINew_SetRegAND( pVBInfo
->P3c4
, 0x31 , ~0x30 ) ;
983 /* --------------------------------------------------------------------- */
984 /* Function : XGI_GetRatePtrCRT2 */
988 /* --------------------------------------------------------------------- */
989 USHORT
XGI_GetRatePtrCRT2( PXGI_HW_DEVICE_INFO pXGIHWDE
, USHORT ModeNo
, USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
991 SHORT LCDRefreshIndex
[] = { 0x00 , 0x00 , 0x03 , 0x01 } ,
992 LCDARefreshIndex
[] = { 0x00 , 0x00 , 0x03 , 0x01 , 0x01 , 0x01 , 0x01 } ;
994 USHORT RefreshRateTableIndex
, i
,
995 modeflag
, index
, temp
;
997 if ( ModeNo
<= 0x13 )
999 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
;
1003 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
1006 if ( pVBInfo
->IF_DEF_CH7005
== 1 )
1008 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
1010 if ( modeflag
& HalfDCLK
)
1015 if ( ModeNo
< 0x14 )
1018 index
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x33 ) ;
1019 index
= index
>> pVBInfo
->SelectCRT2Rate
;
1022 if ( pVBInfo
->LCDInfo
& LCDNonExpanding
)
1028 if ( pVBInfo
->SetFlag
& ProgrammingCRT2
)
1030 if ( pVBInfo
->IF_DEF_CH7005
== 1 )
1032 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
1038 if ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) )
1040 if( pVBInfo
->IF_DEF_LVDS
== 0 )
1042 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
1043 temp
= LCDARefreshIndex
[ pVBInfo
->LCDResInfo
& 0x0F ] ; /* 301b */
1045 temp
= LCDRefreshIndex
[ pVBInfo
->LCDResInfo
& 0x0F ] ;
1059 RefreshRateTableIndex
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].REFindex
;
1060 ModeNo
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].ModeID
;
1061 if ( pXGIHWDE
->jChipType
>= XG20
) /* for XG20, XG21, XG27 */
1064 if ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag & XG2xNotSupport )
1069 if ( ( pVBInfo
->RefIndex
[ RefreshRateTableIndex
].XRes
== 800 ) &&
1070 ( pVBInfo
->RefIndex
[ RefreshRateTableIndex
].YRes
== 600 ) )
1074 /* Alan 10/19/2007; do the similiar adjustment like XGISearchCRT1Rate() */
1075 if ( ( pVBInfo
->RefIndex
[ RefreshRateTableIndex
].XRes
== 1024 ) &&
1076 ( pVBInfo
->RefIndex
[ RefreshRateTableIndex
].YRes
== 768 ) )
1080 if ( ( pVBInfo
->RefIndex
[ RefreshRateTableIndex
].XRes
== 1280 ) &&
1081 ( pVBInfo
->RefIndex
[ RefreshRateTableIndex
].YRes
== 1024 ) )
1090 if ( pVBInfo
->RefIndex
[ RefreshRateTableIndex
+ i
].ModeID
!= ModeNo
)
1092 temp
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
+ i
].Ext_InfoFlag
;
1093 temp
&= ModeInfoFlag
;
1094 if ( temp
< pVBInfo
->ModeType
)
1099 } while( index
!= 0xFFFF ) ;
1100 if ( !( pVBInfo
->VBInfo
& SetCRT2ToRAMDAC
) )
1102 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
1104 temp
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
+ i
- 1 ].Ext_InfoFlag
;
1105 if ( temp
& InterlaceMode
)
1112 if ( ( pVBInfo
->SetFlag
& ProgrammingCRT2
) )
1114 temp
= XGI_AjustCRT2Rate( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, &i
, pVBInfo
) ;
1116 return( RefreshRateTableIndex
+ i
) ; /*return(0x01|(temp1<<1)); */
1120 /* --------------------------------------------------------------------- */
1121 /* Function : XGI_AjustCRT2Rate */
1125 /* --------------------------------------------------------------------- */
1126 BOOLEAN
XGI_AjustCRT2Rate( USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, USHORT
*i
, PVB_DEVICE_INFO pVBInfo
)
1134 if ( ModeNo
<= 0x13 )
1136 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
; /* si+St_ModeFlag */
1140 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
1143 resinfo
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_RESINFO
;
1144 tempbx
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
+ ( *i
) ].ModeID
;
1147 if ( pVBInfo
->IF_DEF_LVDS
== 0 )
1149 if ( pVBInfo
->VBInfo
& SetCRT2ToRAMDAC
)
1151 tempax
|= SupportRAMDAC2
;
1153 if ( pVBInfo
->VBType
& VB_XGI301C
)
1154 tempax
|= SupportCRT2in301C
;
1157 if ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) ) /* 301b */
1159 tempax
|= SupportLCD
;
1161 if ( pVBInfo
->LCDResInfo
!= Panel1280x1024
)
1163 if ( pVBInfo
->LCDResInfo
!= Panel1280x960
)
1165 if ( pVBInfo
->LCDInfo
& LCDNonExpanding
)
1177 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
) /* for HiTV */
1179 if ( ( pVBInfo
->VBType
& VB_XGI301LV
) && ( pVBInfo
->VBExtInfo
== VB_YPbPr1080i
) )
1181 tempax
|= SupportYPbPr
;
1182 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
1196 tempax
|= SupportHiVisionTV
;
1197 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
1204 if ( pVBInfo
->SetFlag
& TVSimuMode
)
1215 if ( pVBInfo
->VBInfo
& ( SetCRT2ToAVIDEO
| SetCRT2ToSVIDEO
| SetCRT2ToSCART
| SetCRT2ToYPbPr
| SetCRT2ToHiVisionTV
) )
1217 tempax
|= SupportTV
;
1219 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
1221 tempax
|= SupportTV1024
;
1224 if ( !( pVBInfo
->VBInfo
& SetPALTV
) )
1226 if ( modeflag
& NoSupportSimuTV
)
1228 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
1230 if ( !( pVBInfo
->VBInfo
& SetNotSimuMode
) )
1242 if ( pVBInfo
->IF_DEF_CH7005
== 1 )
1244 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
1246 tempax
|= SupportCHTV
;
1250 if ( pVBInfo
->VBInfo
& SetCRT2ToLCD
)
1252 tempax
|= SupportLCD
;
1254 if ( resinfo
> 0x08 )
1255 return( 0 ) ; /* 1024x768 */
1257 if ( pVBInfo
->LCDResInfo
< Panel1024x768
)
1259 if ( resinfo
> 0x07 )
1260 return( 0 ) ; /* 800x600 */
1262 if ( resinfo
== 0x04 )
1263 return( 0 ) ; /* 512x384 */
1268 for( ; pVBInfo
->RefIndex
[ RefreshRateTableIndex
+ ( *i
) ].ModeID
== tempbx
; ( *i
)-- )
1270 infoflag
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
+ ( *i
) ].Ext_InfoFlag
;
1271 if ( infoflag
& tempax
)
1279 for( ( *i
) = 0 ; ; ( *i
)++ )
1281 infoflag
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
+ ( *i
) ].Ext_InfoFlag
;
1282 if ( pVBInfo
->RefIndex
[ RefreshRateTableIndex
+ ( *i
) ].ModeID
!= tempbx
)
1287 if ( infoflag
& tempax
)
1296 /* --------------------------------------------------------------------- */
1297 /* Function : XGI_SetSync */
1301 /* --------------------------------------------------------------------- */
1302 void XGI_SetSync(USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
1307 sync
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_InfoFlag
>> 8 ; /* di+0x00 */
1311 XGINew_SetReg3( pVBInfo
->P3c2
, temp
) ; /* Set Misc(3c2) */
1315 /* --------------------------------------------------------------------- */
1316 /* Function : XGI_SetCRT1CRTC */
1320 /* --------------------------------------------------------------------- */
1321 void XGI_SetCRT1CRTC( USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
,PVB_DEVICE_INFO pVBInfo
, PXGI_HW_DEVICE_INFO HwDeviceExtension
)
1328 index
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT1CRTC
; /* Get index */
1329 index
= index
&IndexMask
;
1331 data
=( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x11 ) ;
1333 XGINew_SetReg1(pVBInfo
->P3d4
,0x11,data
); /* Unlock CRTC */
1335 for( i
= 0 ; i
< 8 ; i
++ )
1336 pVBInfo
->TimingH
[ 0 ].data
[ i
] = pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ i
] ;
1338 for( i
= 0 ; i
< 7 ; i
++ )
1339 pVBInfo
->TimingV
[ 0 ].data
[ i
] = pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ i
+ 8 ] ;
1341 XGI_SetCRT1Timing_H( pVBInfo
, HwDeviceExtension
) ;
1345 XGI_SetCRT1Timing_V( ModeIdIndex
, ModeNo
, pVBInfo
) ;
1348 if( pVBInfo
->ModeType
> 0x03 )
1349 XGINew_SetReg1( pVBInfo
->P3d4
, 0x14 , 0x4F ) ;
1353 /* --------------------------------------------------------------------- */
1354 /* Function : XGI_SetCRT1Timing_H */
1358 /* --------------------------------------------------------------------- */
1359 void XGI_SetCRT1Timing_H( PVB_DEVICE_INFO pVBInfo
, PXGI_HW_DEVICE_INFO HwDeviceExtension
)
1361 UCHAR data
, data1
, pushax
;
1364 /* XGINew_SetReg1( pVBInfo->P3d4 , 0x51 , 0 ) ; */
1365 /* XGINew_SetReg1( pVBInfo->P3d4 , 0x56 , 0 ) ; */
1366 /* XGINew_SetRegANDOR( pVBInfo->P3d4 ,0x11 , 0x7f , 0x00 ) ; */
1368 data
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x11 ) ; /* unlock cr0-7 */
1370 XGINew_SetReg1( pVBInfo
->P3d4
, 0x11 , data
) ;
1372 data
= pVBInfo
->TimingH
[ 0 ].data
[ 0 ] ;
1373 XGINew_SetReg1( pVBInfo
->P3d4
, 0 , data
) ;
1375 for( i
= 0x01 ; i
<= 0x04 ; i
++ )
1377 data
= pVBInfo
->TimingH
[ 0 ].data
[ i
] ;
1378 XGINew_SetReg1( pVBInfo
->P3d4
, ( USHORT
)( i
+ 1 ) , data
) ;
1381 for( i
= 0x05 ; i
<= 0x06 ; i
++ )
1383 data
= pVBInfo
->TimingH
[ 0 ].data
[ i
];
1384 XGINew_SetReg1( pVBInfo
->P3c4
,( USHORT
)( i
+ 6 ) , data
) ;
1387 j
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3c4
, 0x0e ) ;
1389 data
= pVBInfo
->TimingH
[ 0 ].data
[ 7 ] ;
1392 XGINew_SetReg1( pVBInfo
->P3c4
, 0x0e , data
) ;
1394 if ( HwDeviceExtension
->jChipType
>= XG20
)
1396 data
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x04 ) ;
1398 XGINew_SetReg1( pVBInfo
->P3d4
, 0x04 , data
) ;
1399 data
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x05 ) ;
1406 data
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3c4
, 0x0c ) ;
1408 XGINew_SetReg1( pVBInfo
->P3c4
, 0x0c , data
) ;
1413 XGINew_SetReg1( pVBInfo
->P3d4
, 0x05 , data
) ;
1414 data
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3c4
, 0x0e ) ;
1420 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0e , ~0xE0 , data
) ;
1425 /* --------------------------------------------------------------------- */
1426 /* Function : XGI_SetCRT1Timing_V */
1430 /* --------------------------------------------------------------------- */
1431 void XGI_SetCRT1Timing_V( USHORT ModeIdIndex
, USHORT ModeNo
,PVB_DEVICE_INFO pVBInfo
)
1436 /* XGINew_SetReg1( pVBInfo->P3d4 , 0x51 , 0 ) ; */
1437 /* XGINew_SetReg1( pVBInfo->P3d4 , 0x56 , 0 ) ; */
1438 /* XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x11 , 0x7f , 0x00 ) ; */
1440 for( i
= 0x00 ; i
<= 0x01 ; i
++ )
1442 data
= pVBInfo
->TimingV
[ 0 ].data
[ i
] ;
1443 XGINew_SetReg1( pVBInfo
->P3d4
, ( USHORT
)( i
+ 6 ) , data
) ;
1446 for( i
= 0x02 ; i
<= 0x03 ; i
++ )
1448 data
= pVBInfo
->TimingV
[ 0 ].data
[ i
] ;
1449 XGINew_SetReg1( pVBInfo
->P3d4
, ( USHORT
)( i
+ 0x0e ) , data
) ;
1452 for( i
= 0x04 ; i
<= 0x05 ; i
++ )
1454 data
= pVBInfo
->TimingV
[ 0 ].data
[ i
] ;
1455 XGINew_SetReg1( pVBInfo
->P3d4
, ( USHORT
)( i
+ 0x11 ) , data
) ;
1458 j
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3c4
, 0x0a ) ;
1460 data
= pVBInfo
->TimingV
[ 0 ].data
[ 6 ] ;
1463 XGINew_SetReg1( pVBInfo
->P3c4
, 0x0a , data
) ;
1465 data
= pVBInfo
->TimingV
[ 0 ].data
[ 6 ] ;
1469 if ( ModeNo
<= 0x13 )
1470 i
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
;
1472 i
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
1474 i
&= DoubleScanMode
;
1478 j
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x09 ) ;
1481 XGINew_SetReg1( pVBInfo
->P3d4
, 0x09 , data
) ;
1485 /* --------------------------------------------------------------------- */
1486 /* Function : XGI_SetXG21CRTC */
1487 /* Input : Stand or enhance CRTC table */
1488 /* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
1489 /* Description : Set LCD timing */
1490 /* --------------------------------------------------------------------- */
1491 void XGI_SetXG21CRTC(USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
1493 UCHAR StandTableIndex
, index
, Tempax
, Tempbx
, Tempcx
, Tempdx
;
1494 USHORT Temp1
, Temp2
, Temp3
;
1496 if ( ModeNo
<= 0x13 )
1498 StandTableIndex
= XGI_GetModePtr( ModeNo
, ModeIdIndex
, pVBInfo
) ;
1499 Tempax
= pVBInfo
->StandTable
[ StandTableIndex
].CRTC
[ 4 ] ; /* CR04 HRS */
1500 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2E , Tempax
) ; /* SR2E [7:0]->HRS */
1501 Tempbx
= pVBInfo
->StandTable
[ StandTableIndex
].CRTC
[ 5 ] ; /* Tempbx: CR05 HRE */
1502 Tempbx
&= 0x1F ; /* Tempbx: HRE[4:0] */
1504 Tempcx
&= 0xE0 ; /* Tempcx: HRS[7:5] */
1505 Tempdx
= Tempcx
| Tempbx
; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
1506 if ( Tempbx
< ( Tempax
& 0x1F ) ) /* IF HRE < HRS */
1507 Tempdx
|= 0x20 ; /* Tempdx: HRE = HRE + 0x20 */
1508 Tempdx
<<= 2 ; /* Tempdx << 2 */
1509 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2F , Tempdx
) ; /* SR2F [7:2]->HRE */
1510 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x30 , 0xE3 , 00 ) ;
1512 Tempax
= pVBInfo
->StandTable
[ StandTableIndex
].CRTC
[ 16 ] ; /* Tempax: CR16 VRS */
1513 Tempbx
= Tempax
; /* Tempbx=Tempax */
1514 Tempax
&= 0x01 ; /* Tempax: VRS[0] */
1515 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x33 , Tempax
) ; /* SR33[0]->VRS */
1516 Tempax
= pVBInfo
->StandTable
[ StandTableIndex
].CRTC
[ 7 ] ; /* Tempax: CR7 VRS */
1517 Tempdx
= Tempbx
>> 1 ; /* Tempdx: VRS[7:1] */
1518 Tempcx
= Tempax
& 0x04 ; /* Tempcx: CR7[2] */
1519 Tempcx
<<= 5 ; /* Tempcx[7]: VRS[8] */
1520 Tempdx
|= Tempcx
; /* Tempdx: VRS[8:1] */
1521 XGINew_SetReg1( pVBInfo
->P3c4
, 0x34 , Tempdx
) ; /* SR34[7:0]: VRS[8:1] */
1523 Temp1
= Tempcx
<< 1 ; /* Temp1[8]: VRS[8] UCHAR -> USHORT */
1524 Temp1
|= Tempbx
; /* Temp1[8:0]: VRS[8:0] */
1525 Tempax
&= 0x80 ; /* Tempax[7]: CR7[7] */
1526 Temp2
= Tempax
<< 2 ; /* Temp2[9]: VRS[9] */
1527 Temp1
|= Temp2
; /* Temp1[9:0]: VRS[9:0] */
1529 Tempax
= pVBInfo
->StandTable
[ StandTableIndex
].CRTC
[ 17 ] ; /* CR16 VRE */
1530 Tempax
&= 0x0F ; /* Tempax[3:0]: VRE[3:0] */
1531 Temp2
= Temp1
& 0x3F0 ; /* Temp2[9:4]: VRS[9:4] */
1532 Temp2
|= Tempax
; /* Temp2[9:0]: VRE[9:0] */
1533 Temp3
= Temp1
& 0x0F ; /* Temp3[3:0]: VRS[3:0] */
1534 if ( Tempax
< Temp3
) /* VRE[3:0]<VRS[3:0] */
1535 Temp2
|= 0x10 ; /* Temp2: VRE + 0x10 */
1536 Temp2
&= 0xFF ; /* Temp2[7:0]: VRE[7:0] */
1537 Tempax
= (UCHAR
)Temp2
; /* Tempax[7:0]: VRE[7:0] */
1538 Tempax
<<= 2 ; /* Tempax << 2: VRE[5:0] */
1539 Temp1
&= 0x600 ; /* Temp1[10:9]: VRS[10:9] */
1540 Temp1
>>= 9 ; /* [10:9]->[1:0] */
1541 Tempbx
= (UCHAR
)Temp1
; /* Tempbx[1:0]: VRS[10:9] */
1542 Tempax
|= Tempbx
; /* VRE[5:0]VRS[10:9] */
1544 XGINew_SetReg1( pVBInfo
->P3c4
, 0x3F , Tempax
) ; /* SR3F D[7:2]->VRE D[1:0]->VRS */
1548 index
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT1CRTC
;
1549 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 3 ] ; /* Tempax: CR4 HRS */
1550 Tempcx
= Tempax
; /* Tempcx: HRS */
1551 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2E , Tempax
) ; /* SR2E[7:0]->HRS */
1553 Tempdx
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 5 ] ; /* SRB */
1554 Tempdx
&= 0xC0 ; /* Tempdx[7:6]: SRB[7:6] */
1555 Temp1
= Tempdx
; /* Temp1[7:6]: HRS[9:8] */
1556 Temp1
<<= 2 ; /* Temp1[9:8]: HRS[9:8] */
1557 Temp1
|= Tempax
; /* Temp1[9:0]: HRS[9:0] */
1559 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 4 ] ; /* CR5 HRE */
1560 Tempax
&= 0x1F ; /* Tempax[4:0]: HRE[4:0] */
1562 Tempbx
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 6 ] ; /* SRC */
1563 Tempbx
&= 0x04 ; /* Tempbx[2]: HRE[5] */
1564 Tempbx
<<= 3 ; /* Tempbx[5]: HRE[5] */
1565 Tempax
|= Tempbx
; /* Tempax[5:0]: HRE[5:0] */
1567 Temp2
= Temp1
& 0x3C0 ; /* Temp2[9:6]: HRS[9:6] */
1568 Temp2
|= Tempax
; /* Temp2[9:0]: HRE[9:0] */
1570 Tempcx
&= 0x3F ; /* Tempcx[5:0]: HRS[5:0] */
1571 if( Tempax
< Tempcx
) /* HRE < HRS */
1572 Temp2
|= 0x40 ; /* Temp2 + 0x40 */
1575 Tempax
= (UCHAR
)Temp2
; /* Tempax: HRE[7:0] */
1576 Tempax
<<= 2 ; /* Tempax[7:2]: HRE[5:0] */
1577 Tempdx
>>= 6 ; /* Tempdx[7:6]->[1:0] HRS[9:8] */
1578 Tempax
|= Tempdx
; /* HRE[5:0]HRS[9:8] */
1579 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2F , Tempax
) ; /* SR2F D[7:2]->HRE, D[1:0]->HRS */
1580 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x30 , 0xE3 , 00 ) ;
1582 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 10 ] ; /* CR10 VRS */
1583 Tempbx
= Tempax
; /* Tempbx: VRS */
1584 Tempax
&= 0x01 ; /* Tempax[0]: VRS[0] */
1585 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x33 , Tempax
) ; /* SR33[0]->VRS[0] */
1586 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 9 ] ; /* CR7[2][7] VRE */
1587 Tempcx
= Tempbx
>> 1 ; /* Tempcx[6:0]: VRS[7:1] */
1588 Tempdx
= Tempax
& 0x04 ; /* Tempdx[2]: CR7[2] */
1589 Tempdx
<<= 5 ; /* Tempdx[7]: VRS[8] */
1590 Tempcx
|= Tempdx
; /* Tempcx[7:0]: VRS[8:1] */
1591 XGINew_SetReg1( pVBInfo
->P3c4
, 0x34 , Tempcx
) ; /* SR34[8:1]->VRS */
1593 Temp1
= Tempdx
; /* Temp1[7]: Tempdx[7] */
1594 Temp1
<<= 1 ; /* Temp1[8]: VRS[8] */
1595 Temp1
|= Tempbx
; /* Temp1[8:0]: VRS[8:0] */
1597 Temp2
= Tempax
<< 2 ; /* Temp2[9]: VRS[9] */
1598 Temp1
|= Temp2
; /* Temp1[9:0]: VRS[9:0] */
1599 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 14 ] ; /* Tempax: SRA */
1600 Tempax
&= 0x08 ; /* Tempax[3]: VRS[3] */
1602 Temp2
<<= 7 ; /* Temp2[10]: VRS[10] */
1603 Temp1
|= Temp2
; /* Temp1[10:0]: VRS[10:0] */
1605 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 11 ] ; /* Tempax: CR11 VRE */
1606 Tempax
&= 0x0F ; /* Tempax[3:0]: VRE[3:0] */
1607 Tempbx
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 14 ] ; /* Tempbx: SRA */
1608 Tempbx
&= 0x20 ; /* Tempbx[5]: VRE[5] */
1609 Tempbx
>>= 1 ; /* Tempbx[4]: VRE[4] */
1610 Tempax
|= Tempbx
; /* Tempax[4:0]: VRE[4:0] */
1611 Temp2
= Temp1
& 0x7E0 ; /* Temp2[10:5]: VRS[10:5] */
1612 Temp2
|= Tempax
; /* Temp2[10:5]: VRE[10:5] */
1614 Temp3
= Temp1
& 0x1F ; /* Temp3[4:0]: VRS[4:0] */
1615 if ( Tempax
< Temp3
) /* VRE < VRS */
1616 Temp2
|= 0x20 ; /* VRE + 0x20 */
1619 Tempax
= (UCHAR
)Temp2
; /* Tempax: VRE[7:0] */
1620 Tempax
<<= 2 ; /* Tempax[7:0]; VRE[5:0]00 */
1621 Temp1
&= 0x600 ; /* Temp1[10:9]: VRS[10:9] */
1622 Temp1
>>= 9 ; /* Temp1[1:0]: VRS[10:9] */
1623 Tempbx
= (UCHAR
)Temp1
;
1624 Tempax
|= Tempbx
; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
1626 XGINew_SetReg1( pVBInfo
->P3c4
, 0x3F , Tempax
) ; /* SR3F D[7:2]->VRE D[1:0]->VRS */
1630 void XGI_SetXG27CRTC(USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
1632 USHORT StandTableIndex
, index
, Tempax
, Tempbx
, Tempcx
, Tempdx
;
1634 if ( ModeNo
<= 0x13 )
1636 StandTableIndex
= XGI_GetModePtr( ModeNo
, ModeIdIndex
, pVBInfo
) ;
1637 Tempax
= pVBInfo
->StandTable
[ StandTableIndex
].CRTC
[ 4 ] ; /* CR04 HRS */
1638 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2E , Tempax
) ; /* SR2E [7:0]->HRS */
1639 Tempbx
= pVBInfo
->StandTable
[ StandTableIndex
].CRTC
[ 5 ] ; /* Tempbx: CR05 HRE */
1640 Tempbx
&= 0x1F ; /* Tempbx: HRE[4:0] */
1642 Tempcx
&= 0xE0 ; /* Tempcx: HRS[7:5] */
1643 Tempdx
= Tempcx
| Tempbx
; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
1644 if ( Tempbx
< ( Tempax
& 0x1F ) ) /* IF HRE < HRS */
1645 Tempdx
|= 0x20 ; /* Tempdx: HRE = HRE + 0x20 */
1646 Tempdx
<<= 2 ; /* Tempdx << 2 */
1647 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2F , Tempdx
) ; /* SR2F [7:2]->HRE */
1648 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x30 , 0xE3 , 00 ) ;
1650 Tempax
= pVBInfo
->StandTable
[ StandTableIndex
].CRTC
[ 16 ] ; /* Tempax: CR10 VRS */
1651 XGINew_SetReg1( pVBInfo
->P3c4
, 0x34 , Tempax
) ; /* SR34[7:0]->VRS */
1652 Tempcx
= Tempax
; /* Tempcx=Tempax=VRS[7:0] */
1653 Tempax
= pVBInfo
->StandTable
[ StandTableIndex
].CRTC
[ 7 ] ; /* Tempax[7][2]: CR7[7][2] VRS[9][8] */
1654 Tempbx
= Tempax
; /* Tempbx=CR07 */
1655 Tempax
&= 0x04 ; /* Tempax[2]: CR07[2] VRS[8] */
1657 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x35 , ~0x01, Tempax
) ; /* SR35 D[0]->VRS D[8] */
1658 Tempcx
|= (Tempax
<< 8) ; /* Tempcx[8] |= VRS[8] */
1659 Tempcx
|= (Tempbx
& 0x80)<<2; /* Tempcx[9] |= VRS[9] */
1662 Tempax
= pVBInfo
->StandTable
[ StandTableIndex
].CRTC
[ 17 ] ; /* CR11 VRE */
1663 Tempax
&= 0x0F ; /* Tempax: VRE[3:0] */
1664 Tempbx
= Tempcx
; /* Tempbx=Tempcx=VRS[9:0] */
1665 Tempbx
&= 0x3F0 ; /* Tempbx[9:4]: VRS[9:4] */
1666 Tempbx
|= Tempax
; /* Tempbx[9:0]: VRE[9:0] */
1667 if ( Tempax
<= (Tempcx
& 0x0F) ) /* VRE[3:0]<=VRS[3:0] */
1668 Tempbx
|= 0x10 ; /* Tempbx: VRE + 0x10 */
1669 Tempax
= (UCHAR
)Tempbx
& 0xFF; /* Tempax[7:0]: VRE[7:0] */
1670 Tempax
<<= 2 ; /* Tempax << 2: VRE[5:0] */
1671 Tempcx
= (Tempcx
&0x600)>>8; /* Tempcx VRS[10:9] */
1672 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x3F , ~0xFC, Tempax
) ; /* SR3F D[7:2]->VRE D[5:0] */
1673 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x35 , ~0x06, Tempcx
) ; /* SR35 D[2:1]->VRS[10:9] */
1677 index
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT1CRTC
;
1678 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 3 ] ; /* Tempax: CR4 HRS */
1679 Tempbx
= Tempax
; /* Tempbx: HRS[7:0] */
1680 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2E , Tempax
) ; /* SR2E[7:0]->HRS */
1682 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 5 ] ; /* SR0B */
1683 Tempax
&= 0xC0 ; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
1684 Tempbx
|= (Tempax
<< 2); /* Tempbx: HRS[9:0] */
1686 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 4 ] ; /* CR5 HRE */
1687 Tempax
&= 0x1F ; /* Tempax[4:0]: HRE[4:0] */
1688 Tempcx
= Tempax
; /* Tempcx: HRE[4:0] */
1690 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 6 ] ; /* SRC */
1691 Tempax
&= 0x04 ; /* Tempax[2]: HRE[5] */
1692 Tempax
<<= 3 ; /* Tempax[5]: HRE[5] */
1693 Tempcx
|= Tempax
; /* Tempcx[5:0]: HRE[5:0] */
1695 Tempbx
= Tempbx
& 0x3C0 ; /* Tempbx[9:6]: HRS[9:6] */
1696 Tempbx
|= Tempcx
; /* Tempbx: HRS[9:6]HRE[5:0] */
1698 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 3 ] ; /* Tempax: CR4 HRS */
1699 Tempax
&= 0x3F ; /* Tempax: HRS[5:0] */
1700 if( Tempcx
<= Tempax
) /* HRE[5:0] < HRS[5:0] */
1701 Tempbx
+= 0x40 ; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
1703 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 5 ] ; /* SR0B */
1704 Tempax
&= 0xC0 ; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
1705 Tempax
>>= 6; /* Tempax[1:0]: HRS[9:8]*/
1706 Tempax
|= ((Tempbx
<< 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
1707 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2F , Tempax
) ; /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
1708 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x30 , 0xE3 , 00 ) ;
1710 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 10 ] ; /* CR10 VRS */
1711 XGINew_SetReg1( pVBInfo
->P3c4
, 0x34 , Tempax
) ; /* SR34[7:0]->VRS[7:0] */
1713 Tempcx
= Tempax
; /* Tempcx <= VRS[7:0] */
1714 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 9 ] ; /* CR7[7][2] VRS[9][8] */
1715 Tempbx
= Tempax
; /* Tempbx <= CR07[7:0] */
1716 Tempax
= Tempax
& 0x04 ; /* Tempax[2]: CR7[2]: VRS[8] */
1717 Tempax
>>= 2 ; /* Tempax[0]: VRS[8] */
1718 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x35 , ~0x01 , Tempax
) ; /* SR35[0]: VRS[8] */
1719 Tempcx
|= (Tempax
<<8) ; /* Tempcx <= VRS[8:0] */
1720 Tempcx
|= ((Tempbx
&0x80)<<2) ; /* Tempcx <= VRS[9:0] */
1721 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 14 ] ; /* Tempax: SR0A */
1722 Tempax
&= 0x08; /* SR0A[3] VRS[10] */
1723 Tempcx
|= (Tempax
<<7) ; /* Tempcx <= VRS[10:0] */
1726 Tempax
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 11 ] ; /* Tempax: CR11 VRE */
1727 Tempax
&= 0x0F ; /* Tempax[3:0]: VRE[3:0] */
1728 Tempbx
= pVBInfo
->XGINEWUB_CRT1Table
[ index
].CR
[ 14 ] ; /* Tempbx: SR0A */
1729 Tempbx
&= 0x20 ; /* Tempbx[5]: SR0A[5]: VRE[4] */
1730 Tempbx
>>= 1 ; /* Tempbx[4]: VRE[4] */
1731 Tempax
|= Tempbx
; /* Tempax[4:0]: VRE[4:0] */
1732 Tempbx
= Tempcx
; /* Tempbx: VRS[10:0] */
1733 Tempbx
&= 0x7E0 ; /* Tempbx[10:5]: VRS[10:5] */
1734 Tempbx
|= Tempax
; /* Tempbx: VRS[10:5]VRE[4:0] */
1736 if ( Tempbx
<= Tempcx
) /* VRE <= VRS */
1737 Tempbx
|= 0x20 ; /* VRE + 0x20 */
1739 Tempax
= (Tempbx
<<2) & 0xFF ; /* Tempax: Tempax[7:0]; VRE[5:0]00 */
1740 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x3F , ~0xFC , Tempax
) ; /* SR3F[7:2]:VRE[5:0] */
1741 Tempax
= Tempcx
>> 8;
1742 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x35 , ~0x07 , Tempax
) ; /* SR35[2:0]:VRS[10:8] */
1747 /* --------------------------------------------------------------------- */
1748 /* Function : XGI_SetXG21LCD */
1750 /* Output : FCLK duty cycle, FCLK delay compensation */
1751 /* Description : All values set zero */
1752 /* --------------------------------------------------------------------- */
1753 void XGI_SetXG21LCD(PVB_DEVICE_INFO pVBInfo
,USHORT RefreshRateTableIndex
,USHORT ModeNo
)
1755 USHORT Data
, Temp
, b3CC
;
1758 XGI_P3cc
= pVBInfo
->P3cc
;
1760 XGINew_SetReg1( pVBInfo
->P3d4
, 0x2E , 0x00 ) ;
1761 XGINew_SetReg1( pVBInfo
->P3d4
, 0x2F , 0x00 ) ;
1762 XGINew_SetReg1( pVBInfo
->P3d4
, 0x46 , 0x00 ) ;
1763 XGINew_SetReg1( pVBInfo
->P3d4
, 0x47 , 0x00 ) ;
1764 if ( ((*pVBInfo
->pDVOSetting
)&0xC0) == 0xC0 )
1766 XGINew_SetReg1( pVBInfo
->P3d4
, 0x2E , *pVBInfo
->pCR2E
) ;
1767 XGINew_SetReg1( pVBInfo
->P3d4
, 0x2F , *pVBInfo
->pCR2F
) ;
1768 XGINew_SetReg1( pVBInfo
->P3d4
, 0x46 , *pVBInfo
->pCR46
) ;
1769 XGINew_SetReg1( pVBInfo
->P3d4
, 0x47 , *pVBInfo
->pCR47
) ;
1772 Temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x37 ) ;
1776 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x06 , 0x40 ) ; /* 18 bits FP */
1777 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x09 , 0x40 ) ;
1780 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x1E , 0x01 ) ; /* Negative blank polarity */
1782 XGINew_SetRegAND( pVBInfo
->P3c4
, 0x30 , ~0x20 ) ;
1783 XGINew_SetRegAND( pVBInfo
->P3c4
, 0x35 , ~0x80 ) ;
1785 if ( ModeNo
<= 0x13 )
1787 b3CC
= (UCHAR
) XGINew_GetReg2( XGI_P3cc
) ;
1789 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x30 , 0x20 ) ; /* Hsync polarity */
1791 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x35 , 0x80 ) ; /* Vsync polarity */
1795 Data
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_InfoFlag
;
1796 if ( Data
& 0x4000 )
1797 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x30 , 0x20 ) ; /* Hsync polarity */
1798 if ( Data
& 0x8000 )
1799 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x35 , 0x80 ) ; /* Vsync polarity */
1803 void XGI_SetXG27LCD(PVB_DEVICE_INFO pVBInfo
,USHORT RefreshRateTableIndex
,USHORT ModeNo
)
1805 USHORT Data
, Temp
, b3CC
;
1808 XGI_P3cc
= pVBInfo
->P3cc
;
1810 XGINew_SetReg1( pVBInfo
->P3d4
, 0x2E , 0x00 ) ;
1811 XGINew_SetReg1( pVBInfo
->P3d4
, 0x2F , 0x00 ) ;
1812 XGINew_SetReg1( pVBInfo
->P3d4
, 0x46 , 0x00 ) ;
1813 XGINew_SetReg1( pVBInfo
->P3d4
, 0x47 , 0x00 ) ;
1815 Temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x37 ) ;
1816 if ( ( Temp
& 0x03 ) == 0 ) /* dual 12 */
1818 XGINew_SetReg1( pVBInfo
->P3d4
, 0x46 , 0x13 ) ;
1819 XGINew_SetReg1( pVBInfo
->P3d4
, 0x47 , 0x13 ) ;
1822 if ( ((*pVBInfo
->pDVOSetting
)&0xC0) == 0xC0 )
1824 XGINew_SetReg1( pVBInfo
->P3d4
, 0x2E , *pVBInfo
->pCR2E
) ;
1825 XGINew_SetReg1( pVBInfo
->P3d4
, 0x2F , *pVBInfo
->pCR2F
) ;
1826 XGINew_SetReg1( pVBInfo
->P3d4
, 0x46 , *pVBInfo
->pCR46
) ;
1827 XGINew_SetReg1( pVBInfo
->P3d4
, 0x47 , *pVBInfo
->pCR47
) ;
1830 XGI_SetXG27FPBits(pVBInfo
);
1832 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x1E , 0x01 ) ; /* Negative blank polarity */
1834 XGINew_SetRegAND( pVBInfo
->P3c4
, 0x30 , ~0x20 ) ; /* Hsync polarity */
1835 XGINew_SetRegAND( pVBInfo
->P3c4
, 0x35 , ~0x80 ) ; /* Vsync polarity */
1837 if ( ModeNo
<= 0x13 )
1839 b3CC
= (UCHAR
) XGINew_GetReg2( XGI_P3cc
) ;
1841 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x30 , 0x20 ) ; /* Hsync polarity */
1843 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x35 , 0x80 ) ; /* Vsync polarity */
1847 Data
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_InfoFlag
;
1848 if ( Data
& 0x4000 )
1849 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x30 , 0x20 ) ; /* Hsync polarity */
1850 if ( Data
& 0x8000 )
1851 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x35 , 0x80 ) ; /* Vsync polarity */
1855 /* --------------------------------------------------------------------- */
1856 /* Function : XGI_UpdateXG21CRTC */
1858 /* Output : CRT1 CRTC */
1859 /* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
1860 /* --------------------------------------------------------------------- */
1861 void XGI_UpdateXG21CRTC( USHORT ModeNo
, PVB_DEVICE_INFO pVBInfo
, USHORT RefreshRateTableIndex
)
1865 XGINew_SetRegAND( pVBInfo
->P3d4
, 0x11 , 0x7F ) ; /* Unlock CR0~7 */
1866 if ( ModeNo
<= 0x13 )
1868 for( i
= 0 ; i
< 12 ; i
++ )
1870 if ( ModeNo
== pVBInfo
->UpdateCRT1
[ i
].ModeID
)
1876 if ( ModeNo
== 0x2E && ( pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT1CRTC
== RES640x480x60
) )
1878 else if ( ModeNo
== 0x2E && ( pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT1CRTC
== RES640x480x72
) )
1880 else if ( ModeNo
== 0x2F )
1882 else if ( ModeNo
== 0x50 )
1884 else if ( ModeNo
== 0x59 )
1890 XGINew_SetReg1( pVBInfo
->P3d4
, 0x02 , pVBInfo
->UpdateCRT1
[ index
].CR02
) ;
1891 XGINew_SetReg1( pVBInfo
->P3d4
, 0x03 , pVBInfo
->UpdateCRT1
[ index
].CR03
) ;
1892 XGINew_SetReg1( pVBInfo
->P3d4
, 0x15 , pVBInfo
->UpdateCRT1
[ index
].CR15
) ;
1893 XGINew_SetReg1( pVBInfo
->P3d4
, 0x16 , pVBInfo
->UpdateCRT1
[ index
].CR16
) ;
1898 /* --------------------------------------------------------------------- */
1899 /* Function : XGI_SetCRT1DE */
1903 /* --------------------------------------------------------------------- */
1904 void XGI_SetCRT1DE( PXGI_HW_DEVICE_INFO HwDeviceExtension
, USHORT ModeNo
,USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
1915 resindex
= XGI_GetResInfo( ModeNo
, ModeIdIndex
, pVBInfo
) ;
1917 if ( ModeNo
<= 0x13 )
1919 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
;
1920 tempax
= pVBInfo
->StResInfo
[ resindex
].HTotal
;
1921 tempbx
= pVBInfo
->StResInfo
[ resindex
].VTotal
;
1925 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
1926 tempax
= pVBInfo
->ModeResInfo
[ resindex
].HTotal
;
1927 tempbx
= pVBInfo
->ModeResInfo
[ resindex
].VTotal
;
1930 if ( modeflag
& HalfDCLK
)
1931 tempax
= tempax
>> 1 ;
1933 if ( ModeNo
> 0x13 )
1935 if ( modeflag
& HalfDCLK
)
1936 tempax
= tempax
<< 1 ;
1938 temp
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_InfoFlag
;
1940 if ( temp
& InterlaceMode
)
1941 tempbx
= tempbx
>> 1 ;
1943 if ( modeflag
& DoubleScanMode
)
1944 tempbx
= tempbx
<< 1 ;
1949 /* if ( !( modeflag & Charx8Dot ) ) */
1956 temp
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x11 ) ;
1957 data
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x11 ) ;
1959 XGINew_SetReg1( pVBInfo
->P3d4
, 0x11 , data
) ; /* Unlock CRTC */
1960 XGINew_SetReg1( pVBInfo
->P3d4
, 0x01 , ( USHORT
)( tempcx
& 0xff ) ) ;
1961 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x0b , ~0x0c , ( USHORT
)( ( tempcx
& 0x0ff00 ) >> 10 ) ) ;
1962 XGINew_SetReg1( pVBInfo
->P3d4
, 0x12 , ( USHORT
)( tempbx
& 0xff ) ) ;
1964 tempbx
= tempbx
>> 8 ;
1966 if ( tempbx
& 0x01 )
1969 if ( tempbx
& 0x02 )
1972 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x07 , ~0x42 , tempax
) ;
1973 data
=( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x07 ) ;
1977 if ( tempbx
& 0x04 )
1980 XGINew_SetRegANDOR( pVBInfo
->P3d4
,0x0a , ~0x02 , tempax
) ;
1981 XGINew_SetReg1( pVBInfo
->P3d4
, 0x11 , temp
) ;
1985 /* --------------------------------------------------------------------- */
1986 /* Function : XGI_GetResInfo */
1990 /* --------------------------------------------------------------------- */
1991 USHORT
XGI_GetResInfo(USHORT ModeNo
, USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
1995 if ( ModeNo
<= 0x13 )
1997 resindex
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ResInfo
; /* si+St_ResInfo */
2001 resindex
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_RESINFO
; /* si+Ext_ResInfo */
2003 return( resindex
) ;
2007 /* --------------------------------------------------------------------- */
2008 /* Function : XGI_SetCRT1Offset */
2012 /* --------------------------------------------------------------------- */
2013 void XGI_SetCRT1Offset( USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
2023 temp
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeInfo
;
2025 temp
= pVBInfo
->ScreenOffset
[ temp
] ;
2027 temp2
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_InfoFlag
;
2028 temp2
&= InterlaceMode
;
2033 temp2
= pVBInfo
->ModeType
- ModeEGA
;
2059 if ( ( ModeNo
>= 0x26 ) && ( ModeNo
<= 0x28 ) )
2060 temp
= temp
* temp2
+ temp2
/ 2 ;
2065 DisplayUnit
= temp
;
2067 temp
= temp
>> 8 ; /* ah */
2069 i
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x0E ) ;
2072 XGINew_SetReg1( pVBInfo
->P3c4
, 0x0E , i
) ;
2074 temp
=( UCHAR
)temp2
;
2075 temp
&= 0xFF ; /* al */
2076 XGINew_SetReg1( pVBInfo
->P3d4
, 0x13 , temp
) ;
2078 /* SetDisplayUnit */
2079 temp2
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_InfoFlag
;
2080 temp2
&= InterlaceMode
;
2084 DisplayUnit
= DisplayUnit
<< 5 ;
2085 ah
= ( DisplayUnit
& 0xff00 ) >> 8 ;
2086 al
= DisplayUnit
& 0x00ff ;
2092 if ( HwDeviceExtension
->jChipType
>= XG20
)
2093 if ( ( ModeNo
== 0x4A ) | (ModeNo
== 0x49 ) )
2096 XGINew_SetReg1( pVBInfo
->P3c4
, 0x10 , ah
) ;
2100 /* --------------------------------------------------------------------- */
2101 /* Function : XGI_SetCRT1VCLK */
2105 /* --------------------------------------------------------------------- */
2106 void XGI_SetCRT1VCLK( USHORT ModeNo
, USHORT ModeIdIndex
,
2107 PXGI_HW_DEVICE_INFO HwDeviceExtension
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
2109 UCHAR index
, data
;
2112 if ( pVBInfo
->IF_DEF_LVDS
== 1 )
2114 index
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRTVCLK
;
2115 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x31 ) & 0xCF ;
2116 XGINew_SetReg1( pVBInfo
->P3c4
, 0x31 , data
) ;
2117 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2B , pVBInfo
->VCLKData
[ index
].SR2B
) ;
2118 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2C , pVBInfo
->VCLKData
[ index
].SR2C
) ;
2119 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2D , 0x01 ) ;
2121 else if ( ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) ) && ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
) )
2123 vclkindex
= XGI_GetVCLK2Ptr( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, HwDeviceExtension
, pVBInfo
) ;
2124 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x31 ) & 0xCF ;
2125 XGINew_SetReg1( pVBInfo
->P3c4
, 0x31 , data
) ;
2126 data
= pVBInfo
->VBVCLKData
[ vclkindex
].Part4_A
;
2127 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2B , data
) ;
2128 data
= pVBInfo
->VBVCLKData
[ vclkindex
].Part4_B
;
2129 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2C , data
) ;
2130 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2D , 0x01 ) ;
2134 index
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRTVCLK
;
2135 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x31 ) & 0xCF ;
2136 XGINew_SetReg1( pVBInfo
->P3c4
, 0x31 , data
) ;
2137 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2B , pVBInfo
->VCLKData
[ index
].SR2B
) ;
2138 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2C , pVBInfo
->VCLKData
[ index
].SR2C
) ;
2139 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2D , 0x01 ) ;
2142 if ( HwDeviceExtension
->jChipType
>= XG20
)
2144 if ( pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
& HalfDCLK
)
2146 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x2B ) ;
2147 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2B , data
) ;
2148 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x2C ) ;
2155 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2C , data
) ;
2161 /* --------------------------------------------------------------------- */
2162 /* Function : XGI_SetCRT1FIFO */
2166 /* --------------------------------------------------------------------- */
2167 void XGI_SetCRT1FIFO( USHORT ModeNo
, PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
)
2171 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x3D ) ;
2173 XGINew_SetReg1( pVBInfo
->P3c4
, 0x3D , data
) ; /* diable auto-threshold */
2175 if ( ModeNo
> 0x13 )
2177 XGINew_SetReg1( pVBInfo
->P3c4
, 0x08 , 0x34 ) ;
2178 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x09 ) ;
2180 XGINew_SetReg1( pVBInfo
->P3c4
, 0x09 , data
| 0x30) ;
2181 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x3D ) ;
2183 XGINew_SetReg1( pVBInfo
->P3c4
, 0x3D , data
) ;
2187 if (HwDeviceExtension
->jChipType
== XG27
)
2189 XGINew_SetReg1( pVBInfo
->P3c4
, 0x08 , 0x0E ) ;
2190 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x09 ) ;
2192 XGINew_SetReg1( pVBInfo
->P3c4
, 0x09 , data
| 0x20 ) ;
2196 XGINew_SetReg1( pVBInfo
->P3c4
, 0x08 , 0xAE ) ;
2197 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x09 ) ;
2199 XGINew_SetReg1( pVBInfo
->P3c4
, 0x09 , data
) ;
2203 if (HwDeviceExtension
->jChipType
== XG21
)
2205 XGI_SetXG21FPBits(pVBInfo
); /* Fix SR9[7:6] can't read back */
2210 /* --------------------------------------------------------------------- */
2211 /* Function : XGI_SetCRT1ModeRegs */
2215 /* --------------------------------------------------------------------- */
2216 void XGI_SetCRT1ModeRegs( PXGI_HW_DEVICE_INFO HwDeviceExtension
,
2217 USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
,PVB_DEVICE_INFO pVBInfo
)
2227 if ( ModeNo
> 0x13 )
2229 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
2230 infoflag
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_InfoFlag
;
2233 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
; /* si+St_ModeFlag */
2235 if ( XGINew_GetReg1( pVBInfo
->P3d4
, 0x31 ) & 0x01 )
2236 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x1F , 0x3F , 0x00 ) ;
2238 if ( ModeNo
> 0x13 )
2245 if ( ModeNo
> 0x13 )
2247 if ( pVBInfo
->ModeType
> 0x02 )
2250 data3
= pVBInfo
->ModeType
- ModeVGA
;
2251 data3
= data3
<< 2 ;
2256 data
&= InterlaceMode
;
2261 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x06 , ~0x3F , data2
) ;
2262 /* XGINew_SetReg1(pVBInfo->P3c4,0x06,data2); */
2263 resindex
= XGI_GetResInfo( ModeNo
, ModeIdIndex
, pVBInfo
) ;
2264 if ( ModeNo
<= 0x13 )
2265 xres
= pVBInfo
->StResInfo
[ resindex
].HTotal
;
2267 xres
= pVBInfo
->ModeResInfo
[ resindex
].HTotal
; /* xres->ax */
2270 if ( infoflag
& InterlaceMode
)
2274 else if ( xres
== 1280 )
2278 data2
= data
& 0x00FF ;
2279 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x19 , 0xFF , data2
) ;
2280 data2
= ( data
& 0xFF00 ) >> 8 ;
2281 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x19 , 0xFC , data2
) ;
2283 if( modeflag
& HalfDCLK
)
2284 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x01 , 0xF7 , 0x08 ) ;
2288 if ( modeflag
& LineCompareOff
)
2291 if ( ModeNo
> 0x13 )
2293 if ( pVBInfo
->ModeType
== ModeEGA
)
2297 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0F , ~0x48 , data2
) ;
2299 if ( pVBInfo
->ModeType
!= ModeText
)
2301 data
= data
^ 0x60 ;
2302 if ( pVBInfo
->ModeType
!= ModeEGA
)
2304 data
= data
^ 0xA0 ;
2307 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x21 , 0x1F , data
) ;
2309 XGI_SetVCLKState( HwDeviceExtension
, ModeNo
, RefreshRateTableIndex
, pVBInfo
) ;
2311 /* if(modeflag&HalfDCLK)//030305 fix lowresolution bug */
2312 /* if(XGINew_IF_DEF_NEW_LOWRES) */
2313 /* XGI_VesaLowResolution(ModeNo,ModeIdIndex);//030305 fix lowresolution bug */
2315 data
=XGINew_GetReg1( pVBInfo
->P3d4
, 0x31 ) ;
2317 if (HwDeviceExtension
->jChipType
== XG27
)
2323 XGINew_SetReg1( pVBInfo
->P3d4
, 0x52 , data
) ;
2324 XGINew_SetRegOR( pVBInfo
->P3d4
, 0x51 , 0x10 ) ;
2327 if (HwDeviceExtension
->jChipType
>= XG20
)
2333 XGINew_SetReg1( pVBInfo
->P3d4
, 0x52 , data
) ;
2334 XGINew_SetReg1( pVBInfo
->P3d4
, 0x51 , 0x02 ) ;
2342 XGINew_SetReg1( pVBInfo
->P3d4
, 0x52 , data
) ;
2348 /* --------------------------------------------------------------------- */
2349 /* Function : XGI_SetVCLKState */
2353 /* --------------------------------------------------------------------- */
2354 void XGI_SetVCLKState( PXGI_HW_DEVICE_INFO HwDeviceExtension
, USHORT ModeNo
, USHORT RefreshRateTableIndex
,PVB_DEVICE_INFO pVBInfo
)
2362 if ( ModeNo
<= 0x13 )
2366 index
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRTVCLK
;
2367 index
&= IndexMask
;
2368 VCLK
= pVBInfo
->VCLKData
[ index
].CLOCK
;
2371 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x32 ) ;
2374 data
|= 0x0c ; /* VCLK > 200 */
2376 if ( HwDeviceExtension
->jChipType
>= XG20
)
2377 data
&= ~0x04 ; /* 2 pixel mode */
2379 XGINew_SetReg1( pVBInfo
->P3c4
, 0x32 , data
) ;
2381 if ( HwDeviceExtension
->jChipType
< XG20
)
2383 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x1F ) ;
2387 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1F , data
) ;
2390 /* Jong for Adavantech LCD ripple issue
2391 if ( ( VCLK >= 0 ) && ( VCLK < 135 ) )
2393 else if ( ( VCLK >= 135 ) && ( VCLK < 160 ) )
2395 else if ( ( VCLK >= 160 ) && ( VCLK < 260 ) )
2397 else if ( VCLK > 260 )
2402 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x07 , 0xFC , data2
) ;
2403 if (HwDeviceExtension
->jChipType
>= XG27
)
2405 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x40 , 0xFC , data2
&0x03 ) ;
2412 /* --------------------------------------------------------------------- */
2413 /* Function : XGI_VesaLowResolution */
2417 /* --------------------------------------------------------------------- */
2418 /*void XGI_VesaLowResolution( USHORT ModeNo , USHORT ModeIdIndex ,PVB_DEVICE_INFO pVBInfo)
2422 if ( ModeNo > 0x13 )
2423 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
2425 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
2427 if ( ModeNo > 0x13 )
2429 if ( modeflag & DoubleScanMode )
2431 if ( modeflag & HalfDCLK )
2433 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
2435 if ( !( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) )
2437 if ( pVBInfo->VBInfo & SetInSlaveMode )
2439 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xf7 , 0x00 ) ;
2440 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0f , 0x7f , 0x00 ) ;
2445 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0f , 0xff , 0x80 ) ;
2446 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xf7 , 0x00 ) ;
2451 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0f , 0x7f , 0x00 ) ;
2455 /* --------------------------------------------------------------------- */
2456 /* Function : XGI_LoadDAC */
2460 /* --------------------------------------------------------------------- */
2461 void XGI_LoadDAC( USHORT ModeNo
, USHORT ModeIdIndex
,PVB_DEVICE_INFO pVBInfo
)
2463 USHORT data
, data2
, time
,
2464 i
, j
, k
, m
, n
, o
,
2465 si
, di
, bx
, dl
, al
, ah
, dh
,
2468 if ( ModeNo
<= 0x13 )
2469 data
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
;
2471 data
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
2473 data
&= DACInfoFlag
;
2477 table
= XGINew_MDA_DAC
;
2478 else if ( data
== 0x08 )
2479 table
= XGINew_CGA_DAC
;
2480 else if ( data
== 0x10 )
2481 table
= XGINew_EGA_DAC
;
2482 else if ( data
== 0x18 )
2485 table
= XGINew_VGA_DAC
;
2493 XGINew_SetReg3( pVBInfo
->P3c6
, 0xFF ) ;
2494 XGINew_SetReg3( pVBInfo
->P3c8
, 0x00 ) ;
2496 for( i
= 0 ; i
< j
; i
++ )
2500 for( k
= 0 ; k
< 3 ; k
++ )
2510 XGINew_SetReg3( pVBInfo
->P3c9
, data2
) ;
2517 for( i
= 16 ; i
< 32 ; i
++ )
2521 for( k
= 0 ; k
< 3 ; k
++ )
2522 XGINew_SetReg3( pVBInfo
->P3c9
, data
) ;
2527 for( m
= 0 ; m
< 9 ; m
++ )
2533 for( n
= 0 ; n
< 3 ; n
++ )
2535 for( o
= 0 ; o
< 5 ; o
++ )
2541 XGI_WriteDAC( dl
, ah
, al
, dh
, pVBInfo
) ;
2546 for( o
= 0 ; o
< 3 ; o
++ )
2552 XGI_WriteDAC( dl
, ah
, al
, dh
, pVBInfo
) ;
2564 /* --------------------------------------------------------------------- */
2565 /* Function : XGI_WriteDAC */
2569 /* --------------------------------------------------------------------- */
2570 void XGI_WriteDAC( USHORT dl
, USHORT ah
, USHORT al
, USHORT dh
,PVB_DEVICE_INFO pVBInfo
)
2572 USHORT temp
, bh
, bl
;
2595 XGINew_SetReg3( pVBInfo
->P3c9
, ( USHORT
)dh
) ;
2596 XGINew_SetReg3( pVBInfo
->P3c9
, ( USHORT
)bh
) ;
2597 XGINew_SetReg3( pVBInfo
->P3c9
, ( USHORT
)bl
) ;
2601 /* --------------------------------------------------------------------- */
2602 /* Function : XGI_ClearBuffer */
2606 /* --------------------------------------------------------------------- */
2607 void XGI_ClearBuffer( PXGI_HW_DEVICE_INFO HwDeviceExtension
, USHORT ModeNo
, PVB_DEVICE_INFO pVBInfo
)
2609 PVOID VideoMemoryAddress
= ( PVOID
)HwDeviceExtension
->pjVideoMemoryAddress
;
2610 ULONG AdapterMemorySize
= ( ULONG
)HwDeviceExtension
->ulVideoMemorySize
;
2616 if ( pVBInfo
->ModeType
>= ModeEGA
)
2618 if ( ModeNo
> 0x13 )
2620 AdapterMemorySize
= 0x40000 ; /* clear 256k */
2621 /* GetDRAMSize( HwDeviceExtension ) ; */
2622 XGI_SetMemory( VideoMemoryAddress
, AdapterMemorySize
, 0 ) ;
2627 pBuffer = VideoMemoryAddress ;
2628 for( i = 0 ; i < 0x4000 ; i++ )
2629 pBuffer[ i ] = 0x0000 ;
2635 pBuffer
= VideoMemoryAddress
;
2636 if ( pVBInfo
->ModeType
< ModeCGA
)
2639 for ( i = 0 ; i < 0x4000 ; i++ )
2640 pBuffer[ i ] = 0x0720 ;
2644 XGI_SetMemory( VideoMemoryAddress
, 0x8000 , 0 ) ;
2649 /* --------------------------------------------------------------------- */
2650 /* Function : XGI_SetLCDAGroup */
2654 /* --------------------------------------------------------------------- */
2655 void XGI_SetLCDAGroup( USHORT ModeNo
, USHORT ModeIdIndex
, PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
2657 USHORT RefreshRateTableIndex
;
2660 /* pVBInfo->SelectCRT2Rate = 0 ; */
2662 pVBInfo
->SetFlag
|= ProgrammingCRT2
;
2663 RefreshRateTableIndex
= XGI_GetRatePtrCRT2( HwDeviceExtension
, ModeNo
, ModeIdIndex
, pVBInfo
) ;
2664 XGI_GetLVDSResInfo( ModeNo
, ModeIdIndex
, pVBInfo
) ;
2665 XGI_GetLVDSData( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
);
2666 XGI_ModCRT1Regs( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, HwDeviceExtension
, pVBInfo
) ;
2667 XGI_SetLVDSRegs( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
2668 XGI_SetCRT2ECLK( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
2672 /* --------------------------------------------------------------------- */
2673 /* Function : XGI_GetLVDSResInfo */
2677 /* --------------------------------------------------------------------- */
2678 void XGI_GetLVDSResInfo( USHORT ModeNo
, USHORT ModeIdIndex
,PVB_DEVICE_INFO pVBInfo
)
2680 USHORT resindex
, xres
, yres
, modeflag
;
2682 if ( ModeNo
<= 0x13 )
2684 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ResInfo
; /* si+St_ResInfo */
2688 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_RESINFO
; /* si+Ext_ResInfo */
2692 /* if ( ModeNo > 0x13 ) */
2693 /* modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; */
2695 /* modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; */
2697 if ( ModeNo
<= 0x13 )
2699 resindex
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ResInfo
; /* si+St_ResInfo */
2703 resindex
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_RESINFO
; /* si+Ext_ResInfo */
2706 /* resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ; */
2708 if ( ModeNo
<= 0x13 )
2710 xres
= pVBInfo
->StResInfo
[ resindex
].HTotal
;
2711 yres
= pVBInfo
->StResInfo
[ resindex
].VTotal
;
2715 xres
= pVBInfo
->ModeResInfo
[ resindex
].HTotal
;
2716 yres
= pVBInfo
->ModeResInfo
[ resindex
].VTotal
;
2718 if ( ModeNo
> 0x13 )
2720 if ( modeflag
& HalfDCLK
)
2723 if ( modeflag
& DoubleScanMode
)
2726 /* if ( modeflag & Charx8Dot ) */
2733 pVBInfo
->VGAHDE
= xres
;
2734 pVBInfo
->HDE
= xres
;
2735 pVBInfo
->VGAVDE
= yres
;
2736 pVBInfo
->VDE
= yres
;
2740 /* --------------------------------------------------------------------- */
2741 /* Function : XGI_GetLVDSData */
2745 /* --------------------------------------------------------------------- */
2746 void XGI_GetLVDSData( USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
2749 XGI330_LVDSDataStruct
*LCDPtr
= NULL
;
2750 XGI330_CHTVDataStruct
*TVPtr
= NULL
;
2754 if ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) )
2756 LCDPtr
= ( XGI330_LVDSDataStruct
* )XGI_GetLcdPtr( tempbx
, ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
2757 pVBInfo
->VGAHT
= LCDPtr
->VGAHT
;
2758 pVBInfo
->VGAVT
= LCDPtr
->VGAVT
;
2759 pVBInfo
->HT
= LCDPtr
->LCDHT
;
2760 pVBInfo
->VT
= LCDPtr
->LCDVT
;
2762 if ( pVBInfo
->IF_DEF_CH7017
== 1 )
2764 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
2766 TVPtr
= ( XGI330_CHTVDataStruct
* )XGI_GetTVPtr( tempbx
, ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
2767 pVBInfo
->VGAHT
= TVPtr
->VGAHT
;
2768 pVBInfo
->VGAVT
= TVPtr
->VGAVT
;
2769 pVBInfo
->HT
= TVPtr
->LCDHT
;
2770 pVBInfo
->VT
= TVPtr
->LCDVT
;
2774 if ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) )
2776 if ( !( pVBInfo
->LCDInfo
& ( SetLCDtoNonExpanding
| EnableScalingLCD
) ) )
2778 if ( ( pVBInfo
->LCDResInfo
== Panel1024x768
) || ( pVBInfo
->LCDResInfo
== Panel1024x768x75
) )
2780 pVBInfo
->HDE
= 1024 ;
2781 pVBInfo
->VDE
= 768 ;
2783 else if ( ( pVBInfo
->LCDResInfo
== Panel1280x1024
) || ( pVBInfo
->LCDResInfo
== Panel1280x1024x75
) )
2785 pVBInfo
->HDE
= 1280 ;
2786 pVBInfo
->VDE
= 1024 ;
2788 else if ( pVBInfo
->LCDResInfo
== Panel1400x1050
)
2790 pVBInfo
->HDE
= 1400 ;
2791 pVBInfo
->VDE
= 1050 ;
2795 pVBInfo
->HDE
= 1600 ;
2796 pVBInfo
->VDE
= 1200 ;
2803 /* --------------------------------------------------------------------- */
2804 /* Function : XGI_ModCRT1Regs */
2808 /* --------------------------------------------------------------------- */
2809 void XGI_ModCRT1Regs( USHORT ModeNo
, USHORT ModeIdIndex
,
2810 USHORT RefreshRateTableIndex
, PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
)
2814 XGI_LVDSCRT1HDataStruct
*LCDPtr
= NULL
;
2815 XGI_LVDSCRT1VDataStruct
*LCDPtr1
=NULL
;
2816 /* XGI330_CHTVDataStruct *TVPtr = NULL ; */
2817 XGI_CH7007TV_TimingHStruct
*CH7007TV_TimingHPtr
= NULL
;
2818 XGI_CH7007TV_TimingVStruct
*CH7007TV_TimingVPtr
= NULL
;
2820 if( ModeNo
<= 0x13 )
2821 index
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_CRT2CRTC
;
2823 index
= pVBInfo
->RefIndex
[RefreshRateTableIndex
].Ext_CRT2CRTC
;
2825 index
= index
& IndexMask
;
2827 if ( ( pVBInfo
->IF_DEF_ScaleLCD
== 0 ) || ( ( pVBInfo
->IF_DEF_ScaleLCD
== 1 ) && ( !( pVBInfo
->LCDInfo
& EnableScalingLCD
) ) ) )
2831 if ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) )
2833 LCDPtr
= ( XGI_LVDSCRT1HDataStruct
* )XGI_GetLcdPtr( tempbx
, ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
2835 for( i
= 0 ; i
< 8 ; i
++ )
2836 pVBInfo
->TimingH
[ 0 ].data
[ i
] = LCDPtr
[ 0 ].Reg
[ i
] ;
2839 if ( pVBInfo
->IF_DEF_CH7007
== 1 )
2841 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
2843 CH7007TV_TimingHPtr
= ( XGI_CH7007TV_TimingHStruct
*)XGI_GetTVPtr( tempbx
, ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
2845 for( i
= 0 ; i
< 8 ; i
++ )
2846 pVBInfo
->TimingH
[ 0 ].data
[ i
] = CH7007TV_TimingHPtr
[ 0 ].data
[ i
] ;
2850 /* if ( pVBInfo->IF_DEF_CH7017 == 1 )
2852 if ( pVBInfo->VBInfo & SetCRT2ToTV )
2853 TVPtr = ( XGI330_CHTVDataStruct *)XGI_GetTVPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
2856 XGI_SetCRT1Timing_H(pVBInfo
,HwDeviceExtension
) ;
2858 if ( pVBInfo
->IF_DEF_CH7007
== 1 )
2860 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2E , CH7007TV_TimingHPtr
[ 0 ].data
[ 8 ] ) ;
2861 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2F , CH7007TV_TimingHPtr
[ 0 ].data
[ 9 ] ) ;
2866 if ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) )
2868 LCDPtr1
= ( XGI_LVDSCRT1VDataStruct
* )XGI_GetLcdPtr( tempbx
, ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
2869 for( i
= 0 ; i
< 7 ; i
++ )
2870 pVBInfo
->TimingV
[ 0 ].data
[ i
] = LCDPtr1
[ 0 ].Reg
[ i
] ;
2873 if ( pVBInfo
->IF_DEF_CH7007
== 1 )
2875 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
2877 CH7007TV_TimingVPtr
= ( XGI_CH7007TV_TimingVStruct
*)XGI_GetTVPtr( tempbx
, ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
2879 for( i
= 0 ; i
< 7 ; i
++ )
2880 pVBInfo
->TimingV
[ 0 ].data
[ i
] = CH7007TV_TimingVPtr
[ 0 ].data
[ i
] ;
2883 /* if ( pVBInfo->IF_DEF_CH7017 == 1 )
2885 if ( pVBInfo->VBInfo & SetCRT2ToTV )
2886 TVPtr = ( XGI330_CHTVDataStruct *)XGI_GetTVPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
2889 XGI_SetCRT1Timing_V( ModeIdIndex
, ModeNo
, pVBInfo
) ;
2891 if ( pVBInfo
->IF_DEF_CH7007
== 1 )
2893 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x33 , ~0x01 , CH7007TV_TimingVPtr
[ 0 ].data
[ 7 ]&0x01 ) ;
2894 XGINew_SetReg1( pVBInfo
->P3c4
, 0x34 , CH7007TV_TimingVPtr
[ 0 ].data
[8 ] ) ;
2895 XGINew_SetReg1( pVBInfo
->P3c4
, 0x3F , CH7007TV_TimingVPtr
[ 0 ].data
[9 ] ) ;
2903 /* --------------------------------------------------------------------- */
2904 /* Function : XGI_SetLVDSRegs */
2908 /* --------------------------------------------------------------------- */
2909 void XGI_SetLVDSRegs( USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
2911 USHORT tempbx
, tempax
, tempcx
, tempdx
, push1
, push2
, modeflag
;
2912 unsigned long temp
, temp1
, temp2
, temp3
, push3
;
2913 XGI330_LCDDataDesStruct
*LCDPtr
= NULL
;
2914 XGI330_LCDDataDesStruct2
*LCDPtr1
= NULL
;
2916 if ( ModeNo
> 0x13 )
2917 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
2919 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
;
2921 if ( !( pVBInfo
->SetFlag
& Win9xDOSMode
) )
2923 if ( ( pVBInfo
->IF_DEF_CH7017
== 0 ) || ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) ) )
2925 if ( pVBInfo
->IF_DEF_OEMUtil
== 1 )
2928 LCDPtr
= ( XGI330_LCDDataDesStruct
* )XGI_GetLcdPtr( tempbx
, ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
2931 if ( ( pVBInfo
->IF_DEF_OEMUtil
== 0 ) || ( LCDPtr
== 0 ) )
2934 if ( pVBInfo
->LCDInfo
& EnableScalingLCD
)
2935 LCDPtr1
= ( XGI330_LCDDataDesStruct2
* )XGI_GetLcdPtr( tempbx
, ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
2937 LCDPtr
= ( XGI330_LCDDataDesStruct
* )XGI_GetLcdPtr( tempbx
, ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
2940 XGI_GetLCDSync( &tempax
, &tempbx
,pVBInfo
) ;
2945 if ( ( pVBInfo
->LCDResInfo
== Panel1024x768
) || ( pVBInfo
->LCDResInfo
== Panel1024x768x75
) )
2950 else if ( ( pVBInfo
->LCDResInfo
== Panel1280x1024
) || ( pVBInfo
->LCDResInfo
== Panel1280x1024x75
) )
2955 else if ( pVBInfo
->LCDResInfo
== Panel1400x1050
)
2966 if ( pVBInfo
->LCDInfo
& SetLCDtoNonExpanding
)
2968 pVBInfo
->HDE
=tempax
;
2969 pVBInfo
->VDE
=tempbx
;
2970 pVBInfo
->VGAHDE
=tempax
;
2971 pVBInfo
->VGAVDE
=tempbx
;
2974 if ( ( pVBInfo
->IF_DEF_ScaleLCD
== 1 ) && ( pVBInfo
->LCDInfo
& EnableScalingLCD
) )
2976 tempax
=pVBInfo
->HDE
;
2977 tempbx
=pVBInfo
->VDE
;
2980 tempax
= pVBInfo
->HT
;
2982 if ( pVBInfo
->LCDInfo
& EnableScalingLCD
)
2983 tempbx
= LCDPtr1
->LCDHDES
;
2985 tempbx
= LCDPtr
->LCDHDES
;
2987 tempcx
= pVBInfo
->HDE
;
2988 tempbx
= tempbx
& 0x0fff ;
2991 if ( tempcx
>= tempax
)
2994 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x1A , tempbx
& 0x07 ) ;
2996 tempcx
= tempcx
>> 3 ;
2997 tempbx
= tempbx
>> 3 ;
2999 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x16 , ( USHORT
)( tempbx
& 0xff ) ) ;
3000 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x17 , ( USHORT
)( tempcx
& 0xff ) ) ;
3002 tempax
= pVBInfo
->HT
;
3004 if ( pVBInfo
->LCDInfo
& EnableScalingLCD
)
3005 tempbx
= LCDPtr1
->LCDHRS
;
3007 tempbx
= LCDPtr
->LCDHRS
;
3011 if ( pVBInfo
->LCDInfo
& EnableScalingLCD
)
3012 tempcx
= LCDPtr1
->LCDHSync
;
3016 if ( tempcx
>= tempax
)
3019 tempax
= tempbx
& 0x07 ;
3020 tempax
= tempax
>> 5 ;
3021 tempcx
= tempcx
>> 3 ;
3022 tempbx
= tempbx
>> 3 ;
3027 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x15 , tempax
) ;
3028 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x14 , ( USHORT
)( tempbx
& 0xff ) ) ;
3030 tempax
= pVBInfo
->VT
;
3031 if ( pVBInfo
->LCDInfo
& EnableScalingLCD
)
3032 tempbx
= LCDPtr1
->LCDVDES
;
3034 tempbx
= LCDPtr
->LCDVDES
;
3035 tempcx
= pVBInfo
->VDE
;
3037 tempbx
= tempbx
& 0x0fff ;
3039 if ( tempcx
>= tempax
)
3042 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x1b , ( USHORT
)( tempbx
& 0xff ) ) ;
3043 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x1c , ( USHORT
)( tempcx
& 0xff ) ) ;
3045 tempbx
= ( tempbx
>> 8 ) & 0x07 ;
3046 tempcx
= ( tempcx
>> 8 ) & 0x07 ;
3048 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x1d , ( USHORT
)( ( tempcx
<< 3 ) | tempbx
) ) ;
3050 tempax
= pVBInfo
->VT
;
3051 if ( pVBInfo
->LCDInfo
& EnableScalingLCD
)
3052 tempbx
= LCDPtr1
->LCDVRS
;
3054 tempbx
= LCDPtr
->LCDVRS
;
3056 /* tempbx = tempbx >> 4 ; */
3059 if ( pVBInfo
->LCDInfo
& EnableScalingLCD
)
3060 tempcx
= LCDPtr1
->LCDVSync
;
3063 if ( tempcx
>= tempax
)
3066 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x18 , ( USHORT
)( tempbx
& 0xff ) ) ;
3067 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x19 , ~0x0f , ( USHORT
)( tempcx
& 0x0f ) ) ;
3069 tempax
= ( ( tempbx
>> 8 ) & 0x07 ) << 3 ;
3071 tempbx
= pVBInfo
->VGAVDE
;
3072 if ( tempbx
!= pVBInfo
->VDE
)
3075 if ( pVBInfo
->LCDInfo
& EnableLVDSDDA
)
3078 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x1a , 0x07 , tempax
) ;
3080 tempcx
= pVBInfo
->VGAVT
;
3081 tempbx
= pVBInfo
->VDE
;
3082 tempax
= pVBInfo
->VGAVDE
;
3085 temp
= tempax
; /* 0430 ylshieh */
3086 temp1
= ( temp
<< 18 ) / tempbx
;
3088 tempdx
= ( USHORT
)( ( temp
<< 18 ) % tempbx
) ;
3096 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x37 , ( USHORT
)( temp2
& 0xff ) ) ;
3097 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x36 , ( USHORT
)( ( temp2
>> 8 ) & 0xff ) ) ;
3099 tempbx
= ( USHORT
)( temp2
>> 16 ) ;
3100 tempax
= tempbx
& 0x03 ;
3102 tempbx
= pVBInfo
->VGAVDE
;
3103 if ( tempbx
== pVBInfo
->VDE
)
3106 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x35 , tempax
) ;
3108 if ( pVBInfo
->VBType
& VB_XGI301C
)
3111 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x3c , ( USHORT
)( temp2
& 0xff ) ) ;
3112 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x3b , ( USHORT
)( ( temp2
>> 8 ) & 0xff ) ) ;
3113 tempbx
= ( USHORT
)( temp2
>> 16 ) ;
3114 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x3a , ~0xc0 , ( USHORT
)( ( tempbx
& 0xff ) << 6 ) ) ;
3116 tempcx
= pVBInfo
->VGAVDE
;
3117 if ( tempcx
== pVBInfo
->VDE
)
3118 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x30 , ~0x0c , 0x00 ) ;
3120 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x30 , ~0x0c , 0x08 ) ;
3123 tempcx
= pVBInfo
->VGAHDE
;
3124 tempbx
= pVBInfo
->HDE
;
3126 temp1
= tempcx
<< 16 ;
3128 tempax
= ( USHORT
)( temp1
/ tempbx
) ;
3130 if ( ( tempbx
& 0xffff ) == ( tempcx
& 0xffff ) )
3134 temp1
= pVBInfo
->VGAHDE
<< 16 ;
3137 temp3
= temp3
<< 16 ;
3140 temp3
= ( temp3
& 0xffff0000 ) + ( temp1
& 0xffff ) ;
3142 tempax
= ( USHORT
)( temp3
& 0xff ) ;
3143 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x1f , tempax
) ;
3145 temp1
= pVBInfo
->VGAVDE
<< 18 ;
3146 temp1
= temp1
/ push3
;
3147 tempbx
= ( USHORT
)( temp1
& 0xffff ) ;
3149 if ( pVBInfo
->LCDResInfo
== Panel1024x768
)
3152 tempax
= ( ( tempbx
>> 8 ) & 0xff ) << 3 ;
3153 tempax
|= ( USHORT
)( ( temp3
>> 8 ) & 0x07 ) ;
3154 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x20 , ( USHORT
)( tempax
& 0xff ) ) ;
3155 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x21 , ( USHORT
)( tempbx
& 0xff ) ) ;
3157 temp3
= temp3
>> 16 ;
3159 if ( modeflag
& HalfDCLK
)
3160 temp3
= temp3
>> 1 ;
3162 XGINew_SetReg1(pVBInfo
->Part1Port
, 0x22 , ( USHORT
)( ( temp3
>> 8 ) & 0xff ) ) ;
3163 XGINew_SetReg1(pVBInfo
->Part1Port
, 0x23 , ( USHORT
)( temp3
& 0xff ) ) ;
3169 /* --------------------------------------------------------------------- */
3170 /* Function : XGI_SetCRT2ECLK */
3174 /* --------------------------------------------------------------------- */
3175 void XGI_SetCRT2ECLK( USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
3177 UCHAR di_0
, di_1
, tempal
;
3180 tempal
= XGI_GetVCLKPtr( RefreshRateTableIndex
, ModeNo
, ModeIdIndex
, pVBInfo
) ;
3181 XGI_GetVCLKLen( tempal
, &di_0
, &di_1
, pVBInfo
) ;
3182 XGI_GetLCDVCLKPtr( &di_0
, &di_1
, pVBInfo
) ;
3184 for( i
= 0 ; i
< 4 ; i
++ )
3186 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x31 , ~0x30 , ( USHORT
)( 0x10 * i
) ) ;
3187 if ( pVBInfo
->IF_DEF_CH7007
== 1 )
3189 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2b , di_0
) ;
3190 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2c , di_1
) ;
3192 else if ( ( !( pVBInfo
->VBInfo
& SetCRT2ToLCDA
) ) && ( !( pVBInfo
->VBInfo
& SetInSlaveMode
) ) )
3194 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2e , di_0
) ;
3195 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2f , di_1
) ;
3199 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2b , di_0
) ;
3200 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2c , di_1
) ;
3206 /* --------------------------------------------------------------------- */
3207 /* Function : XGI_UpdateModeInfo */
3211 /* --------------------------------------------------------------------- */
3212 void XGI_UpdateModeInfo( PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
)
3220 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
3224 temp
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x01 ) ;
3226 if ( !( temp
& 0x20 ) )
3228 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x17 ) ;
3231 if ( ( HwDeviceExtension
->jChipType
>= XG20
) || ( HwDeviceExtension
->jChipType
>= XG40
) )
3232 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x53 ) ;
3234 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x63 ) ;
3236 if ( !( temp
& 0x40 ) )
3237 tempcl
|= ActiveCRT1
;
3241 temp
= XGINew_GetReg1( pVBInfo
->Part1Port
, 0x2e ) ;
3244 if ( !( temp
== 0x08 ) )
3246 tempax
= XGINew_GetReg1( pVBInfo
->Part1Port
, 0x13 ) ; /* Check ChannelA by Part1_13 [2003/10/03] */
3247 if ( tempax
& 0x04 )
3248 tempcl
= tempcl
| ActiveLCD
;
3252 if ( !( tempcl
& ActiveLCD
) )
3254 tempcl
|= ActiveCRT2
;
3257 tempcl
|= ActiveLCD
;
3261 temp
= XGINew_GetReg1( pVBInfo
->Part2Port
, 0x00 ) ;
3263 if( !( temp
& 0x08 ) )
3264 tempch
|= ActiveAVideo
;
3266 if ( !( temp
& 0x04 ) )
3267 tempch
|= ActiveSVideo
;
3270 tempch
|= ActiveSCART
;
3272 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
3275 tempch
|= ActiveHiTV
;
3278 if ( pVBInfo
->VBInfo
& SetCRT2ToYPbPr
)
3280 temp
= XGINew_GetReg1( pVBInfo
->Part2Port
, 0x4d ) ;
3283 tempch
|= ActiveYPbPr
;
3287 tempcl
|= ActiveTV
;
3291 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x3d ) ;
3292 if ( tempcl
& ActiveLCD
)
3294 if ( ( pVBInfo
->SetFlag
& ReserveTVOption
) )
3296 if ( temp
& ActiveTV
)
3297 tempcl
|= ActiveTV
;
3301 tempbl
= ~ModeSwitchStatus
;
3302 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x3d , tempbl
, temp
) ;
3304 if ( !( pVBInfo
->SetFlag
& ReserveTVOption
) )
3305 XGINew_SetReg1( pVBInfo
->P3d4
, 0x3e , tempch
) ;
3314 /* --------------------------------------------------------------------- */
3315 /* Function : XGI_GetVGAType */
3319 /* --------------------------------------------------------------------- */
3320 void XGI_GetVGAType( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
3323 if ( HwDeviceExtension->jChipType >= XG20 )
3325 pVBInfo->Set_VGAType = XG20;
3327 else if ( HwDeviceExtension->jChipType >= XG40 )
3329 pVBInfo->Set_VGAType = VGA_XGI340 ;
3332 pVBInfo
->Set_VGAType
= HwDeviceExtension
->jChipType
;
3336 /* --------------------------------------------------------------------- */
3337 /* Function : XGI_GetVBType */
3341 /* --------------------------------------------------------------------- */
3342 void XGI_GetVBType(PVB_DEVICE_INFO pVBInfo
)
3344 USHORT flag
, tempbx
, tempah
;
3346 if ( pVBInfo
->IF_DEF_CH7007
== 1 )
3348 pVBInfo
->VBType
= VB_CH7007
;
3351 if ( pVBInfo
->IF_DEF_LVDS
== 0 )
3353 tempbx
= VB_XGI302B
;
3354 flag
= XGINew_GetReg1( pVBInfo
->Part4Port
, 0x00 ) ;
3357 tempbx
= VB_XGI301
;
3358 flag
= XGINew_GetReg1( pVBInfo
->Part4Port
, 0x01 ) ;
3361 tempbx
= VB_XGI301B
;
3364 tempbx
= VB_XGI301C
;
3367 tempbx
= VB_XGI301LV
;
3370 tempbx
= VB_XGI302LV
;
3371 tempah
= XGINew_GetReg1( pVBInfo
->Part4Port
, 0x39 ) ;
3372 if ( tempah
!= 0xFF )
3373 tempbx
= VB_XGI301C
;
3378 if ( tempbx
& ( VB_XGI301B
| VB_XGI302B
) )
3380 flag
= XGINew_GetReg1( pVBInfo
->Part4Port
, 0x23 ) ;
3382 if ( !( flag
& 0x02 ) )
3383 tempbx
= tempbx
| VB_NoLCD
;
3387 pVBInfo
->VBType
= tempbx
;
3390 else if ( pVBInfo->IF_DEF_CH7017 == 1 )
3391 pVBInfo->VBType = VB_CH7017 ;
3393 pVBInfo->VBType = VB_LVDS_NS ;
3399 /* --------------------------------------------------------------------- */
3400 /* Function : XGI_GetVBInfo */
3404 /* --------------------------------------------------------------------- */
3405 void XGI_GetVBInfo( USHORT ModeNo
, USHORT ModeIdIndex
, PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
3413 if ( ModeNo
<= 0x13 )
3415 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
;
3419 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
3422 pVBInfo
->SetFlag
= 0 ;
3423 pVBInfo
->ModeType
= modeflag
& ModeInfoFlag
;
3426 if ( pVBInfo
->VBType
& 0xFFFF )
3428 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x30 ) ; /* Check Display Device */
3429 tempbx
= tempbx
| temp
;
3430 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x31 ) ;
3433 tempax
= temp
<< 8 ;
3434 tempbx
= tempbx
| tempax
;
3435 temp
= ( SetCRT2ToDualEdge
| SetCRT2ToYPbPr
| SetCRT2ToLCDA
| SetInSlaveMode
| DisableCRT2Display
) ;
3436 temp
= 0xFFFF ^ temp
;
3439 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
3441 if ( pVBInfo
->IF_DEF_LCDA
== 1 )
3444 if ( ( pVBInfo
->Set_VGAType
>= XG20
) || ( pVBInfo
->Set_VGAType
>= XG40
))
3446 if ( pVBInfo
->IF_DEF_LVDS
== 0 )
3448 /* if ( ( pVBInfo->VBType & VB_XGI302B ) || ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) || ( pVBInfo->VBType & VB_XGI301C ) ) */
3449 if ( pVBInfo
->VBType
& ( VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
3451 if ( temp
& EnableDualEdge
)
3453 tempbx
|= SetCRT2ToDualEdge
;
3455 if ( temp
& SetToLCDA
)
3456 tempbx
|= SetCRT2ToLCDA
;
3460 else if ( pVBInfo
->IF_DEF_CH7017
== 1 )
3462 if ( pVBInfo
->VBType
& VB_CH7017
)
3464 if ( temp
& EnableDualEdge
)
3466 tempbx
|= SetCRT2ToDualEdge
;
3468 if ( temp
& SetToLCDA
)
3469 tempbx
|= SetCRT2ToLCDA
;
3476 if ( pVBInfo
->IF_DEF_YPbPr
== 1 )
3478 if ( ( ( pVBInfo
->IF_DEF_LVDS
== 0 ) && ( ( pVBInfo
->VBType
& VB_XGI301LV
) || ( pVBInfo
->VBType
& VB_XGI302LV
) || ( pVBInfo
->VBType
& VB_XGI301C
) ) )
3479 || ( ( pVBInfo
->IF_DEF_CH7017
== 1 ) && ( pVBInfo
->VBType
&VB_CH7017
) ) || ( (pVBInfo
->IF_DEF_CH7007
== 1) && (pVBInfo
->VBType
&VB_CH7007
) ) ) /* [Billy] 07/05/04 */
3481 if ( temp
& SetYPbPr
) /* temp = CR38 */
3483 if ( pVBInfo
->IF_DEF_HiVision
== 1 )
3485 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x35 ) ; /* shampoo add for new scratch */
3487 tempbx
|= SetCRT2ToHiVisionTV
;
3489 if ( temp
!= YPbPrMode1080i
) {
3490 tempbx
&= ( ~SetCRT2ToHiVisionTV
) ;
3491 tempbx
|= SetCRT2ToYPbPr
; }
3494 /* tempbx |= SetCRT2ToYPbPr ; */
3499 tempax
= push
; /* restore CR31 */
3501 if ( pVBInfo
->IF_DEF_LVDS
== 0 )
3503 if ( pVBInfo
->IF_DEF_YPbPr
== 1 )
3505 if ( pVBInfo
->IF_DEF_HiVision
== 1 )
3512 if ( pVBInfo
->IF_DEF_HiVision
== 1 )
3518 else /* 3nd party chip */
3520 if ( pVBInfo
->IF_DEF_CH7017
== 1 )
3521 temp
= ( SetCRT2ToTV
| SetCRT2ToLCD
| SetCRT2ToLCDA
) ;
3522 else if ( pVBInfo
->IF_DEF_CH7007
== 1 ) /* [Billy] 07/05/03 */
3524 temp
= SetCRT2ToTV
;
3527 temp
= SetCRT2ToLCD
;
3530 if ( !( tempbx
& temp
) )
3532 tempax
|= DisableCRT2Display
;
3536 if ( pVBInfo
->IF_DEF_LCDA
== 1 ) /* Select Display Device */
3538 if ( !( pVBInfo
->VBType
& VB_NoLCD
) )
3540 if ( tempbx
& SetCRT2ToLCDA
)
3542 if ( tempbx
& SetSimuScanMode
)
3543 tempbx
&= ( ~( SetCRT2ToLCD
| SetCRT2ToRAMDAC
| SwitchToCRT2
) ) ;
3545 tempbx
&= ( ~( SetCRT2ToLCD
| SetCRT2ToRAMDAC
| SetCRT2ToTV
| SwitchToCRT2
) ) ;
3551 if ( !( tempbx
& ( SwitchToCRT2
| SetSimuScanMode
) ) ) /* for driver abnormal */
3553 if ( pVBInfo
->IF_DEF_CRT2Monitor
== 1 )
3555 if ( tempbx
& SetCRT2ToRAMDAC
)
3557 tempbx
&= ( 0xFF00 | SetCRT2ToRAMDAC
| SwitchToCRT2
| SetSimuScanMode
) ;
3558 tempbx
&= ( 0x00FF | ( ~SetCRT2ToYPbPr
) ) ;
3562 tempbx
&= ( ~( SetCRT2ToRAMDAC
| SetCRT2ToLCD
| SetCRT2ToTV
) ) ;
3565 if ( !( pVBInfo
->VBType
& VB_NoLCD
) )
3567 if ( tempbx
& SetCRT2ToLCD
)
3569 tempbx
&= ( 0xFF00 | SetCRT2ToLCD
| SwitchToCRT2
| SetSimuScanMode
) ;
3570 tempbx
&= ( 0x00FF | ( ~SetCRT2ToYPbPr
) ) ;
3574 if ( tempbx
& SetCRT2ToSCART
)
3576 tempbx
&= ( 0xFF00 | SetCRT2ToSCART
| SwitchToCRT2
| SetSimuScanMode
) ;
3577 tempbx
&= ( 0x00FF | ( ~SetCRT2ToYPbPr
) ) ;
3580 if ( pVBInfo
->IF_DEF_YPbPr
== 1 )
3582 if ( tempbx
& SetCRT2ToYPbPr
)
3583 tempbx
&= ( 0xFF00 | SwitchToCRT2
| SetSimuScanMode
) ;
3586 if ( pVBInfo
->IF_DEF_HiVision
== 1 )
3588 if ( tempbx
& SetCRT2ToHiVisionTV
)
3589 tempbx
&= ( 0xFF00 | SetCRT2ToHiVisionTV
| SwitchToCRT2
| SetSimuScanMode
) ;
3592 if ( tempax
& DisableCRT2Display
) /* Set Display Device Info */
3594 if ( !( tempbx
& ( SwitchToCRT2
| SetSimuScanMode
) ) )
3595 tempbx
= DisableCRT2Display
;
3598 if ( !( tempbx
& DisableCRT2Display
) )
3600 if ( ( !( tempbx
& DriverMode
) ) || ( !( modeflag
& CRT2Mode
) ) )
3602 if ( pVBInfo
->IF_DEF_LCDA
== 1 )
3604 if ( !( tempbx
& SetCRT2ToLCDA
) )
3605 tempbx
|= ( SetInSlaveMode
| SetSimuScanMode
) ;
3608 if ( pVBInfo
->IF_DEF_VideoCapture
== 1 )
3610 if ( ( ( HwDeviceExtension
->jChipType
== XG40
) && ( pVBInfo
->Set_VGAType
== XG40
) )
3611 || ( ( HwDeviceExtension
->jChipType
== XG41
) && ( pVBInfo
->Set_VGAType
== XG41
) )
3612 || ( ( HwDeviceExtension
->jChipType
== XG42
) && ( pVBInfo
->Set_VGAType
== XG42
) )
3613 || ( ( HwDeviceExtension
->jChipType
== XG45
) && ( pVBInfo
->Set_VGAType
== XG45
) ) )
3617 if ( !( tempbx
& SetCRT2ToRAMDAC
) ) /*CRT2 not need to support*/
3619 tempbx
&= ( 0x00FF | ( ~SetInSlaveMode
) ) ;
3620 pVBInfo
->SetFlag
|= EnableVCMode
;
3627 /*LCD+TV can't support in slave mode (Force LCDA+TV->LCDB)*/
3628 if ( ( tempbx
& SetInSlaveMode
) && ( tempbx
& SetCRT2ToLCDA
) )
3630 tempbx
^= ( SetCRT2ToLCD
| SetCRT2ToLCDA
| SetCRT2ToDualEdge
) ;
3631 pVBInfo
->SetFlag
|= ReserveTVOption
;
3636 pVBInfo
->VBInfo
= tempbx
;
3640 /* --------------------------------------------------------------------- */
3641 /* Function : XGI_GetTVInfo */
3645 /* --------------------------------------------------------------------- */
3646 void XGI_GetTVInfo( USHORT ModeNo
, USHORT ModeIdIndex
,PVB_DEVICE_INFO pVBInfo
)
3657 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
3659 if ( ModeNo
<= 0x13 )
3661 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
; /* si+St_ModeFlag */
3662 resinfo
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ResInfo
; /* si+St_ResInfo */
3666 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
3667 resinfo
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_RESINFO
; /* si+Ext_ResInfo */
3670 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
3672 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x35 ) ;
3674 if ( tempbx
& SetPALTV
)
3676 tempbx
&= ( SetCHTVOverScan
| SetPALMTV
| SetPALNTV
| SetPALTV
) ;
3677 if ( tempbx
& SetPALMTV
)
3678 tempbx
&= ~SetPALTV
; /* set to NTSC if PAL-M */
3681 tempbx
&= ( SetCHTVOverScan
| SetNTSCJ
| SetPALTV
) ;
3683 if ( pVBInfo->IF_DEF_LVDS == 0 )
3685 index1 = XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) ; //PAL-M/PAL-N Info
3686 temp2 = ( index1 & 0xC0 ) >> 5 ; //00:PAL, 01:PAL-M, 10:PAL-N
3688 if ( temp2 & 0x02 ) //PAL-M
3689 tempbx &= ( ~SetPALTV ) ;
3694 if ( pVBInfo
->IF_DEF_CH7017
== 1 )
3696 tempbx
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x35 ) ;
3698 if ( tempbx
& TVOverScan
)
3699 tempbx
|= SetCHTVOverScan
;
3702 if ( pVBInfo
->IF_DEF_CH7007
== 1 ) /* [Billy] 07/05/04 */
3704 tempbx
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x35 ) ;
3706 if ( tempbx
& TVOverScan
)
3708 tempbx
|= SetCHTVOverScan
;
3713 if ( pVBInfo
->IF_DEF_LVDS
== 0 )
3715 if ( pVBInfo
->VBInfo
& SetCRT2ToSCART
)
3716 tempbx
|= SetPALTV
;
3719 if ( pVBInfo
->IF_DEF_YPbPr
== 1 )
3721 if ( pVBInfo
->VBInfo
& SetCRT2ToYPbPr
)
3723 index1
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x35 ) ;
3724 index1
&= YPbPrMode
;
3726 if ( index1
== YPbPrMode525i
)
3727 tempbx
|= SetYPbPrMode525i
;
3729 if ( index1
== YPbPrMode525p
)
3730 tempbx
= tempbx
| SetYPbPrMode525p
;
3731 if ( index1
== YPbPrMode750p
)
3732 tempbx
= tempbx
| SetYPbPrMode750p
;
3736 if ( pVBInfo
->IF_DEF_HiVision
== 1 )
3738 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
3740 tempbx
= tempbx
| SetYPbPrMode1080i
| SetPALTV
;
3744 if ( pVBInfo
->IF_DEF_LVDS
== 0 )
3746 if ( ( pVBInfo
->VBInfo
& SetInSlaveMode
) && ( !( pVBInfo
->VBInfo
& SetNotSimuMode
) ) )
3747 tempbx
|= TVSimuMode
;
3749 if ( !( tempbx
& SetPALTV
) && ( modeflag
> 13 ) && ( resinfo
== 8 ) ) /* NTSC 1024x768, */
3750 tempbx
|= NTSC1024x768
;
3752 tempbx
|= RPLLDIV2XO
;
3754 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
3756 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
3757 tempbx
&=( ~RPLLDIV2XO
) ;
3761 if ( tempbx
& ( SetYPbPrMode525p
| SetYPbPrMode750p
) )
3762 tempbx
&= ( ~RPLLDIV2XO
) ;
3763 else if ( !( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) ) )
3765 if ( tempbx
& TVSimuMode
)
3766 tempbx
&= ( ~RPLLDIV2XO
) ;
3771 pVBInfo
->TVInfo
= tempbx
;
3775 /* --------------------------------------------------------------------- */
3776 /* Function : XGI_GetLCDInfo */
3780 /* --------------------------------------------------------------------- */
3781 BOOLEAN
XGI_GetLCDInfo( USHORT ModeNo
, USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
3790 pVBInfo
->LCDResInfo
= 0 ;
3791 pVBInfo
->LCDTypeInfo
= 0 ;
3792 pVBInfo
->LCDInfo
= 0 ;
3794 if ( ModeNo
<= 0x13 )
3796 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
; /* si+St_ModeFlag // */
3800 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
3801 resinfo
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_RESINFO
; /* si+Ext_ResInfo// */
3804 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x36 ) ; /* Get LCD Res.Info */
3805 tempbx
= temp
& 0x0F ;
3808 tempbx
= Panel1024x768
; /* default */
3810 /* LCD75 [2003/8/22] Vicent */
3811 if ( ( tempbx
== Panel1024x768
) || ( tempbx
== Panel1280x1024
) )
3813 if ( pVBInfo
->VBInfo
& DriverMode
)
3815 tempax
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x33 ) ;
3816 if ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
)
3819 tempax
= tempax
>> 4 ;
3821 if ( ( resinfo
== 6 ) || ( resinfo
== 9 ) )
3824 tempbx
|= PanelRef75Hz
;
3826 else if ( ( resinfo
== 7 ) || ( resinfo
== 8 ) )
3829 tempbx
|= PanelRef75Hz
;
3834 pVBInfo
->LCDResInfo
= tempbx
;
3838 if( pVBInfo
->IF_DEF_OEMUtil
== 1 )
3840 pVBInfo
->LCDTypeInfo
= ( temp
& 0xf0 ) >> 4 ;
3843 if ( !( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) ) )
3850 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x37 ) ;
3852 temp
&= ( ScalingLCD
| LCDNonExpanding
| LCDSyncBit
| SetPWDEnable
) ;
3854 if ( ( pVBInfo
->IF_DEF_ScaleLCD
== 1 ) && ( temp
& LCDNonExpanding
) )
3855 temp
&= ~EnableScalingLCD
;
3859 LCDIdIndex
= XGI_GetLCDCapPtr1(pVBInfo
) ;
3861 tempax
= pVBInfo
->LCDCapList
[ LCDIdIndex
].LCD_Capability
;
3863 if ( pVBInfo
->IF_DEF_LVDS
== 0 ) /* shampoo */
3865 if ( ( ( pVBInfo
->VBType
& VB_XGI302LV
) || ( pVBInfo
->VBType
& VB_XGI301C
) ) && ( tempax
& LCDDualLink
) )
3867 tempbx
|= SetLCDDualLink
;
3871 if ( pVBInfo
->IF_DEF_CH7017
== 1 )
3873 if ( tempax
& LCDDualLink
)
3875 tempbx
|= SetLCDDualLink
;
3879 if ( pVBInfo
->IF_DEF_LVDS
== 0 )
3881 if ( ( pVBInfo
->LCDResInfo
== Panel1400x1050
) && ( pVBInfo
->VBInfo
& SetCRT2ToLCD
) && ( ModeNo
> 0x13 ) && ( resinfo
== 9 ) && ( !( tempbx
& EnableScalingLCD
) ) )
3882 tempbx
|= SetLCDtoNonExpanding
; /* set to center in 1280x1024 LCDB for Panel1400x1050 */
3886 if ( tempax & LCDBToA )
3888 tempbx |= SetLCDBToA ;
3892 if ( pVBInfo
->IF_DEF_ExpLink
== 1 )
3894 if ( modeflag
& HalfDCLK
)
3896 /* if ( !( pVBInfo->LCDInfo&LCDNonExpanding ) ) */
3897 if ( !( tempbx
& SetLCDtoNonExpanding
) )
3899 tempbx
|= EnableLVDSDDA
;
3903 if ( ModeNo
> 0x13 )
3905 if ( pVBInfo
->LCDResInfo
== Panel1024x768
)
3909 tempbx
|= EnableLVDSDDA
;
3917 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
3919 if ( pVBInfo
->VBInfo
& SetNotSimuMode
)
3921 tempbx
|= LCDVESATiming
;
3926 tempbx
|= LCDVESATiming
;
3929 pVBInfo
->LCDInfo
= tempbx
;
3931 if ( pVBInfo
->IF_DEF_PWD
== 1 )
3933 if ( pVBInfo
->LCDInfo
& SetPWDEnable
)
3935 if ( ( pVBInfo
->VBType
& VB_XGI302LV
) || ( pVBInfo
->VBType
& VB_XGI301C
) )
3937 if ( !( tempax
& PWDEnable
) )
3939 pVBInfo
->LCDInfo
&= ~SetPWDEnable
;
3945 if ( pVBInfo
->IF_DEF_LVDS
== 0 )
3947 if ( tempax
& ( LockLCDBToA
| StLCDBToA
) )
3949 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
3951 if ( !( tempax
& LockLCDBToA
) )
3953 if ( ModeNo
<= 0x13 )
3955 pVBInfo
->VBInfo
&= ~( SetSimuScanMode
| SetInSlaveMode
| SetCRT2ToLCD
) ;
3956 pVBInfo
->VBInfo
|= SetCRT2ToLCDA
| SetCRT2ToDualEdge
;
3964 if ( pVBInfo->IF_DEF_LVDS == 0 )
3966 if ( tempax & ( LockLCDBToA | StLCDBToA ) )
3968 if ( pVBInfo->VBInfo & SetInSlaveMode )
3970 if ( !( ( !( tempax & LockLCDBToA ) ) && ( ModeNo > 0x13 ) ) )
3972 pVBInfo->VBInfo&=~(SetSimuScanMode|SetInSlaveMode|SetCRT2ToLCD);
3973 pVBInfo->VBInfo|=SetCRT2ToLCDA|SetCRT2ToDualEdge;
3984 /* --------------------------------------------------------------------- */
3985 /* Function : XGI_SearchModeID */
3989 /* --------------------------------------------------------------------- */
3990 BOOLEAN
XGI_SearchModeID( USHORT ModeNo
, USHORT
*ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
3995 #ifdef LINUX /* chiawen for linux solution */
3999 if ( ModeNo
<= 0x13 )
4001 /* for (*ModeIdIndex=0;*ModeIdIndex<sizeof(pVBInfo->SModeIDTable)/sizeof(XGI_StStruct);(*ModeIdIndex)++) */
4002 for( *ModeIdIndex
= 0 ; ; ( *ModeIdIndex
)++ )
4004 if ( pVBInfo
->SModeIDTable
[ *ModeIdIndex
].St_ModeID
== ModeNo
)
4006 if ( pVBInfo
->SModeIDTable
[ *ModeIdIndex
].St_ModeID
== 0xFF )
4010 if ( ModeNo
== 0x07 )
4011 ( *ModeIdIndex
)++ ; /* 400 lines */
4014 ( *ModeIdIndex
) += 2 ; /* 400 lines */
4015 /* else 350 lines */
4019 /* for (*ModeIdIndex=0;*ModeIdIndex<sizeof(pVBInfo->EModeIDTable)/sizeof(XGI_ExtStruct);(*ModeIdIndex)++) */
4020 for( *ModeIdIndex
= 0 ; ; ( *ModeIdIndex
)++ )
4022 if ( pVBInfo
->EModeIDTable
[ *ModeIdIndex
].Ext_ModeID
== ModeNo
)
4024 if ( pVBInfo
->EModeIDTable
[ *ModeIdIndex
].Ext_ModeID
== 0xFF )
4037 /* win2000 MM adapter not support standard mode! */
4039 /* --------------------------------------------------------------------- */
4044 /* --------------------------------------------------------------------- */
4045 BOOLEAN
XGINew_CheckMemorySize(PXGI_HW_DEVICE_INFO HwDeviceExtension
,USHORT ModeNo
,USHORT ModeIdIndex
,PVB_DEVICE_INFO pVBInfo
)
4053 /* if ( ( HwDeviceExtension->jChipType == XGI_650 ) ||
4054 ( HwDeviceExtension->jChipType == XGI_650M ) )
4059 if ( ModeNo
<= 0x13 )
4061 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
;
4064 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
4067 /* ModeType = modeflag&ModeInfoFlag ; // Get mode type */
4069 memorysize
= modeflag
& MemoryInfoFlag
;
4070 memorysize
= memorysize
> MemorySizeShift
;
4071 memorysize
++ ; /* Get memory size */
4073 temp
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) ; /* Get DRAM Size */
4076 if ( HwDeviceExtension
->jChipType
== XG40
)
4078 temp
= 1 << ( ( temp
& 0x0F0 ) >> 4 ) ; /* memory size per channel SR14[7:4] */
4079 if ( ( tmp
& 0x0c ) == 0x0C ) /* Qual channels */
4083 else if ( ( tmp
& 0x0c ) == 0x08 ) /* Dual channels */
4088 else if ( HwDeviceExtension
->jChipType
== XG42
)
4090 temp
= 1 << ( ( temp
& 0x0F0 ) >> 4 ) ; /* memory size per channel SR14[7:4] */
4091 if ( ( tmp
& 0x04 ) == 0x04 ) /* Dual channels */
4096 else if ( HwDeviceExtension
->jChipType
== XG45
)
4098 temp
= 1 << ( ( temp
& 0x0F0 ) >> 4 ) ; /* memory size per channel SR14[7:4] */
4099 if ( ( tmp
& 0x0c ) == 0x0C ) /* Qual channels */
4103 else if ( ( tmp
& 0x0c ) == 0x08 ) /* triple channels */
4109 else if ( ( tmp
& 0x0c ) == 0x04 ) /* Dual channels */
4114 if ( temp
< memorysize
)
4121 /* --------------------------------------------------------------------- */
4122 /* Function : XGINew_IsLowResolution */
4126 /* --------------------------------------------------------------------- */
4127 /*void XGINew_IsLowResolution( USHORT ModeNo , USHORT ModeIdIndex, BOOLEAN XGINew_CheckMemorySize(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo)
4132 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x0F ) ;
4134 XGINew_SetReg1( pVBInfo->P3c4 , 0x0F , data ) ;
4136 if ( ModeNo > 0x13 )
4138 ModeFlag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
4139 if ( ( ModeFlag & HalfDCLK ) && ( ModeFlag & DoubleScanMode ) )
4141 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x0F ) ;
4143 XGINew_SetReg1( pVBInfo->P3c4 , 0x0F , data ) ;
4144 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x01 ) ;
4146 XGINew_SetReg1( pVBInfo->P3c4 , 0x01 , data ) ;
4153 /* --------------------------------------------------------------------- */
4154 /* Function : XGI_DisplayOn */
4158 /* --------------------------------------------------------------------- */
4159 void XGI_DisplayOn( PXGI_HW_DEVICE_INFO pXGIHWDE
, PVB_DEVICE_INFO pVBInfo
)
4162 XGINew_SetRegANDOR(pVBInfo
->P3c4
,0x01,0xDF,0x00);
4163 if ( pXGIHWDE
->jChipType
== XG21
)
4165 if ( pVBInfo
->IF_DEF_LVDS
== 1 )
4167 if (!(XGI_XG21GetPSCValue( pVBInfo
)&0x1))
4169 XGI_XG21BLSignalVDD( 0x01 , 0x01, pVBInfo
) ; /* LVDS VDD on */
4170 XGI_XG21SetPanelDelay( 2,pVBInfo
) ;
4172 if (!(XGI_XG21GetPSCValue( pVBInfo
)&0x20))
4174 XGI_XG21BLSignalVDD( 0x20 , 0x20, pVBInfo
) ; /* LVDS signal on */
4176 XGI_XG21SetPanelDelay( 3,pVBInfo
) ;
4177 XGI_XG21BLSignalVDD( 0x02 , 0x02, pVBInfo
) ; /* LVDS backlight on */
4181 XGI_XG21BLSignalVDD( 0x20 , 0x20, pVBInfo
) ; /* DVO/DVI signal on */
4186 if (pVBInfo
->IF_DEF_CH7007
== 1) /* [Billy] 07/05/23 For CH7007 */
4192 if ( pXGIHWDE
->jChipType
== XG27
)
4194 if ( pVBInfo
->IF_DEF_LVDS
== 1 )
4196 if (!(XGI_XG27GetPSCValue( pVBInfo
)&0x1))
4198 XGI_XG27BLSignalVDD( 0x01 , 0x01, pVBInfo
) ; /* LVDS VDD on */
4199 XGI_XG21SetPanelDelay( 2,pVBInfo
) ;
4201 if (!(XGI_XG27GetPSCValue( pVBInfo
)&0x20))
4203 XGI_XG27BLSignalVDD( 0x20 , 0x20, pVBInfo
) ; /* LVDS signal on */
4205 XGI_XG21SetPanelDelay( 3,pVBInfo
) ;
4206 XGI_XG27BLSignalVDD( 0x02 , 0x02, pVBInfo
) ; /* LVDS backlight on */
4210 XGI_XG27BLSignalVDD( 0x20 , 0x20, pVBInfo
) ; /* DVO/DVI signal on */
4217 /* --------------------------------------------------------------------- */
4218 /* Function : XGI_DisplayOff */
4222 /* --------------------------------------------------------------------- */
4223 void XGI_DisplayOff( PXGI_HW_DEVICE_INFO pXGIHWDE
, PVB_DEVICE_INFO pVBInfo
)
4226 if ( pXGIHWDE
->jChipType
== XG21
)
4228 if ( pVBInfo
->IF_DEF_LVDS
== 1 )
4230 XGI_XG21BLSignalVDD( 0x02 , 0x00, pVBInfo
) ; /* LVDS backlight off */
4231 XGI_XG21SetPanelDelay( 3,pVBInfo
) ;
4235 XGI_XG21BLSignalVDD( 0x20 , 0x00, pVBInfo
) ; /* DVO/DVI signal off */
4239 if (pVBInfo
->IF_DEF_CH7007
== 1) /*[Billy] 07/05/23 For CH7007 */
4241 /* if( IsCH7007TVMode( pVBInfo ) == 0 ) */
4247 if ( pXGIHWDE
->jChipType
== XG27
)
4249 if ((XGI_XG27GetPSCValue( pVBInfo
)&0x2))
4251 XGI_XG27BLSignalVDD( 0x02 , 0x00, pVBInfo
) ; /* LVDS backlight off */
4252 XGI_XG21SetPanelDelay( 3,pVBInfo
) ;
4255 if ( pVBInfo
->IF_DEF_LVDS
== 0 )
4257 XGI_XG27BLSignalVDD( 0x20 , 0x00, pVBInfo
) ; /* DVO/DVI signal off */
4261 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x01 , 0xDF , 0x20 ) ;
4265 /* --------------------------------------------------------------------- */
4266 /* Function : XGI_WaitDisply */
4269 /* Description : chiawen for sensecrt1 */
4270 /* --------------------------------------------------------------------- */
4271 void XGI_WaitDisply( PVB_DEVICE_INFO pVBInfo
)
4273 while( ( XGINew_GetReg2( pVBInfo
->P3da
) & 0x01 ) )
4276 while( !( XGINew_GetReg2( pVBInfo
->P3da
) & 0x01 ) )
4280 /* --------------------------------------------------------------------- */
4281 /* Function : XGI_SenseCRT1 */
4285 /* --------------------------------------------------------------------- */
4287 void XGI_SenseCRT1( PVB_DEVICE_INFO pVBInfo
)
4289 UCHAR CRTCData
[ 17 ] = { 0x5F , 0x4F , 0x50 , 0x82 , 0x55 , 0x81 ,
4290 0x0B , 0x3E , 0xE9 , 0x0B , 0xDF , 0xE7 ,
4291 0x04 , 0x00 , 0x00 , 0x05 , 0x00 } ;
4293 UCHAR SR01
= 0 , SR1F
= 0 , SR07
= 0 , SR06
= 0 ;
4295 UCHAR CR17
, CR63
, SR31
;
4297 UCHAR DAC_TEST_PARMS
[ 3 ] = { 0x0F , 0x0F , 0x0F } ;
4300 XGINew_SetReg1( pVBInfo
->P3c4
, 0x05 , 0x86 ) ;
4302 /* [2004/05/06] Vicent to fix XG42 single LCD sense to CRT+LCD */
4303 XGINew_SetReg1( pVBInfo
->P3d4
, 0x57 , 0x4A ) ;
4304 XGINew_SetReg1( pVBInfo
->P3d4
, 0x53 , ( UCHAR
)( XGINew_GetReg1( pVBInfo
->P3d4
, 0x53 ) | 0x02 ) ) ;
4306 SR31
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3c4
, 0x31 ) ;
4307 CR63
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x63 ) ;
4308 SR01
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3c4
, 0x01 ) ;
4310 XGINew_SetReg1( pVBInfo
->P3c4
, 0x01 , ( UCHAR
)( SR01
& 0xDF ) ) ;
4311 XGINew_SetReg1( pVBInfo
->P3d4
, 0x63 , ( UCHAR
)( CR63
& 0xBF ) ) ;
4313 CR17
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x17 ) ;
4314 XGINew_SetReg1( pVBInfo
->P3d4
, 0x17 , ( UCHAR
)( CR17
| 0x80 ) ) ;
4316 SR1F
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3c4
, 0x1F ) ;
4317 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1F , ( UCHAR
)( SR1F
| 0x04 ) ) ;
4319 SR07
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3c4
, 0x07 ) ;
4320 XGINew_SetReg1( pVBInfo
->P3c4
, 0x07 , ( UCHAR
)( SR07
& 0xFB ) ) ;
4321 SR06
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3c4
, 0x06 ) ;
4322 XGINew_SetReg1( pVBInfo
->P3c4
, 0x06 , ( UCHAR
)( SR06
& 0xC3 ) ) ;
4324 XGINew_SetReg1( pVBInfo
->P3d4
, 0x11 , 0x00 ) ;
4326 for( i
= 0 ; i
< 8 ; i
++ )
4327 XGINew_SetReg1( pVBInfo
->P3d4
, ( USHORT
)i
, CRTCData
[ i
] ) ;
4329 for( i
= 8 ; i
< 11 ; i
++ )
4330 XGINew_SetReg1( pVBInfo
->P3d4
, ( USHORT
)( i
+ 8 ) , CRTCData
[ i
] ) ;
4332 for( i
= 11 ; i
< 13 ; i
++ )
4333 XGINew_SetReg1( pVBInfo
->P3d4
, ( USHORT
)( i
+ 4 ) , CRTCData
[ i
] ) ;
4335 for( i
= 13 ; i
< 16 ; i
++ )
4336 XGINew_SetReg1( pVBInfo
->P3c4
, ( USHORT
)( i
- 3 ) , CRTCData
[ i
] ) ;
4338 XGINew_SetReg1( pVBInfo
->P3c4
, 0x0E , ( UCHAR
)( CRTCData
[ 16 ] & 0xE0 ) ) ;
4340 XGINew_SetReg1( pVBInfo
->P3c4
, 0x31 , 0x00 ) ;
4341 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2B , 0x1B ) ;
4342 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2C , 0xE1 ) ;
4344 XGINew_SetReg3( pVBInfo
->P3c8
, 0x00 ) ;
4346 for( i
= 0 ; i
< 256 ; i
++ )
4348 XGINew_SetReg3( ( pVBInfo
->P3c8
+ 1 ) , ( UCHAR
)DAC_TEST_PARMS
[ 0 ] ) ;
4349 XGINew_SetReg3( ( pVBInfo
->P3c8
+ 1 ) , ( UCHAR
)DAC_TEST_PARMS
[ 1 ] ) ;
4350 XGINew_SetReg3( ( pVBInfo
->P3c8
+ 1 ) , ( UCHAR
)DAC_TEST_PARMS
[ 2 ] ) ;
4353 XGI_VBLongWait( pVBInfo
) ;
4354 XGI_VBLongWait( pVBInfo
) ;
4355 XGI_VBLongWait( pVBInfo
) ;
4357 XGINew_LCD_Wait_Time( 0x01 , pVBInfo
) ;
4359 XGI_WaitDisply( pVBInfo
) ;
4360 temp
= XGINew_GetReg2( pVBInfo
->P3c2
) ;
4364 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x32 , 0xDF , 0x20 ) ;
4368 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x32 , 0xDF , 0x00 ) ;
4371 /* alan, avoid display something, set BLACK DAC if not restore DAC */
4372 XGINew_SetReg3( pVBInfo
->P3c8
, 0x00 ) ;
4374 for( i
= 0 ; i
< 256 ; i
++ )
4376 XGINew_SetReg3( ( pVBInfo
->P3c8
+ 1 ) , 0 ) ;
4377 XGINew_SetReg3( ( pVBInfo
->P3c8
+ 1 ) , 0 ) ;
4378 XGINew_SetReg3( ( pVBInfo
->P3c8
+ 1 ) , 0 ) ;
4381 XGINew_SetReg1( pVBInfo
->P3c4
, 0x01 , SR01
) ;
4382 XGINew_SetReg1( pVBInfo
->P3d4
, 0x63 , CR63
) ;
4383 XGINew_SetReg1( pVBInfo
->P3c4
, 0x31 , SR31
) ;
4385 /* [2004/05/11] Vicent */
4386 XGINew_SetReg1( pVBInfo
->P3d4
, 0x53 , ( UCHAR
)( XGINew_GetReg1( pVBInfo
->P3d4
, 0x53 ) & 0xFD ) ) ;
4387 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1F , ( UCHAR
) SR1F
) ;
4399 /* --------------------------------------------------------------------- */
4400 /* Function : XGI_WaitDisplay */
4404 /* --------------------------------------------------------------------- */
4405 void XGI_WaitDisplay( PVB_DEVICE_INFO pVBInfo
)
4407 while( !( XGINew_GetReg2( pVBInfo
->P3da
) & 0x01 ) ) ;
4409 while( XGINew_GetReg2( pVBInfo
->P3da
) & 0x01 ) ;
4415 /* --------------------------------------------------------------------- */
4416 /* Function : XGI_SetCRT2Group301 */
4420 /* --------------------------------------------------------------------- */
4421 BOOLEAN
XGI_SetCRT2Group301( USHORT ModeNo
, PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
4425 RefreshRateTableIndex
;
4427 tempbx
=pVBInfo
->VBInfo
;
4428 pVBInfo
->SetFlag
|= ProgrammingCRT2
;
4429 XGI_SearchModeID( ModeNo
, &ModeIdIndex
, pVBInfo
) ;
4430 pVBInfo
->SelectCRT2Rate
= 4 ;
4431 RefreshRateTableIndex
= XGI_GetRatePtrCRT2( HwDeviceExtension
, ModeNo
, ModeIdIndex
, pVBInfo
) ;
4432 XGI_SaveCRT2Info( ModeNo
, pVBInfo
) ;
4433 XGI_GetCRT2ResInfo( ModeNo
, ModeIdIndex
, pVBInfo
) ;
4434 XGI_GetCRT2Data( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
4435 XGI_PreSetGroup1( ModeNo
, ModeIdIndex
, HwDeviceExtension
, RefreshRateTableIndex
, pVBInfo
) ;
4436 XGI_SetGroup1( ModeNo
, ModeIdIndex
, HwDeviceExtension
, RefreshRateTableIndex
, pVBInfo
) ;
4437 XGI_SetLockRegs( ModeNo
, ModeIdIndex
, HwDeviceExtension
, RefreshRateTableIndex
, pVBInfo
) ;
4438 XGI_SetGroup2( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, HwDeviceExtension
, pVBInfo
) ;
4439 XGI_SetLCDRegs(ModeNo
, ModeIdIndex
, HwDeviceExtension
, RefreshRateTableIndex
, pVBInfo
) ;
4440 XGI_SetTap4Regs(pVBInfo
) ;
4441 XGI_SetGroup3(ModeNo
, ModeIdIndex
, pVBInfo
);
4442 XGI_SetGroup4( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, HwDeviceExtension
, pVBInfo
) ;
4443 XGI_SetCRT2VCLK( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
4444 XGI_SetGroup5( ModeNo
, ModeIdIndex
, pVBInfo
) ;
4445 XGI_AutoThreshold( pVBInfo
) ;
4450 /* --------------------------------------------------------------------- */
4451 /* Function : XGI_AutoThreshold */
4455 /* --------------------------------------------------------------------- */
4456 void XGI_AutoThreshold( PVB_DEVICE_INFO pVBInfo
)
4458 if ( !( pVBInfo
->SetFlag
& Win9xDOSMode
) )
4459 XGINew_SetRegOR( pVBInfo
->Part1Port
, 0x01 , 0x40 ) ;
4463 /* --------------------------------------------------------------------- */
4464 /* Function : XGI_SaveCRT2Info */
4468 /* --------------------------------------------------------------------- */
4469 void XGI_SaveCRT2Info( USHORT ModeNo
, PVB_DEVICE_INFO pVBInfo
)
4474 XGINew_SetReg1( pVBInfo
->P3d4
, 0x34 , ModeNo
) ; /* reserve CR34 for CRT1 Mode No */
4475 temp1
= ( pVBInfo
->VBInfo
&SetInSlaveMode
) >> 8 ;
4476 temp2
= ~( SetInSlaveMode
>> 8 ) ;
4477 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x31 , temp2
, temp1
) ;
4481 /* --------------------------------------------------------------------- */
4482 /* Function : XGI_GetCRT2ResInfo */
4486 /* --------------------------------------------------------------------- */
4487 void XGI_GetCRT2ResInfo( USHORT ModeNo
, USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
4494 resindex
= XGI_GetResInfo( ModeNo
, ModeIdIndex
, pVBInfo
) ;
4495 if ( ModeNo
<= 0x13 )
4497 xres
= pVBInfo
->StResInfo
[ resindex
].HTotal
;
4498 yres
= pVBInfo
->StResInfo
[ resindex
].VTotal
;
4499 /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; si+St_ResInfo */
4503 xres
= pVBInfo
->ModeResInfo
[ resindex
].HTotal
; /* xres->ax */
4504 yres
= pVBInfo
->ModeResInfo
[ resindex
].VTotal
; /* yres->bx */
4505 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
; /* si+St_ModeFlag */
4507 /* if ( pVBInfo->IF_DEF_FSTN )
4515 if ( modeflag
& HalfDCLK
)
4518 if ( modeflag
& DoubleScanMode
)
4523 if ( pVBInfo
->VBInfo
& SetCRT2ToLCD
)
4525 if ( pVBInfo
->IF_DEF_LVDS
== 0 )
4527 if ( pVBInfo
->LCDResInfo
== Panel1600x1200
)
4529 if ( !( pVBInfo
->LCDInfo
& LCDVESATiming
) )
4536 if ( pVBInfo
->LCDResInfo
== Panel1280x1024
)
4540 else if ( yres
== 350 )
4543 if ( pVBInfo
->LCDInfo
& LCDVESATiming
)
4550 if ( pVBInfo
->LCDResInfo
== Panel1024x768
)
4552 if ( !( pVBInfo
->LCDInfo
& LCDVESATiming
) )
4554 if ( !( pVBInfo
->LCDInfo
& LCDNonExpanding
) )
4558 else if ( yres
== 400 )
4560 else if ( yres
== 480 )
4571 pVBInfo
->VGAHDE
= xres
;
4572 pVBInfo
->HDE
= xres
;
4573 pVBInfo
->VGAVDE
= yres
;
4574 pVBInfo
->VDE
= yres
;
4578 /* --------------------------------------------------------------------- */
4579 /* Function : XGI_IsLCDDualLink */
4583 /* --------------------------------------------------------------------- */
4584 BOOLEAN
XGI_IsLCDDualLink( PVB_DEVICE_INFO pVBInfo
)
4587 if ( ( ( ( pVBInfo
->VBInfo
& SetCRT2ToLCD
) | SetCRT2ToLCDA
) ) && ( pVBInfo
->LCDInfo
& SetLCDDualLink
) ) /* shampoo0129 */
4594 /* --------------------------------------------------------------------- */
4595 /* Function : XGI_GetCRT2Data */
4599 /* --------------------------------------------------------------------- */
4600 void XGI_GetCRT2Data( USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
4607 XGI_LCDDataStruct
*LCDPtr
= NULL
;
4608 XGI_TVDataStruct
*TVPtr
= NULL
;
4610 if ( ModeNo
<= 0x13 )
4612 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
; /* si+St_ResInfo */
4613 resinfo
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ResInfo
;
4617 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
; /* si+Ext_ResInfo */
4618 resinfo
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_RESINFO
;
4621 pVBInfo
->NewFlickerMode
= 0 ;
4622 pVBInfo
->RVBHRS
= 50 ;
4624 if ( pVBInfo
->VBInfo
& SetCRT2ToRAMDAC
)
4626 XGI_GetRAMDAC2DATA( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
,pVBInfo
) ;
4632 if ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) )
4634 LCDPtr
= (XGI_LCDDataStruct
* )XGI_GetLcdPtr( tempbx
, ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
4636 pVBInfo
->RVBHCMAX
= LCDPtr
->RVBHCMAX
;
4637 pVBInfo
->RVBHCFACT
= LCDPtr
->RVBHCFACT
;
4638 pVBInfo
->VGAHT
= LCDPtr
->VGAHT
;
4639 pVBInfo
->VGAVT
= LCDPtr
->VGAVT
;
4640 pVBInfo
->HT
= LCDPtr
->LCDHT
;
4641 pVBInfo
->VT
= LCDPtr
->LCDVT
;
4643 if ( pVBInfo
->LCDResInfo
== Panel1024x768
)
4648 if ( !( pVBInfo
->LCDInfo
& LCDVESATiming
) )
4650 if ( pVBInfo
->VGAVDE
== 357 )
4652 else if ( pVBInfo
->VGAVDE
== 420 )
4654 else if ( pVBInfo
->VGAVDE
== 525 )
4656 else if ( pVBInfo
->VGAVDE
== 600 )
4658 /* else if(pVBInfo->VGAVDE==350) tempbx=560; */
4659 /* else if(pVBInfo->VGAVDE==400) tempbx=640; */
4666 else if ( pVBInfo
->LCDResInfo
== Panel1024x768x75
)
4671 else if ( pVBInfo
->LCDResInfo
== Panel1280x1024
)
4674 if ( pVBInfo
->VGAVDE
== 360 )
4676 else if ( pVBInfo
->VGAVDE
== 375 )
4678 else if ( pVBInfo
->VGAVDE
== 405 )
4683 else if ( pVBInfo
->LCDResInfo
== Panel1280x1024x75
)
4688 else if ( pVBInfo
->LCDResInfo
== Panel1280x960
)
4691 if ( pVBInfo
->VGAVDE
== 350 )
4693 else if ( pVBInfo
->VGAVDE
== 400 )
4695 else if ( pVBInfo
->VGAVDE
== 1024 )
4700 else if ( pVBInfo
->LCDResInfo
== Panel1400x1050
)
4705 if ( pVBInfo
->VGAVDE
== 1024 )
4711 else if ( pVBInfo
->LCDResInfo
== Panel1600x1200
)
4714 tempbx
= 1200 ; /* alan 10/14/2003 */
4715 if ( !( pVBInfo
->LCDInfo
& LCDVESATiming
) )
4717 if ( pVBInfo
->VGAVDE
== 350 )
4719 else if ( pVBInfo
->VGAVDE
== 400 )
4724 if ( pVBInfo
->LCDInfo
& LCDNonExpanding
)
4726 tempax
= pVBInfo
->VGAHDE
;
4727 tempbx
= pVBInfo
->VGAVDE
;
4730 pVBInfo
->HDE
= tempax
;
4731 pVBInfo
->VDE
= tempbx
;
4735 if ( pVBInfo
->VBInfo
& ( SetCRT2ToTV
) )
4738 TVPtr
= ( XGI_TVDataStruct
* )XGI_GetTVPtr( tempbx
, ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
4740 pVBInfo
->RVBHCMAX
= TVPtr
->RVBHCMAX
;
4741 pVBInfo
->RVBHCFACT
= TVPtr
->RVBHCFACT
;
4742 pVBInfo
->VGAHT
= TVPtr
->VGAHT
;
4743 pVBInfo
->VGAVT
= TVPtr
->VGAVT
;
4744 pVBInfo
->HDE
= TVPtr
->TVHDE
;
4745 pVBInfo
->VDE
= TVPtr
->TVVDE
;
4746 pVBInfo
->RVBHRS
= TVPtr
->RVBHRS
;
4747 pVBInfo
->NewFlickerMode
= TVPtr
->FlickerMode
;
4749 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
4751 if ( resinfo
== 0x08 )
4752 pVBInfo
->NewFlickerMode
= 0x40 ;
4753 else if ( resinfo
== 0x09 )
4754 pVBInfo
->NewFlickerMode
= 0x40 ;
4755 else if ( resinfo
== 0x12 )
4756 pVBInfo
->NewFlickerMode
= 0x40 ;
4758 if ( pVBInfo
->VGAVDE
== 350 )
4759 pVBInfo
->TVInfo
|= TVSimuMode
;
4761 tempax
= ExtHiTVHT
;
4762 tempbx
= ExtHiTVVT
;
4764 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
4766 if ( pVBInfo
->TVInfo
& TVSimuMode
)
4771 if ( !( modeflag
& Charx8Dot
) )
4773 tempax
= StHiTextTVHT
;
4774 tempbx
= StHiTextTVVT
;
4779 else if ( pVBInfo
->VBInfo
& SetCRT2ToYPbPr
)
4781 if ( pVBInfo
->TVInfo
& SetYPbPrMode750p
)
4783 tempax
= YPbPrTV750pHT
; /* Ext750pTVHT */
4784 tempbx
= YPbPrTV750pVT
; /* Ext750pTVVT */
4787 if ( pVBInfo
->TVInfo
& SetYPbPrMode525p
)
4789 tempax
= YPbPrTV525pHT
; /* Ext525pTVHT */
4790 tempbx
= YPbPrTV525pVT
; /* Ext525pTVVT */
4792 else if ( pVBInfo
->TVInfo
& SetYPbPrMode525i
)
4794 tempax
= YPbPrTV525iHT
; /* Ext525iTVHT */
4795 tempbx
= YPbPrTV525iVT
; /* Ext525iTVVT */
4796 if ( pVBInfo
->TVInfo
& NTSC1024x768
)
4797 tempax
= NTSC1024x768HT
;
4804 if ( !( pVBInfo
->TVInfo
& SetPALTV
) )
4808 if ( pVBInfo
->TVInfo
& NTSC1024x768
)
4809 tempax
= NTSC1024x768HT
;
4813 pVBInfo
->HT
= tempax
;
4814 pVBInfo
->VT
= tempbx
;
4820 /* --------------------------------------------------------------------- */
4821 /* Function : XGI_SetCRT2VCLK */
4825 /* --------------------------------------------------------------------- */
4826 void XGI_SetCRT2VCLK( USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
4832 tempal
= XGI_GetVCLKPtr( RefreshRateTableIndex
, ModeNo
, ModeIdIndex
, pVBInfo
) ;
4833 XGI_GetVCLKLen( tempal
, &di_0
, &di_1
, pVBInfo
) ;
4834 XGI_GetLCDVCLKPtr( &di_0
, &di_1
, pVBInfo
) ;
4836 if ( pVBInfo
->VBType
& VB_XGI301
) /* shampoo 0129 */
4838 XGINew_SetReg1(pVBInfo
->Part4Port
, 0x0A , 0x10 ) ;
4839 XGINew_SetReg1(pVBInfo
->Part4Port
, 0x0B , di_1
) ;
4840 XGINew_SetReg1(pVBInfo
->Part4Port
, 0x0A , di_0
) ;
4843 { /* 301b/302b/301lv/302lv */
4844 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x0A , di_0
) ;
4845 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x0B , di_1
) ;
4848 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x00 , 0x12 ) ;
4850 if ( pVBInfo
->VBInfo
& SetCRT2ToRAMDAC
)
4851 XGINew_SetRegOR( pVBInfo
->Part4Port
, 0x12 , 0x28 ) ;
4853 XGINew_SetRegOR( pVBInfo
->Part4Port
, 0x12 , 0x08 ) ;
4857 /* --------------------------------------------------------------------- */
4858 /* Function : XGI_GETLCDVCLKPtr */
4860 /* Output : al -> VCLK Index */
4862 /* --------------------------------------------------------------------- */
4863 void XGI_GetLCDVCLKPtr( UCHAR
* di_0
, UCHAR
*di_1
, PVB_DEVICE_INFO pVBInfo
)
4867 if ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) )
4869 if ( pVBInfo
->IF_DEF_ScaleLCD
== 1 )
4871 if ( pVBInfo
->LCDInfo
& EnableScalingLCD
)
4875 /* index = XGI_GetLCDCapPtr(pVBInfo) ; */
4876 index
= XGI_GetLCDCapPtr1( pVBInfo
) ;
4878 if ( pVBInfo
->VBInfo
& SetCRT2ToLCD
)
4880 *di_0
= pVBInfo
->LCDCapList
[ index
].LCUCHAR_VCLKData1
;
4881 *di_1
= pVBInfo
->LCDCapList
[ index
].LCUCHAR_VCLKData2
;
4885 *di_0
= pVBInfo
->LCDCapList
[ index
].LCDA_VCLKData1
;
4886 *di_1
= pVBInfo
->LCDCapList
[ index
].LCDA_VCLKData2
;
4893 /* --------------------------------------------------------------------- */
4894 /* Function : XGI_GetVCLKPtr */
4898 /* --------------------------------------------------------------------- */
4899 UCHAR
XGI_GetVCLKPtr(USHORT RefreshRateTableIndex
,USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
4909 UCHAR
*CHTVVCLKPtr
= NULL
;
4911 if ( ModeNo
<= 0x13 )
4912 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
; /* si+St_ResInfo */
4914 modeflag
= pVBInfo
->EModeIDTable
[ModeIdIndex
].Ext_ModeFlag
; /* si+Ext_ResInfo */
4917 if ( ( pVBInfo
->SetFlag
& ProgrammingCRT2
) && ( !( pVBInfo
->LCDInfo
& EnableScalingLCD
) ) )
4919 index
= XGI_GetLCDCapPtr(pVBInfo
) ;
4920 tempal
= pVBInfo
->LCDCapList
[ index
].LCD_VCLK
;
4922 if ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) )
4926 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
4928 if(pVBInfo
->VBInfo
&SetCRT2ToHiVisionTV
)
4930 tempal
= HiTVVCLKDIV2
;
4931 if(!(pVBInfo
->TVInfo
& RPLLDIV2XO
))
4933 if(pVBInfo
->TVInfo
& TVSimuMode
)
4935 tempal
= HiTVSimuVCLK
;
4936 if(!(modeflag
& Charx8Dot
))
4937 tempal
= HiTVTextVCLK
;
4943 if ( pVBInfo
->TVInfo
& SetYPbPrMode750p
)
4945 tempal
= YPbPr750pVCLK
;
4949 if ( pVBInfo
->TVInfo
& SetYPbPrMode525p
)
4951 tempal
= YPbPr525pVCLK
;
4955 tempal
= NTSC1024VCLK
;
4957 if ( !( pVBInfo
->TVInfo
& NTSC1024x768
) )
4959 tempal
= TVVCLKDIV2
;
4960 if ( !( pVBInfo
->TVInfo
& RPLLDIV2XO
) )
4964 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
4968 if((pVBInfo->IF_DEF_CH7017==1)&&(pVBInfo->VBType&VB_CH7017))
4971 *tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
4973 *tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
4974 *tempal = *tempal & 0x1F;
4977 if(pVBInfo->TVInfo & SetPALTV)
4978 tempbx = tempbx + 2;
4979 if(pVBInfo->TVInfo & SetCHTVOverScan)
4981 tempbx = tempbx << 1;
4985 if((pVBInfo
->IF_DEF_CH7007
==1)&&(pVBInfo
->VBType
&VB_CH7007
)) /* [Billy] 07/05/08 CH7007 */
4987 /* VideoDebugPrint((0, "XGI_GetVCLKPtr: pVBInfo->IF_DEF_CH7007==1\n")); */
4988 if ( (pVBInfo
->VBInfo
& SetCRT2ToTV
) )
4990 if( ModeNo
<= 0x13 )
4992 tempal
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_CRT2CRTC
;
4996 tempal
= pVBInfo
->RefIndex
[RefreshRateTableIndex
].Ext_CRT2CRTC
;
4999 tempal
= tempal
& 0x0F;
5002 if(pVBInfo
->TVInfo
& SetPALTV
)
5004 tempbx
= tempbx
+ 2;
5006 if(pVBInfo
->TVInfo
& SetCHTVOverScan
)
5010 /** tempbx = tempbx << 1; CH7007 ? **/
5012 /*[Billy]07/05/29 CH7007*/
5013 if ( pVBInfo
->IF_DEF_CH7007
== 1 )
5018 CHTVVCLKPtr
= XGI7007_CHTVVCLKUNTSC
;
5021 CHTVVCLKPtr
= XGI7007_CHTVVCLKONTSC
;
5024 CHTVVCLKPtr
= XGI7007_CHTVVCLKUPAL
;
5027 CHTVVCLKPtr
= XGI7007_CHTVVCLKOPAL
;
5039 CHTVVCLKPtr = pVBInfo->CHTVVCLKUNTSC ;
5042 CHTVVCLKPtr = pVBInfo->CHTVVCLKONTSC ;
5045 CHTVVCLKPtr = pVBInfo->CHTVVCLKUPAL ;
5048 CHTVVCLKPtr = pVBInfo->CHTVVCLKOPAL ;
5055 tempal
= CHTVVCLKPtr
[ tempal
] ;
5061 tempal
= ( UCHAR
)XGINew_GetReg2( ( pVBInfo
->P3ca
+ 0x02 ) ) ;
5062 tempal
= tempal
>> 2 ;
5065 if ( ( pVBInfo
->LCDInfo
& EnableScalingLCD
) && ( modeflag
& Charx8Dot
) ) /* for Dot8 Scaling LCD */
5066 tempal
= tempal
^ tempal
; /* ; set to VCLK25MHz always */
5068 if ( ModeNo
<= 0x13 )
5071 tempal
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRTVCLK
;
5076 /* --------------------------------------------------------------------- */
5077 /* Function : XGI_GetVCLKLen */
5081 /* --------------------------------------------------------------------- */
5082 void XGI_GetVCLKLen(UCHAR tempal
,UCHAR
* di_0
,UCHAR
* di_1
, PVB_DEVICE_INFO pVBInfo
)
5084 if ( pVBInfo
->IF_DEF_CH7007
== 1 ) /* [Billy] 2007/05/16 */
5086 /* VideoDebugPrint((0, "XGI_GetVCLKLen: pVBInfo->IF_DEF_CH7007==1\n")); */
5087 *di_0
= ( UCHAR
)XGI_CH7007VCLKData
[ tempal
].SR2B
;
5088 *di_1
= ( UCHAR
)XGI_CH7007VCLKData
[ tempal
].SR2C
;
5090 else if ( pVBInfo
->VBType
& ( VB_XGI301
| VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
5092 if ( ( !( pVBInfo
->VBInfo
& SetCRT2ToLCDA
) ) && ( pVBInfo
->SetFlag
& ProgrammingCRT2
) )
5094 *di_0
= ( UCHAR
)XGI_VBVCLKData
[ tempal
].SR2B
;
5095 *di_1
= XGI_VBVCLKData
[ tempal
].SR2C
;
5100 *di_0
= XGI_VCLKData
[ tempal
].SR2B
;
5101 *di_1
= XGI_VCLKData
[ tempal
].SR2C
;
5106 /* --------------------------------------------------------------------- */
5107 /* Function : XGI_SetCRT2Offset */
5111 /* --------------------------------------------------------------------- */
5112 void XGI_SetCRT2Offset( USHORT ModeNo
,
5113 USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
5118 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
5123 offset
= XGI_GetOffset( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, HwDeviceExtension
, pVBInfo
) ;
5124 temp
= ( UCHAR
)( offset
& 0xFF ) ;
5125 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x07 , temp
) ;
5126 temp
=( UCHAR
)( ( offset
& 0xFF00 ) >> 8 ) ;
5127 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x09 , temp
) ;
5128 temp
=( UCHAR
)( ( ( offset
>> 3 ) & 0xFF ) + 1 ) ;
5129 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x03 , temp
) ;
5133 /* --------------------------------------------------------------------- */
5134 /* Function : XGI_GetOffset */
5138 /* --------------------------------------------------------------------- */
5139 USHORT
XGI_GetOffset(USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
,PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
)
5146 ColorDepth
[] = { 0x01 , 0x02 , 0x04 } ;
5148 modeinfo
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeInfo
;
5149 if ( ModeNo
<= 0x14 )
5152 infoflag
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_InfoFlag
;
5155 index
= ( modeinfo
>> 8 ) & 0xFF ;
5157 temp
= pVBInfo
->ScreenOffset
[ index
] ;
5159 if ( infoflag
& InterlaceMode
)
5164 colordepth
= XGI_GetColorDepth( ModeNo
, ModeIdIndex
, pVBInfo
) ;
5166 if ( ( ModeNo
>= 0x7C ) && ( ModeNo
<= 0x7E ) )
5168 temp
= ModeNo
- 0x7C ;
5169 colordepth
= ColorDepth
[ temp
] ;
5171 if ( infoflag
& InterlaceMode
)
5175 return( temp
* colordepth
) ;
5178 return( temp
* colordepth
) ;
5182 /* --------------------------------------------------------------------- */
5183 /* Function : XGI_SetCRT2FIFO */
5187 /* --------------------------------------------------------------------- */
5188 void XGI_SetCRT2FIFO( PVB_DEVICE_INFO pVBInfo
)
5190 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x01 , 0x3B ) ; /* threshold high ,disable auto threshold */
5191 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x02 , ~( 0x3F ) , 0x04 ) ; /* threshold low default 04h */
5195 /* --------------------------------------------------------------------- */
5196 /* Function : XGI_PreSetGroup1 */
5200 /* --------------------------------------------------------------------- */
5201 void XGI_PreSetGroup1(USHORT ModeNo
, USHORT ModeIdIndex
,PXGI_HW_DEVICE_INFO HwDeviceExtension
,
5202 USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
5208 if ( ModeNo
> 0x13 )
5210 CRT1Index
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT1CRTC
;
5211 CRT1Index
&= IndexMask
;
5212 resinfo
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_RESINFO
;
5215 XGI_SetCRT2Offset( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, HwDeviceExtension
, pVBInfo
) ;
5216 XGI_SetCRT2FIFO(pVBInfo
) ;
5217 /* XGI_SetCRT2Sync(ModeNo,RefreshRateTableIndex); */
5219 for( tempcx
= 4 ; tempcx
< 7 ; tempcx
++ )
5221 XGINew_SetReg1( pVBInfo
->Part1Port
, tempcx
, 0x0 ) ;
5224 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x50 , 0x00 ) ;
5225 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x02 , 0x44 ) ; /* temp 0206 */
5229 /* --------------------------------------------------------------------- */
5230 /* Function : XGI_SetGroup1 */
5234 /* --------------------------------------------------------------------- */
5235 void XGI_SetGroup1( USHORT ModeNo
, USHORT ModeIdIndex
,
5236 PXGI_HW_DEVICE_INFO HwDeviceExtension
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
5247 if ( ModeNo
> 0x13 )
5249 CRT1Index
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT1CRTC
;
5250 CRT1Index
&= IndexMask
;
5251 resinfo
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_RESINFO
;
5254 if ( ModeNo
<= 0x13 )
5256 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
;
5260 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
5263 /* bainy change table name */
5264 if ( modeflag
& HalfDCLK
)
5266 temp
= ( pVBInfo
->VGAHT
/ 2 - 1 ) & 0x0FF ; /* BTVGA2HT 0x08,0x09 */
5267 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x08 , temp
) ;
5268 temp
= ( ( ( pVBInfo
->VGAHT
/ 2 - 1 ) & 0xFF00 ) >> 8 ) << 4 ;
5269 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x09 , ~0x0F0 , temp
) ;
5270 temp
= ( pVBInfo
->VGAHDE
/ 2 + 16 ) & 0x0FF ; /* BTVGA2HDEE 0x0A,0x0C */
5271 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0A , temp
) ;
5272 tempcx
= ( ( pVBInfo
->VGAHT
- pVBInfo
->VGAHDE
) / 2 ) >> 2 ;
5273 pushbx
= pVBInfo
->VGAHDE
/ 2 + 16 ;
5274 tempcx
= tempcx
>> 1 ;
5275 tempbx
= pushbx
+ tempcx
; /* bx BTVGA@HRS 0x0B,0x0C */
5278 if ( pVBInfo
->VBInfo
& SetCRT2ToRAMDAC
)
5280 tempbx
= pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 4 ] ;
5281 tempbx
|= ( ( pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 14 ] & 0xC0 ) << 2 ) ;
5282 tempbx
= ( tempbx
- 3 ) << 3 ; /* (VGAHRS-3)*8 */
5283 tempcx
= pVBInfo
->XGINEWUB_CRT1Table
[CRT1Index
].CR
[ 5 ] ;
5285 temp
= pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 15 ] ;
5286 temp
= ( temp
& 0x04 ) << ( 5 - 2 ) ; /* VGAHRE D[5] */
5287 tempcx
= ( ( tempcx
| temp
) - 3 ) << 3 ; /* (VGAHRE-3)*8 */
5293 if ( tempcx
> ( pVBInfo
->VGAHT
/ 2 ) )
5294 tempcx
= pVBInfo
->VGAHT
/ 2 ;
5296 temp
= tempbx
& 0x00FF ;
5298 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0B , temp
) ;
5302 temp
= ( pVBInfo
->VGAHT
- 1 ) & 0x0FF ; /* BTVGA2HT 0x08,0x09 */
5303 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x08 , temp
) ;
5304 temp
= ( ( ( pVBInfo
->VGAHT
- 1 ) & 0xFF00 ) >> 8 ) << 4 ;
5305 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x09 , ~0x0F0 , temp
) ;
5306 temp
= ( pVBInfo
->VGAHDE
+ 16 ) & 0x0FF ; /* BTVGA2HDEE 0x0A,0x0C */
5307 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0A , temp
) ;
5308 tempcx
= ( pVBInfo
->VGAHT
- pVBInfo
->VGAHDE
) >> 2 ; /* cx */
5309 pushbx
= pVBInfo
->VGAHDE
+ 16 ;
5310 tempcx
= tempcx
>> 1 ;
5311 tempbx
= pushbx
+ tempcx
; /* bx BTVGA@HRS 0x0B,0x0C */
5314 if ( pVBInfo
->VBInfo
& SetCRT2ToRAMDAC
)
5316 tempbx
= pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 3 ] ;
5317 tempbx
|= ( ( pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 5 ] & 0xC0 ) << 2 ) ;
5318 tempbx
= ( tempbx
- 3 ) << 3 ; /* (VGAHRS-3)*8 */
5319 tempcx
= pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 4 ] ;
5321 temp
= pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 6 ] ;
5322 temp
= ( temp
& 0x04 ) << ( 5 - 2 ) ; /* VGAHRE D[5] */
5323 tempcx
= ( ( tempcx
| temp
) - 3 ) << 3 ; /* (VGAHRE-3)*8 */
5328 if ( tempcx
> pVBInfo
->VGAHT
)
5329 tempcx
= pVBInfo
->VGAHT
;
5331 temp
= tempbx
& 0x00FF ;
5332 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0B , temp
) ;
5335 tempax
= ( tempax
& 0x00FF ) | ( tempbx
& 0xFF00 ) ;
5337 tempbx
= ( tempbx
& 0x00FF ) | ( ( tempbx
& 0xFF00 ) << 4 ) ;
5338 tempax
|= ( tempbx
& 0xFF00 ) ;
5339 temp
= ( tempax
& 0xFF00 ) >> 8 ;
5340 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0C , temp
) ;
5341 temp
= tempcx
& 0x00FF ;
5342 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0D , temp
) ;
5343 tempcx
= ( pVBInfo
->VGAVT
- 1 ) ;
5344 temp
= tempcx
& 0x00FF ;
5346 if ( pVBInfo
->IF_DEF_CH7005
== 1 )
5348 if ( pVBInfo
->VBInfo
& 0x0C )
5354 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0E , temp
) ;
5355 tempbx
= pVBInfo
->VGAVDE
- 1 ;
5356 temp
= tempbx
& 0x00FF ;
5357 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0F , temp
) ;
5358 temp
= ( ( tempbx
& 0xFF00 ) << 3 ) >> 8 ;
5359 temp
|= ( ( tempcx
& 0xFF00 ) >> 8 ) ;
5360 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x12 , temp
) ;
5362 tempax
= pVBInfo
->VGAVDE
;
5363 tempbx
= pVBInfo
->VGAVDE
;
5364 tempcx
= pVBInfo
->VGAVT
;
5365 tempbx
= ( pVBInfo
->VGAVT
+ pVBInfo
->VGAVDE
) >> 1 ; /* BTVGA2VRS 0x10,0x11 */
5366 tempcx
= ( ( pVBInfo
->VGAVT
- pVBInfo
->VGAVDE
) >> 4 ) + tempbx
+ 1 ; /* BTVGA2VRE 0x11 */
5368 if ( pVBInfo
->VBInfo
& SetCRT2ToRAMDAC
)
5370 tempbx
= pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 10 ] ;
5371 temp
= pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 9 ] ;
5379 temp
= pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 14 ] ;
5384 temp
= pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 11 ] ;
5385 tempcx
= ( tempcx
& 0xFF00 ) | ( temp
& 0x00FF ) ;
5388 temp
= tempbx
& 0x00FF ;
5389 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x10 , temp
) ;
5390 temp
= ( ( tempbx
& 0xFF00 ) >> 8 ) << 4 ;
5391 temp
= ( ( tempcx
& 0x000F ) | ( temp
) ) ;
5392 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x11 , temp
) ;
5395 if ( modeflag
& DoubleScanMode
)
5398 if ( modeflag
& HalfDCLK
)
5401 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x2C , ~0x0C0 , tempax
) ;
5405 /* --------------------------------------------------------------------- */
5406 /* Function : XGI_SetLockRegs */
5410 /* --------------------------------------------------------------------- */
5411 void XGI_SetLockRegs( USHORT ModeNo
, USHORT ModeIdIndex
,
5412 PXGI_HW_DEVICE_INFO HwDeviceExtension
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
5424 if ( ModeNo
<= 0x13 )
5426 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
; /* si+St_ResInfo */
5427 resinfo
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ResInfo
;
5431 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
; /* si+Ext_ResInfo */
5432 resinfo
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_RESINFO
;
5433 CRT1Index
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT1CRTC
;
5434 CRT1Index
&= IndexMask
;
5437 if ( !( pVBInfo
->VBInfo
& SetInSlaveMode
) )
5442 temp
= 0xFF ; /* set MAX HT */
5443 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x03 , temp
) ;
5444 /* if ( modeflag & Charx8Dot ) tempcx = 0x08 ; */
5448 if ( pVBInfo
->VBType
& ( VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
5449 modeflag
|= Charx8Dot
;
5451 tempax
= pVBInfo
->VGAHDE
; /* 0x04 Horizontal Display End */
5453 if ( modeflag
& HalfDCLK
)
5454 tempax
= tempax
>> 1 ;
5456 tempax
= ( tempax
/ tempcx
) - 1 ;
5457 tempbx
|= ( ( tempax
& 0x00FF ) << 8 ) ;
5458 temp
= tempax
& 0x00FF ;
5459 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x04 , temp
) ;
5461 temp
= ( tempbx
& 0xFF00 ) >> 8 ;
5463 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
5465 if ( !( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) ) )
5468 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
5470 if ( pVBInfo
->VBType
& VB_XGI301LV
)
5472 if ( pVBInfo
->VBExtInfo
== VB_YPbPr1080i
)
5484 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x05 , temp
) ; /* 0x05 Horizontal Display Start */
5485 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x06 , 0x03 ) ; /* 0x06 Horizontal Blank end */
5487 if ( !( pVBInfo
->VBInfo
& DisableCRT2Display
) )
5488 { /* 030226 bainy */
5489 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
5490 tempax
= pVBInfo
->VGAHT
;
5492 tempax
= XGI_GetVGAHT2( pVBInfo
) ;
5495 if ( tempax
>= pVBInfo
->VGAHT
)
5497 tempax
= pVBInfo
->VGAHT
;
5500 if ( modeflag
& HalfDCLK
)
5502 tempax
= tempax
>> 1 ;
5505 tempax
= ( tempax
/ tempcx
) - 5 ;
5506 tempcx
= tempax
; /* 20030401 0x07 horizontal Retrace Start */
5507 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
5509 temp
= ( tempbx
& 0x00FF ) - 1 ;
5510 if ( !( modeflag
& HalfDCLK
) )
5513 if ( pVBInfo
->TVInfo
& TVSimuMode
)
5516 if ( ModeNo
> 0x13 )
5523 /* tempcx = tempbx & 0x00FF ; */
5524 tempbx
= ( tempbx
& 0xFF00 ) >> 8 ;
5525 tempcx
= ( tempcx
+ tempbx
) >> 1 ;
5526 temp
= ( tempcx
& 0x00FF ) + 2 ;
5528 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
5531 if ( !( modeflag
& HalfDCLK
) )
5533 if ( ( modeflag
& Charx8Dot
) )
5536 if ( pVBInfo
->VGAHDE
>= 800 )
5545 if ( !( modeflag
& HalfDCLK
) )
5548 if ( pVBInfo
->LCDResInfo
!= Panel1280x960
)
5550 if( pVBInfo
->VGAHDE
>= 800 )
5553 if ( pVBInfo
->ModeType
== ModeEGA
)
5555 if ( pVBInfo
->VGAVDE
== 1024 )
5558 if ( pVBInfo
->LCDResInfo
!= Panel1280x1024
)
5565 if ( pVBInfo
->VGAHDE
>= 1280 )
5567 if ( pVBInfo
->LCDResInfo
!= Panel1280x960
)
5569 if ( pVBInfo
->LCDInfo
& LCDNonExpanding
)
5581 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x07 , temp
) ; /* 0x07 Horizontal Retrace Start */
5582 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x08 , 0 ) ; /* 0x08 Horizontal Retrace End */
5584 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
5586 if ( pVBInfo
->TVInfo
& TVSimuMode
)
5588 if ( ( ModeNo
== 0x06 ) || ( ModeNo
== 0x10 ) || ( ModeNo
== 0x11 ) || ( ModeNo
== 0x13 ) || ( ModeNo
== 0x0F ) )
5590 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x07 , 0x5b ) ;
5591 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x08 , 0x03 ) ;
5594 if ( ( ModeNo
== 0x00 ) || ( ModeNo
== 0x01 ) )
5596 if ( pVBInfo
->TVInfo
& SetNTSCTV
)
5598 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x07 , 0x2A ) ;
5599 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x08 , 0x61 ) ;
5603 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x07 , 0x2A ) ;
5604 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x08 , 0x41 ) ;
5605 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0C , 0xF0 ) ;
5609 if ( ( ModeNo
== 0x02 ) || ( ModeNo
== 0x03 ) || ( ModeNo
== 0x07 ) )
5611 if ( pVBInfo
->TVInfo
& SetNTSCTV
)
5613 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x07 , 0x54 ) ;
5614 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x08 , 0x00 ) ;
5618 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x07 , 0x55 ) ;
5619 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x08 , 0x00 ) ;
5620 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0C , 0xF0 ) ;
5624 if ( ( ModeNo
== 0x04 ) || ( ModeNo
== 0x05 ) || ( ModeNo
== 0x0D ) || ( ModeNo
== 0x50 ) )
5626 if ( pVBInfo
->TVInfo
& SetNTSCTV
)
5628 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x07 , 0x30 ) ;
5629 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x08 , 0x03 ) ;
5633 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x07 , 0x2f ) ;
5634 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x08 , 0x02 ) ;
5640 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x18 , 0x03 ) ; /* 0x18 SR0B */
5641 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x19 , 0xF0 , 0x00 ) ;
5642 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x09 , 0xFF ) ; /* 0x09 Set Max VT */
5644 tempbx
= pVBInfo
->VGAVT
;
5647 tempbx
= pVBInfo
->VGAVDE
; /* 0x0E Virtical Display End */
5649 if ( tempbx
== 357 )
5651 if ( tempbx
== 360 )
5653 if ( tempbx
== 375 )
5655 if ( tempbx
== 405 )
5657 if ( tempbx
== 525 )
5662 if ( pVBInfo
->VBInfo
& SetCRT2ToLCD
)
5664 if ( pVBInfo
->LCDResInfo
== Panel1024x768
)
5666 if ( !( pVBInfo
->LCDInfo
& LCDVESATiming
) )
5668 if ( tempbx
== 350 )
5670 if ( tempbx
== 480 )
5676 temp
= tempbx
& 0x00FF ;
5678 temp
= tempbx
& 0x00FF ;
5679 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x10 ,temp
) ; /* 0x10 vertical Blank Start */
5682 temp
= tempbx
& 0x00FF ;
5683 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0E , temp
) ;
5685 if ( tempbx
& 0x0100 )
5692 if ( modeflag
& DoubleScanMode
)
5697 if ( tempbx
& 0x0200 )
5702 temp
= ( tempax
& 0xFF00 ) >> 8 ;
5703 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0B , temp
) ;
5705 if ( tempbx
& 0x0400 )
5710 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x11 , 0x00 ) ; /* 0x11 Vertival Blank End */
5713 tempax
-= tempbx
; /* 0x0C Vertical Retrace Start */
5714 tempax
= tempax
>> 2 ;
5715 push1
= tempax
; /* push ax */
5717 if ( resinfo
!= 0x09 )
5719 tempax
= tempax
<< 1 ;
5723 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
5725 if ( pVBInfo
->VBType
& VB_XGI301LV
)
5727 if ( pVBInfo
->TVInfo
& SetYPbPrMode1080i
)
5731 if ( pVBInfo
->TVInfo
& TVSimuMode
)
5733 if ( pVBInfo
->TVInfo
& SetPALTV
)
5735 if ( pVBInfo
->VBType
& VB_XGI301LV
)
5737 if ( !( pVBInfo
->TVInfo
& ( SetYPbPrMode525p
| SetYPbPrMode750p
| SetYPbPrMode1080i
) ) )
5751 if ( pVBInfo
->TVInfo
& TVSimuMode
)
5753 if ( pVBInfo
->TVInfo
& SetPALTV
)
5755 if ( pVBInfo
->VBType
& VB_XGI301LV
)
5757 if ( !( pVBInfo
->TVInfo
& ( SetYPbPrMode525p
| SetYPbPrMode750p
| SetYPbPrMode1080i
) ) )
5766 tempax
= tempax
>> 2 ;
5769 push1
= tempax
; /* push ax */
5771 if ( ( pVBInfo
->TVInfo
& SetPALTV
) )
5773 if ( tempbx
<= 513 )
5775 if ( tempax
>= 513 )
5782 temp
= tempbx
& 0x00FF ;
5783 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0C , temp
) ;
5785 temp
= tempbx
& 0x00FF ;
5786 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x10 , temp
) ;
5788 if ( tempbx
& 0x0100 )
5793 if ( tempbx
& 0x0200 )
5795 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x0B , 0x0FF , 0x20 ) ;
5800 if ( tempbx
& 0x0100 )
5805 if ( tempbx
& 0x0200 )
5810 if ( tempbx
& 0x0400 )
5815 tempbx
= push1
; /* pop ax */
5816 temp
= tempbx
& 0x00FF ;
5818 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0D , temp
) ; /* 0x0D vertical Retrace End */
5820 if ( tempbx
& 0x0010 )
5825 temp
= tempcx
& 0x00FF ;
5826 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0A , temp
) ; /* 0x0A CR07 */
5827 temp
= ( tempcx
& 0x0FF00 ) >> 8 ;
5828 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x17 , temp
) ; /* 0x17 SR0A */
5830 temp
= ( tempax
& 0xFF00 ) >> 8 ;
5832 temp
= ( temp
>> 1 ) & 0x09 ;
5834 if ( pVBInfo
->VBType
& ( VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
5837 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x16 , temp
) ; /* 0x16 SR01 */
5838 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x0F , 0 ) ; /* 0x0F CR14 */
5839 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x12 , 0 ) ; /* 0x12 CR17 */
5841 if ( pVBInfo
->LCDInfo
& LCDRGB18Bit
)
5846 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x1A , temp
) ; /* 0x1A SR0E */
5852 /* --------------------------------------------------------------------- */
5853 /* Function : XGI_SetGroup2 */
5857 /* --------------------------------------------------------------------- */
5858 void XGI_SetGroup2( USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
,
5859 PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
5872 UCHAR
*TimingPoint
;
5880 if ( ModeNo
<= 0x13 )
5882 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
; /* si+St_ResInfo */
5883 resinfo
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ResInfo
;
5884 crt2crtc
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_CRT2CRTC
;
5888 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
; /* si+Ext_ResInfo */
5889 resinfo
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_RESINFO
;
5890 crt2crtc
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT2CRTC
;
5895 if ( !( pVBInfo
->VBInfo
& SetCRT2ToAVIDEO
) )
5898 if ( !( pVBInfo
->VBInfo
& SetCRT2ToSVIDEO
) )
5901 if ( pVBInfo
->VBInfo
& SetCRT2ToSCART
)
5904 if ( !( pVBInfo
->TVInfo
& SetPALTV
) )
5907 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
5910 if ( pVBInfo
->TVInfo
& ( SetYPbPrMode525p
| SetYPbPrMode750p
) )
5913 tempax
= ( tempax
& 0xff00 ) >> 8 ;
5915 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x0 , tempax
) ;
5916 TimingPoint
= pVBInfo
->NTSCTiming
;
5918 if ( pVBInfo
->TVInfo
& SetPALTV
)
5920 TimingPoint
= pVBInfo
->PALTiming
;
5923 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
5925 TimingPoint
= pVBInfo
->HiTVExtTiming
;
5927 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
5928 TimingPoint
= pVBInfo
->HiTVSt2Timing
;
5930 if ( pVBInfo
->SetFlag
& TVSimuMode
)
5931 TimingPoint
= pVBInfo
->HiTVSt1Timing
;
5933 if ( !(modeflag
& Charx8Dot
) )
5934 TimingPoint
= pVBInfo
->HiTVTextTiming
;
5937 if ( pVBInfo
->VBInfo
& SetCRT2ToYPbPr
)
5939 if ( pVBInfo
->TVInfo
& SetYPbPrMode525i
)
5940 TimingPoint
= pVBInfo
->YPbPr525iTiming
;
5942 if ( pVBInfo
->TVInfo
& SetYPbPrMode525p
)
5943 TimingPoint
= pVBInfo
->YPbPr525pTiming
;
5945 if ( pVBInfo
->TVInfo
& SetYPbPrMode750p
)
5946 TimingPoint
= pVBInfo
->YPbPr750pTiming
;
5949 for( i
= 0x01 , j
= 0 ; i
<= 0x2D ; i
++ , j
++ )
5951 XGINew_SetReg1( pVBInfo
->Part2Port
, i
, TimingPoint
[ j
] ) ;
5954 for( i
= 0x39 ; i
<= 0x45 ; i
++ , j
++ )
5956 XGINew_SetReg1( pVBInfo
->Part2Port
, i
, TimingPoint
[ j
] ) ; /* di->temp2[j] */
5959 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
5961 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x3A , 0x1F , 0x00 ) ;
5964 temp
= pVBInfo
->NewFlickerMode
;
5966 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x0A , 0xFF , temp
) ;
5968 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
5971 if ( pVBInfo
->TVInfo
& SetPALTV
)
5976 if ( pVBInfo
->VDE
<= tempax
)
5978 tempax
-= pVBInfo
->VDE
;
5979 tempax
= tempax
>> 2 ;
5980 tempax
= ( tempax
& 0x00FF ) | ( ( tempax
& 0x00FF ) << 8 ) ;
5982 temp
= ( tempax
& 0xFF00 ) >> 8 ;
5983 temp
+= ( USHORT
)TimingPoint
[ 0 ] ;
5985 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
5987 if ( pVBInfo
->VBInfo
& ( SetCRT2ToAVIDEO
| SetCRT2ToSVIDEO
| SetCRT2ToSCART
| SetCRT2ToYPbPr
) )
5989 tempcx
=pVBInfo
->VGAHDE
;
5990 if ( tempcx
>= 1024 )
5992 temp
= 0x17 ; /* NTSC */
5993 if ( pVBInfo
->TVInfo
& SetPALTV
)
5994 temp
= 0x19 ; /* PAL */
5999 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x01 , temp
) ;
6001 temp
= ( tempax
& 0xFF00 ) >> 8 ;
6002 temp
+= TimingPoint
[ 1 ] ;
6004 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
6006 if ( ( pVBInfo
->VBInfo
& ( SetCRT2ToAVIDEO
| SetCRT2ToSVIDEO
| SetCRT2ToSCART
| SetCRT2ToYPbPr
) ) )
6008 tempcx
= pVBInfo
->VGAHDE
;
6009 if ( tempcx
>= 1024 )
6011 temp
= 0x1D ; /* NTSC */
6012 if ( pVBInfo
->TVInfo
& SetPALTV
)
6013 temp
= 0x52 ; /* PAL */
6017 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x02 , temp
) ;
6021 tempcx
= pVBInfo
->HT
;
6023 if ( XGI_IsLCDDualLink( pVBInfo
) )
6024 tempcx
= tempcx
>> 1 ;
6027 temp
= tempcx
& 0x00FF ;
6028 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x1B , temp
) ;
6030 temp
= ( tempcx
& 0xFF00 ) >> 8 ;
6031 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x1D , ~0x0F , temp
) ;
6033 tempcx
= pVBInfo
->HT
>> 1 ;
6034 push1
= tempcx
; /* push cx */
6037 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
6042 temp
= tempcx
& 0x00FF ;
6044 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x22 , 0x0F , temp
) ;
6046 tempbx
= TimingPoint
[ j
] | ( ( TimingPoint
[ j
+ 1 ] ) << 8 ) ;
6049 temp
= tempbx
& 0x00FF ;
6050 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x24 , temp
) ;
6051 temp
= ( tempbx
& 0xFF00 ) >> 8 ;
6053 XGINew_SetRegANDOR(pVBInfo
->Part2Port
,0x25,0x0F,temp
);
6057 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
6063 temp
= ( tempbx
& 0x00FF ) << 4 ;
6064 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x29 , 0x0F , temp
) ;
6067 tempcx
+= ( TimingPoint
[ j
] | ( ( TimingPoint
[ j
+ 1 ] ) << 8 ) ) ;
6068 temp
= tempcx
& 0x00FF ;
6069 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x27 , temp
) ;
6070 temp
= ( ( tempcx
& 0xFF00 ) >> 8 ) << 4 ;
6071 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x28 , 0x0F , temp
) ;
6074 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
6079 temp
= tempcx
& 0xFF ;
6081 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x2A , 0x0F , temp
) ;
6083 tempcx
= push1
; /* pop cx */
6085 temp
= TimingPoint
[ j
] | ( ( TimingPoint
[ j
+ 1 ] ) << 8 ) ;
6087 temp
= tempcx
& 0x00FF ;
6089 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x2D , 0x0F ,temp
) ;
6093 if ( !( pVBInfo
->VBInfo
& SetCRT2ToTV
) )
6095 tempax
= XGI_GetVGAHT2( pVBInfo
) ;
6096 tempcx
= tempax
- 1 ;
6098 temp
= tempcx
& 0x00FF ;
6099 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x2E , temp
) ;
6101 tempbx
= pVBInfo
->VDE
;
6103 if ( pVBInfo
->VGAVDE
== 360 )
6105 if ( pVBInfo
->VGAVDE
== 375 )
6107 if ( pVBInfo
->VGAVDE
== 405 )
6110 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
6112 if ( pVBInfo
->VBType
& ( VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
6114 if ( !( pVBInfo
->TVInfo
& ( SetYPbPrMode525p
| SetYPbPrMode750p
) ) )
6115 tempbx
= tempbx
>> 1 ;
6118 tempbx
= tempbx
>> 1 ;
6122 temp
= tempbx
& 0x00FF ;
6124 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
6126 if ( pVBInfo
->VBType
& VB_XGI301LV
)
6128 if ( pVBInfo
->TVInfo
& SetYPbPrMode1080i
)
6130 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
6132 if ( ModeNo
== 0x2f )
6139 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
6141 if ( ModeNo
== 0x2f )
6147 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x2F , temp
) ;
6149 temp
= ( tempcx
& 0xFF00 ) >> 8 ;
6150 temp
|= ( ( tempbx
& 0xFF00 ) >> 8 ) << 6 ;
6152 if ( !( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
) )
6154 if ( pVBInfo
->VBType
& VB_XGI301LV
)
6156 if ( pVBInfo
->TVInfo
& SetYPbPrMode1080i
)
6160 if ( !( pVBInfo
->VBInfo
& SetCRT2ToSVIDEO
) )
6167 if ( !( pVBInfo
->VBInfo
& SetCRT2ToSVIDEO
) )
6172 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x30 , temp
) ;
6174 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) ) /* TV gatingno */
6176 tempbx
= pVBInfo
->VDE
;
6177 tempcx
= tempbx
- 2 ;
6179 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
6181 if ( !( pVBInfo
->TVInfo
& ( SetYPbPrMode525p
| SetYPbPrMode750p
) ) )
6182 tempbx
= tempbx
>> 1 ;
6185 if ( pVBInfo
->VBType
& ( VB_XGI302LV
| VB_XGI301C
) )
6188 if( tempcx
& 0x0400 )
6191 if ( tempbx
& 0x0400 )
6194 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x10 , temp
) ;
6197 temp
= ( ( ( tempbx
- 3 ) & 0x0300 ) >> 8 ) << 5 ;
6198 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x46 , temp
) ;
6199 temp
= ( tempbx
- 3 ) & 0x00FF ;
6200 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x47 , temp
) ;
6203 tempbx
= tempbx
& 0x00FF ;
6205 if ( !( modeflag
& HalfDCLK
) )
6207 tempcx
= pVBInfo
->VGAHDE
;
6208 if ( tempcx
>= pVBInfo
->HDE
)
6217 if( pVBInfo
->VBInfo
& SetCRT2ToTV
) { /*301b*/
6218 if(pVBInfo
->VGAHDE
>=1024)
6221 if(pVBInfo
->VGAHDE
>=1280)
6224 tempbx
=tempbx
&0xDFFF;
6229 if ( !( tempbx
& 0x2000 ) )
6231 if ( modeflag
& HalfDCLK
)
6233 tempcx
= ( tempcx
& 0xFF00 ) | ( ( tempcx
& 0x00FF ) << 1 ) ;
6237 tempeax
= pVBInfo
->VGAHDE
;
6238 tempebx
= ( tempcx
& 0xFF00 ) >> 8 ;
6239 longtemp
= tempeax
* tempebx
;
6240 tempecx
= tempcx
& 0x00FF ;
6241 longtemp
= longtemp
/ tempecx
;
6244 tempecx
= 8 * 1024 ;
6246 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
6248 tempecx
= tempecx
* 8 ;
6251 longtemp
= longtemp
* tempecx
;
6252 tempecx
= pVBInfo
->HDE
;
6253 temp2
= longtemp
% tempecx
;
6254 tempeax
= longtemp
/ tempecx
;
6260 tempax
= ( USHORT
)tempeax
;
6263 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
6265 tempcx
= ( ( tempax
& 0xFF00 ) >> 5 ) >> 8 ;
6270 tempbx
=( USHORT
)( ( ( tempeax
& 0x0000FF00 ) & 0x1F00 ) | ( tempbx
& 0x00FF ) ) ;
6271 tempax
=( USHORT
)( ( ( tempeax
& 0x000000FF ) << 8 ) | ( tempax
& 0x00FF ) ) ;
6272 temp
= ( tempax
& 0xFF00 ) >> 8 ;
6276 temp
= ( tempax
& 0x00FF ) >> 8 ;
6279 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x44 , temp
) ;
6280 temp
= ( tempbx
& 0xFF00 ) >> 8 ;
6281 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x45 , ~0x03F , temp
) ;
6282 temp
= tempcx
& 0x00FF ;
6284 if ( tempbx
& 0x2000 )
6287 if ( !( pVBInfo
->VBInfo
& SetCRT2ToLCD
) )
6290 XGINew_SetRegANDOR(pVBInfo
->Part2Port
,0x46,~0x1F,temp
);
6291 if ( pVBInfo
->TVInfo
& SetPALTV
)
6302 temp
= tempbx
& 0x00FF ;
6303 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x4b , temp
) ;
6304 temp
= tempcx
& 0x00FF ;
6305 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x4c , temp
) ;
6307 temp
= ( ( tempcx
& 0xFF00 ) >> 8 ) & 0x03 ;
6309 temp
|= ( ( tempbx
& 0xFF00 ) >> 8 ) & 0x03 ;
6311 if ( pVBInfo
->VBInfo
& SetCRT2ToYPbPr
)
6315 if ( pVBInfo
->TVInfo
& SetYPbPrMode525p
)
6318 if ( pVBInfo
->TVInfo
& SetYPbPrMode750p
)
6322 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x4d , temp
) ;
6323 temp
=XGINew_GetReg1( pVBInfo
->Part2Port
, 0x43 ) ; /* 301b change */
6324 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x43 , ( USHORT
)( temp
- 3 ) ) ;
6326 if ( !( pVBInfo
->TVInfo
& ( SetYPbPrMode525p
| SetYPbPrMode750p
) ) )
6328 if ( pVBInfo
->TVInfo
& NTSC1024x768
)
6330 TimingPoint
= XGI_NTSC1024AdjTime
;
6331 for( i
= 0x1c , j
= 0 ; i
<= 0x30 ; i
++ , j
++ )
6333 XGINew_SetReg1( pVBInfo
->Part2Port
, i
, TimingPoint
[ j
] ) ;
6335 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x43 , 0x72 ) ;
6339 /* [ycchen] 01/14/03 Modify for 301C PALM Support */
6340 if ( pVBInfo
->VBType
& VB_XGI301C
)
6342 if ( pVBInfo
->TVInfo
& SetPALMTV
)
6343 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x4E , ~0x08 , 0x08 ) ; /* PALM Mode */
6346 if ( pVBInfo
->TVInfo
& SetPALMTV
)
6348 tempax
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->Part2Port
, 0x01 ) ;
6350 XGINew_SetRegAND( pVBInfo
->Part2Port
, 0x01 , tempax
) ;
6352 /* if ( !( pVBInfo->VBType & VB_XGI301C ) ) */
6353 XGINew_SetRegAND( pVBInfo
->Part2Port
, 0x00 , 0xEF ) ;
6356 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
6358 if ( !( pVBInfo
->VBInfo
& SetInSlaveMode
) )
6360 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x0B , 0x00 ) ;
6364 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
6371 /* --------------------------------------------------------------------- */
6372 /* Function : XGI_SetLCDRegs */
6376 /* --------------------------------------------------------------------- */
6377 void XGI_SetLCDRegs(USHORT ModeNo
,USHORT ModeIdIndex
, PXGI_HW_DEVICE_INFO HwDeviceExtension
,USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
6393 XGI_LCDDesStruct
*LCDBDesPtr
= NULL
;
6396 if ( ModeNo
<= 0x13 )
6398 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
; /* si+St_ResInfo */
6399 resinfo
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ResInfo
;
6403 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
; /* si+Ext_ResInfo */
6404 resinfo
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_RESINFO
;
6405 CRT1Index
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT1CRTC
;
6406 CRT1Index
&= IndexMask
;
6409 if ( !( pVBInfo
->VBInfo
& SetCRT2ToLCD
) )
6414 tempbx
= pVBInfo
->HDE
; /* RHACTE=HDE-1 */
6416 if ( XGI_IsLCDDualLink( pVBInfo
) )
6417 tempbx
= tempbx
>> 1 ;
6420 temp
= tempbx
& 0x00FF ;
6421 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x2C , temp
) ;
6422 temp
= ( tempbx
& 0xFF00 ) >> 8 ;
6424 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x2B , 0x0F , temp
) ;
6427 if ( pVBInfo
->LCDResInfo
== Panel1280x1024
)
6429 if ( pVBInfo
->ModeType
== ModeEGA
)
6431 if ( pVBInfo
->VGAHDE
>= 1024 )
6434 if ( pVBInfo
->LCDInfo
& LCDVESATiming
)
6440 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x0B , temp
) ;
6441 tempbx
= pVBInfo
->VDE
; /* RTVACTEO=(VDE-1)&0xFF */
6444 temp
= tempbx
& 0x00FF ;
6445 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x03 , temp
) ;
6446 temp
= ( ( tempbx
& 0xFF00 ) >> 8 ) & 0x07 ;
6447 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x0C , ~0x07 , temp
) ;
6449 tempcx
= pVBInfo
->VT
- 1 ;
6450 push2
= tempcx
+ 1 ;
6451 temp
= tempcx
& 0x00FF ; /* RVTVT=VT-1 */
6452 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x19 , temp
) ;
6453 temp
= ( tempcx
& 0xFF00 ) >> 8 ;
6455 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x1A , temp
) ;
6456 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x09 , 0xF0 , 0x00 ) ;
6457 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x0A , 0xF0 , 0x00 ) ;
6458 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x17 , 0xFB , 0x00 ) ;
6459 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x18 , 0xDF , 0x00 ) ;
6461 /* Customized LCDB Des no add */
6463 LCDBDesPtr
= ( XGI_LCDDesStruct
* )XGI_GetLcdPtr( tempbx
, ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
6464 tempah
= pVBInfo
->LCDResInfo
;
6465 tempah
&= PanelResInfo
;
6467 if ( ( tempah
== Panel1024x768
) || ( tempah
== Panel1024x768x75
) )
6472 else if ( ( tempah
== Panel1280x1024
) || ( tempah
== Panel1280x1024x75
) )
6477 else if ( tempah
== Panel1400x1050
)
6488 if ( pVBInfo
->LCDInfo
& EnableScalingLCD
)
6490 tempbx
= pVBInfo
->HDE
;
6491 tempcx
= pVBInfo
->VDE
;
6495 tempax
= pVBInfo
->VT
;
6496 pVBInfo
->LCDHDES
= LCDBDesPtr
->LCDHDES
;
6497 pVBInfo
->LCDHRS
= LCDBDesPtr
->LCDHRS
;
6498 pVBInfo
->LCDVDES
= LCDBDesPtr
->LCDVDES
;
6499 pVBInfo
->LCDVRS
= LCDBDesPtr
->LCDVRS
;
6500 tempbx
= pVBInfo
->LCDVDES
;
6503 if ( tempcx
>= tempax
)
6504 tempcx
-= tempax
; /* lcdvdes */
6506 temp
= tempbx
& 0x00FF ; /* RVEQ1EQ=lcdvdes */
6507 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x05 , temp
) ;
6508 temp
= tempcx
& 0x00FF ;
6509 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x06 , temp
) ;
6510 tempch
= ( ( tempcx
& 0xFF00 ) >> 8 ) & 0x07 ;
6511 tempbh
= ( ( tempbx
& 0xFF00 ) >> 8 ) & 0x07 ;
6513 tempah
= tempah
<< 3 ;
6515 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x02 , tempah
) ;
6518 XGI_GetLCDSync( &tempax
, &tempbx
,pVBInfo
) ;
6520 tempax
= pVBInfo
->VT
;
6521 tempbx
= pVBInfo
->LCDVRS
;
6523 /* if ( SetLCD_Info & EnableScalingLCD ) */
6525 if ( tempcx
>= tempax
)
6528 temp
= tempbx
& 0x00FF ; /* RTVACTEE=lcdvrs */
6529 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x04 , temp
) ;
6530 temp
= ( tempbx
& 0xFF00 ) >> 8 ;
6532 temp
|= ( tempcx
& 0x000F ) ;
6533 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x01 , temp
) ;
6535 tempax
= pVBInfo
->HT
;
6536 tempbx
= pVBInfo
->LCDHDES
;
6539 if ( XGI_IsLCDDualLink( pVBInfo
) )
6541 tempax
= tempax
>> 1 ;
6542 tempbx
= tempbx
>> 1 ;
6543 tempcx
= tempcx
>> 1 ;
6546 if ( pVBInfo
->VBType
& VB_XGI302LV
)
6549 if ( pVBInfo
->VBType
& VB_XGI301C
) /* tap4 */
6554 if ( tempcx
>= tempax
)
6557 temp
= tempbx
& 0x00FF ;
6558 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x1F , temp
) ; /* RHBLKE=lcdhdes */
6559 temp
= ( ( tempbx
& 0xFF00 ) >> 8 ) << 4 ;
6560 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x20 , temp
) ;
6561 temp
= tempcx
& 0x00FF ;
6562 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x23 , temp
) ; /* RHEQPLE=lcdhdee */
6563 temp
= ( tempcx
& 0xFF00 ) >> 8 ;
6564 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x25 , temp
) ;
6567 XGI_GetLCDSync( &tempax
, &tempbx
,pVBInfo
) ;
6569 tempax
= pVBInfo
->HT
;
6570 tempbx
= pVBInfo
->LCDHRS
;
6571 /* if ( SetLCD_Info & EnableScalingLCD) */
6572 if ( XGI_IsLCDDualLink( pVBInfo
) )
6574 tempax
= tempax
>> 1 ;
6575 tempbx
= tempbx
>> 1 ;
6576 tempcx
= tempcx
>> 1 ;
6579 if ( pVBInfo
->VBType
& VB_XGI302LV
)
6584 if ( tempcx
>= tempax
)
6587 temp
= tempbx
& 0x00FF ; /* RHBURSTS=lcdhrs */
6588 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x1C , temp
) ;
6590 temp
= ( tempbx
& 0xFF00 ) >> 8 ;
6592 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x1D , ~0x0F0 , temp
) ;
6593 temp
= tempcx
& 0x00FF ; /* RHSYEXP2S=lcdhre */
6594 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x21 , temp
) ;
6596 if ( !( pVBInfo
->LCDInfo
& LCDVESATiming
) )
6598 if ( pVBInfo
->VGAVDE
== 525 )
6600 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
6607 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x2f , temp
) ;
6608 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x30 , 0xB3 ) ;
6611 if ( pVBInfo
->VGAVDE
== 420 )
6613 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
6619 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x2f , temp
) ;
6625 /* --------------------------------------------------------------------- */
6626 /* Function : XGI_GetTap4Ptr */
6628 /* Output : di -> Tap4 Reg. Setting Pointer */
6630 /* --------------------------------------------------------------------- */
6631 XGI301C_Tap4TimingStruct
* XGI_GetTap4Ptr(USHORT tempcx
, PVB_DEVICE_INFO pVBInfo
)
6637 XGI301C_Tap4TimingStruct
*Tap4TimingPtr
;
6641 tempax
= pVBInfo
->VGAHDE
;
6642 tempbx
= pVBInfo
->HDE
;
6646 tempax
= pVBInfo
->VGAVDE
;
6647 tempbx
= pVBInfo
->VDE
;
6650 if ( tempax
< tempbx
)
6651 return &EnlargeTap4Timing
[ 0 ] ;
6652 else if( tempax
== tempbx
)
6653 return &NoScaleTap4Timing
[ 0 ] ; /* 1:1 */
6655 Tap4TimingPtr
= NTSCTap4Timing
; /* NTSC */
6657 if ( pVBInfo
->TVInfo
& SetPALTV
)
6658 Tap4TimingPtr
= PALTap4Timing
;
6661 if ( pVBInfo
->VBInfo
& SetCRT2ToYPbPr
)
6663 if ( pVBInfo
->TVInfo
& SetYPbPrMode525i
)
6664 Tap4TimingPtr
= YPbPr525iTap4Timing
;
6665 if ( pVBInfo
->TVInfo
& SetYPbPrMode525p
)
6666 Tap4TimingPtr
= YPbPr525pTap4Timing
;
6667 if ( pVBInfo
->TVInfo
& SetYPbPrMode750p
)
6668 Tap4TimingPtr
= YPbPr750pTap4Timing
;
6671 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
6672 Tap4TimingPtr
= HiTVTap4Timing
;
6675 while( Tap4TimingPtr
[ i
].DE
!= 0xFFFF )
6677 if ( Tap4TimingPtr
[ i
].DE
== tempax
)
6681 return &Tap4TimingPtr
[ i
] ;
6685 /* --------------------------------------------------------------------- */
6686 /* Function : XGI_SetTap4Regs */
6690 /* --------------------------------------------------------------------- */
6691 void XGI_SetTap4Regs( PVB_DEVICE_INFO pVBInfo
)
6696 XGI301C_Tap4TimingStruct
*Tap4TimingPtr
;
6698 if ( !( pVBInfo
->VBType
& VB_XGI301C
) )
6702 XGINew_SetRegAND( pVBInfo
->Part2Port
, 0x4E , 0xEB ) ; /* Disable Tap4 */
6703 #else /* Tap4 Setting */
6705 Tap4TimingPtr
= XGI_GetTap4Ptr( 0 , pVBInfo
) ; /* Set Horizontal Scaling */
6706 for( i
= 0x80 , j
= 0 ; i
<= 0xBF ; i
++ , j
++ )
6707 XGINew_SetReg1( pVBInfo
->Part2Port
, i
, Tap4TimingPtr
->Reg
[ j
] ) ;
6709 if ( ( pVBInfo
->VBInfo
& SetCRT2ToTV
) && ( !( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
) ) )
6711 Tap4TimingPtr
= XGI_GetTap4Ptr( 1 , pVBInfo
); /* Set Vertical Scaling */
6712 for( i
= 0xC0 , j
= 0 ; i
< 0xFF ; i
++ , j
++ )
6713 XGINew_SetReg1( pVBInfo
->Part2Port
, i
, Tap4TimingPtr
->Reg
[ j
] ) ;
6716 if ( ( pVBInfo
->VBInfo
& SetCRT2ToTV
) && ( !( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
) ) )
6717 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x4E , ~0x14 , 0x04 ) ; /* Enable V.Scaling */
6719 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x4E , ~0x14 , 0x10 ) ; /* Enable H.Scaling */
6723 /* --------------------------------------------------------------------- */
6724 /* Function : XGI_SetGroup3 */
6728 /* --------------------------------------------------------------------- */
6729 void XGI_SetGroup3(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
6737 modeflag
= pVBInfo
->SModeIDTable
[ModeIdIndex
].St_ModeFlag
; /* si+St_ResInfo */
6741 modeflag
= pVBInfo
->EModeIDTable
[ModeIdIndex
].Ext_ModeFlag
; /* si+Ext_ResInfo */
6745 XGINew_SetReg1(pVBInfo
->Part3Port
,0x00,0x00);
6746 if(pVBInfo
->TVInfo
&SetPALTV
)
6748 XGINew_SetReg1(pVBInfo
->Part3Port
,0x13,0xFA);
6749 XGINew_SetReg1(pVBInfo
->Part3Port
,0x14,0xC8);
6753 XGINew_SetReg1(pVBInfo
->Part3Port
,0x13,0xF5);
6754 XGINew_SetReg1(pVBInfo
->Part3Port
,0x14,0xB7);
6757 if(!(pVBInfo
->VBInfo
&SetCRT2ToTV
))
6762 if(pVBInfo
->TVInfo
&SetPALMTV
)
6764 XGINew_SetReg1(pVBInfo
->Part3Port
,0x13,0xFA);
6765 XGINew_SetReg1(pVBInfo
->Part3Port
,0x14,0xC8);
6766 XGINew_SetReg1(pVBInfo
->Part3Port
,0x3D,0xA8);
6769 if((pVBInfo
->VBInfo
&SetCRT2ToHiVisionTV
)|| (pVBInfo
->VBInfo
&SetCRT2ToYPbPr
))
6771 if(pVBInfo
->TVInfo
& SetYPbPrMode525i
)
6775 tempdi
=pVBInfo
->HiTVGroup3Data
;
6776 if(pVBInfo
->SetFlag
&TVSimuMode
)
6778 tempdi
=pVBInfo
->HiTVGroup3Simu
;
6779 if(!(modeflag
&Charx8Dot
))
6781 tempdi
=pVBInfo
->HiTVGroup3Text
;
6785 if(pVBInfo
->TVInfo
& SetYPbPrMode525p
)
6787 tempdi
=pVBInfo
->Ren525pGroup3
;
6789 if(pVBInfo
->TVInfo
& SetYPbPrMode750p
)
6791 tempdi
=pVBInfo
->Ren750pGroup3
;
6794 for(i
=0;i
<=0x3E;i
++)
6796 XGINew_SetReg1(pVBInfo
->Part3Port
,i
,tempdi
[i
]);
6798 if(pVBInfo
->VBType
&VB_XGI301C
) /* Marcovision */
6800 if(pVBInfo
->TVInfo
& SetYPbPrMode525p
)
6802 XGINew_SetReg1(pVBInfo
->Part3Port
,0x28,0x3f);
6807 } /* {end of XGI_SetGroup3} */
6810 /* --------------------------------------------------------------------- */
6811 /* Function : XGI_SetGroup4 */
6815 /* --------------------------------------------------------------------- */
6816 void XGI_SetGroup4(USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
,PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
6830 if ( ModeNo
<= 0x13 )
6832 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
; /* si+St_ResInfo */
6836 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
; /* si+Ext_ResInfo */
6839 temp
= pVBInfo
->RVBHCFACT
;
6840 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x13 , temp
) ;
6842 tempbx
= pVBInfo
->RVBHCMAX
;
6843 temp
= tempbx
& 0x00FF ;
6844 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x14 , temp
) ;
6845 temp2
= ( ( tempbx
& 0xFF00 ) >> 8 ) << 7 ;
6846 tempcx
= pVBInfo
->VGAHT
- 1 ;
6847 temp
= tempcx
& 0x00FF ;
6848 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x16 , temp
) ;
6850 temp
=( ( tempcx
& 0xFF00 ) >> 8 ) << 3 ;
6853 tempcx
= pVBInfo
->VGAVT
- 1 ;
6854 if ( !( pVBInfo
->VBInfo
& SetCRT2ToTV
) )
6859 temp
= tempcx
& 0x00FF ;
6860 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x17 , temp
) ;
6861 temp
= temp2
| ( ( tempcx
& 0xFF00 ) >> 8 ) ;
6862 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x15 , temp
) ;
6863 XGINew_SetRegOR( pVBInfo
->Part4Port
, 0x0D , 0x08 ) ;
6864 tempcx
= pVBInfo
->VBInfo
;
6865 tempbx
= pVBInfo
->VGAHDE
;
6867 if ( modeflag
& HalfDCLK
)
6869 tempbx
= tempbx
>> 1 ;
6872 if ( XGI_IsLCDDualLink( pVBInfo
) )
6873 tempbx
= tempbx
>> 1 ;
6875 if(tempcx
&SetCRT2ToHiVisionTV
)
6883 else if(tempcx
&SetCRT2ToTV
)
6892 if(pVBInfo
->VBInfo
&SetCRT2ToLCD
)
6900 if ( pVBInfo
->TVInfo
& ( SetYPbPrMode525p
| SetYPbPrMode750p
) )
6903 if ( pVBInfo
->VGAHDE
== 1280 )
6905 if ( pVBInfo
->VGAHDE
== 1024 )
6908 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x0E , ~0xEF , temp
) ;
6910 tempebx
= pVBInfo
->VDE
;
6912 if ( tempcx
& SetCRT2ToHiVisionTV
)
6914 if ( !( temp
& 0xE000 ) )
6915 tempbx
= tempbx
>> 1 ;
6918 tempcx
= pVBInfo
->RVBHRS
;
6919 temp
= tempcx
& 0x00FF ;
6920 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x18 , temp
);
6922 tempeax
= pVBInfo
->VGAVDE
;
6926 if ( tempeax
<= tempebx
)
6928 tempcx
=(tempcx
&(~0x4000));
6929 tempeax
= pVBInfo
->VGAVDE
;
6933 tempeax
-= tempebx
;
6937 templong
= ( tempeax
* 256 * 1024 ) % tempebx
;
6938 tempeax
= ( tempeax
* 256 * 1024 ) / tempebx
;
6941 if ( templong
!= 0 )
6947 temp
= ( USHORT
)( tempebx
& 0x000000FF ) ;
6948 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x1B , temp
) ;
6950 temp
= ( USHORT
)( ( tempebx
& 0x0000FF00 ) >> 8 ) ;
6951 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x1A , temp
) ;
6952 tempbx
= ( USHORT
)( tempebx
>> 16 ) ;
6953 temp
= tempbx
& 0x00FF ;
6955 temp
|= ( ( tempcx
& 0xFF00 ) >> 8 ) ;
6956 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x19 , temp
) ;
6959 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
6962 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x1C , temp
) ;
6963 tempax
= pVBInfo
->VGAHDE
;
6964 if ( modeflag
& HalfDCLK
)
6966 tempax
= tempax
>> 1 ;
6969 if ( XGI_IsLCDDualLink( pVBInfo
) )
6970 tempax
= tempax
>> 1 ;
6972 /* if((pVBInfo->VBInfo&(SetCRT2ToLCD))||((pVBInfo->TVInfo&SetYPbPrMode525p)||(pVBInfo->TVInfo&SetYPbPrMode750p))) { */
6973 if ( pVBInfo
->VBInfo
& SetCRT2ToLCD
)
6980 if ( pVBInfo
->VGAHDE
> 800 )
6982 if ( pVBInfo
->VGAHDE
== 1024 )
6983 tempax
= ( tempax
* 25 / 32 ) - 1 ;
6985 tempax
= ( tempax
* 20 / 32 ) - 1 ;
6991 if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToHiVisionTV ) )
6993 if ( pVBInfo->VBType & VB_XGI301LV )
6995 if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p | SetYPbPrMode1080i ) ) )
6997 if ( pVBInfo->VGAHDE > 800 )
6999 if ( pVBInfo->VGAHDE == 1024 )
7000 tempax = ( tempax * 25 / 32 ) - 1 ;
7002 tempax = ( tempax * 20 / 32 ) - 1 ;
7008 if ( pVBInfo->VGAHDE > 800 )
7010 if ( pVBInfo->VGAHDE == 1024 )
7011 tempax = ( tempax * 25 / 32 ) - 1 ;
7013 tempax = ( tempax * 20 / 32 ) - 1 ;
7019 temp
= ( tempax
& 0xFF00 ) >> 8 ;
7020 temp
= ( ( temp
& 0x0003 ) << 4 ) ;
7021 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x1E , temp
) ;
7022 temp
= ( tempax
& 0x00FF ) ;
7023 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x1D , temp
) ;
7025 if ( pVBInfo
->VBInfo
& ( SetCRT2ToTV
| SetCRT2ToHiVisionTV
) )
7027 if ( pVBInfo
->VGAHDE
> 800 )
7029 XGINew_SetRegOR( pVBInfo
->Part4Port
, 0x1E , 0x08 ) ;
7034 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
7036 if ( !( pVBInfo
->TVInfo
& ( NTSC1024x768
| SetYPbPrMode525p
| SetYPbPrMode750p
| SetYPbPrMode1080i
) ) )
7039 if ( ( pVBInfo
->VBInfo
& SetInSlaveMode
) && ( !( pVBInfo
->TVInfo
& TVSimuMode
) ) )
7040 temp
&= ( ~0x0001 ) ;
7044 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x1F , 0x00C0 , temp
) ;
7045 tempbx
= pVBInfo
->HT
;
7046 if ( XGI_IsLCDDualLink( pVBInfo
) )
7047 tempbx
= tempbx
>> 1 ;
7048 tempbx
= ( tempbx
>> 1 ) - 2 ;
7049 temp
= ( ( tempbx
& 0x0700 ) >> 8 ) << 3 ;
7050 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x21 , 0x00C0 , temp
) ;
7051 temp
= tempbx
& 0x00FF ;
7052 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x22 , temp
) ;
7056 if ( pVBInfo
->ISXPDOS
== 0 )
7057 XGI_SetCRT2VCLK( ModeNo
, ModeIdIndex
, RefreshRateTableIndex
, pVBInfo
) ;
7061 /* --------------------------------------------------------------------- */
7062 /* Function : XGI_SetGroup5 */
7066 /* --------------------------------------------------------------------- */
7067 void XGI_SetGroup5( USHORT ModeNo
, USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
7072 Pindex
= pVBInfo
->Part5Port
;
7073 Pdata
= pVBInfo
->Part5Port
+ 1 ;
7074 if ( pVBInfo
->ModeType
== ModeVGA
)
7076 if ( !( pVBInfo
->VBInfo
& ( SetInSlaveMode
| LoadDACFlag
| CRT2DisplayFlag
) ) )
7078 XGINew_EnableCRT2(pVBInfo
) ;
7079 /* LoadDAC2(pVBInfo->Part5Port,ModeNo,ModeIdIndex); */
7086 /* --------------------------------------------------------------------- */
7087 /* Function : XGI_GetLcdPtr */
7091 /* --------------------------------------------------------------------- */
7092 void* XGI_GetLcdPtr( USHORT BX
, USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
7102 XGI330_LCDDataTablStruct
*tempdi
= 0 ;
7107 if ( ModeNo
<= 0x13 )
7109 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
;
7110 tempal
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_CRT2CRTC
;
7114 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
7115 tempal
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT2CRTC
;
7118 tempal
= tempal
& 0x0f ;
7120 if ( tempbx
<= 1 ) /* ExpLink */
7122 if ( ModeNo
<= 0x13 )
7124 tempal
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_CRT2CRTC
; /* find no Ext_CRT2CRTC2 */
7128 tempal
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT2CRTC
;
7131 if ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
)
7133 if ( ModeNo
<= 0x13 )
7134 tempal
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_CRT2CRTC2
;
7136 tempal
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT2CRTC2
;
7139 if ( tempbx
& 0x01 )
7140 tempal
= ( tempal
>> 4 ) ;
7142 tempal
= ( tempal
& 0x0f ) ;
7145 tempcx
= LCDLenList
[ tempbx
] ; /* mov cl,byte ptr cs:LCDLenList[bx] */
7147 if ( pVBInfo
->LCDInfo
& EnableScalingLCD
) /* ScaleLCD */
7149 if ( ( tempbx
== 5 ) || ( tempbx
) == 7 )
7150 tempcx
= LCDDesDataLen2
;
7151 else if ( ( tempbx
== 3 ) || ( tempbx
== 8 ) )
7152 tempcx
= LVDSDesDataLen2
;
7154 /* mov di, word ptr cs:LCDDataList[bx] */
7155 /* tempdi=pVideoMemory[LCDDataList+tempbx*2]|(pVideoMemory[LCDDataList+tempbx*2+1]<<8); */
7160 tempdi
= XGI_EPLLCDCRT1Ptr_H
;
7163 tempdi
= XGI_EPLLCDCRT1Ptr_V
;
7166 tempdi
= XGI_EPLLCDDataPtr
;
7169 tempdi
= XGI_EPLLCDDesDataPtr
;
7172 tempdi
= XGI_LCDDataTable
;
7175 tempdi
= XGI_LCDDesDataTable
;
7178 tempdi
= XGI_EPLCHLCDRegPtr
;
7189 if ( tempdi
== 0x00 ) /* OEMUtil */
7195 while( tempdi
[ i
].PANELID
!= 0xff )
7197 tempdx
= pVBInfo
->LCDResInfo
;
7198 if ( tempbx
& 0x0080 ) /* OEMUtil */
7200 tempbx
&= ( ~0x0080 ) ;
7201 tempdx
= pVBInfo
->LCDTypeInfo
;
7204 if ( pVBInfo
->LCDInfo
& EnableScalingLCD
)
7205 tempdx
&= ( ~PanelResInfo
) ;
7207 if ( tempdi
[ i
].PANELID
== tempdx
)
7209 tempbx
= tempdi
[ i
].MASK
;
7210 tempdx
= pVBInfo
->LCDInfo
;
7212 if ( ModeNo
<= 0x13 ) /* alan 09/10/2003 */
7213 tempdx
|= SetLCDStdMode
;
7215 if ( modeflag
& HalfDCLK
)
7216 tempdx
|= SetLCDLowResolution
;
7219 if ( tempbx
== tempdi
[ i
].CAP
)
7227 switch( tempdi
[ i
].DATAPTR
)
7230 return &XGI_LVDSCRT11024x768_1_H
[ tempal
] ;
7233 return &XGI_LVDSCRT11024x768_2_H
[ tempal
] ;
7236 return &XGI_LVDSCRT11280x1024_1_H
[ tempal
] ;
7239 return &XGI_LVDSCRT11280x1024_2_H
[ tempal
] ;
7242 return &XGI_LVDSCRT11400x1050_1_H
[ tempal
] ;
7245 return &XGI_LVDSCRT11400x1050_2_H
[ tempal
] ;
7248 return &XGI_LVDSCRT11600x1200_1_H
[ tempal
] ;
7251 return &XGI_LVDSCRT11024x768_1_Hx75
[ tempal
] ;
7254 return &XGI_LVDSCRT11024x768_2_Hx75
[ tempal
] ;
7257 return &XGI_LVDSCRT11280x1024_1_Hx75
[ tempal
] ;
7260 return &XGI_LVDSCRT11280x1024_2_Hx75
[ tempal
] ;
7266 else if ( table
== 1 )
7268 switch( tempdi
[ i
].DATAPTR
)
7271 return &XGI_LVDSCRT11024x768_1_V
[ tempal
] ;
7274 return &XGI_LVDSCRT11024x768_2_V
[ tempal
] ;
7277 return &XGI_LVDSCRT11280x1024_1_V
[ tempal
] ;
7280 return &XGI_LVDSCRT11280x1024_2_V
[ tempal
] ;
7283 return &XGI_LVDSCRT11400x1050_1_V
[ tempal
] ;
7286 return &XGI_LVDSCRT11400x1050_2_V
[ tempal
] ;
7289 return &XGI_LVDSCRT11600x1200_1_V
[ tempal
] ;
7292 return &XGI_LVDSCRT11024x768_1_Vx75
[ tempal
] ;
7295 return &XGI_LVDSCRT11024x768_2_Vx75
[ tempal
] ;
7298 return &XGI_LVDSCRT11280x1024_1_Vx75
[ tempal
] ;
7301 return &XGI_LVDSCRT11280x1024_2_Vx75
[ tempal
] ;
7307 else if ( table
== 2 )
7309 switch( tempdi
[ i
].DATAPTR
)
7312 return &XGI_LVDS1024x768Data_1
[ tempal
] ;
7315 return &XGI_LVDS1024x768Data_2
[ tempal
] ;
7318 return &XGI_LVDS1280x1024Data_1
[ tempal
] ;
7321 return &XGI_LVDS1280x1024Data_2
[ tempal
] ;
7324 return &XGI_LVDS1400x1050Data_1
[ tempal
] ;
7327 return &XGI_LVDS1400x1050Data_2
[ tempal
] ;
7330 return &XGI_LVDS1600x1200Data_1
[ tempal
] ;
7333 return &XGI_LVDSNoScalingData
[ tempal
] ;
7336 return &XGI_LVDS1024x768Data_1x75
[ tempal
] ;
7339 return &XGI_LVDS1024x768Data_2x75
[ tempal
] ;
7342 return &XGI_LVDS1280x1024Data_1x75
[ tempal
] ;
7345 return &XGI_LVDS1280x1024Data_2x75
[ tempal
] ;
7348 return &XGI_LVDSNoScalingDatax75
[ tempal
] ;
7354 else if ( table
== 3 )
7356 switch( tempdi
[ i
].DATAPTR
)
7359 return &XGI_LVDS1024x768Des_1
[ tempal
] ;
7362 return &XGI_LVDS1024x768Des_3
[ tempal
] ;
7365 return &XGI_LVDS1024x768Des_2
[ tempal
] ;
7368 return &XGI_LVDS1280x1024Des_1
[ tempal
] ;
7371 return &XGI_LVDS1280x1024Des_2
[ tempal
] ;
7374 return &XGI_LVDS1400x1050Des_1
[ tempal
] ;
7377 return &XGI_LVDS1400x1050Des_2
[ tempal
] ;
7380 return &XGI_LVDS1600x1200Des_1
[ tempal
] ;
7383 return &XGI_LVDSNoScalingDesData
[ tempal
] ;
7386 return &XGI_LVDS1024x768Des_1x75
[ tempal
] ;
7389 return &XGI_LVDS1024x768Des_3x75
[ tempal
] ;
7392 return &XGI_LVDS1024x768Des_2x75
[ tempal
] ;
7395 return &XGI_LVDS1280x1024Des_1x75
[ tempal
] ;
7398 return &XGI_LVDS1280x1024Des_2x75
[ tempal
] ;
7401 return &XGI_LVDSNoScalingDesDatax75
[ tempal
] ;
7407 else if ( table
== 4 )
7409 switch( tempdi
[ i
].DATAPTR
)
7412 return &XGI_ExtLCD1024x768Data
[ tempal
] ;
7415 return &XGI_StLCD1024x768Data
[ tempal
] ;
7418 return &XGI_CetLCD1024x768Data
[ tempal
] ;
7421 return &XGI_ExtLCD1280x1024Data
[ tempal
] ;
7424 return &XGI_StLCD1280x1024Data
[ tempal
] ;
7427 return &XGI_CetLCD1280x1024Data
[ tempal
] ;
7430 return &XGI_ExtLCD1400x1050Data
[ tempal
] ;
7433 return &XGI_StLCD1400x1050Data
[ tempal
] ;
7436 return &XGI_CetLCD1400x1050Data
[ tempal
] ;
7439 return &XGI_ExtLCD1600x1200Data
[ tempal
] ;
7442 return &XGI_StLCD1600x1200Data
[ tempal
] ;
7445 return &XGI_NoScalingData
[ tempal
] ;
7448 return &XGI_ExtLCD1024x768x75Data
[ tempal
] ;
7451 return &XGI_ExtLCD1024x768x75Data
[ tempal
] ;
7454 return &XGI_CetLCD1024x768x75Data
[ tempal
] ;
7457 return &XGI_ExtLCD1280x1024x75Data
[ tempal
] ;
7460 return &XGI_StLCD1280x1024x75Data
[ tempal
] ;
7463 return &XGI_CetLCD1280x1024x75Data
[ tempal
] ;
7466 return &XGI_NoScalingDatax75
[ tempal
] ;
7472 else if ( table
== 5 )
7474 switch( tempdi
[ i
].DATAPTR
)
7477 return &XGI_ExtLCDDes1024x768Data
[ tempal
] ;
7480 return &XGI_StLCDDes1024x768Data
[ tempal
] ;
7483 return &XGI_CetLCDDes1024x768Data
[ tempal
] ;
7486 if ( ( pVBInfo
->VBType
& VB_XGI301LV
) || ( pVBInfo
->VBType
& VB_XGI302LV
) )
7487 return &XGI_ExtLCDDLDes1280x1024Data
[ tempal
] ;
7489 return &XGI_ExtLCDDes1280x1024Data
[ tempal
] ;
7492 if ( ( pVBInfo
->VBType
& VB_XGI301LV
) || ( pVBInfo
->VBType
& VB_XGI302LV
) )
7493 return &XGI_StLCDDLDes1280x1024Data
[ tempal
] ;
7495 return &XGI_StLCDDes1280x1024Data
[ tempal
] ;
7498 if ( ( pVBInfo
->VBType
& VB_XGI301LV
) || ( pVBInfo
->VBType
& VB_XGI302LV
) )
7499 return &XGI_CetLCDDLDes1280x1024Data
[ tempal
] ;
7501 return &XGI_CetLCDDes1280x1024Data
[ tempal
] ;
7504 if ( ( pVBInfo
->VBType
& VB_XGI301LV
) || ( pVBInfo
->VBType
& VB_XGI302LV
) )
7505 return &XGI_ExtLCDDLDes1400x1050Data
[ tempal
] ;
7507 return &XGI_ExtLCDDes1400x1050Data
[ tempal
] ;
7510 if ( ( pVBInfo
->VBType
& VB_XGI301LV
) || ( pVBInfo
->VBType
& VB_XGI302LV
) )
7511 return &XGI_StLCDDLDes1400x1050Data
[ tempal
] ;
7513 return &XGI_StLCDDes1400x1050Data
[ tempal
] ;
7516 return &XGI_CetLCDDes1400x1050Data
[ tempal
] ;
7519 return &XGI_CetLCDDes1400x1050Data2
[ tempal
] ;
7522 if ( ( pVBInfo
->VBType
& VB_XGI301LV
) || ( pVBInfo
->VBType
& VB_XGI302LV
) )
7523 return &XGI_ExtLCDDLDes1600x1200Data
[ tempal
] ;
7525 return &XGI_ExtLCDDes1600x1200Data
[ tempal
] ;
7528 if ( ( pVBInfo
->VBType
& VB_XGI301LV
) || ( pVBInfo
->VBType
& VB_XGI302LV
) )
7529 return &XGI_StLCDDLDes1600x1200Data
[ tempal
] ;
7531 return &XGI_StLCDDes1600x1200Data
[ tempal
] ;
7534 return &XGI_NoScalingDesData
[ tempal
] ;
7537 return &XGI_ExtLCDDes1024x768x75Data
[ tempal
] ;
7540 return &XGI_StLCDDes1024x768x75Data
[ tempal
] ;
7543 return &XGI_CetLCDDes1024x768x75Data
[ tempal
] ;
7546 if ( ( pVBInfo
->VBType
& VB_XGI301LV
) || ( pVBInfo
->VBType
& VB_XGI302LV
) )
7547 return &XGI_ExtLCDDLDes1280x1024x75Data
[ tempal
] ;
7549 return &XGI_ExtLCDDes1280x1024x75Data
[ tempal
] ;
7552 if ( ( pVBInfo
->VBType
& VB_XGI301LV
) || ( pVBInfo
->VBType
& VB_XGI302LV
) )
7553 return &XGI_StLCDDLDes1280x1024x75Data
[ tempal
] ;
7555 return &XGI_StLCDDes1280x1024x75Data
[ tempal
] ;
7558 if ( ( pVBInfo
->VBType
& VB_XGI301LV
) || ( pVBInfo
->VBType
& VB_XGI302LV
) )
7559 return &XGI_CetLCDDLDes1280x1024x75Data
[ tempal
] ;
7561 return &XGI_CetLCDDes1280x1024x75Data
[ tempal
] ;
7564 return &XGI_NoScalingDesDatax75
[ tempal
] ;
7570 else if ( table
== 6 )
7572 switch( tempdi
[ i
].DATAPTR
)
7575 return &XGI_CH7017LV1024x768
[ tempal
] ;
7578 return &XGI_CH7017LV1400x1050
[ tempal
] ;
7588 /* --------------------------------------------------------------------- */
7589 /* Function : XGI_GetTVPtr */
7593 /* --------------------------------------------------------------------- */
7594 void* XGI_GetTVPtr (USHORT BX
,USHORT ModeNo
,USHORT ModeIdIndex
,USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
7596 USHORT i
, tempdx
, tempbx
, tempal
, modeflag
, table
;
7597 XGI330_TVDataTablStruct
*tempdi
= 0 ;
7601 if ( ModeNo
<= 0x13 )
7603 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
;
7604 tempal
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_CRT2CRTC
;
7608 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
7609 tempal
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT2CRTC
;
7612 tempal
= tempal
& 0x3f ;
7618 tempdi
= 0 ; /*EPLCHTVCRT1Ptr_H;*/
7619 if ( pVBInfo
->IF_DEF_CH7007
== 1 )
7621 tempdi
= XGI_EPLCHTVCRT1Ptr
;
7625 tempdi
= 0 ; /*EPLCHTVCRT1Ptr_V;*/
7626 if ( pVBInfo
->IF_DEF_CH7007
== 1 )
7628 tempdi
= XGI_EPLCHTVCRT1Ptr
;
7632 tempdi
= XGI_EPLCHTVDataPtr
;
7638 tempdi
= XGI_TVDataTable
;
7644 tempdi
= XGI_EPLCHTVRegPtr
;
7650 if ( tempdi
== 0x00 ) /* OEMUtil */
7653 tempdx
= pVBInfo
->TVInfo
;
7655 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
7656 tempdx
= tempdx
| SetTVLockMode
;
7658 if ( modeflag
& HalfDCLK
)
7659 tempdx
= tempdx
| SetTVLowResolution
;
7663 while( tempdi
[ i
].MASK
!= 0xffff )
7665 if ( ( tempdx
& tempdi
[ i
].MASK
) == tempdi
[ i
].CAP
)
7670 if ( table
== 0x00 ) /* 07/05/22 */
7673 else if ( table
== 0x01 )
7676 else if ( table
== 0x04 )
7678 switch( tempdi
[ i
].DATAPTR
)
7681 return &XGI_ExtPALData
[ tempal
] ;
7684 return &XGI_ExtNTSCData
[ tempal
] ;
7687 return &XGI_StPALData
[ tempal
] ;
7690 return &XGI_StNTSCData
[ tempal
] ;
7693 return &XGI_ExtHiTVData
[ tempal
] ;
7696 return &XGI_St2HiTVData
[ tempal
] ;
7699 return &XGI_ExtYPbPr525iData
[ tempal
] ;
7702 return &XGI_ExtYPbPr525pData
[ tempal
] ;
7705 return &XGI_ExtYPbPr750pData
[ tempal
] ;
7708 return &XGI_StYPbPr525iData
[ tempal
] ;
7711 return &XGI_StYPbPr525pData
[ tempal
] ;
7714 return &XGI_StYPbPr750pData
[ tempal
] ;
7716 case 12: /* avoid system hang */
7717 return &XGI_ExtNTSCData
[ tempal
] ;
7720 return &XGI_St1HiTVData
[ tempal
] ;
7726 else if( table
== 0x02 )
7728 switch( tempdi
[ i
].DATAPTR
)
7731 return &XGI_CHTVUNTSCData
[ tempal
] ;
7734 return &XGI_CHTVONTSCData
[ tempal
] ;
7737 return &XGI_CHTVUPALData
[ tempal
] ;
7740 return &XGI_CHTVOPALData
[ tempal
] ;
7746 else if( table
== 0x06 )
7753 /* --------------------------------------------------------------------- */
7754 /* Function : XGI_BacklightByDrv */
7756 /* Output : TRUE -> Skip backlight control */
7758 /* --------------------------------------------------------------------- */
7759 BOOLEAN
XGI_BacklightByDrv( PVB_DEVICE_INFO pVBInfo
)
7763 tempah
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x3A ) ;
7764 if ( tempah
& BacklightControlBit
)
7771 /* --------------------------------------------------------------------- */
7772 /* Function : XGI_FirePWDDisable */
7775 /* Description : Turn off VDD & Backlight : Fire disable procedure */
7776 /* --------------------------------------------------------------------- */
7778 void XGI_FirePWDDisable( PVB_DEVICE_INFO pVBInfo )
7780 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x26 , 0x00 , 0xFC ) ;
7784 /* --------------------------------------------------------------------- */
7785 /* Function : XGI_FirePWDEnable */
7788 /* Description : Turn on VDD & Backlight : Fire enable procedure */
7789 /* --------------------------------------------------------------------- */
7790 void XGI_FirePWDEnable(PVB_DEVICE_INFO pVBInfo
)
7792 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x26 , 0x03 , 0xFC ) ;
7796 /* --------------------------------------------------------------------- */
7797 /* Function : XGI_EnableGatingCRT */
7801 /* --------------------------------------------------------------------- */
7802 void XGI_EnableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
7804 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x63 , 0xBF , 0x40 ) ;
7808 /* --------------------------------------------------------------------- */
7809 /* Function : XGI_DisableGatingCRT */
7813 /* --------------------------------------------------------------------- */
7814 void XGI_DisableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
7817 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x63 , 0xBF , 0x00 ) ;
7821 /* --------------------------------------------------------------------- */
7822 /* Function : XGI_SetPanelDelay */
7826 /* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
7827 /* : bl : 2 ; T2 : the duration signal on and Vdd on */
7828 /* : bl : 3 ; T3 : the duration between CPL off and signal off */
7829 /* : bl : 4 ; T4 : the duration signal off and Vdd off */
7830 /* --------------------------------------------------------------------- */
7831 void XGI_SetPanelDelay(USHORT tempbl
, PVB_DEVICE_INFO pVBInfo
)
7835 index
= XGI_GetLCDCapPtr(pVBInfo
) ;
7838 XGINew_LCD_Wait_Time( pVBInfo
->LCDCapList
[ index
].PSC_S1
, pVBInfo
) ;
7841 XGINew_LCD_Wait_Time( pVBInfo
->LCDCapList
[ index
].PSC_S2
, pVBInfo
) ;
7844 XGINew_LCD_Wait_Time( pVBInfo
->LCDCapList
[ index
].PSC_S3
, pVBInfo
) ;
7847 XGINew_LCD_Wait_Time( pVBInfo
->LCDCapList
[ index
].PSC_S4
, pVBInfo
) ;
7851 /* --------------------------------------------------------------------- */
7852 /* Function : XGI_SetPanelPower */
7856 /* I/O : ah = 0011b = 03h ; Backlight on, Power on */
7857 /* = 0111b = 07h ; Backlight on, Power off */
7858 /* = 1011b = 0Bh ; Backlight off, Power on */
7859 /* = 1111b = 0Fh ; Backlight off, Power off */
7860 /* --------------------------------------------------------------------- */
7861 void XGI_SetPanelPower(USHORT tempah
,USHORT tempbl
, PVB_DEVICE_INFO pVBInfo
)
7863 if ( pVBInfo
->VBType
& ( VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
7864 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x26 , tempbl
, tempah
) ;
7866 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x11 , tempbl
, tempah
) ;
7869 UCHAR
XG21GPIODataTransfer(UCHAR ujDate
)
7877 /* ujRet |= GETBITS(ujDate >> i, 0:0); */
7878 ujRet
|= (ujDate
>> i
) & 1;
7884 /*----------------------------------------------------------------------------*/
7886 /* bl[5] : LVDS signal */
7887 /* bl[1] : LVDS backlight */
7888 /* bl[0] : LVDS VDD */
7889 /*----------------------------------------------------------------------------*/
7890 UCHAR
XGI_XG21GetPSCValue(PVB_DEVICE_INFO pVBInfo
)
7894 CR4A
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x4A ) ;
7895 XGINew_SetRegAND( pVBInfo
->P3d4
, 0x4A , ~0x23 ) ; /* enable GPIO write */
7897 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) ;
7899 temp
= XG21GPIODataTransfer(temp
);
7901 XGINew_SetReg1( pVBInfo
->P3d4
, 0x4A , CR4A
) ;
7905 /*----------------------------------------------------------------------------*/
7907 /* bl[5] : LVDS signal */
7908 /* bl[1] : LVDS backlight */
7909 /* bl[0] : LVDS VDD */
7910 /*----------------------------------------------------------------------------*/
7911 UCHAR
XGI_XG27GetPSCValue(PVB_DEVICE_INFO pVBInfo
)
7913 UCHAR CR4A
,CRB4
,temp
;
7915 CR4A
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x4A ) ;
7916 XGINew_SetRegAND( pVBInfo
->P3d4
, 0x4A , ~0x0C ) ; /* enable GPIO write */
7918 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) ;
7922 XGINew_SetReg1( pVBInfo
->P3d4
, 0x4A , CR4A
) ;
7923 CRB4
= XGINew_GetReg1( pVBInfo
->P3d4
, 0xB4 ) ;
7924 temp
|= ((CRB4
&0x04)<<3);
7927 /*----------------------------------------------------------------------------*/
7929 /* bl[5] : 1;LVDS signal on */
7930 /* bl[1] : 1;LVDS backlight on */
7931 /* bl[0] : 1:LVDS VDD on */
7932 /* bh: 100000b : clear bit 5, to set bit5 */
7933 /* 000010b : clear bit 1, to set bit1 */
7934 /* 000001b : clear bit 0, to set bit0 */
7935 /*----------------------------------------------------------------------------*/
7936 void XGI_XG21BLSignalVDD(USHORT tempbh
,USHORT tempbl
, PVB_DEVICE_INFO pVBInfo
)
7940 CR4A
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x4A ) ;
7943 XGINew_SetRegAND( pVBInfo
->P3d4
, 0x4A , ~tempbh
) ; /* enable GPIO write */
7947 temp
= (tempbl
>>4)&0x02;
7949 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0xB4 , ~0x02 , temp
) ; /* CR B4[1] */
7953 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) ;
7955 temp
= XG21GPIODataTransfer(temp
);
7958 XGINew_SetReg1( pVBInfo
->P3d4
, 0x48 , temp
) ;
7961 void XGI_XG27BLSignalVDD(USHORT tempbh
,USHORT tempbl
, PVB_DEVICE_INFO pVBInfo
)
7964 USHORT tempbh0
,tempbl0
;
7975 temp
= (tempbl
>>4)&0x02;
7977 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0xB4 , ~0x02 , temp
) ; /* CR B4[1] */
7980 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0xB4 , ~tempbh0
, tempbl0
) ;
7982 CR4A
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x4A ) ;
7986 tempbl
<<= 2; /* GPIOC,GPIOD */
7987 XGINew_SetRegAND( pVBInfo
->P3d4
, 0x4A , ~tempbh
) ; /* enable GPIO write */
7988 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x48 , ~tempbh
, tempbl
) ;
7991 /* --------------------------------------------------------------------- */
7992 USHORT
XGI_GetLVDSOEMTableIndex(PVB_DEVICE_INFO pVBInfo
)
7996 index
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x36 ) ;
7997 if (index
<sizeof(XGI21_LCDCapList
)/sizeof(XGI21_LVDSCapStruct
))
8004 /* --------------------------------------------------------------------- */
8005 /* Function : XGI_XG21SetPanelDelay */
8009 /* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
8010 /* : bl : 2 ; T2 : the duration signal on and Vdd on */
8011 /* : bl : 3 ; T3 : the duration between CPL off and signal off */
8012 /* : bl : 4 ; T4 : the duration signal off and Vdd off */
8013 /* --------------------------------------------------------------------- */
8014 void XGI_XG21SetPanelDelay(USHORT tempbl
, PVB_DEVICE_INFO pVBInfo
)
8018 index
= XGI_GetLVDSOEMTableIndex( pVBInfo
);
8020 XGINew_LCD_Wait_Time( pVBInfo
->XG21_LVDSCapList
[ index
].PSC_S1
, pVBInfo
) ;
8023 XGINew_LCD_Wait_Time( pVBInfo
->XG21_LVDSCapList
[ index
].PSC_S2
, pVBInfo
) ;
8026 XGINew_LCD_Wait_Time( pVBInfo
->XG21_LVDSCapList
[ index
].PSC_S3
, pVBInfo
) ;
8029 XGINew_LCD_Wait_Time( pVBInfo
->XG21_LVDSCapList
[ index
].PSC_S4
, pVBInfo
) ;
8032 BOOLEAN
XGI_XG21CheckLVDSMode(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
8041 resindex
= XGI_GetResInfo( ModeNo
, ModeIdIndex
, pVBInfo
) ;
8042 if ( ModeNo
<= 0x13 )
8044 xres
= pVBInfo
->StResInfo
[ resindex
].HTotal
;
8045 yres
= pVBInfo
->StResInfo
[ resindex
].VTotal
;
8046 modeflag
= pVBInfo
->SModeIDTable
[ModeIdIndex
].St_ModeFlag
; /* si+St_ResInfo */
8050 xres
= pVBInfo
->ModeResInfo
[ resindex
].HTotal
; /* xres->ax */
8051 yres
= pVBInfo
->ModeResInfo
[ resindex
].VTotal
; /* yres->bx */
8052 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
; /* si+St_ModeFlag */
8055 if ( !( modeflag
& Charx8Dot
) )
8061 if ( ModeNo
> 0x13 )
8063 if ( ( ModeNo
>0x13 ) && ( modeflag
& HalfDCLK
) )
8067 if ( ( ModeNo
>0x13 ) && ( modeflag
& DoubleScanMode
) )
8073 lvdstableindex
= XGI_GetLVDSOEMTableIndex( pVBInfo
);
8074 if ( xres
> (pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHDE
) )
8077 if ( yres
> (pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVDE
) )
8080 if ( ModeNo
> 0x13 )
8082 if ( ( xres
!= (pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHDE
) ) ||
8083 ( yres
!= (pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVDE
)) )
8085 colordepth
= XGI_GetColorDepth( ModeNo
, ModeIdIndex
, pVBInfo
) ;
8086 if ( colordepth
> 2 )
8095 void XGI_SetXG21FPBits(PVB_DEVICE_INFO pVBInfo
)
8099 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x37 ) ; /* D[0] 1: 18bit */
8100 temp
= ( temp
& 1 ) << 6;
8101 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x06 , ~0x40 , temp
) ; /* SR06[6] 18bit Dither */
8102 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x09 , ~0xc0 , temp
| 0x80 ) ; /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
8106 void XGI_SetXG27FPBits(PVB_DEVICE_INFO pVBInfo
)
8110 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x37 ) ; /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
8111 temp
= ( temp
& 3 ) << 6;
8112 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x06 , ~0xc0 , temp
& 0x80 ) ; /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
8113 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x09 , ~0xc0 , temp
| 0x80 ) ; /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
8117 void XGI_SetXG21LVDSPara(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
8119 UCHAR temp
,Miscdata
;
8125 USHORT LVDSHT
,LVDSHBS
,LVDSHRS
,LVDSHRE
,LVDSHBE
;
8126 USHORT LVDSVT
,LVDSVBS
,LVDSVRS
,LVDSVRE
,LVDSVBE
;
8129 lvdstableindex
= XGI_GetLVDSOEMTableIndex( pVBInfo
);
8131 temp
= (UCHAR
) ( ( pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDS_Capability
& (LCDPolarity
<< 8 ) ) >> 8 );
8132 temp
&= LCDPolarity
;
8133 Miscdata
=(UCHAR
) XGINew_GetReg2(pVBInfo
->P3cc
) ;
8135 XGINew_SetReg3( pVBInfo
->P3c2
, (Miscdata
& 0x3F) | temp
) ;
8137 temp
= (UCHAR
) ( pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDS_Capability
& LCDPolarity
) ;
8138 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x35 , ~0x80 , temp
&0x80 ) ; /* SR35[7] FP VSync polarity */
8139 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x30 , ~0x20 , (temp
&0x40)>>1 ) ; /* SR30[5] FP HSync polarity */
8141 XGI_SetXG21FPBits(pVBInfo
);
8142 resindex
= XGI_GetResInfo( ModeNo
, ModeIdIndex
, pVBInfo
) ;
8143 if ( ModeNo
<= 0x13 )
8145 xres
= pVBInfo
->StResInfo
[ resindex
].HTotal
;
8146 yres
= pVBInfo
->StResInfo
[ resindex
].VTotal
;
8147 modeflag
= pVBInfo
->SModeIDTable
[ModeIdIndex
].St_ModeFlag
; /* si+St_ResInfo */
8151 xres
= pVBInfo
->ModeResInfo
[ resindex
].HTotal
; /* xres->ax */
8152 yres
= pVBInfo
->ModeResInfo
[ resindex
].VTotal
; /* yres->bx */
8153 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
; /* si+St_ModeFlag */
8156 if (!( modeflag
& Charx8Dot
))
8157 xres
= xres
* 8 / 9;
8159 LVDSHT
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHT
;
8161 LVDSHBS
= xres
+ ( pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHDE
- xres
) / 2 ;
8162 if ( ( ModeNo
<=0x13 ) && ( modeflag
& HalfDCLK
) )
8166 if (LVDSHBS
> LVDSHT
) LVDSHBS
-= LVDSHT
;
8168 LVDSHRS
= LVDSHBS
+ pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHFP
;
8169 if (LVDSHRS
> LVDSHT
) LVDSHRS
-= LVDSHT
;
8171 LVDSHRE
= LVDSHRS
+ pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHSYNC
;
8172 if (LVDSHRE
> LVDSHT
) LVDSHRE
-= LVDSHT
;
8174 LVDSHBE
= LVDSHBS
+ LVDSHT
- pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHDE
;
8176 LVDSVT
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVT
;
8178 LVDSVBS
= yres
+ ( pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVDE
- yres
) / 2 ;
8179 if ( ( ModeNo
>0x13 ) && ( modeflag
& DoubleScanMode
) )
8183 if (LVDSVBS
> LVDSVT
) LVDSVBS
-= LVDSVT
;
8185 LVDSVRS
= LVDSVBS
+ pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVFP
;
8186 if (LVDSVRS
> LVDSVT
) LVDSVRS
-= LVDSVT
;
8188 LVDSVRE
= LVDSVRS
+ pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVSYNC
;
8189 if (LVDSVRE
> LVDSVT
) LVDSVRE
-= LVDSVT
;
8191 LVDSVBE
= LVDSVBS
+ LVDSVT
- pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVDE
;
8193 temp
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x11 ) ;
8194 XGINew_SetReg1( pVBInfo
->P3d4
, 0x11 , temp
& 0x7f ) ; /* Unlock CRTC */
8196 if (!( modeflag
& Charx8Dot
))
8198 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x1 , 0x1 ) ;
8201 /* HT SR0B[1:0] CR00 */
8202 value
= ( LVDSHT
>> 3 ) - 5;
8203 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0B , ~0x03 , ( value
& 0x300 ) >> 8 ) ;
8204 XGINew_SetReg1( pVBInfo
->P3d4
, 0x0 , (value
& 0xFF) ) ;
8206 /* HBS SR0B[5:4] CR02 */
8207 value
= ( LVDSHBS
>> 3 ) - 1;
8208 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0B , ~0x30 , ( value
& 0x300 ) >> 4 ) ;
8209 XGINew_SetReg1( pVBInfo
->P3d4
, 0x2 , (value
& 0xFF) ) ;
8211 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
8212 value
= ( LVDSHBE
>> 3 ) - 1;
8213 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0C , ~0x03 , ( value
& 0xC0 ) >> 6 ) ;
8214 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x05 , ~0x80 , ( value
& 0x20 ) << 2 ) ;
8215 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x03 , ~0x1F , value
& 0x1F ) ;
8217 /* HRS SR0B[7:6] CR04 */
8218 value
= ( LVDSHRS
>> 3 ) + 2;
8219 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0B , ~0xC0 , ( value
& 0x300 ) >> 2 ) ;
8220 XGINew_SetReg1( pVBInfo
->P3d4
, 0x4 , (value
& 0xFF) ) ;
8222 /* Panel HRS SR2F[1:0] SR2E[7:0] */
8224 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x2F , ~0x03 , ( value
& 0x300 ) >> 8 ) ;
8225 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2E , (value
& 0xFF) ) ;
8227 /* HRE SR0C[2] CR05[4:0] */
8228 value
= ( LVDSHRE
>> 3 ) + 2;
8229 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0C , ~0x04 , ( value
& 0x20 ) >> 3 ) ;
8230 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x05 , ~0x1F , value
& 0x1F ) ;
8232 /* Panel HRE SR2F[7:2] */
8234 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x2F , ~0xFC , value
<< 2 ) ;
8236 /* VT SR0A[0] CR07[5][0] CR06 */
8237 value
= LVDSVT
- 2 ;
8238 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0A , ~0x01 , ( value
& 0x400 ) >> 10 ) ;
8239 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x07 , ~0x20 , ( value
& 0x200 ) >> 4 ) ;
8240 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x07 , ~0x01 , ( value
& 0x100 ) >> 8 ) ;
8241 XGINew_SetReg1( pVBInfo
->P3d4
, 0x06 , (value
& 0xFF) ) ;
8243 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
8244 value
= LVDSVBS
- 1 ;
8245 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0A , ~0x04 , ( value
& 0x400 ) >> 8 ) ;
8246 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x09 , ~0x20 , ( value
& 0x200 ) >> 4 ) ;
8247 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x07 , ~0x08 , ( value
& 0x100 ) >> 5 ) ;
8248 XGINew_SetReg1( pVBInfo
->P3d4
, 0x15 , (value
& 0xFF) ) ;
8250 /* VBE SR0A[4] CR16 */
8251 value
= LVDSVBE
- 1;
8252 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0A , ~0x10 , ( value
& 0x100 ) >> 4 ) ;
8253 XGINew_SetReg1( pVBInfo
->P3d4
, 0x16 , (value
& 0xFF) ) ;
8255 /* VRS SR0A[3] CR7[7][2] CR10 */
8256 value
= LVDSVRS
- 1 ;
8257 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0A , ~0x08 , ( value
& 0x400 ) >> 7 ) ;
8258 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x07 , ~0x80 , ( value
& 0x200 ) >> 2 ) ;
8259 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x07 , ~0x04 , ( value
& 0x100 ) >> 6 ) ;
8260 XGINew_SetReg1( pVBInfo
->P3d4
, 0x10 , (value
& 0xFF) ) ;
8262 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
8263 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x3F , ~0x03 , ( value
& 0x600 ) >> 9 ) ;
8264 XGINew_SetReg1( pVBInfo
->P3c4
, 0x34 , (value
>> 1) & 0xFF ) ;
8265 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x33 , ~0x01 , value
& 0x01 ) ;
8267 /* VRE SR0A[5] CR11[3:0] */
8268 value
= LVDSVRE
- 1;
8269 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0A , ~0x20 , ( value
& 0x10 ) << 1 ) ;
8270 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x11 , ~0x0F , value
& 0x0F ) ;
8272 /* Panel VRE SR3F[7:2] */ /* SR3F[7] has to be 0, h/w bug */
8273 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x3F , ~0xFC , ( value
<< 2 ) & 0x7C ) ;
8275 for ( temp
=0, value
= 0; temp
< 3; temp
++)
8278 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x31 , ~0x30 , value
) ;
8279 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2B , pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].VCLKData1
) ;
8280 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2C , pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].VCLKData2
) ;
8284 if (!( modeflag
& Charx8Dot
))
8286 XGINew_GetReg2( pVBInfo
->P3da
) ; /* reset 3da */
8287 XGINew_SetReg3( pVBInfo
->P3c0
, 0x13 ) ; /* set index */
8288 XGINew_SetReg3( pVBInfo
->P3c0
, 0x00 ) ; /* set data, panning = 0, shift left 1 dot*/
8290 XGINew_GetReg2( pVBInfo
->P3da
) ; /* Enable Attribute */
8291 XGINew_SetReg3( pVBInfo
->P3c0
, 0x20 ) ;
8293 XGINew_GetReg2( pVBInfo
->P3da
) ; /* reset 3da */
8299 /* no shadow case */
8300 void XGI_SetXG27LVDSPara(USHORT ModeNo
,USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
8302 UCHAR temp
,Miscdata
;
8308 USHORT LVDSHT
,LVDSHBS
,LVDSHRS
,LVDSHRE
,LVDSHBE
;
8309 USHORT LVDSVT
,LVDSVBS
,LVDSVRS
,LVDSVRE
,LVDSVBE
;
8312 lvdstableindex
= XGI_GetLVDSOEMTableIndex( pVBInfo
);
8313 temp
= (UCHAR
) ( ( pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDS_Capability
& (LCDPolarity
<< 8 ) ) >> 8 );
8314 temp
&= LCDPolarity
;
8315 Miscdata
=(UCHAR
) XGINew_GetReg2(pVBInfo
->P3cc
) ;
8317 XGINew_SetReg3( pVBInfo
->P3c2
, (Miscdata
& 0x3F) | temp
) ;
8319 temp
= (UCHAR
) ( pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDS_Capability
& LCDPolarity
) ;
8320 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x35 , ~0x80 , temp
&0x80 ) ; /* SR35[7] FP VSync polarity */
8321 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x30 , ~0x20 , (temp
&0x40)>>1 ) ; /* SR30[5] FP HSync polarity */
8323 XGI_SetXG27FPBits(pVBInfo
);
8324 resindex
= XGI_GetResInfo( ModeNo
, ModeIdIndex
, pVBInfo
) ;
8325 if ( ModeNo
<= 0x13 )
8327 xres
= pVBInfo
->StResInfo
[ resindex
].HTotal
;
8328 yres
= pVBInfo
->StResInfo
[ resindex
].VTotal
;
8329 modeflag
= pVBInfo
->SModeIDTable
[ModeIdIndex
].St_ModeFlag
; /* si+St_ResInfo */
8333 xres
= pVBInfo
->ModeResInfo
[ resindex
].HTotal
; /* xres->ax */
8334 yres
= pVBInfo
->ModeResInfo
[ resindex
].VTotal
; /* yres->bx */
8335 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
; /* si+St_ModeFlag */
8338 if (!( modeflag
& Charx8Dot
))
8339 xres
= xres
* 8 / 9;
8341 LVDSHT
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHT
;
8343 LVDSHBS
= xres
+ ( pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHDE
- xres
) / 2 ;
8344 if ( ( ModeNo
<=0x13 ) && ( modeflag
& HalfDCLK
) )
8348 if (LVDSHBS
> LVDSHT
) LVDSHBS
-= LVDSHT
;
8350 LVDSHRS
= LVDSHBS
+ pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHFP
;
8351 if (LVDSHRS
> LVDSHT
) LVDSHRS
-= LVDSHT
;
8353 LVDSHRE
= LVDSHRS
+ pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHSYNC
;
8354 if (LVDSHRE
> LVDSHT
) LVDSHRE
-= LVDSHT
;
8356 LVDSHBE
= LVDSHBS
+ LVDSHT
- pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHDE
;
8358 LVDSVT
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVT
;
8360 LVDSVBS
= yres
+ ( pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVDE
- yres
) / 2 ;
8361 if ( ( ModeNo
>0x13 ) && ( modeflag
& DoubleScanMode
) )
8365 if (LVDSVBS
> LVDSVT
) LVDSVBS
-= LVDSVT
;
8367 LVDSVRS
= LVDSVBS
+ pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVFP
;
8368 if (LVDSVRS
> LVDSVT
) LVDSVRS
-= LVDSVT
;
8370 LVDSVRE
= LVDSVRS
+ pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVSYNC
;
8371 if (LVDSVRE
> LVDSVT
) LVDSVRE
-= LVDSVT
;
8373 LVDSVBE
= LVDSVBS
+ LVDSVT
- pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVDE
;
8375 temp
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x11 ) ;
8376 XGINew_SetReg1( pVBInfo
->P3d4
, 0x11 , temp
& 0x7f ) ; /* Unlock CRTC */
8378 if (!( modeflag
& Charx8Dot
))
8380 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x1 , 0x1 ) ;
8383 /* HT SR0B[1:0] CR00 */
8384 value
= ( LVDSHT
>> 3 ) - 5;
8385 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0B , ~0x03 , ( value
& 0x300 ) >> 8 ) ;
8386 XGINew_SetReg1( pVBInfo
->P3d4
, 0x0 , (value
& 0xFF) ) ;
8388 /* HBS SR0B[5:4] CR02 */
8389 value
= ( LVDSHBS
>> 3 ) - 1;
8390 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0B , ~0x30 , ( value
& 0x300 ) >> 4 ) ;
8391 XGINew_SetReg1( pVBInfo
->P3d4
, 0x2 , (value
& 0xFF) ) ;
8393 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
8394 value
= ( LVDSHBE
>> 3 ) - 1;
8395 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0C , ~0x03 , ( value
& 0xC0 ) >> 6 ) ;
8396 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x05 , ~0x80 , ( value
& 0x20 ) << 2 ) ;
8397 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x03 , ~0x1F , value
& 0x1F ) ;
8399 /* HRS SR0B[7:6] CR04 */
8400 value
= ( LVDSHRS
>> 3 ) + 2;
8401 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0B , ~0xC0 , ( value
& 0x300 ) >> 2 ) ;
8402 XGINew_SetReg1( pVBInfo
->P3d4
, 0x4 , (value
& 0xFF) ) ;
8404 /* Panel HRS SR2F[1:0] SR2E[7:0] */
8406 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x2F , ~0x03 , ( value
& 0x300 ) >> 8 ) ;
8407 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2E , (value
& 0xFF) ) ;
8409 /* HRE SR0C[2] CR05[4:0] */
8410 value
= ( LVDSHRE
>> 3 ) + 2;
8411 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0C , ~0x04 , ( value
& 0x20 ) >> 3 ) ;
8412 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x05 , ~0x1F , value
& 0x1F ) ;
8414 /* Panel HRE SR2F[7:2] */
8416 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x2F , ~0xFC , value
<< 2 ) ;
8418 /* VT SR0A[0] CR07[5][0] CR06 */
8419 value
= LVDSVT
- 2 ;
8420 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0A , ~0x01 , ( value
& 0x400 ) >> 10 ) ;
8421 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x07 , ~0x20 , ( value
& 0x200 ) >> 4 ) ;
8422 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x07 , ~0x01 , ( value
& 0x100 ) >> 8 ) ;
8423 XGINew_SetReg1( pVBInfo
->P3d4
, 0x06 , (value
& 0xFF) ) ;
8425 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
8426 value
= LVDSVBS
- 1 ;
8427 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0A , ~0x04 , ( value
& 0x400 ) >> 8 ) ;
8428 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x09 , ~0x20 , ( value
& 0x200 ) >> 4 ) ;
8429 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x07 , ~0x08 , ( value
& 0x100 ) >> 5 ) ;
8430 XGINew_SetReg1( pVBInfo
->P3d4
, 0x15 , (value
& 0xFF) ) ;
8432 /* VBE SR0A[4] CR16 */
8433 value
= LVDSVBE
- 1;
8434 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0A , ~0x10 , ( value
& 0x100 ) >> 4 ) ;
8435 XGINew_SetReg1( pVBInfo
->P3d4
, 0x16 , (value
& 0xFF) ) ;
8437 /* VRS SR0A[3] CR7[7][2] CR10 */
8438 value
= LVDSVRS
- 1 ;
8439 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0A , ~0x08 , ( value
& 0x400 ) >> 7 ) ;
8440 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x07 , ~0x80 , ( value
& 0x200 ) >> 2 ) ;
8441 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x07 , ~0x04 , ( value
& 0x100 ) >> 6 ) ;
8442 XGINew_SetReg1( pVBInfo
->P3d4
, 0x10 , (value
& 0xFF) ) ;
8444 /* Panel VRS SR35[2:0] SR34[7:0] */
8445 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x35 , ~0x07 , ( value
& 0x700 ) >> 8 ) ;
8446 XGINew_SetReg1( pVBInfo
->P3c4
, 0x34 , value
& 0xFF ) ;
8448 /* VRE SR0A[5] CR11[3:0] */
8449 value
= LVDSVRE
- 1;
8450 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x0A , ~0x20 , ( value
& 0x10 ) << 1 ) ;
8451 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x11 , ~0x0F , value
& 0x0F ) ;
8453 /* Panel VRE SR3F[7:2] */
8454 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x3F , ~0xFC , ( value
<< 2 ) & 0xFC ) ;
8456 for ( temp
=0, value
= 0; temp
< 3; temp
++)
8459 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x31 , ~0x30 , value
) ;
8460 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2B , pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].VCLKData1
) ;
8461 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2C , pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].VCLKData2
) ;
8465 if (!( modeflag
& Charx8Dot
))
8467 XGINew_GetReg2( pVBInfo
->P3da
) ; /* reset 3da */
8468 XGINew_SetReg3( pVBInfo
->P3c0
, 0x13 ) ; /* set index */
8469 XGINew_SetReg3( pVBInfo
->P3c0
, 0x00 ) ; /* set data, panning = 0, shift left 1 dot*/
8471 XGINew_GetReg2( pVBInfo
->P3da
) ; /* Enable Attribute */
8472 XGINew_SetReg3( pVBInfo
->P3c0
, 0x20 ) ;
8474 XGINew_GetReg2( pVBInfo
->P3da
) ; /* reset 3da */
8480 /* --------------------------------------------------------------------- */
8481 /* Function : XGI_IsLCDON */
8483 /* Output : FALSE : Skip PSC Control */
8484 /* TRUE: Disable PSC */
8486 /* --------------------------------------------------------------------- */
8487 BOOLEAN
XGI_IsLCDON(PVB_DEVICE_INFO pVBInfo
)
8491 tempax
= pVBInfo
->VBInfo
;
8492 if ( tempax
& SetCRT2ToDualEdge
)
8494 else if ( tempax
& ( DisableCRT2Display
| SwitchToCRT2
| SetSimuScanMode
) )
8501 /* --------------------------------------------------------------------- */
8502 /* Function : XGI_EnablePWD */
8506 /* --------------------------------------------------------------------- */
8507 void XGI_EnablePWD( PVB_DEVICE_INFO pVBInfo
)
8512 index
= XGI_GetLCDCapPtr(pVBInfo
) ;
8513 temp
= pVBInfo
->LCDCapList
[ index
].PWD_2B
;
8514 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x2B , temp
) ;
8515 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x2C , pVBInfo
->LCDCapList
[ index
].PWD_2C
) ;
8516 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x2D , pVBInfo
->LCDCapList
[ index
].PWD_2D
) ;
8517 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x2E , pVBInfo
->LCDCapList
[ index
].PWD_2E
) ;
8518 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x2F , pVBInfo
->LCDCapList
[ index
].PWD_2F
) ;
8519 XGINew_SetRegOR( pVBInfo
->Part4Port
, 0x27 , 0x80 ) ; /* enable PWD */
8523 /* --------------------------------------------------------------------- */
8524 /* Function : XGI_DisablePWD */
8528 /* --------------------------------------------------------------------- */
8529 void XGI_DisablePWD( PVB_DEVICE_INFO pVBInfo
)
8531 XGINew_SetRegAND( pVBInfo
->Part4Port
, 0x27 , 0x7F ) ; /* disable PWD */
8535 /* --------------------------------------------------------------------- */
8536 /* Function : XGI_DisableChISLCD */
8538 /* Output : FALSE -> Not LCD Mode */
8540 /* --------------------------------------------------------------------- */
8541 BOOLEAN
XGI_DisableChISLCD(PVB_DEVICE_INFO pVBInfo
)
8546 tempbx
= pVBInfo
->SetFlag
& ( DisableChA
| DisableChB
) ;
8547 tempah
= ~( ( USHORT
)XGINew_GetReg1( pVBInfo
->Part1Port
, 0x2E ) ) ;
8549 if ( tempbx
& ( EnableChA
| DisableChA
) )
8551 if ( !( tempah
& 0x08 ) ) /* Chk LCDA Mode */
8555 if ( !( tempbx
& ( EnableChB
| DisableChB
) ) )
8558 if ( tempah
& 0x01 ) /* Chk LCDB Mode */
8565 /* --------------------------------------------------------------------- */
8566 /* Function : XGI_EnableChISLCD */
8568 /* Output : 0 -> Not LCD mode */
8570 /* --------------------------------------------------------------------- */
8571 BOOLEAN
XGI_EnableChISLCD(PVB_DEVICE_INFO pVBInfo
)
8577 tempbx
= pVBInfo
->SetFlag
& ( EnableChA
| EnableChB
) ;
8578 tempah
= ~( ( USHORT
)XGINew_GetReg1( pVBInfo
->Part1Port
, 0x2E ) ) ;
8580 if ( tempbx
& ( EnableChA
| DisableChA
) )
8582 if ( !( tempah
& 0x08 ) ) /* Chk LCDA Mode */
8586 if ( !( tempbx
& ( EnableChB
| DisableChB
) ) )
8589 if ( tempah
& 0x01 ) /* Chk LCDB Mode */
8596 /* --------------------------------------------------------------------- */
8597 /* Function : XGI_GetLCDCapPtr */
8601 /* --------------------------------------------------------------------- */
8602 USHORT
XGI_GetLCDCapPtr( PVB_DEVICE_INFO pVBInfo
)
8609 tempah
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x36 ) ;
8610 tempal
= tempah
& 0x0F ;
8611 tempah
= tempah
& 0xF0 ;
8613 tempbl
= pVBInfo
->LCDCapList
[ i
].LCD_ID
;
8615 while( tempbl
!= 0xFF )
8617 if ( tempbl
& 0x80 ) /* OEMUtil */
8620 tempbl
= tempbl
& ~( 0x80 ) ;
8623 if ( tempal
== tempbl
)
8628 tempbl
= pVBInfo
->LCDCapList
[ i
].LCD_ID
;
8635 /* --------------------------------------------------------------------- */
8636 /* Function : XGI_GetLCDCapPtr1 */
8640 /* --------------------------------------------------------------------- */
8641 USHORT
XGI_GetLCDCapPtr1( PVB_DEVICE_INFO pVBInfo
)
8648 tempal
= pVBInfo
->LCDResInfo
;
8649 tempah
= pVBInfo
->LCDTypeInfo
;
8652 tempbl
= pVBInfo
->LCDCapList
[ i
].LCD_ID
;
8654 while( tempbl
!= 0xFF )
8656 if ( ( tempbl
& 0x80 ) && ( tempbl
!= 0x80 ) )
8662 if ( tempal
== tempbl
)
8666 tempbl
= pVBInfo
->LCDCapList
[ i
].LCD_ID
;
8669 if ( tempbl
== 0xFF )
8671 pVBInfo
->LCDResInfo
= Panel1024x768
;
8672 pVBInfo
->LCDTypeInfo
= 0 ;
8680 /* --------------------------------------------------------------------- */
8681 /* Function : XGI_GetLCDSync */
8685 /* --------------------------------------------------------------------- */
8686 void XGI_GetLCDSync( USHORT
* HSyncWidth
, USHORT
* VSyncWidth
, PVB_DEVICE_INFO pVBInfo
)
8690 Index
= XGI_GetLCDCapPtr(pVBInfo
) ;
8691 *HSyncWidth
= pVBInfo
->LCDCapList
[ Index
].LCD_HSyncWidth
;
8692 *VSyncWidth
= pVBInfo
->LCDCapList
[ Index
].LCD_VSyncWidth
;
8699 /* --------------------------------------------------------------------- */
8700 /* Function : XGI_EnableBridge */
8704 /* --------------------------------------------------------------------- */
8705 void XGI_EnableBridge( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
8710 if ( pVBInfo
->SetFlag
== Win9xDOSMode
)
8712 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
8714 XGI_DisplayOn( HwDeviceExtension
, pVBInfo
) ;
8717 else /* LVDS or CH7017 */
8722 if ( HwDeviceExtension
->jChipType
< XG40
)
8724 if ( !XGI_DisableChISLCD(pVBInfo
) )
8726 if ( ( XGI_EnableChISLCD(pVBInfo
) ) || ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) ) )
8728 if ( pVBInfo
->LCDInfo
& SetPWDEnable
)
8730 XGI_EnablePWD( pVBInfo
);
8734 pVBInfo
->LCDInfo
&= ( ~SetPWDEnable
) ;
8735 if ( pVBInfo
->VBType
& ( VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
8746 XGI_SetPanelPower( tempah
, tempbl
, pVBInfo
) ;
8747 XGI_SetPanelDelay( 1,pVBInfo
) ;
8755 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
8757 if ( !( pVBInfo
->SetFlag
& DisableChA
) )
8759 if ( pVBInfo
->SetFlag
& EnableChA
)
8761 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x1E , 0x20 ) ; /* Power on */
8765 if ( pVBInfo
->VBInfo
& SetCRT2ToDualEdge
) /* SetCRT2ToLCDA ) */
8767 XGINew_SetReg1(pVBInfo
->Part1Port
,0x1E,0x20); /* Power on */
8772 if ( !( pVBInfo
->SetFlag
& DisableChB
) )
8774 if ( ( pVBInfo
->SetFlag
& EnableChB
) || ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToTV
| SetCRT2ToRAMDAC
) ) )
8776 tempah
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3c4
, 0x32 ) ;
8778 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
8780 if ( !( pVBInfo
->VBInfo
& SetCRT2ToRAMDAC
) )
8783 XGINew_SetReg1( pVBInfo
->P3c4
, 0x32 , tempah
) ;
8784 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x1E , 0x20 ) ;
8787 tempah
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->Part1Port
, 0x2E ) ;
8789 if ( !( tempah
& 0x80 ) )
8790 XGINew_SetRegOR( pVBInfo
->Part1Port
, 0x2E , 0x80 ) ; /* BVBDOENABLE = 1 */
8792 XGINew_SetRegAND( pVBInfo
->Part1Port
, 0x00 , 0x7F ) ; /* BScreenOFF = 0 */
8796 if ( ( pVBInfo
->SetFlag
& ( EnableChA
| EnableChB
) ) || ( !( pVBInfo
->VBInfo
& DisableCRT2Display
) ) )
8798 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x00 , ~0xE0 , 0x20 ) ; /* shampoo 0129 */
8799 if ( pVBInfo
->VBType
& ( VB_XGI302LV
| VB_XGI301C
) )
8801 if ( !XGI_DisableChISLCD(pVBInfo
) )
8803 if ( XGI_EnableChISLCD( pVBInfo
) || ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) ) )
8804 XGINew_SetRegAND( pVBInfo
->Part4Port
,0x2A , 0x7F ) ; /* LVDS PLL power on */
8806 XGINew_SetRegAND( pVBInfo
->Part4Port
, 0x30 , 0x7F ) ; /* LVDS Driver power on */
8812 if ( !( pVBInfo
->VBInfo
& DisableCRT2Display
) )
8816 if ( !( pVBInfo
->VBInfo
& SetSimuScanMode
) )
8818 if ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
)
8820 if ( pVBInfo
->VBInfo
& SetCRT2ToDualEdge
)
8822 tempah
= tempah
& 0x40;
8823 if ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
)
8824 tempah
= tempah
^ 0xC0 ;
8826 if ( pVBInfo
->SetFlag
& DisableChB
)
8829 if ( pVBInfo
->SetFlag
& DisableChA
)
8832 if ( pVBInfo
->SetFlag
& EnableChB
)
8835 if ( pVBInfo
->SetFlag
& EnableChA
)
8842 XGINew_SetRegOR( pVBInfo
->Part4Port
, 0x1F , tempah
) ; /* EnablePart4_1F */
8844 if ( pVBInfo
->SetFlag
& Win9xDOSMode
)
8846 XGI_DisplayOn( HwDeviceExtension
, pVBInfo
) ;
8850 if ( !( pVBInfo
->SetFlag
& DisableChA
) )
8852 XGI_VBLongWait( pVBInfo
) ;
8853 if ( !( pVBInfo
->SetFlag
& GatingCRT
) )
8855 XGI_DisableGatingCRT( HwDeviceExtension
, pVBInfo
) ;
8856 XGI_DisplayOn( HwDeviceExtension
, pVBInfo
) ;
8857 XGI_VBLongWait( pVBInfo
) ;
8863 if ( pVBInfo
->VBInfo
& ( SetCRT2ToTV
| SetCRT2ToLCD
| SetCRT2ToLCDA
) )
8864 XGINew_SetRegOR( pVBInfo
->Part1Port
, 0x1E , 0x20 ) ; /* enable CRT2 */
8868 tempah
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->Part1Port
, 0x2E ) ;
8869 if ( !( tempah
& 0x80 ) )
8870 XGINew_SetRegOR( pVBInfo
->Part1Port
, 0x2E , 0x80 ) ; /* BVBDOENABLE = 1 */
8872 XGINew_SetRegAND(pVBInfo
->Part1Port
,0x00,0x7F);
8873 XGI_DisplayOn( HwDeviceExtension
, pVBInfo
);
8877 if ( HwDeviceExtension
->jChipType
< XG40
)
8879 if ( !XGI_EnableChISLCD(pVBInfo
) )
8881 if ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) )
8883 if ( XGI_BacklightByDrv(pVBInfo
) )
8890 if ( pVBInfo
->LCDInfo
& SetPWDEnable
)
8892 XGI_FirePWDEnable(pVBInfo
) ;
8896 XGI_SetPanelDelay( 2,pVBInfo
) ;
8898 if ( pVBInfo
->VBType
& ( VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
8901 tempbl
= 0xFE ; /* turn on backlght */
8908 XGI_SetPanelPower( tempah
, tempbl
, pVBInfo
) ;
8913 /* --------------------------------------------------------------------- */
8914 /* Function : XGI_DisableBridge */
8918 /* --------------------------------------------------------------------- */
8919 void XGI_DisableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
8926 if ( pVBInfo
->SetFlag
== Win9xDOSMode
)
8930 if ( HwDeviceExtension
->jChipType
< XG40
)
8932 if ( ( !( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) ) ) || ( XGI_DisableChISLCD(pVBInfo
) ) )
8934 if ( !XGI_IsLCDON(pVBInfo
) )
8936 if ( pVBInfo
->LCDInfo
& SetPWDEnable
)
8937 XGI_EnablePWD( pVBInfo
) ;
8940 pVBInfo
->LCDInfo
&= ~SetPWDEnable
;
8941 XGI_DisablePWD(pVBInfo
) ;
8942 if ( pVBInfo
->VBType
& ( VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
8944 tempbx
= 0xFE ; /* not 01h */
8949 tempbx
= 0xF7 ; /* not 08h */
8952 XGI_SetPanelPower( tempax
, tempbx
, pVBInfo
) ;
8953 XGI_SetPanelDelay( 3,pVBInfo
) ;
8955 } /* end if(!XGI_IsLCDON(pVBInfo)) */
8961 if ( !( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2toLCDA ) ) || ( XGI_DisableChISLCD(pVBInfo) ) )
8963 if ( !XGI_IsLCDON(pVBInfo) )
8967 tempbx = XGINew_GetCH7005( 0x61 ) ;
8968 if ( tempbx < 0x01 ) //first time we power up
8969 XGINew_SetCH7005( 0x0066 ) ; //and disable power sequence
8971 XGINew_SetCH7005( 0x5f66 ) ; //leave VDD on - disable power
8977 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
8980 if ( !( pVBInfo
->VBInfo
& ( DisableCRT2Display
| SetSimuScanMode
) ) )
8982 if ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
)
8984 if ( pVBInfo
->VBInfo
& SetCRT2ToDualEdge
)
8986 tempah
= 0x7F; /* Disable Channel A */
8987 if ( !( pVBInfo
->VBInfo
& SetCRT2ToLCDA
) )
8988 tempah
= 0xBF ; /* Disable Channel B */
8990 if ( pVBInfo
->SetFlag
& DisableChB
)
8991 tempah
&= 0xBF ; /* force to disable Cahnnel */
8993 if ( pVBInfo
->SetFlag
& DisableChA
)
8994 tempah
&= 0x7F ; /* Force to disable Channel B */
8999 XGINew_SetRegAND( pVBInfo
->Part4Port
, 0x1F , tempah
) ; /* disable part4_1f */
9001 if ( pVBInfo
->VBType
& ( VB_XGI302LV
| VB_XGI301C
) )
9003 if ( ( ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) ) ) || ( XGI_DisableChISLCD(pVBInfo
) ) || ( XGI_IsLCDON(pVBInfo
) ) )
9004 XGINew_SetRegOR( pVBInfo
->Part4Port
, 0x30 , 0x80 ) ; /* LVDS Driver power down */
9007 if ( ( pVBInfo
->SetFlag
& DisableChA
) || ( pVBInfo
->VBInfo
& ( DisableCRT2Display
| SetCRT2ToLCDA
| SetSimuScanMode
) ) )
9009 if ( pVBInfo
->SetFlag
& GatingCRT
)
9010 XGI_EnableGatingCRT( HwDeviceExtension
, pVBInfo
) ;
9011 XGI_DisplayOff( HwDeviceExtension
, pVBInfo
) ;
9014 if ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
)
9016 if ( ( pVBInfo
->SetFlag
& DisableChA
) || ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
) )
9017 XGINew_SetRegAND( pVBInfo
->Part1Port
, 0x1e , 0xdf ) ; /* Power down */
9020 XGINew_SetRegAND( pVBInfo
->P3c4
, 0x32 , 0xdf ) ; /* disable TV as primary VGA swap */
9022 if ( ( pVBInfo
->VBInfo
& ( SetSimuScanMode
| SetCRT2ToDualEdge
) ) )
9023 XGINew_SetRegAND(pVBInfo
->Part2Port
,0x00,0xdf);
9025 if ( ( pVBInfo
->SetFlag
& DisableChB
) || ( pVBInfo
->VBInfo
& ( DisableCRT2Display
| SetSimuScanMode
) )
9026 || ( ( !( pVBInfo
->VBInfo
& SetCRT2ToLCDA
) ) && ( pVBInfo
->VBInfo
& ( SetCRT2ToRAMDAC
| SetCRT2ToLCD
| SetCRT2ToTV
) ) ) )
9027 XGINew_SetRegOR( pVBInfo
->Part1Port
, 0x00 , 0x80 ) ; /* BScreenOff=1 */
9029 if ( ( pVBInfo
->SetFlag
& DisableChB
) || ( pVBInfo
->VBInfo
& ( DisableCRT2Display
| SetSimuScanMode
) )
9030 || ( !( pVBInfo
->VBInfo
& SetCRT2ToLCDA
) ) || ( pVBInfo
->VBInfo
& ( SetCRT2ToRAMDAC
| SetCRT2ToLCD
| SetCRT2ToTV
) ) )
9032 tempah
= XGINew_GetReg1( pVBInfo
->Part1Port
, 0x00 ) ; /* save Part1 index 0 */
9033 XGINew_SetRegOR( pVBInfo
->Part1Port
, 0x00 , 0x10 ) ; /* BTDAC = 1, avoid VB reset */
9034 XGINew_SetRegAND( pVBInfo
->Part1Port
, 0x1E , 0xDF ) ; /* disable CRT2 */
9035 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x00 , tempah
) ; /* restore Part1 index 0 */
9040 if ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToTV
) )
9042 XGINew_SetRegOR( pVBInfo
->Part1Port
, 0x00 , 0x80 ) ; /* BScreenOff=1 */
9043 XGINew_SetRegAND( pVBInfo
->Part1Port
, 0x1E , 0xDF ) ; /* Disable CRT2 */
9044 XGINew_SetRegAND( pVBInfo
->P3c4
, 0x32 , 0xDF ) ; /* Disable TV asPrimary VGA swap */
9047 if ( pVBInfo
->VBInfo
& ( DisableCRT2Display
| SetCRT2ToLCDA
| SetSimuScanMode
) )
9048 XGI_DisplayOff( HwDeviceExtension
, pVBInfo
) ;
9054 if ( HwDeviceExtension
->jChipType
< XG40
)
9056 if ( !( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) ) || ( XGI_DisableChISLCD(pVBInfo
) ) || ( XGI_IsLCDON(pVBInfo
) ) )
9058 if ( pVBInfo
->LCDInfo
& SetPWDEnable
)
9060 if ( pVBInfo
->LCDInfo
& SetPWDEnable
)
9061 XGI_BacklightByDrv(pVBInfo
) ;
9064 XGI_SetPanelDelay( 4 ,pVBInfo
) ;
9065 if ( pVBInfo
->VBType
& VB_XGI301LV
)
9077 XGI_SetPanelPower( tempah
, tempbl
, pVBInfo
) ;
9083 /* --------------------------------------------------------------------- */
9084 /* Function : XGI_GetTVPtrIndex */
9087 /* Description : bx 0 : ExtNTSC */
9099 /* --------------------------------------------------------------------- */
9100 USHORT
XGI_GetTVPtrIndex( PVB_DEVICE_INFO pVBInfo
)
9104 if ( pVBInfo
->TVInfo
& SetPALTV
)
9106 if ( pVBInfo
->TVInfo
& SetYPbPrMode1080i
)
9108 if ( pVBInfo
->TVInfo
& SetYPbPrMode525i
)
9110 if ( pVBInfo
->TVInfo
& SetYPbPrMode525p
)
9112 if ( pVBInfo
->TVInfo
& SetYPbPrMode750p
)
9114 if ( pVBInfo
->TVInfo
& TVSimuMode
)
9121 /* --------------------------------------------------------------------- */
9122 /* Function : XGI_OEM310Setting */
9125 /* Description : Customized Param. for 301 */
9126 /* --------------------------------------------------------------------- */
9127 void XGI_OEM310Setting( USHORT ModeNo
, USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
9129 if ( pVBInfo
->SetFlag
& Win9xDOSMode
)
9133 XGI_SetDelayComp(pVBInfo
) ;
9135 if ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) )
9136 XGI_SetLCDCap(pVBInfo
) ;
9138 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
9141 XGI_SetPhaseIncr(pVBInfo
) ;
9142 XGI_SetYFilter( ModeNo
, ModeIdIndex
,pVBInfo
) ;
9143 XGI_SetAntiFlicker( ModeNo
, ModeIdIndex
,pVBInfo
) ;
9145 if ( pVBInfo
->VBType
&VB_XGI301
)
9146 XGI_SetEdgeEnhance( ModeNo
, ModeIdIndex
,pVBInfo
) ;
9151 /* --------------------------------------------------------------------- */
9152 /* Function : XGI_SetDelayComp */
9156 /* --------------------------------------------------------------------- */
9157 void XGI_SetDelayComp( PVB_DEVICE_INFO pVBInfo
)
9165 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
9167 if ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
| SetCRT2ToTV
| SetCRT2ToRAMDAC
) )
9172 index
= XGI_GetTVPtrIndex(pVBInfo
) ; /* Get TV Delay */
9173 tempbl
= pVBInfo
->XGI_TVDelayList
[ index
] ;
9175 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
9176 tempbl
= pVBInfo
->XGI_TVDelayList2
[ index
] ;
9178 if ( pVBInfo
->VBInfo
& SetCRT2ToDualEdge
)
9179 tempbl
= tempbl
>> 4 ;
9181 if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
9182 tempbl = CRT2Delay1 ; // Get CRT2 Delay
9184 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
9185 tempbl = CRT2Delay2 ;
9187 if ( pVBInfo
->VBInfo
& ( SetCRT2ToLCD
| SetCRT2ToLCDA
) )
9189 index
= XGI_GetLCDCapPtr(pVBInfo
) ; /* Get LCD Delay */
9190 tempbh
=pVBInfo
->LCDCapList
[ index
].LCD_DelayCompensation
;
9192 if ( !( pVBInfo
->VBInfo
& SetCRT2ToLCDA
) )
9198 tempah
= XGINew_GetReg1( pVBInfo
->Part1Port
, 0x2D ) ;
9200 if ( pVBInfo
->VBInfo
& ( SetCRT2ToRAMDAC
| SetCRT2ToLCD
| SetCRT2ToTV
) ) /* Channel B */
9206 if ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
) /* Channel A */
9211 XGINew_SetReg1(pVBInfo
->Part1Port
,0x2D,tempah
);
9214 else if ( pVBInfo
->IF_DEF_LVDS
== 1 )
9218 if ( pVBInfo
->VBInfo
& SetCRT2ToLCD
)
9220 tempah
= pVBInfo
->LCDCapList
[ XGI_GetLCDCapPtr(pVBInfo
) ].LCD_DelayCompensation
; /* / Get LCD Delay */
9222 tempah
= tempah
<< 4 ;
9223 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x2D , 0x0f , tempah
) ;
9229 /* --------------------------------------------------------------------- */
9230 /* Function : XGI_SetLCDCap */
9234 /* --------------------------------------------------------------------- */
9235 void XGI_SetLCDCap( PVB_DEVICE_INFO pVBInfo
)
9239 tempcx
= pVBInfo
->LCDCapList
[ XGI_GetLCDCapPtr(pVBInfo
) ].LCD_Capability
;
9241 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
9243 if ( pVBInfo
->VBType
& ( VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
9244 { /* 301LV/302LV only */
9245 /* Set 301LV Capability */
9246 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x24 , ( UCHAR
)( tempcx
& 0x1F ) ) ;
9249 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x0D , ~( ( EnableVBCLKDRVLOW
| EnablePLLSPLOW
) >> 8 ) , ( USHORT
)( ( tempcx
& ( EnableVBCLKDRVLOW
| EnablePLLSPLOW
) ) >> 8 ) ) ;
9252 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
9254 if ( pVBInfo
->VBInfo
& SetCRT2ToLCD
)
9255 XGI_SetLCDCap_B( tempcx
,pVBInfo
) ;
9256 else if ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
)
9257 XGI_SetLCDCap_A( tempcx
,pVBInfo
) ;
9259 if ( pVBInfo
->VBType
& ( VB_XGI302LV
| VB_XGI301C
) )
9261 if ( tempcx
& EnableSpectrum
)
9262 SetSpectrum( pVBInfo
) ;
9265 else /* LVDS,CH7017 */
9266 XGI_SetLCDCap_A( tempcx
, pVBInfo
) ;
9270 /* --------------------------------------------------------------------- */
9271 /* Function : XGI_SetLCDCap_A */
9275 /* --------------------------------------------------------------------- */
9276 void XGI_SetLCDCap_A(USHORT tempcx
,PVB_DEVICE_INFO pVBInfo
)
9280 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x37 ) ;
9282 if ( temp
& LCDRGB18Bit
)
9284 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x19 , 0x0F , ( USHORT
)( 0x20 | ( tempcx
& 0x00C0 ) ) ) ; /* Enable Dither */
9285 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x1A , 0x7F , 0x80 ) ;
9289 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x19 , 0x0F , ( USHORT
)( 0x30 | ( tempcx
& 0x00C0 ) ) ) ;
9290 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x1A , 0x7F , 0x00 ) ;
9294 if ( tempcx & EnableLCD24bpp ) // 24bits
9296 XGINew_SetRegANDOR(pVBInfo->Part1Port,0x19, 0x0F,(USHORT)(0x30|(tempcx&0x00C0)) );
9297 XGINew_SetRegANDOR(pVBInfo->Part1Port,0x1A,0x7F,0x00);
9301 XGINew_SetRegANDOR(pVBInfo->Part1Port,0x19, 0x0F,(USHORT)(0x20|(tempcx&0x00C0)) );//Enable Dither
9302 XGINew_SetRegANDOR(pVBInfo->Part1Port,0x1A,0x7F,0x80);
9308 /* --------------------------------------------------------------------- */
9309 /* Function : XGI_SetLCDCap_B */
9310 /* Input : cx -> LCD Capability */
9313 /* --------------------------------------------------------------------- */
9314 void XGI_SetLCDCap_B(USHORT tempcx
,PVB_DEVICE_INFO pVBInfo
)
9316 if ( tempcx
& EnableLCD24bpp
) /* 24bits */
9317 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x1A , 0xE0 , ( USHORT
)( ( ( tempcx
& 0x00ff ) >> 6 ) | 0x0c ) ) ;
9319 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x1A , 0xE0 , ( USHORT
)( ( ( tempcx
& 0x00ff ) >> 6 ) | 0x18 ) ) ; /* Enable Dither */
9323 /* --------------------------------------------------------------------- */
9324 /* Function : SetSpectrum */
9328 /* --------------------------------------------------------------------- */
9329 void SetSpectrum( PVB_DEVICE_INFO pVBInfo
)
9333 index
= XGI_GetLCDCapPtr(pVBInfo
) ;
9335 XGINew_SetRegAND( pVBInfo
->Part4Port
, 0x30 , 0x8F ) ; /* disable down spectrum D[4] */
9336 XGI_LongWait(pVBInfo
) ;
9337 XGINew_SetRegOR( pVBInfo
->Part4Port
, 0x30 , 0x20 ) ; /* reset spectrum */
9338 XGI_LongWait(pVBInfo
) ;
9340 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x31 , pVBInfo
->LCDCapList
[ index
].Spectrum_31
) ;
9341 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x32 , pVBInfo
->LCDCapList
[ index
].Spectrum_32
) ;
9342 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x33 , pVBInfo
->LCDCapList
[ index
].Spectrum_33
) ;
9343 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x34 , pVBInfo
->LCDCapList
[ index
].Spectrum_34
) ;
9344 XGI_LongWait(pVBInfo
) ;
9345 XGINew_SetRegOR( pVBInfo
->Part4Port
, 0x30 , 0x40 ) ; /* enable spectrum */
9349 /* --------------------------------------------------------------------- */
9350 /* Function : XGI_SetAntiFlicker */
9353 /* Description : Set TV Customized Param. */
9354 /* --------------------------------------------------------------------- */
9355 void XGI_SetAntiFlicker( USHORT ModeNo
, USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
9362 if (pVBInfo
->TVInfo
& ( SetYPbPrMode525p
| SetYPbPrMode750p
) )
9365 tempbx
= XGI_GetTVPtrIndex(pVBInfo
) ;
9368 if ( ModeNo
<= 0x13 )
9370 index
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].VB_StTVFlickerIndex
;
9374 index
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].VB_ExtTVFlickerIndex
;
9378 tempah
= TVAntiFlickList
[ tempbx
] ;
9379 tempah
= tempah
<< 4 ;
9381 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x0A , 0x8F , tempah
) ;
9385 /* --------------------------------------------------------------------- */
9386 /* Function : XGI_SetEdgeEnhance */
9390 /* --------------------------------------------------------------------- */
9391 void XGI_SetEdgeEnhance( USHORT ModeNo
, USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
9399 tempbx
= XGI_GetTVPtrIndex(pVBInfo
) ;
9402 if ( ModeNo
<= 0x13 )
9404 index
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].VB_StTVEdgeIndex
;
9408 index
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].VB_ExtTVEdgeIndex
;
9412 tempah
= TVEdgeList
[ tempbx
] ;
9413 tempah
= tempah
<< 5 ;
9415 XGINew_SetRegANDOR( pVBInfo
->Part2Port
, 0x3A , 0x1F , tempah
) ;
9419 /* --------------------------------------------------------------------- */
9420 /* Function : XGI_SetPhaseIncr */
9424 /* --------------------------------------------------------------------- */
9425 void XGI_SetPhaseIncr( PVB_DEVICE_INFO pVBInfo
)
9434 XGI_GetTVPtrIndex2( &tempbx
, &tempcl
, &tempch
, pVBInfo
) ; /* bx, cl, ch */
9435 tempData
= TVPhaseList
[ tempbx
] ;
9437 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x31 , ( USHORT
)( tempData
& 0x000000FF ) ) ;
9438 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x32 , ( USHORT
)( ( tempData
& 0x0000FF00 ) >> 8 ) ) ;
9439 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x33 , ( USHORT
)( ( tempData
& 0x00FF0000 ) >> 16 ) ) ;
9440 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x34 , ( USHORT
)( ( tempData
& 0xFF000000 ) >> 24 ) ) ;
9444 /* --------------------------------------------------------------------- */
9445 /* Function : XGI_SetYFilter */
9449 /* --------------------------------------------------------------------- */
9450 void XGI_SetYFilter( USHORT ModeNo
, USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
9460 XGI_GetTVPtrIndex2( &tempbx
, &tempcl
, &tempch
, pVBInfo
) ; /* bx, cl, ch */
9466 filterPtr
= NTSCYFilter1
;
9470 filterPtr
= PALYFilter1
;
9476 filterPtr
= PALMYFilter1
;
9480 filterPtr
= PALNYFilter1
;
9485 filterPtr
= NTSCYFilter2
;
9489 filterPtr
= PALMYFilter2
;
9493 filterPtr
= PALNYFilter2
;
9497 filterPtr
= PALYFilter2
;
9504 if ( ModeNo
<= 0x13 )
9505 tempal
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].VB_StTVYFilterIndex
;
9507 tempal
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].VB_ExtTVYFilterIndex
;
9514 if ( ( tempcl
== 0 ) && ( tempch
== 1 ) )
9516 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x35 , 0 ) ;
9517 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x36 , 0 ) ;
9518 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x37 , 0 ) ;
9519 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x38 , filterPtr
[ index
++ ] ) ;
9523 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x35 , filterPtr
[ index
++ ] ) ;
9524 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x36 , filterPtr
[ index
++ ] ) ;
9525 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x37 , filterPtr
[ index
++ ] ) ;
9526 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x38 , filterPtr
[ index
++ ] ) ;
9529 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
9531 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x48 , filterPtr
[ index
++ ] ) ;
9532 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x49 , filterPtr
[ index
++ ] ) ;
9533 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x4A , filterPtr
[ index
++ ] ) ;
9538 /* --------------------------------------------------------------------- */
9539 /* Function : XGI_GetTVPtrIndex2 */
9541 /* Output : bx 0 : NTSC */
9545 /* 4 : NTSC1024x768 */
9546 /* 5 : PAL-M 1024x768 */
9548 /* cl 0 : YFilter1 */
9551 /* 1 : 301B/302B/301LV/302LV */
9553 /* --------------------------------------------------------------------- */
9554 void XGI_GetTVPtrIndex2(USHORT
* tempbx
,UCHAR
* tempcl
,UCHAR
* tempch
, PVB_DEVICE_INFO pVBInfo
)
9560 if ( pVBInfo
->TVInfo
& SetPALTV
)
9563 if ( pVBInfo
->TVInfo
& SetPALMTV
)
9566 if ( pVBInfo
->TVInfo
& SetPALNTV
)
9569 if ( pVBInfo
->TVInfo
& NTSC1024x768
)
9572 if ( pVBInfo
->TVInfo
& SetPALMTV
)
9576 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
9578 if ( ( !( pVBInfo
->VBInfo
& SetInSlaveMode
) ) || ( pVBInfo
->TVInfo
& TVSimuMode
) )
9585 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
9590 /* --------------------------------------------------------------------- */
9591 /* Function : XGI_SetCRT2ModeRegs */
9594 /* Description : Origin code for crt2group */
9595 /* --------------------------------------------------------------------- */
9596 void XGI_SetCRT2ModeRegs(USHORT ModeNo
,PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
9603 /* XGINew_SetReg1( pVBInfo->Part1Port , 0x03 , 0x00 ) ; // fix write part1 index 0 BTDRAM bit Bug */
9605 if ( !( pVBInfo
->VBInfo
& DisableCRT2Display
) )
9607 tempah
=XGINew_GetReg1( pVBInfo
->Part1Port
, 0x00 ) ;
9608 tempah
&= ~0x10 ; /* BTRAMDAC */
9609 tempah
|= 0x40 ; /* BTRAM */
9611 if ( pVBInfo
->VBInfo
& ( SetCRT2ToRAMDAC
| SetCRT2ToTV
| SetCRT2ToLCD
) )
9613 tempah
=0x40; /* BTDRAM */
9614 if ( ModeNo
> 0x13 )
9616 tempcl
= pVBInfo
->ModeType
;
9620 tempah
= ( 0x008 >> tempcl
) ; /* BT Color */
9626 if ( pVBInfo
->VBInfo
& SetInSlaveMode
)
9627 tempah
^= 0x50 ; /* BTDAC */
9632 if ( pVBInfo->VBInfo & DisableCRT2Display )
9637 XGINew_SetReg1( pVBInfo->Part1Port , 0x00 , tempah ) ;
9638 if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD ) )
9640 tempcl = pVBInfo->ModeType ;
9641 if ( ModeNo > 0x13 )
9644 if ( ( tempcl > 0 ) || ( tempcl == 0 ) )
9646 tempah=(0x008>>tempcl) ;
9657 if ( pVBInfo->VBInfo & SetInSlaveMode )
9659 tempah = ( tempah ^ 0x050 ) ;
9664 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x00 , tempah
) ;
9668 if ( pVBInfo
->VBInfo
& DisableCRT2Display
)
9669 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x2e , tempbl
, tempah
) ;
9675 if ( pVBInfo
->VBInfo
& ( SetCRT2ToRAMDAC
| SetCRT2ToTV
| SetCRT2ToLCD
| SetCRT2ToLCDA
) )
9677 if ( ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
) && ( !( pVBInfo
->VBInfo
& SetSimuScanMode
) ) )
9681 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x2e , tempbl
, tempah
) ;
9685 if ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
)
9691 if ( pVBInfo
->VBInfo
& ( SetCRT2ToRAMDAC
| SetCRT2ToTV
| SetCRT2ToLCD
) )
9696 if ( !( pVBInfo
->VBInfo
& SetInSlaveMode
) )
9699 if ( !( pVBInfo
->VBInfo
& SetCRT2ToRAMDAC
) )
9701 tempah
= tempah
^ 0x05 ;
9702 if ( !( pVBInfo
->VBInfo
& SetCRT2ToLCD
) )
9703 tempah
= tempah
^ 0x01 ;
9706 if ( !( pVBInfo
->VBInfo
& SetCRT2ToDualEdge
) )
9708 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x2e , tempbl
, tempah
) ;
9711 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x2e , tempbl
, tempah
) ;
9715 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x2e , tempbl
, tempah
) ;
9718 if ( pVBInfo
->VBInfo
& ( SetCRT2ToRAMDAC
| SetCRT2ToTV
| SetCRT2ToLCD
| SetCRT2ToLCDA
) )
9720 tempah
&= ( ~0x08 ) ;
9721 if ( ( pVBInfo
->ModeType
== ModeVGA
) && ( !( pVBInfo
->VBInfo
& SetInSlaveMode
) ) )
9727 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
9729 /* if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) ) */
9732 if ( ModeNo
> 0x13 )
9734 if ( pVBInfo
->VBInfo
& DriverMode
)
9735 tempah
= tempah
^ 0x20 ;
9740 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x0D , ~0x0BF , tempah
) ;
9743 if ( pVBInfo
->LCDInfo
& SetLCDDualLink
)
9746 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
9748 /* if ( ( !( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) ) && ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) ) ) */
9750 if ( pVBInfo
->TVInfo
& RPLLDIV2XO
)
9755 if ( ( pVBInfo
->LCDResInfo
== Panel1280x1024
) || ( pVBInfo
->LCDResInfo
== Panel1280x1024x75
) )
9758 if ( pVBInfo
->LCDResInfo
== Panel1280x960
)
9761 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x0C , tempah
) ;
9764 if ( pVBInfo
->VBType
& ( VB_XGI301B
| VB_XGI302B
| VB_XGI301LV
| VB_XGI302LV
| VB_XGI301C
) )
9769 if ( pVBInfo
->VBInfo
& SetCRT2ToDualEdge
)
9772 if ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
)
9773 tempah
|= 0x04 ; /* shampoo 0129 */
9776 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x13 , tempbl
, tempah
) ;
9779 if ( !( pVBInfo
->VBInfo
& DisableCRT2Display
) )
9781 if ( pVBInfo
->VBInfo
& SetCRT2ToDualEdge
)
9785 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x2c , tempbl
, tempah
) ;
9789 if ( !( pVBInfo
->VBInfo
& DisableCRT2Display
) )
9791 if ( pVBInfo
->VBInfo
& SetCRT2ToDualEdge
)
9794 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x21 , tempbl
, tempah
) ;
9799 if ( !( pVBInfo
->VBInfo
& SetCRT2ToLCDA
) )
9802 if ( !( pVBInfo
->VBInfo
& SetCRT2ToDualEdge
) )
9806 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x23 , tempbl
, tempah
) ;
9808 if ( pVBInfo
->VBType
& ( VB_XGI302LV
| VB_XGI301C
) )
9810 if ( pVBInfo
->LCDInfo
& SetLCDDualLink
)
9812 XGINew_SetRegOR( pVBInfo
->Part4Port
, 0x27 , 0x20 ) ;
9813 XGINew_SetRegOR( pVBInfo
->Part4Port
, 0x34 , 0x10 ) ;
9819 /* --------------------------------------------------------------------- */
9820 /* Function : XGI_CloseCRTC */
9824 /* --------------------------------------------------------------------- */
9825 void XGI_CloseCRTC( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
9831 if ( pVBInfo
->VBInfo
& SetCRT2ToLCDA
)
9838 /* --------------------------------------------------------------------- */
9839 /* Function : XGI_OpenCRTC */
9843 /* --------------------------------------------------------------------- */
9844 void XGI_OpenCRTC( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
9854 /* --------------------------------------------------------------------- */
9855 /* Function : XGI_GetRAMDAC2DATA */
9859 /* --------------------------------------------------------------------- */
9860 void XGI_GetRAMDAC2DATA(USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PVB_DEVICE_INFO pVBInfo
)
9871 pVBInfo
->RVBHCMAX
= 1 ;
9872 pVBInfo
->RVBHCFACT
= 1 ;
9874 if ( ModeNo
<= 0x13 )
9876 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
;
9877 StandTableIndex
= XGI_GetModePtr( ModeNo
, ModeIdIndex
, pVBInfo
) ;
9878 tempax
= pVBInfo
->StandTable
[ StandTableIndex
].CRTC
[ 0 ] ;
9879 tempbx
= pVBInfo
->StandTable
[StandTableIndex
].CRTC
[ 6 ] ;
9880 temp1
= pVBInfo
->StandTable
[ StandTableIndex
].CRTC
[ 7 ] ;
9884 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
9885 CRT1Index
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT1CRTC
;
9886 CRT1Index
&= IndexMask
;
9887 temp1
= ( USHORT
)pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 0 ] ;
9888 temp2
= ( USHORT
)pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 5 ] ;
9889 tempax
= ( temp1
& 0xFF ) | ( ( temp2
& 0x03 ) << 8 ) ;
9890 tempbx
= ( USHORT
)pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 8 ] ;
9891 tempcx
= ( USHORT
)pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 14 ] << 8 ;
9893 tempcx
= tempcx
<< 2 ;
9895 temp1
= ( USHORT
)pVBInfo
->XGINEWUB_CRT1Table
[ CRT1Index
].CR
[ 9 ] ;
9905 if ( modeflag
& Charx8Dot
)
9910 pVBInfo
->VGAHT
= tempax
;
9911 pVBInfo
->HT
= tempax
;
9913 pVBInfo
->VGAVT
= tempbx
;
9914 pVBInfo
->VT
= tempbx
;
9919 /* --------------------------------------------------------------------- */
9920 /* Function : XGI_GetColorDepth */
9924 /* --------------------------------------------------------------------- */
9925 USHORT
XGI_GetColorDepth(USHORT ModeNo
, USHORT ModeIdIndex
, PVB_DEVICE_INFO pVBInfo
)
9927 USHORT ColorDepth
[ 6 ] = { 1 , 2 , 4 , 4 , 6 , 8 } ;
9931 if ( ModeNo
<= 0x13 )
9933 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
;
9937 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
;
9940 index
=(modeflag
&ModeInfoFlag
)-ModeEGA
;
9945 return( ColorDepth
[ index
] ) ;
9950 /* --------------------------------------------------------------------- */
9951 /* Function : XGI_UnLockCRT2 */
9955 /* --------------------------------------------------------------------- */
9956 void XGI_UnLockCRT2( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
9959 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x2f , 0xFF , 0x01 ) ;
9964 /* --------------------------------------------------------------------- */
9965 /* Function : XGI_LockCRT2 */
9969 /* --------------------------------------------------------------------- */
9970 void XGI_LockCRT2( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
9973 XGINew_SetRegANDOR( pVBInfo
->Part1Port
, 0x2F , 0xFE , 0x00 ) ;
9979 /* --------------------------------------------------------------------- */
9980 /* Function : XGINew_EnableCRT2 */
9984 /* --------------------------------------------------------------------- */
9985 void XGINew_EnableCRT2( PVB_DEVICE_INFO pVBInfo
)
9987 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x1E , 0xFF , 0x20 ) ;
9992 /* --------------------------------------------------------------------- */
9997 /* --------------------------------------------------------------------- */
9998 void XGINew_LCD_Wait_Time(UCHAR DelayTime
, PVB_DEVICE_INFO pVBInfo
)
10007 //printk("XGINew_LCD_Wait_Time");
10009 for( i
= 0 ; i
< DelayTime
; i
++ )
10011 for( j
= 0 ; j
< 66 ; j
++ )
10014 temp
= XGINew_GetReg3( 0x61 ) ;
10016 //temp &= 0x10000000;
10018 if ( temp
== flag
)
10029 /* --------------------------------------------------------------------- */
10030 /* Function : XGI_BridgeIsOn */
10033 /* Description : */
10034 /* --------------------------------------------------------------------- */
10035 BOOLEAN
XGI_BridgeIsOn( PVB_DEVICE_INFO pVBInfo
)
10039 if ( pVBInfo
->IF_DEF_LVDS
== 1 )
10045 flag
= XGINew_GetReg1( pVBInfo
->Part4Port
, 0x00 ) ;
10046 if ( ( flag
== 1 ) || ( flag
== 2 ) )
10047 return( 1 ) ; /* 301b */
10055 /* --------------------------------------------------------------------- */
10056 /* Function : XGI_LongWait */
10059 /* Description : */
10060 /* --------------------------------------------------------------------- */
10061 void XGI_LongWait(PVB_DEVICE_INFO pVBInfo
)
10065 i
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x1F ) ;
10067 if ( !( i
& 0xC0 ) )
10069 for( i
= 0 ; i
< 0xFFFF ; i
++ )
10071 if ( !( XGINew_GetReg2( pVBInfo
->P3da
) & 0x08 ) )
10075 for( i
= 0 ; i
< 0xFFFF ; i
++ )
10077 if ( ( XGINew_GetReg2( pVBInfo
->P3da
) & 0x08 ) )
10084 /* --------------------------------------------------------------------- */
10085 /* Function : XGI_VBLongWait */
10088 /* Description : */
10089 /* --------------------------------------------------------------------- */
10090 void XGI_VBLongWait( PVB_DEVICE_INFO pVBInfo
)
10097 if ( !( pVBInfo
->VBInfo
& SetCRT2ToTV
) )
10100 for( i
= 0 ; i
< 3 ; i
++ )
10102 for( j
= 0 ; j
< 100 ; j
++ )
10104 tempal
= XGINew_GetReg2( pVBInfo
->P3da
) ;
10106 { /* VBWaitMode2 */
10107 if ( ( tempal
& 0x08 ) )
10112 if ( !( tempal
& 0x08 ) )
10118 { /* VBWaitMode1 */
10119 if ( !( tempal
& 0x08 ) )
10124 if ( ( tempal
& 0x08 ) )
10130 temp
= temp
^ 0x01 ;
10135 XGI_LongWait(pVBInfo
) ;
10143 /* --------------------------------------------------------------------- */
10144 /* Function : XGI_GetVGAHT2 */
10147 /* Description : */
10148 /* --------------------------------------------------------------------- */
10149 USHORT
XGI_GetVGAHT2( PVB_DEVICE_INFO pVBInfo
)
10154 tempbx
= ( ( pVBInfo
->VGAVT
- pVBInfo
->VGAVDE
) * pVBInfo
->RVBHCMAX
) & 0xFFFF ;
10155 tempax
= ( pVBInfo
->VT
- pVBInfo
->VDE
) * pVBInfo
->RVBHCFACT
;
10156 tempax
= ( tempax
* pVBInfo
->HT
) /tempbx
;
10158 return( ( USHORT
)tempax
) ;
10162 /* --------------------------------------------------------------------- */
10163 /* Function : XGI_GetVCLK2Ptr */
10166 /* Description : */
10167 /* --------------------------------------------------------------------- */
10168 USHORT
XGI_GetVCLK2Ptr( USHORT ModeNo
, USHORT ModeIdIndex
, USHORT RefreshRateTableIndex
, PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
)
10172 USHORT LCDXlat1VCLK
[ 4 ] = { VCLK65
+ 2 , VCLK65
+ 2 , VCLK65
+ 2 , VCLK65
+ 2 } ;
10173 USHORT LCDXlat2VCLK
[ 4 ] = { VCLK108_2
+ 5 , VCLK108_2
+ 5 , VCLK108_2
+ 5 , VCLK108_2
+ 5 } ;
10174 USHORT LVDSXlat1VCLK
[ 4 ] = { VCLK40
, VCLK40
, VCLK40
, VCLK40
} ;
10175 USHORT LVDSXlat2VCLK
[ 4 ] = { VCLK65
+ 2 , VCLK65
+ 2 , VCLK65
+ 2 , VCLK65
+ 2 } ;
10176 USHORT LVDSXlat3VCLK
[ 4 ] = { VCLK65
+ 2 , VCLK65
+ 2 , VCLK65
+ 2 , VCLK65
+ 2 } ;
10178 USHORT CRT2Index
, VCLKIndex
;
10179 USHORT modeflag
, resinfo
;
10180 UCHAR
*CHTVVCLKPtr
= NULL
;
10182 if ( ModeNo
<= 0x13 )
10184 modeflag
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ModeFlag
; /* si+St_ResInfo */
10185 resinfo
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_ResInfo
;
10186 CRT2Index
= pVBInfo
->SModeIDTable
[ ModeIdIndex
].St_CRT2CRTC
;
10190 modeflag
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeFlag
; /* si+Ext_ResInfo */
10191 resinfo
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_RESINFO
;
10192 CRT2Index
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRT2CRTC
;
10195 if ( pVBInfo
->IF_DEF_LVDS
== 0 )
10197 CRT2Index
= CRT2Index
>> 6 ; /* for LCD */
10198 if ( ( ( pVBInfo
->VBInfo
& SetCRT2ToLCD
) | SetCRT2ToLCDA
) ) /*301b*/
10200 if ( pVBInfo
->LCDResInfo
!= Panel1024x768
)
10202 VCLKIndex
= LCDXlat2VCLK
[ CRT2Index
] ;
10206 VCLKIndex
= LCDXlat1VCLK
[ CRT2Index
] ;
10211 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
10213 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
10215 if ( pVBInfo
->SetFlag
& RPLLDIV2XO
)
10217 VCLKIndex
= HiTVVCLKDIV2
;
10225 VCLKIndex
= HiTVVCLK
;
10232 if ( pVBInfo
->SetFlag
& TVSimuMode
)
10234 if( modeflag
& Charx8Dot
)
10236 VCLKIndex
= HiTVSimuVCLK
;
10244 VCLKIndex
= HiTVTextVCLK
;
10252 if ( pVBInfo
->VBType
& VB_XGI301LV
) /* 301lv */
10254 if ( !( pVBInfo
->VBExtInfo
== VB_YPbPr1080i
) )
10256 VCLKIndex
= YPbPr750pVCLK
;
10257 if ( !( pVBInfo
->VBExtInfo
== VB_YPbPr750p
) )
10259 VCLKIndex
= YPbPr525pVCLK
;
10260 if ( !( pVBInfo
->VBExtInfo
== VB_YPbPr525p
) )
10262 VCLKIndex
= YPbPr525iVCLK_2
;
10263 if ( !( pVBInfo
->SetFlag
& RPLLDIV2XO
) )
10264 VCLKIndex
= YPbPr525iVCLK
;
10272 if ( pVBInfo
->VBInfo
& SetCRT2ToTV
)
10274 if ( pVBInfo
->SetFlag
& RPLLDIV2XO
)
10276 VCLKIndex
= TVVCLKDIV2
;
10284 VCLKIndex
= TVVCLK
;
10295 VCLKIndex
= ( UCHAR
)XGINew_GetReg2( ( pVBInfo
->P3ca
+ 0x02 ) ) ; /* Port 3cch */
10296 VCLKIndex
= ( ( VCLKIndex
>> 2 ) & 0x03 ) ;
10297 if ( ModeNo
> 0x13 )
10299 VCLKIndex
= pVBInfo
->RefIndex
[ RefreshRateTableIndex
].Ext_CRTVCLK
; /* di+Ext_CRTVCLK */
10300 VCLKIndex
&= IndexMask
;
10307 if ( ModeNo
<= 0x13 )
10308 VCLKIndex
= CRT2Index
;
10310 VCLKIndex
= CRT2Index
;
10312 if ( pVBInfo
->IF_DEF_CH7005
== 1 )
10314 if ( !( pVBInfo
->VBInfo
& SetCRT2ToLCD
) )
10316 VCLKIndex
&= 0x1f ;
10319 if ( pVBInfo
->VBInfo
& SetPALTV
)
10322 if ( pVBInfo
->VBInfo
& SetCHTVOverScan
)
10328 CHTVVCLKPtr
= pVBInfo
->CHTVVCLKUNTSC
;
10331 CHTVVCLKPtr
= pVBInfo
->CHTVVCLKONTSC
;
10334 CHTVVCLKPtr
= pVBInfo
->CHTVVCLKUPAL
;
10337 CHTVVCLKPtr
= pVBInfo
->CHTVVCLKOPAL
;
10343 VCLKIndex
= CHTVVCLKPtr
[ VCLKIndex
] ;
10348 VCLKIndex
= VCLKIndex
>> 6 ;
10349 if ( ( pVBInfo
->LCDResInfo
== Panel800x600
) || ( pVBInfo
->LCDResInfo
== Panel320x480
) )
10350 VCLKIndex
= LVDSXlat1VCLK
[ VCLKIndex
] ;
10351 else if ( ( pVBInfo
->LCDResInfo
== Panel1024x768
) || ( pVBInfo
->LCDResInfo
== Panel1024x768x75
) )
10352 VCLKIndex
= LVDSXlat2VCLK
[ VCLKIndex
] ;
10354 VCLKIndex
= LVDSXlat3VCLK
[ VCLKIndex
] ;
10357 /* VCLKIndex = VCLKIndex&IndexMask ; */
10361 return( VCLKIndex
) ;