|
|
1.1 ! root 1: /* Copyright (c) 1993 by NeXT Computer, Inc as an unpublished work. ! 2: * All rights reserved. ! 3: * ! 4: * QVisionDAC.m -- DAC support for the QVision. ! 5: * ! 6: * History ! 7: * Thu Sep 15 16:13:45 PDT 1994, James C. Lee ! 8: * Added AT&T 20C505 DAC support ! 9: * Author: Derek B Clegg 30 June 1993 ! 10: * Based on work by Joe Pasqua. ! 11: */ ! 12: #import <driverkit/generalFuncs.h> ! 13: #import <driverkit/i386/ioPorts.h> ! 14: #import <bsd/dev/ev_types.h> ! 15: #import "QVision.h" ! 16: ! 17: /* The `ProgramDAC' category of `QVision'. */ ! 18: ! 19: @implementation QVision (ProgramDAC) ! 20: ! 21: // also check for AT&T 20C505 DAC; it's BT485 compatible ! 22: static DACtype checkForBrooktreeDAC(void) ! 23: { ! 24: DACtype dac; ! 25: ! 26: /* Unlock the extended graphics registers. */ ! 27: outw(VGA_GRFX_INDEX, 0x050f); ! 28: ! 29: /* Unlock some more extended registers. */ ! 30: outb(VGA_GRFX_INDEX, 0x10); ! 31: outb(VGA_GRFX_DATA, 0x08); ! 32: ! 33: /* Read the status register. */ ! 34: switch (inb(DAC_EXT_REG) & 0xF0) { ! 35: case 0x40: ! 36: dac = Bt484; ! 37: break; ! 38: case 0x80: ! 39: dac = Bt485; ! 40: break; ! 41: case 0x20: ! 42: dac = Bt485A; ! 43: break; ! 44: case 0xd0: ! 45: dac = ATT20C505; ! 46: break; ! 47: default: ! 48: dac = UnknownDAC; ! 49: break; ! 50: } ! 51: return dac; ! 52: } ! 53: ! 54: - determineDACType ! 55: { ! 56: dac = checkForBrooktreeDAC(); ! 57: return self; ! 58: } ! 59: ! 60: /* Default gamma precompensation table for color displays. ! 61: * Gamma 2.2 LUT for P22 phosphor displays (Hitachi, NEC, generic VGA) */ ! 62: ! 63: static const unsigned char gamma16[] = { ! 64: 0, 74, 102, 123, 140, 155, 168, 180, ! 65: 192, 202, 212, 221, 230, 239, 247, 255 ! 66: }; ! 67: ! 68: static const unsigned char gamma8[] = { ! 69: 0, 15, 22, 27, 31, 35, 39, 42, 45, 47, 50, 52, ! 70: 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 74, 76, ! 71: 78, 79, 81, 82, 84, 85, 87, 88, 90, 91, 93, 94, ! 72: 95, 97, 98, 99, 100, 102, 103, 104, 105, 107, 108, 109, ! 73: 110, 111, 112, 114, 115, 116, 117, 118, 119, 120, 121, 122, ! 74: 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, ! 75: 135, 136, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145, ! 76: 146, 147, 148, 148, 149, 150, 151, 152, 153, 153, 154, 155, ! 77: 156, 157, 158, 158, 159, 160, 161, 162, 162, 163, 164, 165, ! 78: 165, 166, 167, 168, 168, 169, 170, 171, 171, 172, 173, 174, ! 79: 174, 175, 176, 177, 177, 178, 179, 179, 180, 181, 182, 182, ! 80: 183, 184, 184, 185, 186, 186, 187, 188, 188, 189, 190, 190, ! 81: 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 198, 198, ! 82: 199, 200, 200, 201, 201, 202, 203, 203, 204, 205, 205, 206, ! 83: 206, 207, 208, 208, 209, 210, 210, 211, 211, 212, 213, 213, ! 84: 214, 214, 215, 216, 216, 217, 217, 218, 218, 219, 220, 220, ! 85: 221, 221, 222, 222, 223, 224, 224, 225, 225, 226, 226, 227, ! 86: 228, 228, 229, 229, 230, 230, 231, 231, 232, 233, 233, 234, ! 87: 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 240, 240, ! 88: 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, ! 89: 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, ! 90: 253, 253, 254, 255, ! 91: }; ! 92: ! 93: static void ! 94: SetGammaValue(unsigned int r, unsigned int g, unsigned int b, int level) ! 95: { ! 96: outb(PALETTE_DATA, EV_SCALE_BRIGHTNESS(level, r)); ! 97: outb(PALETTE_DATA, EV_SCALE_BRIGHTNESS(level, g)); ! 98: outb(PALETTE_DATA, EV_SCALE_BRIGHTNESS(level, b)); ! 99: } ! 100: ! 101: - setGammaTable ! 102: { ! 103: unsigned int i, j, g; ! 104: const IODisplayInfo *displayInfo; ! 105: ! 106: displayInfo = [self displayInfo]; ! 107: ! 108: outb(PALETTE_WRITE, 0x00); ! 109: ! 110: if (redTransferTable != 0) { ! 111: for (i = 0; i < transferTableCount; i++) { ! 112: for (j = 0; j < 256/transferTableCount; j++) { ! 113: SetGammaValue(redTransferTable[i], greenTransferTable[i], ! 114: blueTransferTable[i], brightnessLevel); ! 115: } ! 116: } ! 117: } else { ! 118: switch (displayInfo->bitsPerPixel) { ! 119: case IO_24BitsPerPixel: ! 120: case IO_8BitsPerPixel: ! 121: for (g = 0; g < 256; g++) { ! 122: SetGammaValue(gamma8[g], gamma8[g], gamma8[g], ! 123: brightnessLevel); ! 124: } ! 125: break; ! 126: case IO_15BitsPerPixel: ! 127: for (i = 0; i < 32; i++) { ! 128: for (j = 0; j < 8; j++) { ! 129: SetGammaValue(gamma16[i/2], gamma16[i/2], gamma16[i/2], ! 130: brightnessLevel); ! 131: } ! 132: } ! 133: break; ! 134: default: ! 135: break; ! 136: } ! 137: } ! 138: return self; ! 139: } ! 140: ! 141: - resetDAC ! 142: { ! 143: const QVisionMode *mode; ! 144: ! 145: mode = [self displayInfo]->parameters; ! 146: ! 147: if (dac == Bt485 || dac == Bt485A || dac == ATT20C505) { ! 148: /* Brooktree 485 or 485A only! */ ! 149: outb(DAC_CMD_0, 0x80); /* Enable the DAC_EXT_REG. */ ! 150: outb(PALETTE_WRITE, 0x01); /* Make 13C6 be the DAC_EXT_REG. */ ! 151: outb(DAC_EXT_REG, 0x00); /* Turn off clock doubling. */ ! 152: outb(PALETTE_WRITE, 0x00); /* Restore 13C6. */ ! 153: } ! 154: ! 155: /* Restore DAC command registers 0, 1, & 2 to their initial VGA values. */ ! 156: outb(DAC_CMD_0, 0x40); ! 157: outb(DAC_CMD_1, 0x00); ! 158: outb(DAC_CMD_2, 0x20); ! 159: ! 160: return self; ! 161: } ! 162: ! 163: - programDAC ! 164: { ! 165: const QVisionMode *mode; ! 166: ! 167: mode = [self displayInfo]->parameters; ! 168: ! 169: /* Load DAC Command regs. */ ! 170: outb(DAC_CMD_0, 0x02); /* 8-bit DAC. */ ! 171: outb(DAC_CMD_1, mode->dacCmd1); /* Set the bits per pixel. */ ! 172: outb(DAC_CMD_2, 0x20); /* Allow advanced modes. */ ! 173: ! 174: if (mode->needsPixelDoubling && ! 175: (dac == Bt485 || dac == Bt485A || dac == ATT20C505)) ! 176: { ! 177: /* Brooktree 485 or 485A, or AT&T 20C505 only! */ ! 178: outb(DAC_CMD_0, 0x82); /* Enable the DAC_EXT_REG. */ ! 179: outb(PALETTE_WRITE, 0x01); /* Make 13C6 be the DAC_EXT_REG. */ ! 180: outb(DAC_EXT_REG, 0x08); /* Turn on clock doubling. */ ! 181: } ! 182: ! 183: /* Set overscan color (black) */ ! 184: outb(CO_COLOR_WRITE, 0x00); ! 185: outb(CO_COLOR_DATA, 0x00); /* Red component. */ ! 186: outb(CO_COLOR_DATA, 0x00); /* Green component. */ ! 187: outb(CO_COLOR_DATA, 0x00); /* Blue component. */ ! 188: ! 189: return self; ! 190: } ! 191: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.