| #include "osdef.h" |
| |
| #ifdef TC |
| #include <stdio.h> |
| #include <string.h> |
| #include <conio.h> |
| #include <dos.h> |
| #endif |
| |
| |
| #ifdef LINUX_XF86 |
| #include "xf86.h" |
| #include "xf86PciInfo.h" |
| #include "xgi.h" |
| #include "xgi_regs.h" |
| #endif |
| |
| #ifdef LINUX_KERNEL |
| #include <asm/io.h> |
| #include <linux/types.h> |
| #include <linux/version.h> |
| #include "XGIfb.h" |
| /*#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) |
| #include <video/XGIfb.h> |
| #else |
| #include <linux/XGIfb.h> |
| #endif*/ |
| #endif |
| |
| #ifdef WIN2000 |
| #include <dderror.h> |
| #include <devioctl.h> |
| #include <miniport.h> |
| #include <ntddvdeo.h> |
| #include <video.h> |
| |
| #include "xgiv.h" |
| #include "dd_i2c.h" |
| #include "tools.h" |
| #endif |
| |
| #include "vb_def.h" |
| #include "vgatypes.h" |
| #include "vb_struct.h" |
| #include "vb_util.h" |
| #include "vb_table.h" |
| |
| |
| |
| #define IndexMask 0xff |
| #ifndef XGI_MASK_DUAL_CHIP |
| #define XGI_MASK_DUAL_CHIP 0x04 /* SR3A */ |
| #endif |
| |
| |
| |
| BOOLEAN XGI_IsLCDDualLink(PVB_DEVICE_INFO pVBInfo); |
| BOOLEAN XGI_SetCRT2Group301(USHORT ModeNo, PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo); |
| BOOLEAN XGI_BacklightByDrv(PVB_DEVICE_INFO pVBInfo); |
| |
| BOOLEAN XGI_IsLCDON(PVB_DEVICE_INFO pVBInfo); |
| BOOLEAN XGI_DisableChISLCD(PVB_DEVICE_INFO pVBInfo); |
| BOOLEAN XGI_EnableChISLCD(PVB_DEVICE_INFO pVBInfo); |
| BOOLEAN XGI_AjustCRT2Rate(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,USHORT *i, PVB_DEVICE_INFO pVBInfo); |
| BOOLEAN XGI_SearchModeID( USHORT ModeNo,USHORT *ModeIdIndex, PVB_DEVICE_INFO pVBInfo); |
| BOOLEAN XGI_GetLCDInfo(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); |
| BOOLEAN XGISetModeNew( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT ModeNo ) ; |
| BOOLEAN XGI_BridgeIsOn(PVB_DEVICE_INFO pVBInfo); |
| UCHAR XGI_GetModePtr( USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo); |
| USHORT XGI_GetOffset(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo); |
| USHORT XGI_GetRatePtrCRT2( PXGI_HW_DEVICE_INFO pXGIHWDE, USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo ); |
| USHORT XGI_GetResInfo(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); |
| USHORT XGI_GetColorDepth(USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo); |
| USHORT XGI_GetVGAHT2(PVB_DEVICE_INFO pVBInfo); |
| USHORT XGI_GetVCLK2Ptr(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo); |
| void XGI_VBLongWait(PVB_DEVICE_INFO pVBInfo); |
| void XGI_SaveCRT2Info(USHORT ModeNo, PVB_DEVICE_INFO pVBInfo); |
| void XGI_GetCRT2Data(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_GetCRT2ResInfo(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_PreSetGroup1(USHORT ModeNo,USHORT ModeIdIndex, PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetGroup1(USHORT ModeNo,USHORT ModeIdIndex, PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetLockRegs(USHORT ModeNo,USHORT ModeIdIndex, PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetLCDRegs(USHORT ModeNo,USHORT ModeIdIndex, PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetGroup2(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetGroup3(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetGroup4(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetGroup5(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); |
| void* XGI_GetLcdPtr(USHORT BX, USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); |
| void* XGI_GetTVPtr(USHORT BX, USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_FirePWDEnable(PVB_DEVICE_INFO pVBInfo); |
| void XGI_EnableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo); |
| void XGI_DisableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetPanelDelay(USHORT tempbl, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetPanelPower(USHORT tempah,USHORT tempbl, PVB_DEVICE_INFO pVBInfo); |
| void XGI_EnablePWD( PVB_DEVICE_INFO pVBInfo); |
| void XGI_DisablePWD( PVB_DEVICE_INFO pVBInfo); |
| void XGI_AutoThreshold( PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetTap4Regs( PVB_DEVICE_INFO pVBInfo); |
| |
| void XGI_DisplayOn(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo); |
| void XGI_DisplayOff( PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo ); |
| void XGI_SetCRT1Group(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetXG21CRTC(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetXG21LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo); |
| void XGI_SetXG27CRTC(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetXG27LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo); |
| void XGI_UpdateXG21CRTC(USHORT ModeNo, PVB_DEVICE_INFO pVBInfo, USHORT RefreshRateTableIndex); |
| void XGI_WaitDisply(PVB_DEVICE_INFO pVBInfo); |
| void XGI_SenseCRT1(PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetSeqRegs(USHORT ModeNo,USHORT StandTableIndex,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetMiscRegs(USHORT StandTableIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetCRTCRegs(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT StandTableIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetATTRegs(USHORT ModeNo,USHORT StandTableIndex,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo ); |
| void XGI_SetGRCRegs(USHORT StandTableIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_ClearExt1Regs(PVB_DEVICE_INFO pVBInfo); |
| |
| void XGI_SetSync(USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetCRT1CRTC(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo,PXGI_HW_DEVICE_INFO HwDeviceExtension); |
| void XGI_SetCRT1Timing_H(PVB_DEVICE_INFO pVBInfo,PXGI_HW_DEVICE_INFO HwDeviceExtension); |
| void XGI_SetCRT1Timing_V(USHORT ModeIdIndex,USHORT ModeNo,PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetCRT1DE(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetCRT1VCLK(USHORT ModeNo,USHORT ModeIdIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetCRT1FIFO(USHORT ModeNo,PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetCRT1ModeRegs(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetVCLKState(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo,USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo); |
| |
| void XGI_LoadDAC(USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo); |
| void XGI_WriteDAC(USHORT dl, USHORT ah, USHORT al, USHORT dh, PVB_DEVICE_INFO pVBInfo); |
| /*void XGI_ClearBuffer(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo,PVB_DEVICE_INFO pVBInfo);*/ |
| void XGI_SetLCDAGroup(USHORT ModeNo,USHORT ModeIdIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo); |
| void XGI_GetLVDSResInfo( USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo); |
| void XGI_GetLVDSData(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo); |
| void XGI_ModCRT1Regs(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetLVDSRegs(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo); |
| void XGI_UpdateModeInfo(PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo); |
| void XGI_GetVGAType(PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo); |
| void XGI_GetVBType(PVB_DEVICE_INFO pVBInfo); |
| void XGI_GetVBInfo(USHORT ModeNo,USHORT ModeIdIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo); |
| void XGI_GetTVInfo(USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetCRT2ECLK( USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo); |
| void InitTo330Pointer(UCHAR,PVB_DEVICE_INFO pVBInfo); |
| void XGI_GetLCDSync(USHORT* HSyncWidth, USHORT* VSyncWidth, PVB_DEVICE_INFO pVBInfo); |
| void XGI_DisableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo); |
| void XGI_EnableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetCRT2VCLK(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_OEM310Setting(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetDelayComp(PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetLCDCap(PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetLCDCap_A(USHORT tempcx,PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetLCDCap_B(USHORT tempcx,PVB_DEVICE_INFO pVBInfo); |
| void SetSpectrum(PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetAntiFlicker(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetEdgeEnhance(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetPhaseIncr(PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetYFilter(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_GetTVPtrIndex2(USHORT* tempbx,UCHAR* tempcl,UCHAR* tempch, PVB_DEVICE_INFO pVBInfo); |
| USHORT XGI_GetTVPtrIndex( PVB_DEVICE_INFO pVBInfo ); |
| void XGI_SetCRT2ModeRegs(USHORT ModeNo,PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo ); |
| void XGI_CloseCRTC(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo); |
| void XGI_OpenCRTC(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo); |
| void XGI_GetRAMDAC2DATA(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_UnLockCRT2(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo); |
| void XGI_LockCRT2(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo); |
| void XGINew_EnableCRT2(PVB_DEVICE_INFO pVBInfo); |
| void XGINew_LCD_Wait_Time(UCHAR DelayTime, PVB_DEVICE_INFO pVBInfo); |
| void XGI_LongWait(PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetCRT1Offset( USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex , PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo ); |
| void XGI_GetLCDVCLKPtr(UCHAR* di_0,UCHAR *di_1, PVB_DEVICE_INFO pVBInfo); |
| UCHAR XGI_GetVCLKPtr(USHORT RefreshRateTableIndex,USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); |
| void XGI_GetVCLKLen(UCHAR tempal,UCHAR* di_0,UCHAR* di_1, PVB_DEVICE_INFO pVBInfo); |
| USHORT XGI_GetLCDCapPtr(PVB_DEVICE_INFO pVBInfo); |
| USHORT XGI_GetLCDCapPtr1(PVB_DEVICE_INFO pVBInfo); |
| XGI301C_Tap4TimingStruct* XGI_GetTap4Ptr(USHORT tempcx, PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetXG21FPBits(PVB_DEVICE_INFO pVBInfo); |
| void XGI_SetXG27FPBits(PVB_DEVICE_INFO pVBInfo); |
| UCHAR XGI_XG21GetPSCValue(PVB_DEVICE_INFO pVBInfo); |
| UCHAR XGI_XG27GetPSCValue(PVB_DEVICE_INFO pVBInfo); |
| void XGI_XG21BLSignalVDD(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo); |
| void XGI_XG27BLSignalVDD(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo); |
| void XGI_XG21SetPanelDelay(USHORT tempbl, PVB_DEVICE_INFO pVBInfo); |
| BOOLEAN XGI_XG21CheckLVDSMode(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ); |
| void XGI_SetXG21LVDSPara(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ); |
| void XGI_SetXG27LVDSPara(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ); |
| UCHAR XGI_SetDefaultVCLK( PVB_DEVICE_INFO pVBInfo ); |
| |
| extern void ReadVBIOSTablData( UCHAR ChipType , PVB_DEVICE_INFO pVBInfo); |
| #ifdef WIN2000 |
| /* [Billy] 2007/05/17 For CH7007 */ |
| extern UCHAR CH7007TVReg_UNTSC[][8],CH7007TVReg_ONTSC[][8],CH7007TVReg_UPAL[][8],CH7007TVReg_OPAL[][8]; |
| extern UCHAR CH7007TVCRT1UNTSC_H[][10],CH7007TVCRT1ONTSC_H[][10],CH7007TVCRT1UPAL_H[][10],CH7007TVCRT1OPAL_H[][10] ; |
| extern UCHAR CH7007TVCRT1UNTSC_V[][10],CH7007TVCRT1ONTSC_V[][10],CH7007TVCRT1UPAL_V[][10],CH7007TVCRT1OPAL_V[][10] ; |
| extern UCHAR XGI7007_CHTVVCLKUNTSC[],XGI7007_CHTVVCLKONTSC[],XGI7007_CHTVVCLKUPAL[],XGI7007_CHTVVCLKOPAL[]; |
| |
| extern BOOLEAN XGI_XG21CheckCH7007TVMode(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ) ; |
| extern void SetCH7007Regs(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo ) ; |
| extern VP_STATUS TurnOnCH7007(PHW_DEVICE_EXTENSION pHWDE) ; |
| extern VP_STATUS TurnOffCH7007(PHW_DEVICE_EXTENSION pHWDE) ; |
| extern BOOLEAN IsCH7007TVMode(PVB_DEVICE_INFO pVBInfo) ; |
| #endif |
| |
| /* USHORT XGINew_flag_clearbuffer; 0: no clear frame buffer 1:clear frame buffer */ |
| |
| |
| |
| |
| |
| USHORT XGINew_MDA_DAC[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
| 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15, |
| 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15, |
| 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, |
| 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
| 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15, |
| 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15, |
| 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F}; |
| |
| USHORT XGINew_CGA_DAC[]={0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15, |
| 0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15, |
| 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F, |
| 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F, |
| 0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15, |
| 0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15, |
| 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F, |
| 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F}; |
| |
| USHORT XGINew_EGA_DAC[]={0x00,0x10,0x04,0x14,0x01,0x11,0x05,0x15, |
| 0x20,0x30,0x24,0x34,0x21,0x31,0x25,0x35, |
| 0x08,0x18,0x0C,0x1C,0x09,0x19,0x0D,0x1D, |
| 0x28,0x38,0x2C,0x3C,0x29,0x39,0x2D,0x3D, |
| 0x02,0x12,0x06,0x16,0x03,0x13,0x07,0x17, |
| 0x22,0x32,0x26,0x36,0x23,0x33,0x27,0x37, |
| 0x0A,0x1A,0x0E,0x1E,0x0B,0x1B,0x0F,0x1F, |
| 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F}; |
| |
| USHORT XGINew_VGA_DAC[]={0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15, |
| 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F, |
| 0x00,0x05,0x08,0x0B,0x0E,0x11,0x14,0x18, |
| 0x1C,0x20,0x24,0x28,0x2D,0x32,0x38,0x3F, |
| |
| 0x00,0x10,0x1F,0x2F,0x3F,0x1F,0x27,0x2F, |
| 0x37,0x3F,0x2D,0x31,0x36,0x3A,0x3F,0x00, |
| 0x07,0x0E,0x15,0x1C,0x0E,0x11,0x15,0x18, |
| 0x1C,0x14,0x16,0x18,0x1A,0x1C,0x00,0x04, |
| 0x08,0x0C,0x10,0x08,0x0A,0x0C,0x0E,0x10, |
| 0x0B,0x0C,0x0D,0x0F,0x10}; |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : InitTo330Pointer */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void InitTo330Pointer( UCHAR ChipType ,PVB_DEVICE_INFO pVBInfo) |
| { |
| pVBInfo->SModeIDTable = (XGI_StStruct *) XGI330_SModeIDTable ; |
| pVBInfo->StandTable = (XGI_StandTableStruct *) XGI330_StandTable ; |
| pVBInfo->EModeIDTable = (XGI_ExtStruct *) XGI330_EModeIDTable ; |
| pVBInfo->RefIndex = (XGI_Ext2Struct *) XGI330_RefIndex ; |
| pVBInfo->XGINEWUB_CRT1Table = (XGI_CRT1TableStruct *) XGI_CRT1Table ; |
| |
| /* add for new UNIVGABIOS */ |
| /* XGINew_UBLCDDataTable = (XGI_LCDDataTablStruct *) XGI_LCDDataTable ; */ |
| /* XGINew_UBTVDataTable = (XGI_TVDataTablStruct *) XGI_TVDataTable ; */ |
| |
| |
| if ( ChipType >= XG40 ) |
| { |
| pVBInfo->MCLKData = (XGI_MCLKDataStruct *) XGI340New_MCLKData ; |
| pVBInfo->ECLKData = (XGI_ECLKDataStruct *) XGI340_ECLKData ; |
| } |
| else |
| { |
| pVBInfo->MCLKData = (XGI_MCLKDataStruct *) XGI330New_MCLKData ; |
| pVBInfo->ECLKData = (XGI_ECLKDataStruct *) XGI330_ECLKData ; |
| } |
| |
| pVBInfo->VCLKData = (XGI_VCLKDataStruct *) XGI_VCLKData ; |
| pVBInfo->VBVCLKData = (XGI_VBVCLKDataStruct *) XGI_VBVCLKData ; |
| pVBInfo->ScreenOffset = XGI330_ScreenOffset ; |
| pVBInfo->StResInfo = (XGI_StResInfoStruct *) XGI330_StResInfo ; |
| pVBInfo->ModeResInfo = (XGI_ModeResInfoStruct *) XGI330_ModeResInfo ; |
| |
| pVBInfo->pOutputSelect = &XGI330_OutputSelect ; |
| pVBInfo->pSoftSetting = &XGI330_SoftSetting ; |
| pVBInfo->pSR07 = &XGI330_SR07 ; |
| pVBInfo->LCDResInfo = 0 ; |
| pVBInfo->LCDTypeInfo = 0 ; |
| pVBInfo->LCDInfo = 0 ; |
| pVBInfo->VBInfo = 0 ; |
| pVBInfo->TVInfo = 0; |
| |
| |
| pVBInfo->SR15 = XGI340_SR13 ; |
| pVBInfo->CR40 = XGI340_cr41 ; |
| pVBInfo->SR25 = XGI330_sr25 ; |
| pVBInfo->pSR31 = &XGI330_sr31 ; |
| pVBInfo->pSR32 = &XGI330_sr32 ; |
| pVBInfo->CR6B = XGI340_CR6B ; |
| pVBInfo->CR6E = XGI340_CR6E ; |
| pVBInfo->CR6F = XGI340_CR6F ; |
| pVBInfo->CR89 = XGI340_CR89 ; |
| pVBInfo->AGPReg = XGI340_AGPReg ; |
| pVBInfo->SR16 = XGI340_SR16 ; |
| pVBInfo->pCRCF = &XG40_CRCF ; |
| pVBInfo->pXGINew_DRAMTypeDefinition = &XG40_DRAMTypeDefinition ; |
| |
| |
| pVBInfo->CR49 = XGI330_CR49 ; |
| pVBInfo->pSR1F = &XGI330_SR1F ; |
| pVBInfo->pSR21 = &XGI330_SR21 ; |
| pVBInfo->pSR22 = &XGI330_SR22 ; |
| pVBInfo->pSR23 = &XGI330_SR23 ; |
| pVBInfo->pSR24 = &XGI330_SR24 ; |
| pVBInfo->pSR33 = &XGI330_SR33 ; |
| |
| |
| |
| pVBInfo->pCRT2Data_1_2 = &XGI330_CRT2Data_1_2 ; |
| pVBInfo->pCRT2Data_4_D = &XGI330_CRT2Data_4_D ; |
| pVBInfo->pCRT2Data_4_E = &XGI330_CRT2Data_4_E ; |
| pVBInfo->pCRT2Data_4_10 = &XGI330_CRT2Data_4_10 ; |
| pVBInfo->pRGBSenseData = &XGI330_RGBSenseData ; |
| pVBInfo->pVideoSenseData = &XGI330_VideoSenseData ; |
| pVBInfo->pYCSenseData = &XGI330_YCSenseData ; |
| pVBInfo->pRGBSenseData2 = &XGI330_RGBSenseData2 ; |
| pVBInfo->pVideoSenseData2 = &XGI330_VideoSenseData2 ; |
| pVBInfo->pYCSenseData2 = &XGI330_YCSenseData2 ; |
| |
| pVBInfo->NTSCTiming = XGI330_NTSCTiming ; |
| pVBInfo->PALTiming = XGI330_PALTiming ; |
| pVBInfo->HiTVExtTiming = XGI330_HiTVExtTiming ; |
| pVBInfo->HiTVSt1Timing = XGI330_HiTVSt1Timing ; |
| pVBInfo->HiTVSt2Timing = XGI330_HiTVSt2Timing ; |
| pVBInfo->HiTVTextTiming = XGI330_HiTVTextTiming ; |
| pVBInfo->YPbPr750pTiming = XGI330_YPbPr750pTiming ; |
| pVBInfo->YPbPr525pTiming = XGI330_YPbPr525pTiming ; |
| pVBInfo->YPbPr525iTiming = XGI330_YPbPr525iTiming ; |
| pVBInfo->HiTVGroup3Data = XGI330_HiTVGroup3Data ; |
| pVBInfo->HiTVGroup3Simu = XGI330_HiTVGroup3Simu ; |
| pVBInfo->HiTVGroup3Text = XGI330_HiTVGroup3Text ; |
| pVBInfo->Ren525pGroup3 = XGI330_Ren525pGroup3 ; |
| pVBInfo->Ren750pGroup3 = XGI330_Ren750pGroup3 ; |
| |
| |
| pVBInfo->TimingH = (XGI_TimingHStruct *) XGI_TimingH ; |
| pVBInfo->TimingV = (XGI_TimingVStruct *) XGI_TimingV ; |
| pVBInfo->UpdateCRT1 = (XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table ; |
| |
| pVBInfo->CHTVVCLKUNTSC = XGI330_CHTVVCLKUNTSC ; |
| pVBInfo->CHTVVCLKONTSC = XGI330_CHTVVCLKONTSC ; |
| pVBInfo->CHTVVCLKUPAL = XGI330_CHTVVCLKUPAL ; |
| pVBInfo->CHTVVCLKOPAL = XGI330_CHTVVCLKOPAL ; |
| |
| /* 310 customization related */ |
| if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) ) |
| pVBInfo->LCDCapList = XGI_LCDDLCapList ; |
| else |
| pVBInfo->LCDCapList = XGI_LCDCapList ; |
| |
| if ( ( ChipType == XG21 ) || ( ChipType == XG27 ) ) |
| pVBInfo->XG21_LVDSCapList = XGI21_LCDCapList ; |
| |
| pVBInfo->XGI_TVDelayList = XGI301TVDelayList ; |
| pVBInfo->XGI_TVDelayList2 = XGI301TVDelayList2 ; |
| |
| |
| pVBInfo->pXGINew_I2CDefinition = &XG40_I2CDefinition ; |
| |
| if ( ChipType >= XG20 ) |
| pVBInfo->pXGINew_CR97 = &XG20_CR97 ; |
| |
| if ( ChipType == XG27 ) |
| { |
| pVBInfo->MCLKData = (XGI_MCLKDataStruct *) XGI27New_MCLKData ; |
| pVBInfo->CR40 = XGI27_cr41 ; |
| pVBInfo->pXGINew_CR97 = &XG27_CR97 ; |
| pVBInfo->pSR36 = &XG27_SR36 ; |
| pVBInfo->pCR8F = &XG27_CR8F ; |
| pVBInfo->pCRD0 = XG27_CRD0 ; |
| pVBInfo->pCRDE = XG27_CRDE ; |
| pVBInfo->pSR40 = &XG27_SR40 ; |
| pVBInfo->pSR41 = &XG27_SR41 ; |
| |
| } |
| |
| if ( ChipType >= XG20 ) |
| { |
| pVBInfo->pDVOSetting = &XG21_DVOSetting ; |
| pVBInfo->pCR2E = &XG21_CR2E ; |
| pVBInfo->pCR2F = &XG21_CR2F ; |
| pVBInfo->pCR46 = &XG21_CR46 ; |
| pVBInfo->pCR47 = &XG21_CR47 ; |
| } |
| |
| } |
| |
| |
| |
| |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGISetModeNew */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| BOOLEAN XGISetModeNew( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT ModeNo ) |
| { |
| USHORT ModeIdIndex ; |
| /* PUCHAR pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ; */ |
| VB_DEVICE_INFO VBINF; |
| PVB_DEVICE_INFO pVBInfo = &VBINF; |
| pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ; |
| pVBInfo->BaseAddr = (ULONG)HwDeviceExtension->pjIOAddress ; |
| pVBInfo->IF_DEF_LVDS = 0 ; |
| pVBInfo->IF_DEF_CH7005 = 0 ; |
| pVBInfo->IF_DEF_LCDA = 1 ; |
| pVBInfo->IF_DEF_CH7017 = 0 ; |
| pVBInfo->IF_DEF_CH7007 = 0 ; /* [Billy] 2007/05/14 */ |
| pVBInfo->IF_DEF_VideoCapture = 0 ; |
| pVBInfo->IF_DEF_ScaleLCD = 0 ; |
| pVBInfo->IF_DEF_OEMUtil = 0 ; |
| pVBInfo->IF_DEF_PWD = 0 ; |
| |
| |
| if ( HwDeviceExtension->jChipType >= XG20 ) /* kuku 2004/06/25 */ |
| { |
| pVBInfo->IF_DEF_YPbPr = 0 ; |
| pVBInfo->IF_DEF_HiVision = 0 ; |
| pVBInfo->IF_DEF_CRT2Monitor = 0 ; |
| pVBInfo->VBType = 0 ; /*set VBType default 0*/ |
| } |
| else if ( HwDeviceExtension->jChipType >= XG40 ) |
| { |
| pVBInfo->IF_DEF_YPbPr = 1 ; |
| pVBInfo->IF_DEF_HiVision = 1 ; |
| pVBInfo->IF_DEF_CRT2Monitor = 1 ; |
| } |
| else |
| { |
| pVBInfo->IF_DEF_YPbPr = 1 ; |
| pVBInfo->IF_DEF_HiVision = 1 ; |
| pVBInfo->IF_DEF_CRT2Monitor = 0 ; |
| } |
| |
| pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14 ; |
| pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24 ; |
| pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10 ; |
| pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e ; |
| pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12 ; |
| pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C ; |
| pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a ; |
| pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16 ; |
| pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17 ; |
| pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18 ; |
| pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19 ; |
| pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A ; |
| pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00 ; |
| pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04 ; |
| pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10 ; |
| pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12 ; |
| pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 ; |
| pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2 ; |
| |
| if ( HwDeviceExtension->jChipType == XG21 ) /* for x86 Linux, XG21 LVDS */ |
| { |
| if ( ( XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) & 0xE0 ) == 0xC0 ) |
| { |
| pVBInfo->IF_DEF_LVDS = 1 ; |
| } |
| } |
| if ( HwDeviceExtension->jChipType == XG27 ) |
| { |
| if ( ( XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) & 0xE0 ) == 0xC0 ) |
| { |
| if ( XGINew_GetReg1( pVBInfo->P3d4 , 0x30 ) & 0x20 ) |
| { |
| pVBInfo->IF_DEF_LVDS = 1 ; |
| } |
| } |
| } |
| |
| if ( HwDeviceExtension->jChipType < XG20 ) /* kuku 2004/06/25 */ |
| XGI_GetVBType( pVBInfo ) ; |
| |
| InitTo330Pointer( HwDeviceExtension->jChipType, pVBInfo ) ; |
| #ifdef WIN2000 |
| ReadVBIOSTablData( HwDeviceExtension->jChipType , pVBInfo) ; |
| #endif |
| if ( ModeNo & 0x80 ) |
| { |
| ModeNo = ModeNo & 0x7F ; |
| /* XGINew_flag_clearbuffer = 0 ; */ |
| } |
| /* else |
| { |
| XGINew_flag_clearbuffer = 1 ; |
| } |
| */ |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x05 , 0x86 ) ; |
| |
| if ( HwDeviceExtension->jChipType < XG20 ) /* kuku 2004/06/25 1.Openkey */ |
| XGI_UnLockCRT2( HwDeviceExtension , pVBInfo ) ; |
| |
| XGI_SearchModeID( ModeNo , &ModeIdIndex, pVBInfo ) ; |
| |
| XGI_GetVGAType(HwDeviceExtension, pVBInfo) ; |
| |
| if ( HwDeviceExtension->jChipType < XG20 ) /* kuku 2004/06/25 */ |
| { |
| XGI_GetVBInfo(ModeNo , ModeIdIndex , HwDeviceExtension, pVBInfo ) ; |
| XGI_GetTVInfo(ModeNo , ModeIdIndex, pVBInfo ) ; |
| XGI_GetLCDInfo(ModeNo , ModeIdIndex, pVBInfo ) ; |
| XGI_DisableBridge( HwDeviceExtension,pVBInfo ) ; |
| /* XGI_OpenCRTC( HwDeviceExtension, pVBInfo ) ; */ |
| |
| if ( pVBInfo->VBInfo & ( SetSimuScanMode | SetCRT2ToLCDA ) ) |
| { |
| XGI_SetCRT1Group(HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ; |
| |
| if ( pVBInfo->VBInfo & SetCRT2ToLCDA ) |
| { |
| XGI_SetLCDAGroup(ModeNo , ModeIdIndex , HwDeviceExtension, pVBInfo ) ; |
| } |
| } |
| else |
| { |
| if ( !( pVBInfo->VBInfo & SwitchToCRT2) ) |
| { |
| XGI_SetCRT1Group( HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ; |
| if ( pVBInfo->VBInfo & SetCRT2ToLCDA ) |
| { |
| XGI_SetLCDAGroup( ModeNo , ModeIdIndex , HwDeviceExtension, pVBInfo ) ; |
| } |
| } |
| } |
| |
| if ( pVBInfo->VBInfo & ( SetSimuScanMode | SwitchToCRT2 ) ) |
| { |
| switch( HwDeviceExtension->ujVBChipID ) |
| { |
| case VB_CHIP_301: |
| XGI_SetCRT2Group301( ModeNo , HwDeviceExtension, pVBInfo ) ; /*add for CRT2 */ |
| break ; |
| |
| case VB_CHIP_302: |
| XGI_SetCRT2Group301(ModeNo , HwDeviceExtension, pVBInfo ) ; /*add for CRT2 */ |
| break ; |
| |
| default: |
| break ; |
| } |
| } |
| |
| XGI_SetCRT2ModeRegs( ModeNo, HwDeviceExtension,pVBInfo ) ; |
| XGI_OEM310Setting( ModeNo, ModeIdIndex,pVBInfo ) ; /*0212*/ |
| XGI_CloseCRTC( HwDeviceExtension, pVBInfo ) ; |
| XGI_EnableBridge( HwDeviceExtension ,pVBInfo) ; |
| } /* !XG20 */ |
| else |
| { |
| #ifdef WIN2000 |
| if ( pVBInfo->IF_DEF_CH7007 == 1 ) |
| { |
| |
| VideoDebugPrint((0, "XGISetModeNew: pVBIfo->IF_DEF_CH7007==1\n")); |
| pVBInfo->VBType = VB_CH7007 ; |
| XGI_GetVBInfo(ModeNo , ModeIdIndex , HwDeviceExtension, pVBInfo ) ; |
| XGI_GetTVInfo(ModeNo , ModeIdIndex, pVBInfo ) ; |
| XGI_GetLCDInfo(ModeNo , ModeIdIndex, pVBInfo ) ; |
| if( !(XGI_XG21CheckCH7007TVMode(ModeNo, ModeIdIndex, pVBInfo )) ) |
| { |
| return FALSE; |
| } |
| } |
| #endif |
| |
| |
| if ( pVBInfo->IF_DEF_LVDS == 1 ) |
| { |
| if ( !XGI_XG21CheckLVDSMode(ModeNo , ModeIdIndex, pVBInfo) ) |
| { |
| return FALSE; |
| } |
| } |
| |
| if ( ModeNo <= 0x13 ) |
| { |
| pVBInfo->ModeType = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag & ModeInfoFlag; |
| } |
| else |
| { |
| pVBInfo->ModeType = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag & ModeInfoFlag; |
| } |
| |
| pVBInfo->SetFlag = 0 ; |
| if ( pVBInfo->IF_DEF_CH7007 != 1 ) |
| { |
| pVBInfo->VBInfo = DisableCRT2Display ; |
| } |
| |
| |
| XGI_DisplayOff(HwDeviceExtension, pVBInfo) ; |
| |
| XGI_SetCRT1Group(HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ; |
| |
| XGI_DisplayOn( HwDeviceExtension, pVBInfo ) ; |
| /* |
| if( HwDeviceExtension->jChipType == XG21 ) |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x09 , ~0x80 , 0x80 ) ; |
| */ |
| } |
| |
| |
| /* |
| if ( ModeNo <= 0x13 ) |
| { |
| modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; |
| } |
| else |
| { |
| modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; |
| } |
| pVBInfo->ModeType = modeflag&ModeInfoFlag ; |
| pVBInfo->SetFlag = 0x00 ; |
| pVBInfo->VBInfo = DisableCRT2Display ; |
| temp = XGINew_CheckMemorySize( HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ; |
| |
| if ( temp == 0 ) |
| return( 0 ) ; |
| |
| XGI_DisplayOff( HwDeviceExtension, pVBInfo) ; |
| XGI_SetCRT1Group( HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ; |
| XGI_DisplayOn( HwDeviceExtension, pVBInfo) ; |
| */ |
| |
| XGI_UpdateModeInfo( HwDeviceExtension, pVBInfo ) ; |
| |
| if ( HwDeviceExtension->jChipType < XG20 ) /* kuku 2004/06/25 */ |
| { |
| XGI_LockCRT2( HwDeviceExtension, pVBInfo ) ; |
| } |
| |
| return( TRUE ) ; |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetCRT1Group */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetCRT1Group( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT ModeNo , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ) |
| { |
| USHORT StandTableIndex , |
| RefreshRateTableIndex , |
| b3CC , |
| temp ; |
| |
| USHORT XGINew_P3cc = pVBInfo->P3cc; |
| |
| /* XGINew_CRT1Mode = ModeNo ; // SaveModeID */ |
| StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ; |
| /* XGI_SetBIOSData(ModeNo , ModeIdIndex ) ; */ |
| /* XGI_ClearBankRegs( ModeNo , ModeIdIndex ) ; */ |
| XGI_SetSeqRegs( ModeNo , StandTableIndex , ModeIdIndex, pVBInfo ) ; |
| XGI_SetMiscRegs( StandTableIndex, pVBInfo ) ; |
| XGI_SetCRTCRegs( HwDeviceExtension , StandTableIndex, pVBInfo) ; |
| XGI_SetATTRegs( ModeNo , StandTableIndex , ModeIdIndex, pVBInfo ) ; |
| XGI_SetGRCRegs( StandTableIndex, pVBInfo ) ; |
| XGI_ClearExt1Regs(pVBInfo) ; |
| |
| /* if ( pVBInfo->IF_DEF_ExpLink ) */ |
| if ( HwDeviceExtension->jChipType == XG27 ) |
| { |
| if ( pVBInfo->IF_DEF_LVDS == 0 ) |
| { |
| XGI_SetDefaultVCLK( pVBInfo ) ; |
| } |
| } |
| |
| temp = ~ProgrammingCRT2 ; |
| pVBInfo->SetFlag &= temp ; |
| pVBInfo->SelectCRT2Rate = 0 ; |
| |
| if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) |
| { |
| if ( pVBInfo->VBInfo & ( SetSimuScanMode | SetCRT2ToLCDA | SetInSlaveMode ) ) |
| { |
| pVBInfo->SetFlag |= ProgrammingCRT2 ; |
| } |
| } |
| |
| RefreshRateTableIndex = XGI_GetRatePtrCRT2( HwDeviceExtension, ModeNo , ModeIdIndex, pVBInfo ) ; |
| if ( RefreshRateTableIndex != 0xFFFF ) |
| { |
| XGI_SetSync( RefreshRateTableIndex, pVBInfo ) ; |
| XGI_SetCRT1CRTC( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo, HwDeviceExtension ) ; |
| XGI_SetCRT1DE( HwDeviceExtension , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ; |
| XGI_SetCRT1Offset( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ; |
| XGI_SetCRT1VCLK( ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ; |
| } |
| |
| if ( ( HwDeviceExtension->jChipType >= XG20 )&& |
| ( HwDeviceExtension->jChipType < XG27 ) ) /* fix H/W DCLK/2 bug */ |
| { |
| if ( ( ModeNo == 0x00 ) | (ModeNo == 0x01) ) |
| { |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , 0x4E) ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , 0xE9) ; |
| b3CC =(UCHAR) XGINew_GetReg2(XGINew_P3cc) ; |
| XGINew_SetReg3(XGINew_P3cc , (b3CC |= 0x0C) ) ; |
| } |
| else if ( ( ModeNo == 0x04) | ( ModeNo == 0x05) | ( ModeNo == 0x0D) ) |
| { |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , 0x1B) ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , 0xE3) ; |
| b3CC = (UCHAR)XGINew_GetReg2(XGINew_P3cc) ; |
| XGINew_SetReg3(XGINew_P3cc , (b3CC |= 0x0C) ) ; |
| } |
| } |
| |
| if ( HwDeviceExtension->jChipType >= XG21 ) |
| { |
| temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) ; |
| if ( temp & 0xA0 ) |
| { |
| |
| /*XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~0x20 ) ;*/ /* Enable write GPIOF */ |
| /*XGINew_SetRegAND( pVBInfo->P3d4 , 0x48 , ~0x20 ) ;*/ /* P. DWN */ |
| /* XG21 CRT1 Timing */ |
| if ( HwDeviceExtension->jChipType == XG27 ) |
| XGI_SetXG27CRTC( ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo ); |
| else |
| XGI_SetXG21CRTC( ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo ); |
| |
| XGI_UpdateXG21CRTC( ModeNo , pVBInfo , RefreshRateTableIndex) ; |
| |
| if ( HwDeviceExtension->jChipType == XG27 ) |
| XGI_SetXG27LCD( pVBInfo , RefreshRateTableIndex , ModeNo ); |
| else |
| XGI_SetXG21LCD( pVBInfo , RefreshRateTableIndex , ModeNo ); |
| |
| if ( pVBInfo->IF_DEF_LVDS == 1 ) |
| { |
| if ( HwDeviceExtension->jChipType == XG27 ) |
| XGI_SetXG27LVDSPara(ModeNo,ModeIdIndex, pVBInfo ); |
| else |
| XGI_SetXG21LVDSPara(ModeNo,ModeIdIndex, pVBInfo ); |
| } |
| /*XGINew_SetRegOR( pVBInfo->P3d4 , 0x48 , 0x20 ) ;*/ /* P. ON */ |
| } |
| } |
| |
| pVBInfo->SetFlag &= ( ~ProgrammingCRT2 ) ; |
| XGI_SetCRT1FIFO( ModeNo , HwDeviceExtension, pVBInfo ) ; |
| XGI_SetCRT1ModeRegs( HwDeviceExtension , ModeNo , ModeIdIndex , RefreshRateTableIndex , pVBInfo) ; |
| |
| |
| /* XGI_LoadCharacter(); //dif ifdef TVFont */ |
| |
| XGI_LoadDAC( ModeNo , ModeIdIndex, pVBInfo ) ; |
| /* XGI_ClearBuffer( HwDeviceExtension , ModeNo, pVBInfo ) ; */ |
| #ifdef WIN2000 |
| if ( pVBInfo->IF_DEF_CH7007 == 1 ) /* [Billy] 2007/05/14 */ |
| { |
| VideoDebugPrint((0, "XGI_SetCRT1Group: VBInfo->IF_DEF_CH7007==1\n")); |
| SetCH7007Regs(HwDeviceExtension, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo ) ; /* 07/05/28 */ |
| } |
| #endif |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_GetModePtr */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| UCHAR XGI_GetModePtr( USHORT ModeNo , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ) |
| { |
| UCHAR index ; |
| |
| if ( ModeNo <= 0x13 ) |
| index = pVBInfo->SModeIDTable[ ModeIdIndex ].St_StTableIndex ; |
| else |
| { |
| if ( pVBInfo->ModeType <= 0x02 ) |
| index = 0x1B ; /* 02 -> ModeEGA */ |
| else |
| index = 0x0F ; |
| } |
| return( index ) ; /* Get pVBInfo->StandTable index */ |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetBIOSData */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| /*UCHAR XGI_SetBIOSData( USHORT ModeNo , USHORT ModeIdIndex ) |
| { |
| return( 0 ) ; |
| } |
| */ |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_ClearBankRegs */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| /*UCHAR XGI_ClearBankRegs( USHORT ModeNo , USHORT ModeIdIndex ) |
| { |
| return( 0 ) ; |
| } |
| */ |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetSeqRegs */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetSeqRegs( USHORT ModeNo , USHORT StandTableIndex , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ) |
| { |
| UCHAR tempah , |
| SRdata ; |
| |
| USHORT i , |
| modeflag ; |
| |
| if ( ModeNo <= 0x13 ) |
| modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; |
| else |
| modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; |
| |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x00 , 0x03 ) ; /* Set SR0 */ |
| tempah=pVBInfo->StandTable[ StandTableIndex ].SR[ 0 ] ; |
| |
| i = SetCRT2ToLCDA ; |
| if ( pVBInfo->VBInfo & SetCRT2ToLCDA ) |
| { |
| tempah |= 0x01 ; |
| } |
| else |
| { |
| if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToLCD ) ) |
| { |
| if ( pVBInfo->VBInfo & SetInSlaveMode ) |
| tempah |= 0x01 ; |
| } |
| } |
| |
| tempah |= 0x20 ; /* screen off */ |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x01 , tempah ) ; /* Set SR1 */ |
| |
| for( i = 02 ; i <= 04 ; i++ ) |
| { |
| SRdata = pVBInfo->StandTable[ StandTableIndex ].SR[ i - 1 ] ; /* Get SR2,3,4 from file */ |
| XGINew_SetReg1( pVBInfo->P3c4 , i , SRdata ) ; /* Set SR2 3 4 */ |
| } |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetMiscRegs */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetMiscRegs( USHORT StandTableIndex, PVB_DEVICE_INFO pVBInfo ) |
| { |
| UCHAR Miscdata ; |
| |
| Miscdata = pVBInfo->StandTable[ StandTableIndex ].MISC ; /* Get Misc from file */ |
| /* |
| if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) |
| { |
| if ( pVBInfo->VBInfo & SetCRT2ToLCDA ) |
| { |
| Miscdata |= 0x0C ; |
| } |
| } |
| */ |
| |
| XGINew_SetReg3( pVBInfo->P3c2 , Miscdata ) ; /* Set Misc(3c2) */ |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetCRTCRegs */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetCRTCRegs( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT StandTableIndex, PVB_DEVICE_INFO pVBInfo ) |
| { |
| UCHAR CRTCdata ; |
| USHORT i ; |
| |
| CRTCdata = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x11 ) ; |
| CRTCdata &= 0x7f ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , CRTCdata ) ; /* Unlock CRTC */ |
| |
| for( i = 0 ; i <= 0x18 ; i++ ) |
| { |
| CRTCdata = pVBInfo->StandTable[ StandTableIndex ].CRTC[ i ] ; /* Get CRTC from file */ |
| XGINew_SetReg1( pVBInfo->P3d4 , i , CRTCdata ) ; /* Set CRTC( 3d4 ) */ |
| } |
| /* |
| if ( ( HwDeviceExtension->jChipType == XGI_630 )&& ( HwDeviceExtension->jChipRevision == 0x30 ) ) |
| { |
| if ( pVBInfo->VBInfo & SetInSlaveMode ) |
| { |
| if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToTV ) ) |
| { |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x18 , 0xFE ) ; |
| } |
| } |
| } |
| */ |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetATTRegs( USHORT ModeNo , USHORT StandTableIndex , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ) |
| { |
| UCHAR ARdata ; |
| USHORT i , |
| modeflag ; |
| |
| if ( ModeNo <= 0x13 ) |
| modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; |
| else |
| modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; |
| |
| for( i = 0 ; i <= 0x13 ; i++ ) |
| { |
| ARdata = pVBInfo->StandTable[ StandTableIndex ].ATTR[ i ] ; |
| if ( modeflag & Charx8Dot ) /* ifndef Dot9 */ |
| { |
| if ( i == 0x13 ) |
| { |
| if ( pVBInfo->VBInfo & SetCRT2ToLCDA ) |
| ARdata = 0 ; |
| else |
| { |
| if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToLCD ) ) |
| { |
| if ( pVBInfo->VBInfo & SetInSlaveMode ) |
| ARdata = 0 ; |
| } |
| } |
| } |
| } |
| |
| XGINew_GetReg2( pVBInfo->P3da ) ; /* reset 3da */ |
| XGINew_SetReg3( pVBInfo->P3c0 , i ) ; /* set index */ |
| XGINew_SetReg3( pVBInfo->P3c0 , ARdata ) ; /* set data */ |
| } |
| |
| XGINew_GetReg2( pVBInfo->P3da ) ; /* reset 3da */ |
| XGINew_SetReg3( pVBInfo->P3c0 , 0x14 ) ; /* set index */ |
| XGINew_SetReg3( pVBInfo->P3c0 , 0x00 ) ; /* set data */ |
| XGINew_GetReg2( pVBInfo->P3da ) ; /* Enable Attribute */ |
| XGINew_SetReg3( pVBInfo->P3c0 , 0x20 ) ; |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetGRCRegs */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetGRCRegs( USHORT StandTableIndex, PVB_DEVICE_INFO pVBInfo ) |
| { |
| UCHAR GRdata ; |
| USHORT i ; |
| |
| for( i = 0 ; i <= 0x08 ; i++ ) |
| { |
| GRdata = pVBInfo->StandTable[ StandTableIndex ].GRC[ i ] ; /* Get GR from file */ |
| XGINew_SetReg1( pVBInfo->P3ce , i , GRdata ) ; /* Set GR(3ce) */ |
| } |
| |
| if ( pVBInfo->ModeType > ModeVGA ) |
| { |
| GRdata = ( UCHAR )XGINew_GetReg1( pVBInfo->P3ce , 0x05 ) ; |
| GRdata &= 0xBF ; /* 256 color disable */ |
| XGINew_SetReg1( pVBInfo->P3ce , 0x05 , GRdata ) ; |
| } |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_ClearExt1Regs */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_ClearExt1Regs(PVB_DEVICE_INFO pVBInfo) |
| { |
| USHORT i ; |
| |
| for( i = 0x0A ; i <= 0x0E ; i++ ) |
| XGINew_SetReg1( pVBInfo->P3c4 , i , 0x00 ) ; /* Clear SR0A-SR0E */ |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetDefaultVCLK */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| UCHAR XGI_SetDefaultVCLK( PVB_DEVICE_INFO pVBInfo ) |
| { |
| |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x31 , ~0x30 , 0x20 ) ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ 0 ].SR2B ) ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ 0 ].SR2C ) ; |
| |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x31 , ~0x30 , 0x10 ) ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ 1 ].SR2B ) ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ 1 ].SR2C ) ; |
| |
| XGINew_SetRegAND( pVBInfo->P3c4 , 0x31 , ~0x30 ) ; |
| return( 0 ) ; |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_GetRatePtrCRT2 */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| USHORT XGI_GetRatePtrCRT2( PXGI_HW_DEVICE_INFO pXGIHWDE, USHORT ModeNo , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ) |
| { |
| SHORT LCDRefreshIndex[] = { 0x00 , 0x00 , 0x03 , 0x01 } , |
| LCDARefreshIndex[] = { 0x00 , 0x00 , 0x03 , 0x01 , 0x01 , 0x01 , 0x01 } ; |
| |
| USHORT RefreshRateTableIndex , i , |
| modeflag , index , temp ; |
| |
| if ( ModeNo <= 0x13 ) |
| { |
| modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; |
| } |
| else |
| { |
| modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; |
| } |
| |
| if ( pVBInfo->IF_DEF_CH7005 == 1 ) |
| { |
| if ( pVBInfo->VBInfo & SetCRT2ToTV ) |
| { |
| if ( modeflag & HalfDCLK ) |
| return( 0 ) ; |
| } |
| } |
| |
| if ( ModeNo < 0x14 ) |
| return( 0xFFFF ) ; |
| |
| index = XGINew_GetReg1( pVBInfo->P3d4 , 0x33 ) ; |
| index = index >> pVBInfo->SelectCRT2Rate ; |
| index &= 0x0F ; |
| |
| if ( pVBInfo->LCDInfo & LCDNonExpanding ) |
| index = 0 ; |
| |
| if ( index > 0 ) |
| index-- ; |
| |
| if ( pVBInfo->SetFlag & ProgrammingCRT2 ) |
| { |
| if ( pVBInfo->IF_DEF_CH7005 == 1 ) |
| { |
| if ( pVBInfo->VBInfo & SetCRT2ToTV ) |
| { |
| index = 0 ; |
| } |
| } |
| |
| if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) |
| { |
| if( pVBInfo->IF_DEF_LVDS == 0 ) |
| { |
| if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) |
| temp = LCDARefreshIndex[ pVBInfo->LCDResInfo & 0x0F ] ; /* 301b */ |
| else |
| temp = LCDRefreshIndex[ pVBInfo->LCDResInfo & 0x0F ] ; |
| |
| if ( index > temp ) |
| { |
| index = temp ; |
| } |
| } |
| else |
| { |
| index = 0 ; |
| } |
| } |
| } |
| |
| RefreshRateTableIndex = pVBInfo->EModeIDTable[ ModeIdIndex ].REFindex ; |
| ModeNo = pVBInfo->RefIndex[ RefreshRateTableIndex ].ModeID ; |
| if ( pXGIHWDE->jChipType >= XG20 ) /* for XG20, XG21, XG27 */ |
| { |
| /* |
| if ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag & XG2xNotSupport ) |
| { |
| index++; |
| } |
| */ |
| if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 800 ) && |
| ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 600 ) ) |
| { |
| index++; |
| } |
| /* Alan 10/19/2007; do the similiar adjustment like XGISearchCRT1Rate() */ |
| if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 1024 ) && |
| ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 768 ) ) |
| { |
| index++; |
| } |
| if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 1280 ) && |
| ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 1024 ) ) |
| { |
| index++; |
| } |
| } |
| |
| i = 0 ; |
| do |
| { |
| if ( pVBInfo->RefIndex[ RefreshRateTableIndex + i ].ModeID != ModeNo ) |
| break ; |
| temp = pVBInfo->RefIndex[ RefreshRateTableIndex + i ].Ext_InfoFlag ; |
| temp &= ModeInfoFlag ; |
| if ( temp < pVBInfo->ModeType ) |
| break ; |
| i++ ; |
| index-- ; |
| |
| } while( index != 0xFFFF ) ; |
| if ( !( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) ) |
| { |
| if ( pVBInfo->VBInfo & SetInSlaveMode ) |
| { |
| temp = pVBInfo->RefIndex[ RefreshRateTableIndex + i - 1 ].Ext_InfoFlag ; |
| if ( temp & InterlaceMode ) |
| { |
| i++ ; |
| } |
| } |
| } |
| i-- ; |
| if ( ( pVBInfo->SetFlag & ProgrammingCRT2 ) ) |
| { |
| temp = XGI_AjustCRT2Rate( ModeNo , ModeIdIndex , RefreshRateTableIndex , &i, pVBInfo) ; |
| } |
| return( RefreshRateTableIndex + i ) ; /*return(0x01|(temp1<<1)); */ |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_AjustCRT2Rate */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| BOOLEAN XGI_AjustCRT2Rate( USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex , USHORT *i, PVB_DEVICE_INFO pVBInfo ) |
| { |
| USHORT tempax , |
| tempbx , |
| resinfo , |
| modeflag , |
| infoflag ; |
| |
| if ( ModeNo <= 0x13 ) |
| { |
| modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; /* si+St_ModeFlag */ |
| } |
| else |
| { |
| modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; |
| } |
| |
| resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ; |
| tempbx = pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].ModeID ; |
| tempax = 0 ; |
| |
| if ( pVBInfo->IF_DEF_LVDS == 0 ) |
| { |
| if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) |
| { |
| tempax |= SupportRAMDAC2 ; |
| |
| if ( pVBInfo->VBType & VB_XGI301C ) |
| tempax |= SupportCRT2in301C ; |
| } |
| |
| if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) /* 301b */ |
| { |
| tempax |= SupportLCD ; |
| |
| if ( pVBInfo->LCDResInfo != Panel1280x1024 ) |
| { |
| if ( pVBInfo->LCDResInfo != Panel1280x960 ) |
| { |
| if ( pVBInfo->LCDInfo & LCDNonExpanding ) |
| { |
| if ( resinfo >= 9 ) |
| { |
| tempax = 0 ; |
| return( 0 ) ; |
| } |
| } |
| } |
| } |
| } |
| |
| if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) /* for HiTV */ |
| { |
| if ( ( pVBInfo->VBType & VB_XGI301LV ) && ( pVBInfo->VBExtInfo == VB_YPbPr1080i ) ) |
| { |
| tempax |= SupportYPbPr ; |
| if ( pVBInfo->VBInfo & SetInSlaveMode ) |
| { |
| if ( resinfo == 4 ) |
| return( 0 ) ; |
| |
| if ( resinfo == 3 ) |
| return( 0 ) ; |
| |
| if ( resinfo > 7 ) |
| return( 0 ) ; |
| } |
| } |
| else |
| { |
| tempax |= SupportHiVisionTV ; |
| if ( pVBInfo->VBInfo & SetInSlaveMode ) |
| { |
| if ( resinfo == 4 ) |
| return( 0 ) ; |
| |
| if ( resinfo == 3 ) |
| { |
| if ( pVBInfo->SetFlag & TVSimuMode ) |
| return( 0 ) ; |
| } |
| |
| if ( resinfo > 7 ) |
| return( 0 ) ; |
| } |
| } |
| } |
| else |
| { |
| if ( pVBInfo->VBInfo & ( SetCRT2ToAVIDEO | SetCRT2ToSVIDEO | SetCRT2ToSCART | SetCRT2ToYPbPr | SetCRT2ToHiVisionTV ) ) |
| { |
| tempax |= SupportTV ; |
| |
| if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) |
| { |
| tempax |= SupportTV1024 ; |
| } |
| |
| if ( !( pVBInfo->VBInfo & SetPALTV ) ) |
| { |
| if ( modeflag & NoSupportSimuTV ) |
| { |
| if ( pVBInfo->VBInfo & SetInSlaveMode ) |
| { |
| if ( !( pVBInfo->VBInfo & SetNotSimuMode ) ) |
| { |
| return( 0 ) ; |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| else /* for LVDS */ |
| { |
| if ( pVBInfo->IF_DEF_CH7005 == 1 ) |
| { |
| if ( pVBInfo->VBInfo & SetCRT2ToTV ) |
| { |
| tempax |= SupportCHTV ; |
| } |
| } |
| |
| if ( pVBInfo->VBInfo & SetCRT2ToLCD ) |
| { |
| tempax |= SupportLCD ; |
| |
| if ( resinfo > 0x08 ) |
| return( 0 ) ; /* 1024x768 */ |
| |
| if ( pVBInfo->LCDResInfo < Panel1024x768 ) |
| { |
| if ( resinfo > 0x07 ) |
| return( 0 ) ; /* 800x600 */ |
| |
| if ( resinfo == 0x04 ) |
| return( 0 ) ; /* 512x384 */ |
| } |
| } |
| } |
| |
| for( ; pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].ModeID == tempbx ; ( *i )-- ) |
| { |
| infoflag = pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].Ext_InfoFlag ; |
| if ( infoflag & tempax ) |
| { |
| return( 1 ) ; |
| } |
| if ( ( *i ) == 0 ) |
| break ; |
| } |
| |
| for( ( *i ) = 0 ; ; ( *i )++ ) |
| { |
| infoflag = pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].Ext_InfoFlag ; |
| if ( pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].ModeID != tempbx ) |
| { |
| return( 0 ) ; |
| } |
| |
| if ( infoflag & tempax ) |
| { |
| return( 1 ) ; |
| } |
| } |
| return( 1 ) ; |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetSync */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetSync(USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo ) |
| { |
| USHORT sync , |
| temp ; |
| |
| sync = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag >> 8 ; /* di+0x00 */ |
| sync &= 0xC0 ; |
| temp = 0x2F ; |
| temp |= sync ; |
| XGINew_SetReg3( pVBInfo->P3c2 , temp ) ; /* Set Misc(3c2) */ |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetCRT1CRTC */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetCRT1CRTC( USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo, PXGI_HW_DEVICE_INFO HwDeviceExtension ) |
| { |
| UCHAR index , |
| data ; |
| |
| USHORT i ; |
| |
| index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ; /* Get index */ |
| index = index&IndexMask ; |
| |
| data =( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x11 ) ; |
| data &= 0x7F ; |
| XGINew_SetReg1(pVBInfo->P3d4,0x11,data); /* Unlock CRTC */ |
| |
| for( i = 0 ; i < 8 ; i++ ) |
| pVBInfo->TimingH[ 0 ].data[ i ] = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ i ] ; |
| |
| for( i = 0 ; i < 7 ; i++ ) |
| pVBInfo->TimingV[ 0 ].data[ i ] = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ i + 8 ] ; |
| |
| XGI_SetCRT1Timing_H( pVBInfo, HwDeviceExtension ) ; |
| |
| |
| |
| XGI_SetCRT1Timing_V( ModeIdIndex , ModeNo, pVBInfo ) ; |
| |
| |
| if( pVBInfo->ModeType > 0x03 ) |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x14 , 0x4F ) ; |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetCRT1Timing_H */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetCRT1Timing_H( PVB_DEVICE_INFO pVBInfo, PXGI_HW_DEVICE_INFO HwDeviceExtension ) |
| { |
| UCHAR data , data1, pushax; |
| USHORT i , j ; |
| |
| /* XGINew_SetReg1( pVBInfo->P3d4 , 0x51 , 0 ) ; */ |
| /* XGINew_SetReg1( pVBInfo->P3d4 , 0x56 , 0 ) ; */ |
| /* XGINew_SetRegANDOR( pVBInfo->P3d4 ,0x11 , 0x7f , 0x00 ) ; */ |
| |
| data = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x11 ) ; /* unlock cr0-7 */ |
| data &= 0x7F ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , data ) ; |
| |
| data = pVBInfo->TimingH[ 0 ].data[ 0 ] ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0 , data ) ; |
| |
| for( i = 0x01 ; i <= 0x04 ; i++ ) |
| { |
| data = pVBInfo->TimingH[ 0 ].data[ i ] ; |
| XGINew_SetReg1( pVBInfo->P3d4 , ( USHORT )( i + 1 ) , data ) ; |
| } |
| |
| for( i = 0x05 ; i <= 0x06 ; i++ ) |
| { |
| data = pVBInfo->TimingH[ 0 ].data[ i ]; |
| XGINew_SetReg1( pVBInfo->P3c4 ,( USHORT )( i + 6 ) , data ) ; |
| } |
| |
| j = ( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x0e ) ; |
| j &= 0x1F ; |
| data = pVBInfo->TimingH[ 0 ].data[ 7 ] ; |
| data &= 0xE0 ; |
| data |= j ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x0e , data ) ; |
| |
| if ( HwDeviceExtension->jChipType >= XG20 ) |
| { |
| data = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x04 ) ; |
| data = data - 1 ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x04 , data ) ; |
| data = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x05 ) ; |
| data1 = data ; |
| data1 &= 0xE0 ; |
| data &= 0x1F ; |
| if ( data == 0 ) |
| { |
| pushax = data ; |
| data = ( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x0c ) ; |
| data &= 0xFB ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x0c , data ) ; |
| data = pushax ; |
| } |
| data = data - 1 ; |
| data |= data1 ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x05 , data ) ; |
| data = ( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x0e ) ; |
| data = data >> 5 ; |
| data = data + 3 ; |
| if ( data > 7 ) |
| data = data - 7 ; |
| data = data << 5 ; |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0e , ~0xE0 , data ) ; |
| } |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetCRT1Timing_V */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetCRT1Timing_V( USHORT ModeIdIndex , USHORT ModeNo,PVB_DEVICE_INFO pVBInfo ) |
| { |
| UCHAR data ; |
| USHORT i , j ; |
| |
| /* XGINew_SetReg1( pVBInfo->P3d4 , 0x51 , 0 ) ; */ |
| /* XGINew_SetReg1( pVBInfo->P3d4 , 0x56 , 0 ) ; */ |
| /* XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x11 , 0x7f , 0x00 ) ; */ |
| |
| for( i = 0x00 ; i <= 0x01 ; i++ ) |
| { |
| data = pVBInfo->TimingV[ 0 ].data[ i ] ; |
| XGINew_SetReg1( pVBInfo->P3d4 , ( USHORT )( i + 6 ) , data ) ; |
| } |
| |
| for( i = 0x02 ; i <= 0x03 ; i++ ) |
| { |
| data = pVBInfo->TimingV[ 0 ].data[ i ] ; |
| XGINew_SetReg1( pVBInfo->P3d4 , ( USHORT )( i + 0x0e ) , data ) ; |
| } |
| |
| for( i = 0x04 ; i <= 0x05 ; i++ ) |
| { |
| data = pVBInfo->TimingV[ 0 ].data[ i ] ; |
| XGINew_SetReg1( pVBInfo->P3d4 , ( USHORT )( i + 0x11 ) , data ) ; |
| } |
| |
| j = ( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x0a ) ; |
| j &= 0xC0 ; |
| data = pVBInfo->TimingV[ 0 ].data[ 6 ] ; |
| data &= 0x3F ; |
| data |= j ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x0a , data ) ; |
| |
| data = pVBInfo->TimingV[ 0 ].data[ 6 ] ; |
| data &= 0x80 ; |
| data = data >> 2 ; |
| |
| if ( ModeNo <= 0x13 ) |
| i = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; |
| else |
| i = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; |
| |
| i &= DoubleScanMode ; |
| if ( i ) |
| data |= 0x80 ; |
| |
| j = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x09 ) ; |
| j &= 0x5F ; |
| data |= j ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x09 , data ) ; |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetXG21CRTC */ |
| /* Input : Stand or enhance CRTC table */ |
| /* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */ |
| /* Description : Set LCD timing */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetXG21CRTC(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) |
| { |
| UCHAR StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx ; |
| USHORT Temp1, Temp2, Temp3 ; |
| |
| if ( ModeNo <= 0x13 ) |
| { |
| StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ; |
| Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 4 ] ; /* CR04 HRS */ |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ; /* SR2E [7:0]->HRS */ |
| Tempbx = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 5 ] ; /* Tempbx: CR05 HRE */ |
| Tempbx &= 0x1F ; /* Tempbx: HRE[4:0] */ |
| Tempcx = Tempax ; |
| Tempcx &= 0xE0 ; /* Tempcx: HRS[7:5] */ |
| Tempdx = Tempcx | Tempbx ; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */ |
| if ( Tempbx < ( Tempax & 0x1F ) ) /* IF HRE < HRS */ |
| Tempdx |= 0x20 ; /* Tempdx: HRE = HRE + 0x20 */ |
| Tempdx <<= 2 ; /* Tempdx << 2 */ |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempdx ) ; /* SR2F [7:2]->HRE */ |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ; |
| |
| Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 16 ] ; /* Tempax: CR16 VRS */ |
| Tempbx = Tempax ; /* Tempbx=Tempax */ |
| Tempax &= 0x01 ; /* Tempax: VRS[0] */ |
| XGINew_SetRegOR( pVBInfo->P3c4 , 0x33 , Tempax ) ; /* SR33[0]->VRS */ |
| Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 7 ] ; /* Tempax: CR7 VRS */ |
| Tempdx = Tempbx >> 1 ; /* Tempdx: VRS[7:1] */ |
| Tempcx = Tempax & 0x04 ; /* Tempcx: CR7[2] */ |
| Tempcx <<= 5 ; /* Tempcx[7]: VRS[8] */ |
| Tempdx |= Tempcx ; /* Tempdx: VRS[8:1] */ |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempdx ) ; /* SR34[7:0]: VRS[8:1] */ |
| |
| Temp1 = Tempcx << 1 ; /* Temp1[8]: VRS[8] UCHAR -> USHORT */ |
| Temp1 |= Tempbx ; /* Temp1[8:0]: VRS[8:0] */ |
| Tempax &= 0x80 ; /* Tempax[7]: CR7[7] */ |
| Temp2 = Tempax << 2 ; /* Temp2[9]: VRS[9] */ |
| Temp1 |= Temp2 ; /* Temp1[9:0]: VRS[9:0] */ |
| |
| Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 17 ] ; /* CR16 VRE */ |
| Tempax &= 0x0F ; /* Tempax[3:0]: VRE[3:0] */ |
| Temp2 = Temp1 & 0x3F0 ; /* Temp2[9:4]: VRS[9:4] */ |
| Temp2 |= Tempax ; /* Temp2[9:0]: VRE[9:0] */ |
| Temp3 = Temp1 & 0x0F ; /* Temp3[3:0]: VRS[3:0] */ |
| if ( Tempax < Temp3 ) /* VRE[3:0]<VRS[3:0] */ |
| Temp2 |= 0x10 ; /* Temp2: VRE + 0x10 */ |
| Temp2 &= 0xFF ; /* Temp2[7:0]: VRE[7:0] */ |
| Tempax = (UCHAR)Temp2 ; /* Tempax[7:0]: VRE[7:0] */ |
| Tempax <<= 2 ; /* Tempax << 2: VRE[5:0] */ |
| Temp1 &= 0x600 ; /* Temp1[10:9]: VRS[10:9] */ |
| Temp1 >>= 9 ; /* [10:9]->[1:0] */ |
| Tempbx = (UCHAR)Temp1 ; /* Tempbx[1:0]: VRS[10:9] */ |
| Tempax |= Tempbx ; /* VRE[5:0]VRS[10:9] */ |
| Tempax &= 0x7F ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x3F , Tempax ) ; /* SR3F D[7:2]->VRE D[1:0]->VRS */ |
| } |
| else |
| { |
| index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ; |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 3 ] ; /* Tempax: CR4 HRS */ |
| Tempcx = Tempax ; /* Tempcx: HRS */ |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ; /* SR2E[7:0]->HRS */ |
| |
| Tempdx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 5 ] ; /* SRB */ |
| Tempdx &= 0xC0 ; /* Tempdx[7:6]: SRB[7:6] */ |
| Temp1 = Tempdx ; /* Temp1[7:6]: HRS[9:8] */ |
| Temp1 <<= 2 ; /* Temp1[9:8]: HRS[9:8] */ |
| Temp1 |= Tempax ; /* Temp1[9:0]: HRS[9:0] */ |
| |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 4 ] ; /* CR5 HRE */ |
| Tempax &= 0x1F ; /* Tempax[4:0]: HRE[4:0] */ |
| |
| Tempbx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 6 ] ; /* SRC */ |
| Tempbx &= 0x04 ; /* Tempbx[2]: HRE[5] */ |
| Tempbx <<= 3 ; /* Tempbx[5]: HRE[5] */ |
| Tempax |= Tempbx ; /* Tempax[5:0]: HRE[5:0] */ |
| |
| Temp2 = Temp1 & 0x3C0 ; /* Temp2[9:6]: HRS[9:6] */ |
| Temp2 |= Tempax ; /* Temp2[9:0]: HRE[9:0] */ |
| |
| Tempcx &= 0x3F ; /* Tempcx[5:0]: HRS[5:0] */ |
| if( Tempax < Tempcx ) /* HRE < HRS */ |
| Temp2 |= 0x40 ; /* Temp2 + 0x40 */ |
| |
| Temp2 &= 0xFF ; |
| Tempax = (UCHAR)Temp2 ; /* Tempax: HRE[7:0] */ |
| Tempax <<= 2 ; /* Tempax[7:2]: HRE[5:0] */ |
| Tempdx >>= 6 ; /* Tempdx[7:6]->[1:0] HRS[9:8] */ |
| Tempax |= Tempdx ; /* HRE[5:0]HRS[9:8] */ |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempax ) ; /* SR2F D[7:2]->HRE, D[1:0]->HRS */ |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ; |
| |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 10 ] ; /* CR10 VRS */ |
| Tempbx = Tempax ; /* Tempbx: VRS */ |
| Tempax &= 0x01 ; /* Tempax[0]: VRS[0] */ |
| XGINew_SetRegOR( pVBInfo->P3c4 , 0x33 , Tempax ) ; /* SR33[0]->VRS[0] */ |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 9 ] ; /* CR7[2][7] VRE */ |
| Tempcx = Tempbx >> 1 ; /* Tempcx[6:0]: VRS[7:1] */ |
| Tempdx = Tempax & 0x04 ; /* Tempdx[2]: CR7[2] */ |
| Tempdx <<= 5 ; /* Tempdx[7]: VRS[8] */ |
| Tempcx |= Tempdx ; /* Tempcx[7:0]: VRS[8:1] */ |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempcx ) ; /* SR34[8:1]->VRS */ |
| |
| Temp1 = Tempdx ; /* Temp1[7]: Tempdx[7] */ |
| Temp1 <<= 1 ; /* Temp1[8]: VRS[8] */ |
| Temp1 |= Tempbx ; /* Temp1[8:0]: VRS[8:0] */ |
| Tempax &= 0x80 ; |
| Temp2 = Tempax << 2 ; /* Temp2[9]: VRS[9] */ |
| Temp1 |= Temp2 ; /* Temp1[9:0]: VRS[9:0] */ |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ; /* Tempax: SRA */ |
| Tempax &= 0x08 ; /* Tempax[3]: VRS[3] */ |
| Temp2 = Tempax ; |
| Temp2 <<= 7 ; /* Temp2[10]: VRS[10] */ |
| Temp1 |= Temp2 ; /* Temp1[10:0]: VRS[10:0] */ |
| |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 11 ] ; /* Tempax: CR11 VRE */ |
| Tempax &= 0x0F ; /* Tempax[3:0]: VRE[3:0] */ |
| Tempbx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ; /* Tempbx: SRA */ |
| Tempbx &= 0x20 ; /* Tempbx[5]: VRE[5] */ |
| Tempbx >>= 1 ; /* Tempbx[4]: VRE[4] */ |
| Tempax |= Tempbx ; /* Tempax[4:0]: VRE[4:0] */ |
| Temp2 = Temp1 & 0x7E0 ; /* Temp2[10:5]: VRS[10:5] */ |
| Temp2 |= Tempax ; /* Temp2[10:5]: VRE[10:5] */ |
| |
| Temp3 = Temp1 & 0x1F ; /* Temp3[4:0]: VRS[4:0] */ |
| if ( Tempax < Temp3 ) /* VRE < VRS */ |
| Temp2 |= 0x20 ; /* VRE + 0x20 */ |
| |
| Temp2 &= 0xFF ; |
| Tempax = (UCHAR)Temp2 ; /* Tempax: VRE[7:0] */ |
| Tempax <<= 2 ; /* Tempax[7:0]; VRE[5:0]00 */ |
| Temp1 &= 0x600 ; /* Temp1[10:9]: VRS[10:9] */ |
| Temp1 >>= 9 ; /* Temp1[1:0]: VRS[10:9] */ |
| Tempbx = (UCHAR)Temp1 ; |
| Tempax |= Tempbx ; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */ |
| Tempax &= 0x7F ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x3F , Tempax ) ; /* SR3F D[7:2]->VRE D[1:0]->VRS */ |
| } |
| } |
| |
| void XGI_SetXG27CRTC(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) |
| { |
| USHORT StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx ; |
| |
| if ( ModeNo <= 0x13 ) |
| { |
| StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ; |
| Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 4 ] ; /* CR04 HRS */ |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ; /* SR2E [7:0]->HRS */ |
| Tempbx = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 5 ] ; /* Tempbx: CR05 HRE */ |
| Tempbx &= 0x1F ; /* Tempbx: HRE[4:0] */ |
| Tempcx = Tempax ; |
| Tempcx &= 0xE0 ; /* Tempcx: HRS[7:5] */ |
| Tempdx = Tempcx | Tempbx ; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */ |
| if ( Tempbx < ( Tempax & 0x1F ) ) /* IF HRE < HRS */ |
| Tempdx |= 0x20 ; /* Tempdx: HRE = HRE + 0x20 */ |
| Tempdx <<= 2 ; /* Tempdx << 2 */ |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempdx ) ; /* SR2F [7:2]->HRE */ |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ; |
| |
| Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 16 ] ; /* Tempax: CR10 VRS */ |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempax ) ; /* SR34[7:0]->VRS */ |
| Tempcx = Tempax ; /* Tempcx=Tempax=VRS[7:0] */ |
| Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 7 ] ; /* Tempax[7][2]: CR7[7][2] VRS[9][8] */ |
| Tempbx = Tempax ; /* Tempbx=CR07 */ |
| Tempax &= 0x04 ; /* Tempax[2]: CR07[2] VRS[8] */ |
| Tempax >>= 2; |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x01, Tempax ) ; /* SR35 D[0]->VRS D[8] */ |
| Tempcx |= (Tempax << 8) ; /* Tempcx[8] |= VRS[8] */ |
| Tempcx |= (Tempbx & 0x80)<<2; /* Tempcx[9] |= VRS[9] */ |
| |
| |
| Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 17 ] ; /* CR11 VRE */ |
| Tempax &= 0x0F ; /* Tempax: VRE[3:0] */ |
| Tempbx = Tempcx ; /* Tempbx=Tempcx=VRS[9:0] */ |
| Tempbx &= 0x3F0 ; /* Tempbx[9:4]: VRS[9:4] */ |
| Tempbx |= Tempax ; /* Tempbx[9:0]: VRE[9:0] */ |
| if ( Tempax <= (Tempcx & 0x0F) ) /* VRE[3:0]<=VRS[3:0] */ |
| Tempbx |= 0x10 ; /* Tempbx: VRE + 0x10 */ |
| Tempax = (UCHAR)Tempbx & 0xFF; /* Tempax[7:0]: VRE[7:0] */ |
| Tempax <<= 2 ; /* Tempax << 2: VRE[5:0] */ |
| Tempcx = (Tempcx&0x600)>>8; /* Tempcx VRS[10:9] */ |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0xFC, Tempax ) ; /* SR3F D[7:2]->VRE D[5:0] */ |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x06, Tempcx ) ; /* SR35 D[2:1]->VRS[10:9] */ |
| } |
| else |
| { |
| index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ; |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 3 ] ; /* Tempax: CR4 HRS */ |
| Tempbx = Tempax ; /* Tempbx: HRS[7:0] */ |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ; /* SR2E[7:0]->HRS */ |
| |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 5 ] ; /* SR0B */ |
| Tempax &= 0xC0 ; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/ |
| Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */ |
| |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 4 ] ; /* CR5 HRE */ |
| Tempax &= 0x1F ; /* Tempax[4:0]: HRE[4:0] */ |
| Tempcx = Tempax ; /* Tempcx: HRE[4:0] */ |
| |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 6 ] ; /* SRC */ |
| Tempax &= 0x04 ; /* Tempax[2]: HRE[5] */ |
| Tempax <<= 3 ; /* Tempax[5]: HRE[5] */ |
| Tempcx |= Tempax ; /* Tempcx[5:0]: HRE[5:0] */ |
| |
| Tempbx = Tempbx & 0x3C0 ; /* Tempbx[9:6]: HRS[9:6] */ |
| Tempbx |= Tempcx ; /* Tempbx: HRS[9:6]HRE[5:0] */ |
| |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 3 ] ; /* Tempax: CR4 HRS */ |
| Tempax &= 0x3F ; /* Tempax: HRS[5:0] */ |
| if( Tempcx <= Tempax ) /* HRE[5:0] < HRS[5:0] */ |
| Tempbx += 0x40 ; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/ |
| |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 5 ] ; /* SR0B */ |
| Tempax &= 0xC0 ; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/ |
| Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/ |
| Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */ |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempax ) ; /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */ |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ; |
| |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 10 ] ; /* CR10 VRS */ |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempax ) ; /* SR34[7:0]->VRS[7:0] */ |
| |
| Tempcx = Tempax ; /* Tempcx <= VRS[7:0] */ |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 9 ] ; /* CR7[7][2] VRS[9][8] */ |
| Tempbx = Tempax ; /* Tempbx <= CR07[7:0] */ |
| Tempax = Tempax & 0x04 ; /* Tempax[2]: CR7[2]: VRS[8] */ |
| Tempax >>= 2 ; /* Tempax[0]: VRS[8] */ |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x01 , Tempax ) ; /* SR35[0]: VRS[8] */ |
| Tempcx |= (Tempax<<8) ; /* Tempcx <= VRS[8:0] */ |
| Tempcx |= ((Tempbx&0x80)<<2) ; /* Tempcx <= VRS[9:0] */ |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ; /* Tempax: SR0A */ |
| Tempax &= 0x08; /* SR0A[3] VRS[10] */ |
| Tempcx |= (Tempax<<7) ; /* Tempcx <= VRS[10:0] */ |
| |
| |
| Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 11 ] ; /* Tempax: CR11 VRE */ |
| Tempax &= 0x0F ; /* Tempax[3:0]: VRE[3:0] */ |
| Tempbx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ; /* Tempbx: SR0A */ |
| Tempbx &= 0x20 ; /* Tempbx[5]: SR0A[5]: VRE[4] */ |
| Tempbx >>= 1 ; /* Tempbx[4]: VRE[4] */ |
| Tempax |= Tempbx ; /* Tempax[4:0]: VRE[4:0] */ |
| Tempbx = Tempcx ; /* Tempbx: VRS[10:0] */ |
| Tempbx &= 0x7E0 ; /* Tempbx[10:5]: VRS[10:5] */ |
| Tempbx |= Tempax ; /* Tempbx: VRS[10:5]VRE[4:0] */ |
| |
| if ( Tempbx <= Tempcx ) /* VRE <= VRS */ |
| Tempbx |= 0x20 ; /* VRE + 0x20 */ |
| |
| Tempax = (Tempbx<<2) & 0xFF ; /* Tempax: Tempax[7:0]; VRE[5:0]00 */ |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0xFC , Tempax ) ; /* SR3F[7:2]:VRE[5:0] */ |
| Tempax = Tempcx >> 8; |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x07 , Tempax ) ; /* SR35[2:0]:VRS[10:8] */ |
| } |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetXG21LCD */ |
| /* Input : */ |
| /* Output : FCLK duty cycle, FCLK delay compensation */ |
| /* Description : All values set zero */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetXG21LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo) |
| { |
| USHORT Data , Temp , b3CC ; |
| USHORT XGI_P3cc ; |
| |
| XGI_P3cc = pVBInfo->P3cc ; |
| |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , 0x00 ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , 0x00 ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , 0x00 ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , 0x00 ) ; |
| if ( ((*pVBInfo->pDVOSetting)&0xC0) == 0xC0 ) |
| { |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , *pVBInfo->pCR2E ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , *pVBInfo->pCR2F ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , *pVBInfo->pCR46 ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , *pVBInfo->pCR47 ) ; |
| } |
| |
| Temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ; |
| |
| if ( Temp & 0x01 ) |
| { |
| XGINew_SetRegOR( pVBInfo->P3c4 , 0x06 , 0x40 ) ; /* 18 bits FP */ |
| XGINew_SetRegOR( pVBInfo->P3c4 , 0x09 , 0x40 ) ; |
| } |
| |
| XGINew_SetRegOR( pVBInfo->P3c4 , 0x1E , 0x01 ) ; /* Negative blank polarity */ |
| |
| XGINew_SetRegAND( pVBInfo->P3c4 , 0x30 , ~0x20 ) ; |
| XGINew_SetRegAND( pVBInfo->P3c4 , 0x35 , ~0x80 ) ; |
| |
| if ( ModeNo <= 0x13 ) |
| { |
| b3CC = (UCHAR) XGINew_GetReg2( XGI_P3cc ) ; |
| if ( b3CC & 0x40 ) |
| XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */ |
| if ( b3CC & 0x80 ) |
| XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */ |
| } |
| else |
| { |
| Data = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ; |
| if ( Data & 0x4000 ) |
| XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */ |
| if ( Data & 0x8000 ) |
| XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */ |
| } |
| } |
| |
| void XGI_SetXG27LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo) |
| { |
| USHORT Data , Temp , b3CC ; |
| USHORT XGI_P3cc ; |
| |
| XGI_P3cc = pVBInfo->P3cc ; |
| |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , 0x00 ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , 0x00 ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , 0x00 ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , 0x00 ) ; |
| |
| Temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ; |
| if ( ( Temp & 0x03 ) == 0 ) /* dual 12 */ |
| { |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , 0x13 ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , 0x13 ) ; |
| } |
| |
| if ( ((*pVBInfo->pDVOSetting)&0xC0) == 0xC0 ) |
| { |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , *pVBInfo->pCR2E ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , *pVBInfo->pCR2F ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , *pVBInfo->pCR46 ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , *pVBInfo->pCR47 ) ; |
| } |
| |
| XGI_SetXG27FPBits(pVBInfo); |
| |
| XGINew_SetRegOR( pVBInfo->P3c4 , 0x1E , 0x01 ) ; /* Negative blank polarity */ |
| |
| XGINew_SetRegAND( pVBInfo->P3c4 , 0x30 , ~0x20 ) ; /* Hsync polarity */ |
| XGINew_SetRegAND( pVBInfo->P3c4 , 0x35 , ~0x80 ) ; /* Vsync polarity */ |
| |
| if ( ModeNo <= 0x13 ) |
| { |
| b3CC = (UCHAR) XGINew_GetReg2( XGI_P3cc ) ; |
| if ( b3CC & 0x40 ) |
| XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */ |
| if ( b3CC & 0x80 ) |
| XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */ |
| } |
| else |
| { |
| Data = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ; |
| if ( Data & 0x4000 ) |
| XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */ |
| if ( Data & 0x8000 ) |
| XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */ |
| } |
| } |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_UpdateXG21CRTC */ |
| /* Input : */ |
| /* Output : CRT1 CRTC */ |
| /* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_UpdateXG21CRTC( USHORT ModeNo , PVB_DEVICE_INFO pVBInfo , USHORT RefreshRateTableIndex ) |
| { |
| int i , index = -1; |
| |
| XGINew_SetRegAND( pVBInfo->P3d4 , 0x11 , 0x7F ) ; /* Unlock CR0~7 */ |
| if ( ModeNo <= 0x13 ) |
| { |
| for( i = 0 ; i < 12 ; i++ ) |
| { |
| if ( ModeNo == pVBInfo->UpdateCRT1[ i ].ModeID ) |
| index = i ; |
| } |
| } |
| else |
| { |
| if ( ModeNo == 0x2E && ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC == RES640x480x60 ) ) |
| index = 12 ; |
| else if ( ModeNo == 0x2E && ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC == RES640x480x72 ) ) |
| index = 13 ; |
| else if ( ModeNo == 0x2F ) |
| index = 14 ; |
| else if ( ModeNo == 0x50 ) |
| index = 15 ; |
| else if ( ModeNo == 0x59 ) |
| index = 16 ; |
| } |
| |
| if( index != -1 ) |
| { |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x02 , pVBInfo->UpdateCRT1[ index ].CR02 ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x03 , pVBInfo->UpdateCRT1[ index ].CR03 ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x15 , pVBInfo->UpdateCRT1[ index ].CR15 ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x16 , pVBInfo->UpdateCRT1[ index ].CR16 ) ; |
| } |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetCRT1DE */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetCRT1DE( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT ModeNo,USHORT ModeIdIndex , USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo ) |
| { |
| USHORT resindex , |
| tempax , |
| tempbx , |
| tempcx , |
| temp , |
| modeflag ; |
| |
| UCHAR data ; |
| |
| resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ; |
| |
| if ( ModeNo <= 0x13 ) |
| { |
| modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; |
| tempax = pVBInfo->StResInfo[ resindex ].HTotal ; |
| tempbx = pVBInfo->StResInfo[ resindex ].VTotal ; |
| } |
| else |
| { |
| modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; |
| tempax = pVBInfo->ModeResInfo[ resindex ].HTotal ; |
| tempbx = pVBInfo->ModeResInfo[ resindex ].VTotal ; |
| } |
| |
| if ( modeflag & HalfDCLK ) |
| tempax = tempax >> 1 ; |
| |
| if ( ModeNo > 0x13 ) |
| { |
| if ( modeflag & HalfDCLK ) |
| tempax = tempax << 1 ; |
| |
| temp = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ; |
| |
| if ( temp & InterlaceMode ) |
| tempbx = tempbx >> 1 ; |
| |
| if ( modeflag & DoubleScanMode ) |
| tempbx = tempbx << 1 ; |
| } |
| |
| tempcx = 8 ; |
| |
| /* if ( !( modeflag & Charx8Dot ) ) */ |
| /* tempcx = 9 ; */ |
| |
| tempax /= tempcx ; |
| tempax -= 1 ; |
| tempbx -= 1 ; |
| tempcx = tempax ; |
| temp = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x11 ) ; |
| data = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x11 ) ; |
| data &= 0x7F ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , data ) ; /* Unlock CRTC */ |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x01 , ( USHORT )( tempcx & 0xff ) ) ; |
| XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x0b , ~0x0c , ( USHORT )( ( tempcx & 0x0ff00 ) >> 10 ) ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x12 , ( USHORT )( tempbx & 0xff ) ) ; |
| tempax = 0 ; |
| tempbx = tempbx >> 8 ; |
| |
| if ( tempbx & 0x01 ) |
| tempax |= 0x02 ; |
| |
| if ( tempbx & 0x02 ) |
| tempax |= 0x40 ; |
| |
| XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x42 , tempax ) ; |
| data =( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x07 ) ; |
| data &= 0xFF ; |
| tempax = 0 ; |
| |
| if ( tempbx & 0x04 ) |
| tempax |= 0x02 ; |
| |
| XGINew_SetRegANDOR( pVBInfo->P3d4 ,0x0a , ~0x02 , tempax ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , temp ) ; |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_GetResInfo */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| USHORT XGI_GetResInfo(USHORT ModeNo , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ) |
| { |
| USHORT resindex ; |
| |
| if ( ModeNo <= 0x13 ) |
| { |
| resindex = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ; /* si+St_ResInfo */ |
| } |
| else |
| { |
| resindex = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ; /* si+Ext_ResInfo */ |
| } |
| return( resindex ) ; |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetCRT1Offset */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetCRT1Offset( USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex , PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo ) |
| { |
| USHORT temp , |
| ah , |
| al , |
| temp2 , |
| i , |
| DisplayUnit ; |
| |
| /* GetOffset */ |
| temp = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeInfo ; |
| temp = temp >> 8 ; |
| temp = pVBInfo->ScreenOffset[ temp ] ; |
| |
| temp2 = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ; |
| temp2 &= InterlaceMode ; |
| |
| if ( temp2 ) |
| temp = temp << 1; |
| |
| temp2 = pVBInfo->ModeType - ModeEGA ; |
| |
| switch( temp2 ) |
| { |
| case 0: |
| temp2 = 1 ; |
| break ; |
| case 1: |
| temp2 = 2 ; |
| break ; |
| case 2: |
| temp2 = 4 ; |
| break ; |
| case 3: |
| temp2 = 4 ; |
| break ; |
| case 4: |
| temp2 = 6 ; |
| break; |
| case 5: |
| temp2 = 8 ; |
| break ; |
| default: |
| break ; |
| } |
| |
| if ( ( ModeNo >= 0x26 ) && ( ModeNo <= 0x28 ) ) |
| temp = temp * temp2 + temp2 / 2 ; |
| else |
| temp *= temp2 ; |
| |
| /* SetOffset */ |
| DisplayUnit = temp ; |
| temp2 = temp ; |
| temp = temp >> 8 ; /* ah */ |
| temp &= 0x0F ; |
| i = XGINew_GetReg1( pVBInfo->P3c4 , 0x0E ) ; |
| i &= 0xF0 ; |
| i |= temp ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x0E , i ) ; |
| |
| temp =( UCHAR )temp2 ; |
| temp &= 0xFF ; /* al */ |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x13 , temp ) ; |
| |
| /* SetDisplayUnit */ |
| temp2 = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ; |
| temp2 &= InterlaceMode ; |
| if ( temp2 ) |
| DisplayUnit >>= 1 ; |
| |
| DisplayUnit = DisplayUnit << 5 ; |
| ah = ( DisplayUnit & 0xff00 ) >> 8 ; |
| al = DisplayUnit & 0x00ff ; |
| if ( al == 0 ) |
| ah += 1 ; |
| else |
| ah += 2 ; |
| |
| if ( HwDeviceExtension->jChipType >= XG20 ) |
| if ( ( ModeNo == 0x4A ) | (ModeNo == 0x49 ) ) |
| ah -= 1 ; |
| |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x10 , ah ) ; |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetCRT1VCLK */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetCRT1VCLK( USHORT ModeNo , USHORT ModeIdIndex , |
| PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo ) |
| { |
| UCHAR index , data ; |
| USHORT vclkindex ; |
| |
| if ( pVBInfo->IF_DEF_LVDS == 1 ) |
| { |
| index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ; |
| data = XGINew_GetReg1( pVBInfo->P3c4 , 0x31 ) & 0xCF ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , data ) ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ index ].SR2B ) ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ index ].SR2C ) ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2D , 0x01 ) ; |
| } |
| else if ( ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) && ( pVBInfo->VBInfo & SetCRT2ToLCDA ) ) |
| { |
| vclkindex = XGI_GetVCLK2Ptr( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ; |
| data = XGINew_GetReg1( pVBInfo->P3c4 , 0x31 ) & 0xCF ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , data ) ; |
| data = pVBInfo->VBVCLKData[ vclkindex ].Part4_A ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , data ) ; |
| data = pVBInfo->VBVCLKData[ vclkindex ].Part4_B ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , data ) ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2D , 0x01 ) ; |
| } |
| else |
| { |
| index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ; |
| data = XGINew_GetReg1( pVBInfo->P3c4 , 0x31 ) & 0xCF ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , data ) ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ index ].SR2B ) ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ index ].SR2C ) ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2D , 0x01 ) ; |
| } |
| |
| if ( HwDeviceExtension->jChipType >= XG20 ) |
| { |
| if ( pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag & HalfDCLK ) |
| { |
| data = XGINew_GetReg1( pVBInfo->P3c4 , 0x2B ) ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , data ) ; |
| data = XGINew_GetReg1( pVBInfo->P3c4 , 0x2C ) ; |
| index = data ; |
| index &= 0xE0 ; |
| data &= 0x1F ; |
| data = data << 1 ; |
| data += 1 ; |
| data |= index ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , data ) ; |
| } |
| } |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetCRT1FIFO */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetCRT1FIFO( USHORT ModeNo , PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo ) |
| { |
| USHORT data ; |
| |
| data = XGINew_GetReg1( pVBInfo->P3c4 , 0x3D ) ; |
| data &= 0xfe ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x3D , data ) ; /* diable auto-threshold */ |
| |
| if ( ModeNo > 0x13 ) |
| { |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x08 , 0x34 ) ; |
| data = XGINew_GetReg1( pVBInfo->P3c4 , 0x09 ) ; |
| data &= 0xC0 ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x09 , data | 0x30) ; |
| data = XGINew_GetReg1( pVBInfo->P3c4 , 0x3D ) ; |
| data |= 0x01 ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x3D , data ) ; |
| } |
| else |
| { |
| if (HwDeviceExtension->jChipType == XG27) |
| { |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x08 , 0x0E ) ; |
| data = XGINew_GetReg1( pVBInfo->P3c4 , 0x09 ) ; |
| data &= 0xC0 ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x09 , data | 0x20 ) ; |
| } |
| else |
| { |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x08 , 0xAE ) ; |
| data = XGINew_GetReg1( pVBInfo->P3c4 , 0x09 ) ; |
| data &= 0xF0 ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x09 , data ) ; |
| } |
| } |
| |
| if (HwDeviceExtension->jChipType == XG21) |
| { |
| XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */ |
| } |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetCRT1ModeRegs */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetCRT1ModeRegs( PXGI_HW_DEVICE_INFO HwDeviceExtension , |
| USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo ) |
| { |
| USHORT data , |
| data2 , |
| data3 , |
| infoflag = 0 , |
| modeflag , |
| resindex , |
| xres ; |
| |
| if ( ModeNo > 0x13 ) |
| { |
| modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; |
| infoflag = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ; |
| } |
| else |
| modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; /* si+St_ModeFlag */ |
| |
| if ( XGINew_GetReg1( pVBInfo->P3d4 , 0x31 ) & 0x01 ) |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x1F , 0x3F , 0x00 ) ; |
| |
| if ( ModeNo > 0x13 ) |
| data = infoflag ; |
| else |
| data = 0 ; |
| |
| data2 = 0 ; |
| |
| if ( ModeNo > 0x13 ) |
| { |
| if ( pVBInfo->ModeType > 0x02 ) |
| { |
| data2 |= 0x02 ; |
| data3 = pVBInfo->ModeType - ModeVGA ; |
| data3 = data3 << 2 ; |
| data2 |= data3 ; |
| } |
| } |
| |
| data &= InterlaceMode ; |
| |
| if ( data ) |
| data2 |= 0x20 ; |
| |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x06 , ~0x3F , data2 ) ; |
| /* XGINew_SetReg1(pVBInfo->P3c4,0x06,data2); */ |
| resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ; |
| if ( ModeNo <= 0x13 ) |
| xres = pVBInfo->StResInfo[ resindex ].HTotal ; |
| else |
| xres = pVBInfo->ModeResInfo[ resindex ].HTotal ; /* xres->ax */ |
| |
| data = 0x0000 ; |
| if ( infoflag & InterlaceMode ) |
| { |
| if ( xres == 1024 ) |
| data = 0x0035 ; |
| else if ( xres == 1280 ) |
| data = 0x0048 ; |
| } |
| |
| data2 = data & 0x00FF ; |
| XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x19 , 0xFF , data2 ) ; |
| data2 = ( data & 0xFF00 ) >> 8 ; |
| XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x19 , 0xFC , data2 ) ; |
| |
| if( modeflag & HalfDCLK ) |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xF7 , 0x08 ) ; |
| |
| data2 = 0 ; |
| |
| if ( modeflag & LineCompareOff ) |
| data2 |= 0x08 ; |
| |
| if ( ModeNo > 0x13 ) |
| { |
| if ( pVBInfo->ModeType == ModeEGA ) |
| data2 |= 0x40 ; |
| } |
| |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0F , ~0x48 , data2 ) ; |
| data = 0x60 ; |
| if ( pVBInfo->ModeType != ModeText ) |
| { |
| data = data ^ 0x60 ; |
| if ( pVBInfo->ModeType != ModeEGA ) |
| { |
| data = data ^ 0xA0 ; |
| } |
| } |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x21 , 0x1F , data ) ; |
| |
| XGI_SetVCLKState( HwDeviceExtension , ModeNo , RefreshRateTableIndex, pVBInfo) ; |
| |
| /* if(modeflag&HalfDCLK)//030305 fix lowresolution bug */ |
| /* if(XGINew_IF_DEF_NEW_LOWRES) */ |
| /* XGI_VesaLowResolution(ModeNo,ModeIdIndex);//030305 fix lowresolution bug */ |
| |
| data=XGINew_GetReg1( pVBInfo->P3d4 , 0x31 ) ; |
| |
| if (HwDeviceExtension->jChipType == XG27 ) |
| { |
| if ( data & 0x40 ) |
| data = 0x2c ; |
| else |
| data = 0x6c ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x52 , data ) ; |
| XGINew_SetRegOR( pVBInfo->P3d4 , 0x51 , 0x10 ) ; |
| } |
| else |
| if (HwDeviceExtension->jChipType >= XG20 ) |
| { |
| if ( data & 0x40 ) |
| data = 0x33 ; |
| else |
| data = 0x73 ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x52 , data ) ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x51 , 0x02 ) ; |
| } |
| else |
| { |
| if ( data & 0x40 ) |
| data = 0x2c ; |
| else |
| data = 0x6c ; |
| XGINew_SetReg1( pVBInfo->P3d4 , 0x52 , data ) ; |
| } |
| |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_SetVCLKState */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_SetVCLKState( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT ModeNo , USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo ) |
| { |
| USHORT data , |
| data2 = 0 ; |
| SHORT VCLK ; |
| |
| UCHAR index ; |
| |
| if ( ModeNo <= 0x13 ) |
| VCLK = 0 ; |
| else |
| { |
| index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ; |
| index &= IndexMask ; |
| VCLK = pVBInfo->VCLKData[ index ].CLOCK ; |
| } |
| |
| data = XGINew_GetReg1( pVBInfo->P3c4 , 0x32 ) ; |
| data &= 0xf3 ; |
| if ( VCLK >= 200 ) |
| data |= 0x0c ; /* VCLK > 200 */ |
| |
| if ( HwDeviceExtension->jChipType >= XG20 ) |
| data &= ~0x04 ; /* 2 pixel mode */ |
| |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x32 , data ) ; |
| |
| if ( HwDeviceExtension->jChipType < XG20 ) |
| { |
| data = XGINew_GetReg1( pVBInfo->P3c4 , 0x1F ) ; |
| data &= 0xE7 ; |
| if ( VCLK < 200 ) |
| data |= 0x10 ; |
| XGINew_SetReg1( pVBInfo->P3c4 , 0x1F , data ) ; |
| } |
| |
| /* Jong for Adavantech LCD ripple issue |
| if ( ( VCLK >= 0 ) && ( VCLK < 135 ) ) |
| data2 = 0x03 ; |
| else if ( ( VCLK >= 135 ) && ( VCLK < 160 ) ) |
| data2 = 0x02 ; |
| else if ( ( VCLK >= 160 ) && ( VCLK < 260 ) ) |
| data2 = 0x01 ; |
| else if ( VCLK > 260 ) |
| data2 = 0x00 ; |
| */ |
| data2 = 0x00 ; |
| |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x07 , 0xFC , data2 ) ; |
| if (HwDeviceExtension->jChipType >= XG27 ) |
| { |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x40 , 0xFC , data2&0x03 ) ; |
| } |
| |
| |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_VesaLowResolution */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| /*void XGI_VesaLowResolution( USHORT ModeNo , USHORT ModeIdIndex ,PVB_DEVICE_INFO pVBInfo) |
| { |
| USHORT modeflag; |
| |
| if ( ModeNo > 0x13 ) |
| modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; |
| else |
| modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; |
| |
| if ( ModeNo > 0x13 ) |
| { |
| if ( modeflag & DoubleScanMode ) |
| { |
| if ( modeflag & HalfDCLK ) |
| { |
| if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) |
| { |
| if ( !( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) ) |
| { |
| if ( pVBInfo->VBInfo & SetInSlaveMode ) |
| { |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xf7 , 0x00 ) ; |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0f , 0x7f , 0x00 ) ; |
| return ; |
| } |
| } |
| } |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0f , 0xff , 0x80 ) ; |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xf7 , 0x00 ) ; |
| return ; |
| } |
| } |
| } |
| XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0f , 0x7f , 0x00 ) ; |
| } |
| */ |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_LoadDAC */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_LoadDAC( USHORT ModeNo , USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo ) |
| { |
| USHORT data , data2 , time , |
| i , j , k , m , n , o , |
| si , di , bx , dl , al , ah , dh , |
| *table = NULL ; |
| |
| if ( ModeNo <= 0x13 ) |
| data = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; |
| else |
| data = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; |
| |
| data &= DACInfoFlag ; |
| time = 64 ; |
| |
| if ( data == 0x00 ) |
| table = XGINew_MDA_DAC ; |
| else if ( data == 0x08 ) |
| table = XGINew_CGA_DAC ; |
| else if ( data == 0x10 ) |
| table = XGINew_EGA_DAC ; |
| else if ( data == 0x18 ) |
| { |
| time = 256 ; |
| table = XGINew_VGA_DAC ; |
| } |
| |
| if ( time == 256 ) |
| j = 16 ; |
| else |
| j = time ; |
| |
| XGINew_SetReg3( pVBInfo->P3c6 , 0xFF ) ; |
| XGINew_SetReg3( pVBInfo->P3c8 , 0x00 ) ; |
| |
| for( i = 0 ; i < j ; i++ ) |
| { |
| data = table[ i ] ; |
| |
| for( k = 0 ; k < 3 ; k++ ) |
| { |
| data2 = 0 ; |
| |
| if ( data & 0x01 ) |
| data2 = 0x2A ; |
| |
| if ( data & 0x02 ) |
| data2 += 0x15 ; |
| |
| XGINew_SetReg3( pVBInfo->P3c9 , data2 ) ; |
| data = data >> 2 ; |
| } |
| } |
| |
| if ( time == 256 ) |
| { |
| for( i = 16 ; i < 32 ; i++ ) |
| { |
| data = table[ i ] ; |
| |
| for( k = 0 ; k < 3 ; k++ ) |
| XGINew_SetReg3( pVBInfo->P3c9 , data ) ; |
| } |
| |
| si = 32 ; |
| |
| for( m = 0 ; m < 9 ; m++ ) |
| { |
| di = si ; |
| bx = si + 0x04 ; |
| dl = 0 ; |
| |
| for( n = 0 ; n < 3 ; n++ ) |
| { |
| for( o = 0 ; o < 5 ; o++ ) |
| { |
| dh = table[ si ] ; |
| ah = table[ di ] ; |
| al = table[ bx ] ; |
| si++ ; |
| XGI_WriteDAC( dl , ah , al , dh, pVBInfo ) ; |
| } |
| |
| si -= 2 ; |
| |
| for( o = 0 ; o < 3 ; o++ ) |
| { |
| dh = table[ bx ] ; |
| ah = table[ di ] ; |
| al = table[ si ] ; |
| si-- ; |
| XGI_WriteDAC( dl , ah , al , dh, pVBInfo ) ; |
| } |
| |
| dl++ ; |
| } |
| |
| si += 5 ; |
| } |
| } |
| } |
| |
| |
| /* --------------------------------------------------------------------- */ |
| /* Function : XGI_WriteDAC */ |
| /* Input : */ |
| /* Output : */ |
| /* Description : */ |
| /* --------------------------------------------------------------------- */ |
| void XGI_WriteDAC( USHORT dl , USHORT ah , USHORT al , USHORT dh,PVB_DEVICE_INFO pVBInfo ) |
| { |
| USHORT temp , bh , bl ; |
| |
| bh = ah ; |
| bl = al ; |
| |
| if ( dl != 0 ) |
| { |
| temp = bh ; |
| bh = dh ; |
| dh = temp ; |
| if ( dl == 1 ) |
| { |
| temp = bl ; |
| bl = dh ; |
| dh = temp ; |
| } |
| else |
| { |
| temp = |