|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /* ! 26: * Initialize the VGA console. ! 27: */ ! 28: ! 29: #import <bsd/i386/param.h> ! 30: #import <bsd/dev/i386/BasicConsole.h> ! 31: #import <bsd/dev/i386/VGAConsole.h> ! 32: #import <driverkit/displayDefs.h> ! 33: #import <machdep/i386/kernBootStruct.h> ! 34: #import <machdep/i386/io_inline.h> ! 35: ! 36: ! 37: #define VGA_MODE_S12 0 // 640x480x4 VGA mode ! 38: #define N_SMODES 1 // Total number of modes ! 39: ! 40: ! 41: #define VGA_SEQ_ADDR 0x3c4 ! 42: #define VGA_SEQ_DATA 0x3c5 ! 43: ! 44: #define VGA_CLK_MODE_INDEX 0x01 ! 45: #define VGA_SCRN_OFF 0x20 ! 46: ! 47: ! 48: #define VGA_CRTC_ADDR 0x3d4 ! 49: #define VGA_CRTC_DATA 0x3d5 ! 50: ! 51: #define VGA_ADDR ((char *)0xA0000) ! 52: #define VGA_LENGTH 0x10000 ! 53: ! 54: // Generic VGA Stuff ! 55: #define INPUT_STATUS_1 0x3da ! 56: ! 57: // Misc Output Register values ! 58: #define MISC_OUTPUT_PORT 0x3C2 ! 59: #define FEAT_CNTRL_PORT 0x3da ! 60: #define VGA_MISC_CNT 2 ! 61: static const unsigned char miscOutData[VGA_MISC_CNT] = { ! 62: 0xe3,0, /* VGA_MODE_S12 */ ! 63: }; ! 64: ! 65: // Sequencer Data ! 66: #define VGA_SEQ_CNT 5 ! 67: ! 68: static const unsigned char sequencerData[VGA_SEQ_CNT] = { ! 69: 0x03, 0x21, 0x0f, 0x00, 0x06 // VGA_MODE_S12 ! 70: }; ! 71: ! 72: #define VGA_CRT_CNT 25 ! 73: ! 74: static const unsigned char crtData[VGA_CRT_CNT] = { ! 75: 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0x0b, 0x3e, 0x00, 0x40, ! 76: 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0xea, 0x8c, 0xdf, 0x28, ! 77: 0x00, 0xe7, 0x04, 0xe3, 0xff // VGA_MODE_S12 ! 78: }; ! 79: ! 80: #define VGA_ATR_CNT 21 ! 81: #define ATTR_INDEX 0x3C0 ! 82: #define ATTR_DATA 0x3C0 ! 83: static const unsigned char attrData[VGA_ATR_CNT] = { ! 84: 0x00, 0x01, 0x02, 0x03, ! 85: 0x00, 0x01, 0x02, 0x03, ! 86: 0x00, 0x01, 0x02, 0x03, ! 87: 0x00, 0x01, 0x02, 0x03, ! 88: 0x01, 0x00, ! 89: 0x03, 0x00, 0 ! 90: //VGA_MODE_S12 ! 91: }; ! 92: ! 93: #define VGA_GFX_CNT 9 ! 94: #define GC_INDEX 0x3CE ! 95: #define GC_DATA 0x3CF ! 96: static const unsigned char gfxData[VGA_GFX_CNT] = { ! 97: 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff, // VGA_MODE_S12 ! 98: }; ! 99: ! 100: #define VGA_PALETTE_REG 0x3C8 ! 101: #define VGA_PALETTE_DATA 0x3C9 ! 102: #define VGA_NUM_COLORS 16 ! 103: static const unsigned char paletteVals[VGA_NUM_COLORS][3] = { ! 104: {0,0,0}, // 0 black ! 105: {21, 21, 21}, // 1 dark gray ! 106: {42, 42, 42}, // 2 light gray ! 107: {63, 63, 63}, // 3 white ! 108: {0,0,0}, // 0 black ! 109: {21, 21, 21}, // 1 dark gray ! 110: {42, 42, 42}, // 2 light gray ! 111: {63, 63, 63}, // 3 white ! 112: {0,0,0}, // 0 black ! 113: {21, 21, 21}, // 1 dark gray ! 114: {42, 42, 42}, // 2 light gray ! 115: {63, 63, 63}, // 3 white ! 116: {0,0,0}, // 0 black ! 117: {21, 21, 21}, // 1 dark gray ! 118: {42, 42, 42}, // 2 light gray ! 119: {63, 63, 63}, // 3 white ! 120: }; ! 121: ! 122: static inline void setColorReg(int reg, int red, int green, int blue) ! 123: { ! 124: outb(VGA_PALETTE_REG, reg); // VGA select color palette reg ! 125: DELAY(10); ! 126: outb(VGA_PALETTE_DATA, red); // VGA now prepared to accept each color ! 127: DELAY(10); ! 128: outb(VGA_PALETTE_DATA, green); ! 129: DELAY(10); ! 130: outb(VGA_PALETTE_DATA, blue); ! 131: DELAY(10); ! 132: } ! 133: ! 134: static void setVGAcolors() ! 135: { ! 136: int i, index; ! 137: // set the palette registers to something nice ! 138: for (i = 0; i < VGA_NUM_COLORS; i++) ! 139: { ! 140: index = i % 4; ! 141: setColorReg(i, paletteVals[index][0], ! 142: paletteVals[index][1], ! 143: paletteVals[index][2]); ! 144: } ! 145: } ! 146: ! 147: extern void bzero(void *, int); ! 148: extern void memset(void *, unsigned char, int); ! 149: ! 150: int VGASetGraphicsMode(void) ! 151: // Description: Sets the standard VGA registers based on the supplied mode. ! 152: // This code is pretty generic, maybe we should break it out ! 153: // as a standard utility routine. ! 154: { ! 155: unsigned int i; ! 156: ! 157: // NOTE: The attribute registers are a little wierd. Normally there is a ! 158: // separate index and data port. The attribute register set has just ! 159: // one port that gets used for both. You write an index to the port then ! 160: // use the same port for data. The VGA automatically toggles the sense ! 161: // of the port (between index and data) with an internal flip-flop. ! 162: // You set the state of the flip-flop by doing an in() on the input ! 163: // status 1 port - I know its hokey, but thats the way it works... ! 164: // MORE: The other weird thing is that the attribute index register also ! 165: // contains a palette access bit. This bit determines whether the CPU or ! 166: // the VGA has control of the palette. While the CPU owns the palette, the ! 167: // display is effectively off. ! 168: ! 169: // Turn the video off while we are doing this... ! 170: outb(VGA_SEQ_ADDR, 1); ! 171: outb(VGA_SEQ_DATA, sequencerData[1]); ! 172: ! 173: inb(INPUT_STATUS_1); // Set the attribute flip-flop to "index" ! 174: outb(ATTR_INDEX, 0x00); // Gives palette to CPU, turning off video ! 175: // outb(ATTR_DATA, attrData[0]); ! 176: ! 177: // Set the misc. output register ! 178: outb(MISC_OUTPUT_PORT, miscOutData[0]); ! 179: ! 180: // Set the feature control register ! 181: outb(FEAT_CNTRL_PORT, miscOutData[1]); ! 182: ! 183: // Load the sequencer registers ! 184: for (i = 0; i < VGA_SEQ_CNT; i++) ! 185: { ! 186: outb(VGA_SEQ_ADDR, i); ! 187: outb(VGA_SEQ_DATA, sequencerData[i]); ! 188: } ! 189: ! 190: outb(VGA_SEQ_ADDR, 0x00); ! 191: outb(VGA_SEQ_DATA, 0x03); // Low order two bits are reset bits ! 192: ! 193: // Load the CRTC registers ! 194: // CRTC registers 0-7 are locked by a bit in register 0x11. We need ! 195: // to unlock these registers before we can start setting them. ! 196: outb(VGA_CRTC_ADDR, 0x11); ! 197: outb(VGA_CRTC_DATA, 0x00); // Unlocks registers 0-7 ! 198: for (i = 0; i < VGA_CRT_CNT; i++) ! 199: { ! 200: outb(VGA_CRTC_ADDR, i); ! 201: outb(VGA_CRTC_DATA, crtData[i]); ! 202: } ! 203: ! 204: ! 205: inb(INPUT_STATUS_1); // Set the attribute flip-flop to "index" ! 206: // Load the attribute registers ! 207: for (i = 0; i < VGA_ATR_CNT; i++) ! 208: { ! 209: outb(ATTR_INDEX, i); ! 210: outb(ATTR_DATA, attrData[i]); ! 211: } ! 212: ! 213: ! 214: // Load graphics registers ! 215: for (i = 0; i < VGA_GFX_CNT; i++) ! 216: { ! 217: outb(GC_INDEX, i); ! 218: outb(GC_DATA, gfxData[i]); ! 219: } ! 220: ! 221: setVGAcolors(); ! 222: ! 223: // Clear display memory ! 224: // FIXME -- should ensure memory mapping here ! 225: // (this is relying on a straight physical-to-virtual mapping) ! 226: memset(VGA_ADDR, 0x01, VGA_LENGTH); ! 227: ! 228: // Re-enable video ! 229: inb(INPUT_STATUS_1); // Set the attribute flip-flop to "index" ! 230: outb(ATTR_INDEX, 0x20); // Give the palette back to the VGA ! 231: // outb(ATTR_DATA, attrData[0]); ! 232: ! 233: // Really re-enable video. ! 234: outb(VGA_SEQ_ADDR, 1); ! 235: outb(VGA_SEQ_DATA, ((sequencerData[1]) & (~0x20))); ! 236: ! 237: return 0; ! 238: } ! 239: ! 240: ! 241: IOConsoleInfo *BasicAllocateConsole() ! 242: { ! 243: IODisplayInfo di; ! 244: KERNBOOTSTRUCT *kernbootstruct = KERNSTRUCT_ADDR; ! 245: ! 246: bzero(&di, sizeof(di)); ! 247: di.width = 640; ! 248: di.height = 480; ! 249: return( VGAAllocateConsole(&di) ); ! 250: } ! 251:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.