|
|
Sample Programs from NeXSTEP 3.3
/* Copyright (c) 1992, 1993 NeXT Computer, Inc. All rights reserved.
*
* QVision.m -- Compaq QVision display driver.
*
* HISTORY
* 30 Sep 92 Joe Pasqua
* Created.
* 29 June 1993 Derek B Clegg
* Cleaned up for external release.
* Tue Aug 16 16:53:03 PDT 1994 James C. Lee
* Add 3.3 bus support & 8-bit color support.
*/
#import <driverkit/i386/IOEISADeviceDescription.h>
#import "QVision.h"
@implementation QVision
/* Set the brightness to `level'.
*/
- setBrightness:(int)level token:(int)t
{
if (level < EV_SCREEN_MIN_BRIGHTNESS || level > EV_SCREEN_MAX_BRIGHTNESS) {
IOLog("QVision: Invalid arg to setBrightness: %d\n", level);
return nil;
}
brightnessLevel = level;
[self setGammaTable];
return self;
}
/* Set the transfer tables.
*/
- setTransferTable:(unsigned int *)table count:(int)count
{
int k;
IOBitsPerPixel bpp;
IOColorSpace cspace;
if (redTransferTable != 0)
IOFree(redTransferTable, 3 * transferTableCount);
transferTableCount = count;
redTransferTable = IOMalloc(3 * count);
greenTransferTable = redTransferTable + count;
blueTransferTable = greenTransferTable + count;
bpp = [self displayInfo]->bitsPerPixel;
cspace = [self displayInfo]->colorSpace;
if (bpp == IO_8BitsPerPixel && cspace == IO_OneIsWhiteColorSpace) {
for (k = 0; k < count; k++) {
redTransferTable[k] = greenTransferTable[k] =
blueTransferTable[k] = table[k] & 0xFF;
}
} else if (cspace == IO_RGBColorSpace &&
(bpp == IO_8BitsPerPixel ||
bpp == IO_12BitsPerPixel ||
bpp == IO_15BitsPerPixel ||
bpp == IO_24BitsPerPixel))
{
for (k = 0; k < count; k++) {
redTransferTable[k] = (table[k] >> 24) & 0xFF;
greenTransferTable[k] = (table[k] >> 16) & 0xFF;
blueTransferTable[k] = (table[k] >> 8) & 0xFF;
}
} else {
IOLog("%s: Can't set transfertable, unknown colorSpace (%d) & pixel depth (%d)\n",
[self name], cspace, bpp);
IOFree(redTransferTable, 3 * count);
redTransferTable = 0;
}
[self setGammaTable];
return self;
}
/* Put the display into linear framebuffer mode. This typically happens
* when the window server starts running.
*/
- (void)enterLinearMode
{
/* Set up the chip to use the selected mode. */
[self initializeMode];
/* Set the gamma-corrected gray-scale palette if necessary. */
[self setGammaTable];
/* Enter linear mode. */
if ([self enableLinearFrameBuffer] == nil) {
IOLog("%s: Failed to enter linear mode.\n", [self name]);
return;
}
}
/* Get the device out of whatever advanced linear mode it was using and back
* into a state where it can be used as a standard VGA device.
*/
- (void)revertToVGAMode
{
/* Reset the VGA parameters. */
[self resetVGA];
/* Let the superclass do whatever work it needs to do. */
[super revertToVGAMode];
}
- initFromDeviceDescription:deviceDescription
{
IODisplayInfo *displayInfo;
const IORange *range;
const QVisionMode *mode;
// DEBUG
// IOBreakToDebugger();
if ([super initFromDeviceDescription:deviceDescription] == nil)
return [super free];
if ([self determineConfiguration] == nil) {
IOLog("Unknown configuration, abort.\n");
return [super free];
}
if ([self selectMode] == nil)
return [super free];
redTransferTable = greenTransferTable = blueTransferTable = 0;
transferTableCount = 0;
brightnessLevel = EV_SCREEN_MAX_BRIGHTNESS;
range = [deviceDescription memoryRangeList];
if (range == 0) {
IOLog("%s: No memory range specified.\n", [self name]);
return [super free];
}
videoRamAddress = range[0].start;
displayInfo = [self displayInfo];
mode = displayInfo->parameters;
displayInfo->flags = IO_DISPLAY_HAS_TRANSFER_TABLE;
displayInfo->frameBuffer =
(void *)[self mapFrameBufferAtPhysicalAddress:videoRamAddress
length:range[0].size];
IOLog("%s: physical address = 0x%08lx\n", [self name], videoRamAddress);
if (displayInfo->frameBuffer == 0)
return [super free];
IOLog("%s: Initialized `%s'.\n", [self name], mode->name);
return self;
}
@end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.