windows-nt/Source/XPSP1/NT/drivers/video/ms/ati/mini/cvtvga.h

437 lines
17 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/************************************************************************/
/* */
/* 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
* M<horizontal resolution>F<vertical scan frequency), with the
* "M" standing for (M)ode.
*/
#define M640F72 0x0001
#define M800F72 0x0020
#define M800F70 0x0010
#define M800F60 0x0008
#define M800F56 0x0004
#define M800F89 0x0002
#define M800F95 0x0001
#define M1024F66 0x0010
#define M1024F72 0x0008
#define M1024F70 0x0004
#define M1024F60 0x0002
#define M1024F87 0x0001
#define M1280F95 0x0002
#define M1280F87 0x0001
/*
* There are 3 1120x750 modes which use the same flag bit. Assume
* that the 70Hz noninterlaced mode was selected.
*/
#define M1120F70 0x0001
/*
* In some installations, the display parameters are not stored
* in the EEPROM. Instead, they are read from a table corresponding
* to Appendix D of the Programmer's Guide to the Mach 32 Registers.
*
* The entries in our copy of the table are arranged in ascending order
* of horizontal resolution, with entries having the same horizontal
* resolution sorted from worst to best (interlaced modes in increasing
* order of vertical scan frequency, followed by noninterlaced modes in
* ascending order of vertical scan frequency.
*
* The name for the constant is in the form
* B<horizontal resolution>F<vertical scan frequency>, 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
* T<horizontal resolution>F<vertical scan frequency>, 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