home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Examples / DriverKit / QVision / QVision_reloc.tproj / QVision.m < prev    next >
Text File  |  1996-03-26  |  5KB  |  185 lines

  1. /* Copyright (c) 1992-1996  NeXT Software, 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.  * 16 Aug 1994 James C. Lee
  11.  *    Add 3.3 bus support & 8-bit color support.
  12.  * 30 Oct 95 Rakesh Dubey
  13.  *    Updated for 4.0.
  14.  */
  15.  
  16. #import <driverkit/i386/IOEISADeviceDescription.h>
  17. #import "QVision.h"
  18.  
  19. @implementation QVision
  20.  
  21. /*
  22.  * Set the brightness to `level'. 
  23.  */
  24. - setBrightness:(int)level token:(int)t
  25. {
  26.     if (level < EV_SCREEN_MIN_BRIGHTNESS || level > EV_SCREEN_MAX_BRIGHTNESS) {
  27.     IOLog("QVision: Invalid arg to setBrightness: %d\n", level);
  28.     return nil;
  29.     }
  30.     brightnessLevel = level;
  31.     [self setGammaTable];
  32.     return self;
  33. }
  34.  
  35. /*
  36.  * Set the transfer tables. 
  37.  */
  38. - setTransferTable:(const unsigned int *)table count:(int)count
  39. {
  40.     int     k;
  41.     IOBitsPerPixel bpp;
  42.     IOColorSpace cspace;
  43.  
  44.     if (redTransferTable != 0)
  45.     IOFree(redTransferTable, 3 * transferTableCount);
  46.  
  47.     transferTableCount = count;
  48.  
  49.     redTransferTable = IOMalloc(3 * count);
  50.     greenTransferTable = redTransferTable + count;
  51.     blueTransferTable = greenTransferTable + count;
  52.  
  53.     bpp = [self displayInfo]->bitsPerPixel;
  54.     cspace = [self displayInfo]->colorSpace;
  55.  
  56.     if (bpp == IO_8BitsPerPixel && cspace == IO_OneIsWhiteColorSpace) {
  57.     for (k = 0; k < count; k++) {
  58.         redTransferTable[k] = greenTransferTable[k] =
  59.         blueTransferTable[k] = table[k] & 0xFF;
  60.     }
  61.     } else if (cspace == IO_RGBColorSpace &&
  62.            (bpp == IO_8BitsPerPixel ||
  63.         bpp == IO_12BitsPerPixel ||
  64.         bpp == IO_15BitsPerPixel ||
  65.         bpp == IO_24BitsPerPixel)) {
  66.     for (k = 0; k < count; k++) {
  67.         redTransferTable[k] = (table[k] >> 24) & 0xFF;
  68.         greenTransferTable[k] = (table[k] >> 16) & 0xFF;
  69.         blueTransferTable[k] = (table[k] >> 8) & 0xFF;
  70.     }
  71.     } else {
  72.     IOLog("%s: Can't set transfertable, unknown colorSpace (%d) & pixel depth (%d)\n",[self name], cspace, bpp);
  73.     IOFree(redTransferTable, 3 * count);
  74.     redTransferTable = 0;
  75.     }
  76.     [self setGammaTable];
  77.     return self;
  78. }
  79.  
  80. /*
  81.  * Put the display into linear framebuffer mode. This typically happens when
  82.  * the window server starts running. 
  83.  */
  84. - (void)enterLinearMode
  85. {
  86.     /* Set up the chip to use the selected mode. */
  87.     [self initializeMode];
  88.  
  89.     /* Set the gamma-corrected gray-scale palette if necessary. */
  90.     [self setGammaTable];
  91.  
  92.     /* Enter linear mode. */
  93.     if ([self enableLinearFrameBuffer] == nil) {
  94.     IOLog("%s: Failed to enter linear mode.\n", [self name]);
  95.     return;
  96.     }
  97. }
  98.  
  99. /*
  100.  * Get the device out of whatever advanced linear mode it was using and back
  101.  * into a state where it can be used as a standard VGA device. 
  102.  */
  103. - (void)revertToVGAMode
  104. {
  105.     /* Reset the VGA parameters. */
  106.     [self resetVGA];
  107.  
  108.     /* Let the superclass do whatever work it needs to do. */
  109.     [super revertToVGAMode];
  110. }
  111.  
  112. - initFromDeviceDescription:deviceDescription
  113. {
  114.     IODisplayInfo *displayInfo;
  115.     const IORange *range;
  116.     const QVisionMode *mode;
  117.     IOReturn result;
  118.  
  119.     if ([super initFromDeviceDescription:deviceDescription] == nil)
  120.     return [super free];
  121.  
  122.     [self initModeList];    // Initialize the mode list array
  123.     
  124.     if ([self determineConfiguration] == nil) {
  125.     IOLog("Unknown configuration, abort.\n");
  126.     return [super free];
  127.     }
  128.  
  129.     if ([self selectMode] == nil)
  130.     return [super free];
  131.  
  132.     redTransferTable = greenTransferTable = blueTransferTable = 0;
  133.     transferTableCount = 0;
  134.     brightnessLevel = EV_SCREEN_MAX_BRIGHTNESS;
  135.  
  136.     range = [deviceDescription memoryRangeList];
  137.     if (range == 0) {
  138.     IOLog("%s: No memory range specified.\n", [self name]);
  139.     return [super free];
  140.     }
  141.     videoRamAddress = range[0].start;
  142.  
  143.     displayInfo = [self displayInfo];
  144.     mode = displayInfo->parameters;
  145.  
  146.     result = [self mapMemoryRange:0 
  147.         to:(vm_address_t *)&(displayInfo->frameBuffer)
  148.         findSpace:YES cache:IO_DISPLAY_CACHE_WRITETHROUGH];
  149.             
  150.     if (result != IO_R_SUCCESS)    {
  151.         IOLog("%s: IOFrameBufferDisplay: can't map memory (%s)\n",
  152.         [self name], [self stringFromReturn:result]);
  153.     return [super free];
  154.     }
  155.                 
  156.     if (displayInfo->frameBuffer == 0)
  157.         return [super free];
  158.     
  159.     IOLog_dbg(("%s: Initialized `%s'.\n", [self name], mode->name));
  160.     return self;
  161. }
  162.  
  163. - (unsigned int)displayMemorySize
  164. {
  165.     return installedVRAMBytes;
  166. }
  167.  
  168. - (unsigned int)ramdacSpeed
  169. {
  170.     return 0;        /* can not determine this */
  171. }
  172.  
  173. /*
  174.  * Note that we don't use the mapFrameBufferAtPhysicalAddress:length: API
  175.  * anymore. That API is limited and will be obsoleted at a later time. 
  176.  */
  177. - free
  178. {
  179.     [self unmapMemoryRange:0 
  180.         from:(vm_address_t)[self displayInfo]->frameBuffer];
  181.     return [super free];
  182. }
  183.  
  184. @end
  185.