home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.2 (Developer) / NS_dev_3.2.iso / NextDeveloper / Examples / DriverKit / QVision / QVision_reloc.tproj / QVision.m < prev    next >
Encoding:
Text File  |  1993-07-20  |  3.5 KB  |  141 lines

  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.  */
  11. #import <driverkit/i386/IOEISADeviceDescription.h>
  12. #import "QVision.h"
  13.  
  14. @implementation QVision
  15.  
  16. /* Set the brightness to `level'.
  17.  */
  18. - setBrightness:(int)level token:(int)t
  19. {
  20.     if (level < EV_SCREEN_MIN_BRIGHTNESS || level > EV_SCREEN_MAX_BRIGHTNESS) {
  21.     IOLog("QVision: Invalid arg to setBrightness: %d\n", level);
  22.     return nil;
  23.     }
  24.     brightnessLevel = level;
  25.     [self setGammaTable];
  26.     return self;
  27. }
  28.  
  29. /* Set the transfer tables.
  30.  */
  31. - setTransferTable:(unsigned int *)table count:(int)count
  32. {
  33.     int k;
  34.  
  35.     if (redTransferTable != 0)
  36.     IOFree(redTransferTable, 3 * transferTableCount);
  37.  
  38.     transferTableCount = count;
  39.  
  40.     redTransferTable = IOMalloc(3 * count);
  41.     greenTransferTable = redTransferTable + count;
  42.     blueTransferTable = greenTransferTable + count;
  43.  
  44.     switch ([self displayInfo]->bitsPerPixel) {
  45.     case IO_8BitsPerPixel:
  46.     for (k = 0; k < count; k++) {
  47.         redTransferTable[k] = greenTransferTable[k] =
  48.         blueTransferTable[k] = table[k] & 0xFF;
  49.     }
  50.     break;
  51.  
  52.     case IO_15BitsPerPixel:
  53.     case IO_24BitsPerPixel:
  54.     for (k = 0; k < count; k++) {
  55.         redTransferTable[k] = (table[k] >> 24) & 0xFF;
  56.         greenTransferTable[k] = (table[k] >> 16) & 0xFF;
  57.         blueTransferTable[k] = (table[k] >> 8) & 0xFF;
  58.     }
  59.     break;
  60.  
  61.     default:
  62.     IOFree(redTransferTable, 3 * count);
  63.     redTransferTable = 0;
  64.     break;
  65.     }
  66.     [self setGammaTable];
  67.     return self;
  68. }
  69.  
  70. /* Put the display into linear framebuffer mode. This typically happens
  71.  * when the window server starts running.
  72.  */
  73. - (void)enterLinearMode
  74. {
  75.     /* Set up the chip to use the selected mode. */
  76.     [self initializeMode];
  77.  
  78.     /* Set the gamma-corrected gray-scale palette if necessary. */
  79.     [self setGammaTable];
  80.  
  81.     /* Enter linear mode. */
  82.     if ([self enableLinearFrameBuffer] == nil) {
  83.     IOLog("%s: Failed to enter linear mode.\n", [self name]);
  84.     return;
  85.     }
  86. }
  87.  
  88. /* Get the device out of whatever advanced linear mode it was using and back
  89.  * into a state where it can be used as a standard VGA device.
  90.  */
  91. - (void)revertToVGAMode
  92. {
  93.     /* Reset the VGA parameters. */
  94.     [self resetVGA];
  95.  
  96.     /* Let the superclass do whatever work it needs to do. */
  97.     [super revertToVGAMode];
  98. }
  99.  
  100. - initFromDeviceDescription:deviceDescription
  101. {
  102.     IODisplayInfo *displayInfo;
  103.     const IORange *range;
  104.     const QVisionMode *mode;
  105.  
  106.     if ([super initFromDeviceDescription:deviceDescription] == nil)
  107.     return [super free];
  108.  
  109.     if ([self determineConfiguration] == nil)
  110.     return [super free];
  111.  
  112.     if ([self selectMode] == nil)
  113.     return [super free];
  114.  
  115.     redTransferTable = greenTransferTable = blueTransferTable = 0;
  116.     transferTableCount = 0;
  117.     brightnessLevel = EV_SCREEN_MAX_BRIGHTNESS;
  118.  
  119.     range = [deviceDescription memoryRangeList];
  120.     if (range == 0) {
  121.     IOLog("%s: No memory range specified.\n", [self name]);
  122.     return [super free];
  123.     }
  124.     videoRamAddress = range[0].start;
  125.  
  126.     displayInfo = [self displayInfo];
  127.     mode = displayInfo->parameters;
  128.  
  129.     displayInfo->flags = IO_DISPLAY_HAS_TRANSFER_TABLE;
  130.  
  131.     displayInfo->frameBuffer =
  132.         (void *)[self mapFrameBufferAtPhysicalAddress:videoRamAddress
  133.          length:range[0].size];
  134.     if (displayInfo->frameBuffer == 0)
  135.         return [super free];
  136.  
  137.     IOLog("%s: Initialized `%s'.\n", [self name], mode->name);
  138.     return self;
  139. }
  140. @end
  141.