|
|
1.1 root 1: /* Copyright (c) 1992, 1993 NeXT Computer, Inc. All rights reserved.
2: *
3: * QVision.m -- Compaq QVision display driver.
4: *
5: * HISTORY
6: * 30 Sep 92 Joe Pasqua
7: * Created.
8: * 29 June 1993 Derek B Clegg
9: * Cleaned up for external release.
10: * Tue Aug 16 16:53:03 PDT 1994 James C. Lee
11: * Add 3.3 bus support & 8-bit color support.
12: */
13: #import <driverkit/i386/IOEISADeviceDescription.h>
14: #import "QVision.h"
15:
16: @implementation QVision
17:
18: /* Set the brightness to `level'.
19: */
20: - setBrightness:(int)level token:(int)t
21: {
22: if (level < EV_SCREEN_MIN_BRIGHTNESS || level > EV_SCREEN_MAX_BRIGHTNESS) {
23: IOLog("QVision: Invalid arg to setBrightness: %d\n", level);
24: return nil;
25: }
26: brightnessLevel = level;
27: [self setGammaTable];
28: return self;
29: }
30:
31: /* Set the transfer tables.
32: */
33: - setTransferTable:(unsigned int *)table count:(int)count
34: {
35: int k;
36: IOBitsPerPixel bpp;
37: IOColorSpace cspace;
38:
39: if (redTransferTable != 0)
40: IOFree(redTransferTable, 3 * transferTableCount);
41:
42: transferTableCount = count;
43:
44: redTransferTable = IOMalloc(3 * count);
45: greenTransferTable = redTransferTable + count;
46: blueTransferTable = greenTransferTable + count;
47:
48: bpp = [self displayInfo]->bitsPerPixel;
49: cspace = [self displayInfo]->colorSpace;
50:
51: if (bpp == IO_8BitsPerPixel && cspace == IO_OneIsWhiteColorSpace) {
52: for (k = 0; k < count; k++) {
53: redTransferTable[k] = greenTransferTable[k] =
54: blueTransferTable[k] = table[k] & 0xFF;
55: }
56: } else if (cspace == IO_RGBColorSpace &&
57: (bpp == IO_8BitsPerPixel ||
58: bpp == IO_12BitsPerPixel ||
59: bpp == IO_15BitsPerPixel ||
60: bpp == IO_24BitsPerPixel))
61: {
62: for (k = 0; k < count; k++) {
63: redTransferTable[k] = (table[k] >> 24) & 0xFF;
64: greenTransferTable[k] = (table[k] >> 16) & 0xFF;
65: blueTransferTable[k] = (table[k] >> 8) & 0xFF;
66: }
67: } else {
68: IOLog("%s: Can't set transfertable, unknown colorSpace (%d) & pixel depth (%d)\n",
69: [self name], cspace, bpp);
70: IOFree(redTransferTable, 3 * count);
71: redTransferTable = 0;
72: }
73: [self setGammaTable];
74: return self;
75: }
76:
77: /* Put the display into linear framebuffer mode. This typically happens
78: * when the window server starts running.
79: */
80: - (void)enterLinearMode
81: {
82: /* Set up the chip to use the selected mode. */
83: [self initializeMode];
84:
85: /* Set the gamma-corrected gray-scale palette if necessary. */
86: [self setGammaTable];
87:
88: /* Enter linear mode. */
89: if ([self enableLinearFrameBuffer] == nil) {
90: IOLog("%s: Failed to enter linear mode.\n", [self name]);
91: return;
92: }
93: }
94:
95: /* Get the device out of whatever advanced linear mode it was using and back
96: * into a state where it can be used as a standard VGA device.
97: */
98: - (void)revertToVGAMode
99: {
100: /* Reset the VGA parameters. */
101: [self resetVGA];
102:
103: /* Let the superclass do whatever work it needs to do. */
104: [super revertToVGAMode];
105: }
106:
107: - initFromDeviceDescription:deviceDescription
108: {
109: IODisplayInfo *displayInfo;
110: const IORange *range;
111: const QVisionMode *mode;
112:
113: // DEBUG
114: // IOBreakToDebugger();
115:
116: if ([super initFromDeviceDescription:deviceDescription] == nil)
117: return [super free];
118:
119: if ([self determineConfiguration] == nil) {
120: IOLog("Unknown configuration, abort.\n");
121: return [super free];
122: }
123:
124: if ([self selectMode] == nil)
125: return [super free];
126:
127: redTransferTable = greenTransferTable = blueTransferTable = 0;
128: transferTableCount = 0;
129: brightnessLevel = EV_SCREEN_MAX_BRIGHTNESS;
130:
131: range = [deviceDescription memoryRangeList];
132: if (range == 0) {
133: IOLog("%s: No memory range specified.\n", [self name]);
134: return [super free];
135: }
136: videoRamAddress = range[0].start;
137:
138: displayInfo = [self displayInfo];
139: mode = displayInfo->parameters;
140:
141: displayInfo->flags = IO_DISPLAY_HAS_TRANSFER_TABLE;
142:
143: displayInfo->frameBuffer =
144: (void *)[self mapFrameBufferAtPhysicalAddress:videoRamAddress
145: length:range[0].size];
146: IOLog("%s: physical address = 0x%08lx\n", [self name], videoRamAddress);
147: if (displayInfo->frameBuffer == 0)
148: return [super free];
149:
150: IOLog("%s: Initialized `%s'.\n", [self name], mode->name);
151: return self;
152: }
153: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.