/************************************************************************/ /* */ /* CVTVGA.H */ /* */ /* Copyright (c) 1992, ATI Technologies Inc. */ /************************************************************************/ /********************** PolyTron RCS Utilities $Revision: 1.8 $ $Date: 06 Feb 1996 15:59:40 $ $Author: RWolff $ $Log: S:/source/wnt/ms11/miniport/archive/cvtvga.h_v $ * * Rev 1.8 06 Feb 1996 15:59:40 RWolff * For 1600x1200, deleted 52Hz table (never an official mode, offered * only to allow a choice of refresh rates), updated 60Hz to match CRT * parameters currently offered by install program, added 66Hz and 76Hz. * * Rev 1.7 19 Dec 1995 14:01:34 RWolff * Added support for refresh rates up to 100Hz at 640x480, 800x600, and * 1024x768 and 75Hz at 1280x1024. Updated mode tables to match those in * the Mach64 Programmer's Guide. * * Rev 1.6 07 Sep 1995 16:43:06 RWolff * Fixed 1280x1024 95Hz interlaced (listed as 47Hz in display applet) to * eliminate "wrap" at top of screen. The tables in both the Mach 32 * and Mach 64 books contain the wrong values for vertical total and * vertical sync start. * * Rev 1.5 20 Jul 1995 17:55:48 mgrubac * Added support for VDIF files * * Rev 1.4 10 Apr 1995 15:57:36 RWOLFF * Added prototype for routine to replace BookValues[] entries where the * Mach 64 and Mach 8/Mach 32 need different CRT parameters. * * Rev 1.3 31 Aug 1994 16:23:08 RWOLFF * Added support for 1152x864 and 1600x1200 "canned" mode tables. * * Rev 1.2 19 Aug 1994 17:10:22 RWOLFF * Added support for non-standard pixel clock generators. * * Rev 1.1 12 May 1994 11:11:02 RWOLFF * Added refresh rate to st_book_data structure, re-ordered list of book * mode tables to allow a single range of indices when highest noninterlaced * refresh rates at a given resolution are ignored. * * Rev 1.0 31 Jan 1994 11:40:38 RWOLFF * Initial revision. Rev 1.1 08 Oct 1993 11:04:50 RWOLFF Removed prototype for unused "fall back to 56Hz" function for 800x600. Rev 1.0 16 Aug 1993 13:30:00 Robert_Wolff Initial revision. Rev 1.8 08 Apr 1993 16:44:54 RWOLFF Revision level as checked in at Microsoft. Rev 1.6 25 Mar 1993 11:13:38 RWOLFF Brought function prototype into sync with the function definition to eliminate compile-time warnings. Rev 1.5 08 Mar 1993 19:28:18 BRADES submit to MS NT Rev 1.4 02 Dec 1992 17:29:56 Robert_Wolff Added prototype for FallBack800to56(). Rev 1.3 27 Nov 1992 15:18:20 STEPHEN No change. Rev 1.2 17 Nov 1992 17:25:34 Robert_Wolff Fixed gathering of CRT parameters for 68800 card with minimal install (EEPROM blank, then predefined monitor type selected). Rev 1.1 12 Nov 1992 16:44:26 Robert_Wolff Same file is now used for both Windows NT driver and VIDEO.EXE test program. XlateVgaTable() no longer depends on the global variable classMACH32. Rev 1.1 09 Oct 1992 15:01:24 Robert_Wolff Added fields for DISP_CNTL and CLOCK_SEL values. Rev 1.0 01 Oct 1992 15:32:38 Robert_Wolff Initial revision. End of PolyTron RCS section *****************/ #if defined(DOC) CVTVGA.H - ATI card VGA to 8514 format translation DESCRIPTION: This include file contains definitions specific to the VGA to 8514 format EEPROM translation module of the program VIDEO.EXE Included are structure definitions, function prototypes and general definitions #endif /* * Bit 8 of CRT parameter table entry 0 is set if the table is in * 8514 format and clear if the table is in VGA format. */ #define FMT_8514 0x0100 /* * Bit 6 of CRT parameter table entry 0 is set if all parameters * are to be read from the EEPROM and clear if only sync polarities * are to be used. */ #define CRTC_USAGE 0x0040 /* * Bit flags to recognize which vertical scan rate is used at * a given resolution. The name for the constant is in the form * MFF, with the * "B" standing for (B)ook. */ #define B640F60 0 #define B640F72 1 #define B640F75 2 #define B640F90 3 #define B640F100 4 #define B800F89 5 #define B800F95 6 #define B800F56 7 #define B800F60 8 #define B800F70 9 #define B800F72 10 #define B800F75 11 #define B800F90 12 #define B800F100 13 #define B1024F87 14 #define B1024F60 15 #define B1024F66 16 #define B1024F70 17 #define B1024F72 18 #define B1024F75 19 #define B1024F90 20 #define B1024F100 21 #define B1120F70 22 #define B1152F87 23 #define B1152F95 24 #define B1152F60 25 #define B1152F70 26 #define B1152F75 27 #define B1152F80 28 #define B1280F87 29 #define B1280F95 30 #define B1280F60 31 #define B1280F70 32 #define B1280F74 33 #define B1280F75 34 #define B1600F60 35 #define B1600F66 36 #define B1600F76 37 /* * VGA parameter table entry to use when translating into 8514 format. * The value NO_TBL_ENTRY will cause the VGA to 8514 format translation * routine to fail gracefully if we have run into an EEPROM CRT parameter * table in VGA format for which we have no entry in the VGA parameter table. * * The entries in the VGA parameter table are arranged in ascending order * of horizontal resolution, with entries having the same horizontal * resolution sorted in ascending order of vertical scan frequency. No * distinction is made between interlaced and noninterlaced modes. * * The name for the constant is in the form * TF, with the * "T" standing for (T)able. */ #define T640F72 0 #define T800F72 4 #define T800F70 3 #define T800F60 2 #define T800F56 1 #define T800F89 5 #define T1024F72 8 #define T1024F70 7 #define T1024F60 6 #define T1024F87 9 /* * Some resolution/vertical scan rate combinations (e.g. IBM default * 640x480) did not have VGA parameter tables in either VGAP$PS2.ASM * or VGAP$68A.MAC. For these modes, XlateVgaTable() will return * the parameters in Appendix D of the Programmer's Guide to the * Mach 32 Registers, since calculating the values for the mode table * requires a VGA parameter table. * * If we encounter one of these modes (identified by its (T)able * value being greater than or equal to USE_BOOK_VALUE), handle * it the same way we deal with modes whose parameters are not * stored in the EEPROM. */ #define NO_TBL_ENTRY -1 #define USE_BOOK_VALUE 1000 #define T640F60 USE_BOOK_VALUE+B640F60 #define T800F95 USE_BOOK_VALUE+B800F95 #define T1024F66 USE_BOOK_VALUE+B1024F66 #define T1280F87 USE_BOOK_VALUE+B1280F87 #define T1280F95 USE_BOOK_VALUE+B1280F95 #define T1120F70 USE_BOOK_VALUE+B1120F70 /* * Value returned in overscan words if no table entry was found. * This value was chosen because it will stand out when the overscan * words are printed out as 4 hex digits (as is done by VIDEO.EXE). */ #define INVALID_WARNING 0x0DEAD /* * Bits which are set in pmode->control when sync polarity is negative, * and mask which must be ORed with sync width during VGA to 8514 conversion * if the sync is negative. */ #define HSYNC_BIT 0x4000 #define VSYNC_BIT 0x8000 #define NEG_SYNC_FACTOR 0x0020 /* * Mask for bit which is set in st_vga_data.MiscParms * for interlaced modes. */ #define INTERL 0x040 /* * Mask for bit which is set in st_vga_data.Mode * if word mode is enabled. */ #define WORD_MODE 0x004 /* * Format of VGA parameter table. This structure contains only those values * from the mode tables in VGAROM\VGAP$68A.MAC and VGAROM\VGAP$PS2.ASM which * are used in translating EEPROM data from VGA to 8514 format (original * tables are 64 bytes). * * The offsets listed in the comments are the offsets of the corresponding * bytes in the assembler tables. */ struct st_vga_data { unsigned char Stretch; /* Horizontal values stretched if 128 here, offset 0 */ unsigned char MiscParms; /* Miscelaneous parameters, offset 7 */ unsigned char DisplayWidth; /* Offset 11 */ unsigned char DisplayHgt; /* Offset 28 */ unsigned char Mode; /* Contains word mode flag, offset 33 */ /* * Values for CLOCK_SEL, DISP_CNTL, and ClockFreq taken from the * Programmer's Guide to the Mach 32 Registers. These values are * not stored as a combination of the CRT registers when the * EEPROM data is in VGA format. */ unsigned short ClockSel; unsigned short DispCntl; unsigned long ClockFreq; /* Pixel clock frequency in Hertz */ }; /* * Data structure to hold mode parameters as quoted in Appendix D * of the Programmer's Guide to the Mach 32 Registers. */ struct st_book_data { unsigned char HTotal; /* Horizontal total */ unsigned char HDisp; /* Horizontal displayed */ unsigned char HSyncStrt; /* Horizontal sync start */ unsigned char HSyncWid; /* Horizontal sync width */ unsigned short VTotal; /* Vertical total */ unsigned short VDisp; /* Vertical displayed */ unsigned short VSyncStrt; /* Vertical sync start */ unsigned char VSyncWid; /* Vertical sync width */ unsigned char DispCntl; /* Display control */ unsigned long ClockFreq; /* Pixel clock frequency, in Hertz */ unsigned short ClockSel; /* Clock Select */ unsigned short Refresh; /* Refresh rate */ }; /* * Data structure which eases setting one particular byte of a * data word. If foo is a variable of type SplitWord, then a 16 bit * value can be set using foo.word, or the high and low bytes * can be accessed independently by using foo.byte.high and * foo.byte.low. */ struct TwoBytes { unsigned char low; unsigned char high; }; union SplitWord { unsigned short word; struct TwoBytes byte; }; /* * Function to translate a CRT parameter table in VGA format * into 8514 format and fill in the mode table. */ extern short XlateVgaTable(PVOID HwDeviceExtension, short TableOffset, struct st_mode_table *pmode, short VgaTblEntry, short BookTblEntry, struct st_eeprom_data *ee, BOOL IsMach32); /* * Function to fill in a CRT parameter table using values from * Appendix D of the Programmer's Guide to the Mach 32 Registers, * rather than the EEPROM contents. This is done when the * bit flag for "use stored parameters" is clear. */ extern void BookVgaTable(short VgaTblEntry, struct st_mode_table *pmode); /* * Function to replace "canned" CRT tables with Mach 64 versions * in cases where the Mach 64 needs a pixel clock value which the * Mach 8 and Mach 32 can't generate. */ extern void SetMach64Tables(void); /* * Array of parameters taken from Appendix D of the * Programmer's Guide to the Mach 32 Registers. * * For interlaced modes, the refresh rate field contains the * frame rate, not the vertical scan frequency. */ #ifdef INCLUDE_CVTVGA struct st_book_data BookValues[B1600F76-B640F60+1] = { {0x063, 0x04F, 0x052, 0x02C, 0x0418, 0x03BF, 0x03D2, 0x022, 0x023, 25175000L, 0x0800, 60}, /* 640x480 60Hz NI */ {0x069, 0x04F, 0x052, 0x025, 0x040B, 0x03BF, 0x03D0, 0x023, 0x023, 32000000L, 0x0800, 72}, /* 640x480 72Hz NI */ {0x068, 0x04F, 0x051, 0x028, 0x03E3, 0x03BF, 0x03C0, 0x023, 0x023, 31500000L, 0x0800, 75}, /* 640x480 75Hz NI */ {0x067, 0x04F, 0x053, 0x025, 0x0428, 0x03BF, 0x03F0, 0x02E, 0x023, 39910000L, 0x0800, 90}, /* 640x480 90Hz NI */ {0x069, 0x04F, 0x057, 0x030, 0x0422, 0x03BF, 0x03E9, 0x02C, 0x023, 44900000L, 0x0800, 100}, /* 640x480 100Hz NI */ {0x080, 0x063, 0x065, 0x004, 0x057D, 0x04AB, 0x04C2, 0x02C, 0x033, 32500000L, 0x0800, 44}, /* 800x600 89Hz I */ {0x084, 0x063, 0x06D, 0x010, 0x057C, 0x04AB, 0x04C2, 0x00C, 0x033, 36000000L, 0x0800, 47}, /* 800x600 95Hz I */ {0x07F, 0x063, 0x066, 0x009, 0x04E0, 0x04AB, 0x04B0, 0x002, 0x023, 36000000L, 0x0800, 56}, /* 800x600 56Hz NI */ {0x083, 0x063, 0x068, 0x010, 0x04E3, 0x04AB, 0x04B0, 0x004, 0x023, 40000000L, 0x0800, 60}, /* 800x600 60Hz NI */ {0x07D, 0x063, 0x066, 0x012, 0x04F3, 0x04AB, 0x04C0, 0x02C, 0x023, 44900000L, 0x0800, 70}, /* 800x600 70Hz NI */ {0x081, 0x063, 0x06A, 0x00F, 0x0537, 0x04AB, 0x04F8, 0x006, 0x023, 50000000L, 0x0800, 72}, /* 800x600 72Hz NI */ {0x083, 0x063, 0x065, 0x00A, 0x04E0, 0x04AB, 0x04B0, 0x003, 0x023, 49500000L, 0x0800, 75}, /* 800x600 75Hz NI */ {0x07B, 0x063, 0x063, 0x008, 0x04F2, 0x04AB, 0x04BB, 0x00B, 0x023, 56640000L, 0x0800, 90}, /* 800x600 90Hz NI */ {0x086, 0x063, 0x067, 0x008, 0x04E0, 0x04AB, 0x04BA, 0x004, 0x023, 67500000L, 0x0800, 100}, /* 800x600 75Hz NI */ {0x09D, 0x07F, 0x081, 0x016, 0x0660, 0x05FF, 0x0600, 0x008, 0x033, 44900000L, 0x0800, 43}, /* 1024x768 87Hz I */ {0x0A7, 0x07F, 0x082, 0x031, 0x0649, 0x05FF, 0x0602, 0x026, 0x023, 65000000L, 0x0800, 60}, /* 1024x768 60Hz NI */ {0x0AD, 0x07F, 0x085, 0x016, 0x065B, 0x05FF, 0x060B, 0x004, 0x023, 75000000L, 0x0800, 66}, /* 1024x768 66Hz NI */ {0x0A5, 0x07F, 0x082, 0x031, 0x0649, 0x05FF, 0x0602, 0x026, 0x023, 75000000L, 0x0800, 70}, /* 1024x768 70Hz NI */ {0x0A0, 0x07F, 0x082, 0x031, 0x0649, 0x05FF, 0x0602, 0x026, 0x023, 75000000L, 0x0800, 72}, /* 1024x768 72Hz NI */ {0x0A3, 0x07F, 0x081, 0x00C, 0x063B, 0x05FF, 0x0600, 0x003, 0x023, 78750000L, 0x0800, 75}, /* 1024x768 75Hz NI */ {0x0A3, 0x07F, 0x07C, 0x02C, 0x0698, 0x05FF, 0x0628, 0x02F, 0x023, 100000000L, 0x0800, 90}, /* 1024x768 90Hz NI */ {0x0AD, 0x07F, 0x081, 0x02B, 0x062B, 0x05FF, 0x05FF, 0x028, 0x023, 110000000L, 0x0800, 100}, /* 1024x768 100Hz NI */ {0x0AE, 0x08B, 0x095, 0x00F, 0x0659, 0x05DD, 0x05FC, 0x00A, 0x023, 80000000L, 0x0800, 70}, /* 1120x750 70Hz NI */ {0x0B0, 0x08F, 0x097, 0x010, 0x083E, 0x06BF, 0x075D, 0x009, 0x033, 65000000L, 0x0800, 43}, /* 1152x864 87Hz I */ {0x0B4, 0x08F, 0x09A, 0x010, 0x0766, 0x06BF, 0x06FD, 0x009, 0x033, 65000000L, 0x0800, 47}, /* 1152x864 95Hz I */ {0x0B5, 0x08F, 0x097, 0x00E, 0x0727, 0x06BF, 0x06CD, 0x005, 0x023, 80000000L, 0x0800, 60}, /* 1152x864 60Hz NI */ {0x0BC, 0x08F, 0x093, 0x013, 0x0764, 0x06BF, 0x06DC, 0x00B, 0x023, 100000000L, 0x0800, 70}, /* 1152x864 70Hz NI */ {0x0B6, 0x08F, 0x092, 0x012, 0x07D5, 0x06BF, 0x071C, 0x008, 0x023, 110000000L, 0x0800, 75}, /* 1152x864 75Hz NI */ {0x0B3, 0x08F, 0x090, 0x00E, 0x077D, 0x06BF, 0x06FD, 0x007, 0x023, 110000000L, 0x0800, 80}, /* 1152x864 80Hz NI */ {0x0C7, 0x09F, 0x0A9, 0x00A, 0x08F8, 0x07FF, 0x0861, 0x00A, 0x033, 80000000L, 0x0800, 43}, /* 1280x1024 87Hz I */ {0x0C7, 0x09F, 0x0A9, 0x00A, 0x0842, 0x07FF, 0x0800, 0x00A, 0x033, 80000000L, 0x0800, 47}, /* 1280x1024 95Hz I */ {0x0D6, 0x09F, 0x0A9, 0x02E, 0x0852, 0x07FF, 0x0800, 0x025, 0x023, 110000000L, 0x0800 | CLOCK_SEL_MUX, 60}, /* 1280x1024 60Hz NI */ {0x0D2, 0x09F, 0x0A9, 0x00E, 0x0851, 0x07FF, 0x0800, 0x005, 0x023, 126000000L, 0x0800 | CLOCK_SEL_MUX, 70}, /* 1280x1024 70Hz NI */ {0x0D5, 0x09F, 0x0A3, 0x012, 0x084B, 0x07FF, 0x07FF, 0x01E, 0x023, 135000000L, 0x0800 | CLOCK_SEL_MUX, 74}, /* 1280x1024 74Hz NI */ {0x0D2, 0x09F, 0x0A1, 0x012, 0x0851, 0x07FF, 0x0800, 0x003, 0x023, 135000000L, 0x0800 | CLOCK_SEL_MUX, 75}, /* 1280x1024 75Hz NI */ /* * Although the horizontal CRT parameters are stored in 8-bit fields, * some refresh rates at 1600x1200 result in a 9-bit value. In these * cases, we store only the lower-order 8 bits, and the BIOS will * resolve the matter when we set the mode. */ {0x0FF, 0x0C7, 0x0CB, 0x034, 0x09E9, 0x095F, 0x0971, 0x028, 0x023, 156000000L, 0x0800, 60}, /* 1600x1200 60Hz NI */ {0x003, 0x0C7, 0x0CC, 0x031, 0x09C8, 0x095F, 0x0962, 0x023, 0x023, 172000000L, 0x0800, 66}, /* 1600x1200 66Hz NI */ {0x003, 0x0C7, 0x0CC, 0x031, 0x09C8, 0x095F, 0x0962, 0x025, 0x023, 198000000L, 0x0800, 76} /* 1600x1200 76Hz NI */ }; #else extern struct st_book_data BookValues[B1600F76-B640F60+1]; #endif