/* vgaInit.c - a VGA 3+ mode initialization source module */ /* Copyright 1984-2000 Wind River Systems, Inc. */ #include "copyright_wrs.h" /* modification history -------------------- 01b,11may06,dgp doc: fix headings in library 01a,26mar00,ms written. */ /* DESCRIPTION This library provides initialization routines to configure VGA in 3+ alphanumeric mode. The functions addressed here include: \ms \m - Initialization of the VGA specific register set. \me USER INTERFACE \cs STATUS vgaInit ( VOID ) \ce This routine will initialize the VGA specific register set to bring a VGA card in VGA 3+ mode and loads the font in plane 2. REFERENCES .I Programmer's Guide to the EGA, VGA, and Super VGA Cards - Ferraro. .I Programmer's Guide to PC & PS/2 Video Systems - Richard Wilton. INCLUDE FILES: NONE. */ /* includes */ #include "vxWorks.h" #include "sysLib.h" #include "drv/pci/pciConfigLib.h" #include "intLib.h" /* include font */ #include "vgaFont.c" /* defines */ #define VGA_FEATURE_CTRL 0x3DA /* Feature Control Register */ #define VGA_MVGA_SR_PORT 0x3C2 /* Miscellaneous Output Port */ #define VGA_DAC_PEL_MASK 0x3C6 /* Color Palette Pixel Mask Register */ #define VGA_DAC_READ_INDEX 0x3C7 /* Color Palette Read-Mode Index Reg */ #define VGA_DAC_STATE 0x3C7 /* Color Palette State Register */ #define VGA_DAC_WRITE_INDEX 0x3C8 /* Color Palette Index Register */ #define VGA_DAC_DATA_REG 0x3C9 /* Color Palette Data Register */ #define VGA_AR_PORT 0x3C0 /* Attribute Controller Index Port */ #define VGA_CR_PORT 0x3D4 /* CRT Controller Index Port */ #define VGA_GR_PORT 0x3CE /* Graphics Controller Index Port */ #define VGA_SR_PORT 0x3C4 /* Sequencer Index Port */ #define VGA_SR_DATA_PORT 0x3C5 /* Sequencer Data Port */ /* forward declarations */ LOCAL VOID vgaRegSet (int ioPort, short value); LOCAL STATUS vgaDnldFont (char * font, int len); STATUS vgaInit (void); /******************************************************************************* * * vgaRegSet - sets the given vga register with given value. * * This routine sets the given vga register with given value. * * RETURNS: N/A */ LOCAL VOID vgaRegSet ( int ioPort, short value ) { sysOutByte (ioPort, (char) (value & 0xFF)); sysOutByte (ioPort + 1, (char) (value >> 8)); } /******************************************************************************* * * vgaDnldFont - writes given font in plane 2. * * This routine downloads the user specified font in bit plane 2 of VGA planes. * * RETURNS: OK/ERROR */ LOCAL STATUS vgaDnldFont ( char * font, int len ) { int i, j, bytesPerChar; int intKey; unsigned char * vidPtr = (unsigned char *) 0xA0000; if ((bytesPerChar = len/CHARPERFONT) > MAXBYTESPERCH) return ERROR; intKey = intLock(); /* sequencer is put to reset */ vgaRegSet (VGA_SR_PORT, 0x0100); /* write only to plane 2 */ vgaRegSet (VGA_SR_PORT, 0x0402); /* sequential addressing */ vgaRegSet (VGA_SR_PORT, 0x0704); /* out of reset */ vgaRegSet (VGA_SR_PORT, 0x0300); /* read plane 2 only */ vgaRegSet (VGA_GR_PORT, 0x0204); /* disable even-odd */ vgaRegSet (VGA_GR_PORT, 0x0005); /* 0xA0000 */ vgaRegSet (VGA_GR_PORT, 0x0006); intUnlock (intKey); /* Downloading a font into bit plane # 2 */ i = 0; j = 0; while(i < FONTDATAMAX) { if (j < bytesPerChar) { *vidPtr++ = vgaFont[i]; i++; j++; } else { vidPtr += (MAXBYTESPERCH - bytesPerChar); j = 0; } } /* Downloading over */ intKey = intLock(); /* sequencer is put to reset */ vgaRegSet (VGA_SR_PORT, 0x0100); /* write only to plane 0 & 1 */ vgaRegSet (VGA_SR_PORT, 0x0302); /* font 0 */ vgaRegSet (VGA_SR_PORT, 0x0003); /* odd-even addressing */ vgaRegSet (VGA_SR_PORT, 0x0304); /* out of reset */ vgaRegSet (VGA_SR_PORT, 0x0300); /* read plane 0 only */ vgaRegSet (VGA_GR_PORT, 0x0004); /* even-odd */ vgaRegSet (VGA_GR_PORT, 0x1005); /* 0xB8000 */ vgaRegSet (VGA_GR_PORT, 0x0E06); intUnlock (intKey); return OK; } /******************************************************************************* * * vgaInit - initializes the VGA chip and loads font in memory. * * This routine will initialize the VGA specific register set to bring a VGA * card in VGA 3+ mode and loads the font in plane 2. * * RETURNS: OK/ERROR */ STATUS vgaInit ( void ) { int intKey; intKey = intLock (); /* Sequencer Registers */ vgaRegSet (VGA_SR_PORT, 0x0100); vgaRegSet (VGA_SR_PORT, 0x0001); /* write only to plane 0 & 1 */ vgaRegSet (VGA_SR_PORT, 0x0302); vgaRegSet (VGA_SR_PORT, 0x0003); /* enable odd/even addressing + extended */ vgaRegSet (VGA_SR_PORT, 0x0204); vgaRegSet (VGA_SR_PORT, 0x0007); /* MSR: Select DCLK0, Enable RAM access and move I/O to 3Dx */ sysOutByte (VGA_MVGA_SR_PORT, 0x67); vgaRegSet (VGA_SR_PORT, 0x0300); intUnlock (intKey); /* CRT Controller Registers */ vgaRegSet (VGA_CR_PORT, 0x0E11); vgaRegSet (VGA_CR_PORT, 0x5F00); vgaRegSet (VGA_CR_PORT, 0x4F01); vgaRegSet (VGA_CR_PORT, 0x5002); vgaRegSet (VGA_CR_PORT, 0x8203); vgaRegSet (VGA_CR_PORT, 0x5504); vgaRegSet (VGA_CR_PORT, 0x8105); vgaRegSet (VGA_CR_PORT, 0xBF06); vgaRegSet (VGA_CR_PORT, 0x1F07); vgaRegSet (VGA_CR_PORT, 0x0008); vgaRegSet (VGA_CR_PORT, 0x4F09); vgaRegSet (VGA_CR_PORT, 0x0D0A); vgaRegSet (VGA_CR_PORT, 0x0E0B); vgaRegSet (VGA_CR_PORT, 0x000C); vgaRegSet (VGA_CR_PORT, 0x000D); vgaRegSet (VGA_CR_PORT, 0x070E); vgaRegSet (VGA_CR_PORT, 0x800F); vgaRegSet (VGA_CR_PORT, 0x9C10); /* Protect Registers CR0-7 */ vgaRegSet (VGA_CR_PORT, 0x8E11); vgaRegSet (VGA_CR_PORT, 0x8F12); vgaRegSet (VGA_CR_PORT, 0x2813); vgaRegSet (VGA_CR_PORT, 0x1F14); vgaRegSet (VGA_CR_PORT, 0x9615); vgaRegSet (VGA_CR_PORT, 0xB916); vgaRegSet (VGA_CR_PORT, 0xA317); vgaRegSet (VGA_CR_PORT, 0xFF18); vgaRegSet (VGA_CR_PORT, 0x4F70); /* Attribute Controller Registers */ sysInByte (VGA_FEATURE_CTRL); sysOutByte (VGA_AR_PORT, 0x00); sysOutByte (VGA_AR_PORT, 0x00); sysOutByte (VGA_AR_PORT, 0x01); sysOutByte (VGA_AR_PORT, 0x01); sysOutByte (VGA_AR_PORT, 0x02); sysOutByte (VGA_AR_PORT, 0x02); sysOutByte (VGA_AR_PORT, 0x03); sysOutByte (VGA_AR_PORT, 0x03); sysOutByte (VGA_AR_PORT, 0x04); sysOutByte (VGA_AR_PORT, 0x04); sysOutByte (VGA_AR_PORT, 0x05); sysOutByte (VGA_AR_PORT, 0x05); sysOutByte (VGA_AR_PORT, 0x06); sysOutByte (VGA_AR_PORT, 0x14); sysOutByte (VGA_AR_PORT, 0x07); sysOutByte (VGA_AR_PORT, 0x07); sysOutByte (VGA_AR_PORT, 0x08); sysOutByte (VGA_AR_PORT, 0x38); sysOutByte (VGA_AR_PORT, 0x09); sysOutByte (VGA_AR_PORT, 0x39); sysOutByte (VGA_AR_PORT, 0x0A); sysOutByte (VGA_AR_PORT, 0x3A); sysOutByte (VGA_AR_PORT, 0x0B); sysOutByte (VGA_AR_PORT, 0x3B); sysOutByte (VGA_AR_PORT, 0x0C); sysOutByte (VGA_AR_PORT, 0x3C); sysOutByte (VGA_AR_PORT, 0x0D); sysOutByte (VGA_AR_PORT, 0x3D); sysOutByte (VGA_AR_PORT, 0x0E); sysOutByte (VGA_AR_PORT, 0x3E); sysOutByte (VGA_AR_PORT, 0x0F); sysOutByte (VGA_AR_PORT, 0x3F); sysOutByte (VGA_AR_PORT, 0x10); sysOutByte (VGA_AR_PORT, 0x0C); sysOutByte (VGA_AR_PORT, 0x11); sysOutByte (VGA_AR_PORT, 0x00); sysOutByte (VGA_AR_PORT, 0x12); sysOutByte (VGA_AR_PORT, 0x0F); sysOutByte (VGA_AR_PORT, 0x13); sysOutByte (VGA_AR_PORT, 0x08); sysOutByte (VGA_AR_PORT, 0x14); sysOutByte (VGA_AR_PORT, 0x00); /* Enable Video */ sysOutByte (VGA_AR_PORT, 0x20); /* Graphics Controller Registers */ vgaRegSet (VGA_GR_PORT, 0x0000); vgaRegSet (VGA_GR_PORT, 0x0001); vgaRegSet (VGA_GR_PORT, 0x0002); vgaRegSet (VGA_GR_PORT, 0x0003); vgaRegSet (VGA_GR_PORT, 0x0004); vgaRegSet (VGA_GR_PORT, 0x1005); /* B8000-BFFFF */ vgaRegSet (VGA_GR_PORT, 0x0E06); vgaRegSet (VGA_GR_PORT, 0x0007); vgaRegSet (VGA_GR_PORT, 0xFF08); /* Palette Registers */ sysOutByte (VGA_DAC_PEL_MASK, 0xFF); sysOutByte (VGA_DAC_WRITE_INDEX, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x00); /* 0x00 - 0x0F */ sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x3F); /* 0x00 - 0x0F */ sysOutByte (VGA_DAC_DATA_REG, 0x00); /* 0x10 - 0x1F */ sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x3F); /* 0x10 - 0x1F */ sysOutByte (VGA_DAC_DATA_REG, 0x15); /* 0x20 - 0x2F */ sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x3F); /* 0x20 - 0x2F */ sysOutByte (VGA_DAC_DATA_REG, 0x15); /* 0x30 - 0x3F */ sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x00); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x2A); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x15); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x3F); sysOutByte (VGA_DAC_DATA_REG, 0x3F); /* 0x30 - 0x3F */ vgaDnldFont (vgaFont, FONTDATAMAX); return OK; }