Annotation of Examples/DriverKit/QVision/QVision_reloc.tproj/QVisionDAC.m, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.