Annotation of Examples/DriverKit/S3/S3_reloc.tproj/S3ProgramDAC.m, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1993 by NeXT Computer, Inc as an unpublished work.
                      2:  * All rights reserved.
                      3:  *
                      4:  * S3ProgramDAC.m -- DAC support for the S3.
                      5:  *
                      6:  * History
                      7:  * Thu Sep 15 15:16:43 PDT 1994, James C. Lee
                      8:  *   Added AT&T 20C505 DAC support
                      9:  * Author:  Derek B Clegg      1 July 1993
                     10:  * Based on work by Joe Pasqua.
                     11:  */
                     12: #import "S3.h"
                     13: 
                     14: /* The `ProgramDAC' category of `S3'. */
                     15: 
                     16: @implementation S3 (ProgramDAC)
                     17: 
                     18: static inline void
                     19: setCommandRegister0(unsigned char value)
                     20: {
                     21:     rwrite(VGA_CRTC_INDEX, 0x55, 0x01);
                     22:     outb(RS_02, value);
                     23: }
                     24: 
                     25: static inline void
                     26: setCommandRegister1(unsigned char value)
                     27: {
                     28:     rwrite(VGA_CRTC_INDEX, 0x55, 0x02);
                     29:     outb(RS_00, value);
                     30: }
                     31: 
                     32: static inline void
                     33: setCommandRegister2(unsigned char value)
                     34: {
                     35:     rwrite(VGA_CRTC_INDEX, 0x55, 0x02);
                     36:     outb(RS_01, value);
                     37: }
                     38: 
                     39: static inline void
                     40: setCommandRegister3(unsigned char value)
                     41: {
                     42:     unsigned char commandRegister0, addressRegister;
                     43: 
                     44:     rwrite(VGA_CRTC_INDEX, 0x55, 0x01);
                     45:     commandRegister0 = inb(RS_02);
                     46:     outb(RS_02, 0x80 | commandRegister0);
                     47:     rwrite(VGA_CRTC_INDEX, 0x55, 0x00);
                     48:     addressRegister = inb(RS_00);
                     49:     outb(RS_00, 0x01);
                     50:     rwrite(VGA_CRTC_INDEX, 0x55, 0x02);
                     51:     outb(RS_02, value);
                     52:     rwrite(VGA_CRTC_INDEX, 0x55, 0x01);
                     53:     outb(RS_02, commandRegister0);
                     54:     rwrite(VGA_CRTC_INDEX, 0x55, 0x00);
                     55:     outb(RS_00, addressRegister);
                     56: }
                     57: 
                     58: // also check for AT&T 20C505 DAC; it's BT485 compatible
                     59: static DACtype checkForBrooktreeDAC(void)
                     60: {
                     61:     DACtype dac;
                     62:     unsigned char commandRegister0;
                     63: 
                     64:     S3_unlockRegisters();
                     65: 
                     66:     /* Save the value of command register 0. */
                     67:     rwrite(VGA_CRTC_INDEX, 0x55, 0x01);
                     68:     commandRegister0 = inb(RS_02);
                     69: 
                     70:     /* Write a zero to bit 7 of command register 0. */
                     71:     outb(RS_02, commandRegister0 & ~(1 << 7));
                     72: 
                     73:     /* Read the status register. */
                     74:     rwrite(VGA_CRTC_INDEX, 0x55, 0x02);
                     75:     switch (inb(RS_02) & 0xF0) {
                     76:     case 0x40:
                     77:        dac = Bt484;
                     78:        break;
                     79:     case 0x80:
                     80:        dac = Bt485;
                     81:        break;
                     82:     case 0x20:
                     83:        dac = Bt485A;
                     84:        break;
                     85:     case 0xd0:
                     86:        dac = ATT20C505;
                     87:        break;
                     88:     default:
                     89:        dac = UnknownDAC;
                     90:        break;
                     91:     }
                     92: 
                     93:     /* Restore the old value of command register 0. */
                     94:     setCommandRegister0(commandRegister0);
                     95: 
                     96:     /* Make sure that we are addressing RS(00xx). */
                     97:     rwrite(VGA_CRTC_INDEX, 0x55, 0x00);
                     98: 
                     99:     S3_lockRegisters();
                    100: 
                    101:     return dac;
                    102: }
                    103: 
                    104: - determineDACType
                    105: {
                    106:     dac = checkForBrooktreeDAC();
                    107:     if (dac == UnknownDAC) {
                    108:        /* Assume that it's an AT&T 20C491 or some other compatible DAC,
                    109:         * such as the Sierra SC15025. */
                    110:        dac = ATT20C491;
                    111:     }
                    112:     return self;
                    113: }
                    114: 
                    115: - (BOOL)hasTransferTable
                    116: {
                    117:     switch (dac) {
                    118:     case ATT20C491:
                    119:        if ([self displayInfo]->bitsPerPixel == IO_8BitsPerPixel)
                    120:            return YES;
                    121:        else 
                    122:            return NO;
                    123:        break;
                    124:     case Bt484:
                    125:     case Bt485:
                    126:     case Bt485A:
                    127:     case ATT20C505:
                    128:        return YES;
                    129:        break;
                    130:     default:
                    131:        return NO;
                    132:        break;
                    133:     }
                    134: }
                    135: 
                    136: - (BOOL)needsSoftwareGammaCorrection
                    137: {
                    138:     switch (dac) {
                    139:     case ATT20C491:
                    140:        return YES;
                    141:        break;
                    142:     case Bt484:
                    143:     case Bt485:
                    144:     case Bt485A:
                    145:     case ATT20C505:
                    146:        return NO;
                    147:        break;
                    148:     default:
                    149:        return YES;
                    150:        break;
                    151:     }
                    152: }
                    153: 
                    154: /* Default gamma precompensation table for color displays.
                    155:  * Gamma 2.2 LUT for P22 phosphor displays (Hitachi, NEC, generic VGA) */
                    156: 
                    157: static const unsigned char gamma16[] = {
                    158:       0,  74, 102, 123, 140, 155, 168, 180,
                    159:     192, 202, 212, 221, 230, 239, 247, 255
                    160: };
                    161: 
                    162: static const unsigned char gamma8[] = {
                    163:       0,  15,  22,  27,  31,  35,  39,  42,  45,  47,  50,  52,
                    164:      55,  57,  59,  61,  63,  65,  67,  69,  71,  73,  74,  76,
                    165:      78,  79,  81,  82,  84,  85,  87,  88,  90,  91,  93,  94,
                    166:      95,  97,  98,  99, 100, 102, 103, 104, 105, 107, 108, 109,
                    167:     110, 111, 112, 114, 115, 116, 117, 118, 119, 120, 121, 122,
                    168:     123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
                    169:     135, 136, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145,
                    170:     146, 147, 148, 148, 149, 150, 151, 152, 153, 153, 154, 155, 
                    171:     156, 157, 158, 158, 159, 160, 161, 162, 162, 163, 164, 165,
                    172:     165, 166, 167, 168, 168, 169, 170, 171, 171, 172, 173, 174,
                    173:     174, 175, 176, 177, 177, 178, 179, 179, 180, 181, 182, 182,
                    174:     183, 184, 184, 185, 186, 186, 187, 188, 188, 189, 190, 190, 
                    175:     191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 198, 198,
                    176:     199, 200, 200, 201, 201, 202, 203, 203, 204, 205, 205, 206, 
                    177:     206, 207, 208, 208, 209, 210, 210, 211, 211, 212, 213, 213,
                    178:     214, 214, 215, 216, 216, 217, 217, 218, 218, 219, 220, 220, 
                    179:     221, 221, 222, 222, 223, 224, 224, 225, 225, 226, 226, 227,
                    180:     228, 228, 229, 229, 230, 230, 231, 231, 232, 233, 233, 234, 
                    181:     234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 240, 240,
                    182:     241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 
                    183:     247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252,
                    184:     253, 253, 254, 255, 
                    185: };
                    186: 
                    187: static void
                    188: SetGammaValue(unsigned int r, unsigned int g, unsigned int b, int level)
                    189: {
                    190:     outb(RS_01, EV_SCALE_BRIGHTNESS(level, r));
                    191:     outb(RS_01, EV_SCALE_BRIGHTNESS(level, g));
                    192:     outb(RS_01, EV_SCALE_BRIGHTNESS(level, b));
                    193: }
                    194: 
                    195: - setGammaTable
                    196: {
                    197:     unsigned int i, j, g;
                    198:     const IODisplayInfo *displayInfo;
                    199: 
                    200:     displayInfo = [self displayInfo];
                    201: 
                    202:     outb(RS_00, 0x00);
                    203: 
                    204:     switch (dac) {
                    205:     case Bt484:
                    206:     case Bt485:
                    207:     case Bt485A:
                    208:     case ATT20C505:
                    209:        if (redTransferTable != 0) {
                    210:            for (i = 0; i < transferTableCount; i++) {
                    211:                for (j = 0; j < 256/transferTableCount; j++) {
                    212:                    SetGammaValue(redTransferTable[i], greenTransferTable[i],
                    213:                                  blueTransferTable[i], brightnessLevel);
                    214:                }
                    215:            }
                    216:        } else {
                    217:            switch (displayInfo->bitsPerPixel) {
                    218:            case IO_24BitsPerPixel:
                    219:            case IO_8BitsPerPixel:
                    220:                for (g = 0; g < 256; g++) {
                    221:                    SetGammaValue(gamma8[g], gamma8[g], gamma8[g], 
                    222:                                  brightnessLevel);
                    223:            }
                    224:            break;
                    225: 
                    226:            case IO_15BitsPerPixel:
                    227:                for (i = 0; i < 32; i++) {
                    228:                    for (j = 0; j < 8; j++) {
                    229:                        SetGammaValue(gamma16[i/2], gamma16[i/2], gamma16[i/2],
                    230:                                      brightnessLevel);
                    231:                    }
                    232:                }
                    233:                break;
                    234:            default:
                    235:                break;
                    236:            }
                    237:        }
                    238:        break;
                    239: 
                    240:     case ATT20C491:    /* ATT20C491 or other compatible DAC. */
                    241:        switch (displayInfo->bitsPerPixel) {
                    242:          const unsigned char *rTable, *gTable, *bTable;
                    243:        case IO_8BitsPerPixel:
                    244:          
                    245:            /* Write out the gamma-corrected grayscale palette. */
                    246:            if (redTransferTable != 0) {
                    247:                rTable = redTransferTable;
                    248:                gTable = greenTransferTable;
                    249:                bTable = blueTransferTable;
                    250:            } else {
                    251:                rTable = gTable = bTable = gamma8;
                    252:            }
                    253:            for (g = 0; g < 256; g++) {
                    254:                unsigned int r,gr,b;
                    255:                r = rTable[g] * 63 / 255;
                    256:                gr = gTable[g] * 63 / 255;
                    257:                b = bTable[g] * 63 / 255;
                    258:                SetGammaValue(r, gr, b, brightnessLevel);
                    259:            }
                    260:            break;
                    261:        default:
                    262:            break;
                    263:        }
                    264:        break;
                    265:     default:
                    266:        break;
                    267:     }
                    268:     return self;
                    269: }
                    270: 
                    271: - resetDAC
                    272: {
                    273:     const IODisplayInfo *displayInfo;
                    274: 
                    275:     displayInfo = [self displayInfo];
                    276: 
                    277:     switch (dac) {
                    278:     case ATT20C491:
                    279:        inb(RS_03);             /* Take DAC out of command mode. */
                    280:        inb(RS_02);             /* Four reads to get DAC into command mode */
                    281:        inb(RS_02);
                    282:        inb(RS_02);
                    283:        inb(RS_02);
                    284:        outb(RS_02, 0x00);      /* Get DAC into 8bpp mode. */
                    285:        inb(RS_03);             /* Take DAC out of command mode. */
                    286:        rwrite(VGA_CRTC_INDEX, 0x45, 0x00);
                    287:        rwrite(VGA_CRTC_INDEX, 0x53, 0x00);
                    288:        rwrite(VGA_CRTC_INDEX, 0x55, 0x00);
                    289:        break;
                    290: 
                    291:     case Bt484:
                    292:     case Bt485:
                    293:     case Bt485A:
                    294:     case ATT20C505:
                    295:        setCommandRegister0(0x00);
                    296:        setCommandRegister1(0x00);
                    297:        setCommandRegister2(0x00);
                    298:        if (dac == Bt485 || dac == Bt485A || dac == ATT20C505)
                    299:            setCommandRegister3(0x00);
                    300:        rwrite(VGA_CRTC_INDEX, 0x45, 0x00);
                    301:        rwrite(VGA_CRTC_INDEX, 0x53, 0x00);
                    302:        rwrite(VGA_CRTC_INDEX, 0x55, 0x00);
                    303:        rrmw(VGA_CRTC_INDEX, 0x55, ~S3_DAC_R_SEL_MASK, 0x00);
                    304:     default:
                    305:        break;
                    306:     }
                    307: 
                    308:     /* Restore the PIXEL mask. */
                    309:     outb(RS_02, 0xFF);
                    310: 
                    311:     /* Set correct falling edge mode. */
                    312:     rrmw(VGA_CRTC_INDEX, S3_EXT_MODE, 0xFE, 0x00);
                    313: 
                    314:     return self;
                    315: }
                    316: 
                    317: - programDAC
                    318: {
                    319:     const IODisplayInfo *displayInfo;
                    320: 
                    321:     displayInfo = [self displayInfo];
                    322: 
                    323:     switch (dac) {
                    324:     case ATT20C491:
                    325:        inb(RS_03);     /* Take DAC out of command mode. */
                    326:        inb(RS_02);     /* Four reads to get DAC into command mode */
                    327:        inb(RS_02);
                    328:        inb(RS_02);
                    329:        inb(RS_02);
                    330: 
                    331:        switch (displayInfo->bitsPerPixel) {
                    332:        case IO_8BitsPerPixel:
                    333:            outb(RS_02, 0x00);          /* Get DAC into 8bpp mode. */
                    334:            break;
                    335:        case IO_15BitsPerPixel:
                    336:            outb(RS_02, 0xA0);          /* Get DAC into 15bpp mode. */
                    337:            break;
                    338:        default:
                    339:            break;
                    340:        }
                    341:        inb(RS_03);     /* Take DAC out of command mode. */
                    342:        rwrite(VGA_CRTC_INDEX, 0x45, 0x00);
                    343:        rwrite(VGA_CRTC_INDEX, 0x53, 0x00);
                    344:        rwrite(VGA_CRTC_INDEX, 0x55, 0x00);
                    345:        break;
                    346: 
                    347:     case Bt484:
                    348:     case Bt485:
                    349:     case Bt485A:
                    350:     case ATT20C505:
                    351:        switch (displayInfo->bitsPerPixel) {
                    352:        case IO_8BitsPerPixel:
                    353:            if (displayInfo->width == 1280) {
                    354:                setCommandRegister0(0x02);
                    355:                setCommandRegister1(0x40);
                    356:                setCommandRegister2(0x30);
                    357:                if (dac == Bt485 || dac == Bt485A || dac == ATT20C505)
                    358:                    setCommandRegister3(0x08);
                    359:                rwrite(VGA_CRTC_INDEX, 0x45, 0x20);
                    360:                rwrite(VGA_CRTC_INDEX, 0x53, 0x00);
                    361:                rwrite(VGA_CRTC_INDEX, 0x55, 0x28);
                    362:            } else {
                    363:                setCommandRegister0(0x02);
                    364:                setCommandRegister1(0x00);
                    365:                setCommandRegister2(0x00);
                    366:                if (dac == Bt485 || dac == Bt485A || dac == ATT20C505)
                    367:                    setCommandRegister3(0x00);
                    368:                rwrite(VGA_CRTC_INDEX, 0x45, 0x00);
                    369:                rwrite(VGA_CRTC_INDEX, 0x53, 0x00);
                    370:                rwrite(VGA_CRTC_INDEX, 0x55, 0x00);
                    371:            }
                    372:            break;
                    373: 
                    374:        case IO_15BitsPerPixel:
                    375:            setCommandRegister0(0x02);
                    376:            setCommandRegister1(0x20);
                    377:            setCommandRegister2(0x30);
                    378:            if (dac == Bt485 || dac == Bt485A || dac == ATT20C505)
                    379:                setCommandRegister3(0x00);
                    380:            if (displayInfo->width == 1280)
                    381:                rwrite(VGA_CRTC_INDEX, 0x53, 0x20);
                    382:            else
                    383:                rwrite(VGA_CRTC_INDEX, 0x53, 0x00);
                    384:            rwrite(VGA_CRTC_INDEX, 0x45, 0x20);
                    385:            rwrite(VGA_CRTC_INDEX, 0x55, 0x28);
                    386:            break;
                    387: 
                    388:        case IO_24BitsPerPixel:
                    389:            setCommandRegister0(0x02);
                    390:            setCommandRegister1(0x00);
                    391:            setCommandRegister2(0x30);
                    392:            if (dac == Bt485 || dac == Bt485A || dac == ATT20C505)
                    393:                setCommandRegister3(0x08);
                    394:            rwrite(VGA_CRTC_INDEX, 0x45, 0x20);
                    395:            rwrite(VGA_CRTC_INDEX, 0x53, 0x20);
                    396:            rwrite(VGA_CRTC_INDEX, 0x55, 0x28);
                    397:            break;
                    398: 
                    399:        default:
                    400:            break;
                    401:        }
                    402:        rrmw(VGA_CRTC_INDEX, 0x55, ~S3_DAC_R_SEL_MASK, 0x00);
                    403:        break;
                    404: 
                    405:     default:
                    406:        break;
                    407:     }
                    408: 
                    409:     /* Restore the PIXEL mask. */
                    410:     outb(RS_02, 0xFF);
                    411: 
                    412:     /* Set correct falling edge mode. */
                    413:     rrmw(VGA_CRTC_INDEX, S3_EXT_MODE, 0xFE, 0x00);
                    414: 
                    415:     return self;
                    416: }
                    417: @end

unix.superglobalmegacorp.com

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