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

  1. /* Copyright (c) 1993 by NeXT Computer, Inc as an unpublished work.
  2.  * All rights reserved.
  3.  *
  4.  * QVisionSetMode.m -- Mode support for the QVision.
  5.  *
  6.  * Author:  Derek B Clegg    21 May 1993
  7.  * Based on work by Joe Pasqua.
  8.  */
  9. #import <string.h>
  10. #import <driverkit/generalFuncs.h>
  11. #import <driverkit/i386/ioPorts.h>
  12. #import <driverkit/i386/directDevice.h>
  13. #import "QVision.h"
  14.  
  15. /* The `SetMode' category of `QVision'. */
  16.  
  17. @implementation QVision (SetMode)
  18.  
  19. - (void)reportConfiguration
  20. {
  21.     const char *adapterString, *dacString;
  22.  
  23.     switch (adapter) {
  24.     case QVisionAdapter: adapterString = "QVision"; break;
  25.     case OrionAdapter: adapterString = "Orion"; break;
  26.     case Orion12Adapter: adapterString = "Orion12"; break;
  27.     default: adapterString = "unknown"; break;
  28.     }
  29.  
  30.     switch (dac) {
  31.     case Bt484: dacString = "Brooktree 484"; break;
  32.     case Bt485: dacString = "Brooktree 485"; break;
  33.     case Bt485A: dacString = "Brooktree 485A"; break;
  34.     default: dacString = "unknown"; break;
  35.     }
  36.  
  37.     IOLog("%s: %s adapter; %s DAC.\n", [self name], adapterString, dacString);
  38. }
  39.  
  40. - determineConfiguration
  41. {
  42.     int slot;
  43.     unsigned int cardID;
  44.  
  45.     adapter = UnknownAdapter;
  46.  
  47.     if ([self isEISAPresent] == TRUE) {
  48.     for (slot = 1; slot < 16; slot++) {
  49.         if ([self getEISAId:&cardID forSlot:slot] == TRUE) {
  50.         switch (cardID) {
  51.         case QVISION_EISA_ID:
  52.             adapter = QVisionAdapter;
  53.             break;
  54.         case ORION_EISA_ID:
  55.             adapter = OrionAdapter;
  56.             break;
  57.         case ORION12_EISA_ID:
  58.             adapter = Orion12Adapter;
  59.             break;
  60.         case QVISION_ISA_ID:
  61.         case ORION_ISA_ID:
  62.         case ORION12_ISA_ID:
  63.             IOLog("%s: Sorry, ISA cards are not supported.\n",
  64.               [self name]);
  65.             break;
  66.         default:
  67.             /* We found some other EISA card.  Just ignore it. */
  68.             continue;
  69.         }
  70.         break;
  71.         }
  72.     }
  73.     }
  74.     [self determineDACType];
  75.     [self reportConfiguration];
  76.     return self;
  77. }
  78.  
  79. - selectMode
  80. {
  81.     int k, mode;
  82.     const QVisionMode *qvMode;
  83.     BOOL validModes[QVisionModeTableCount];
  84.  
  85.     for (k = 0; k < QVisionModeTableCount; k++) {
  86.     qvMode = QVisionModeTable[k].parameters;
  87.     validModes[k] = (qvMode->adapter <= adapter);
  88.     }
  89.  
  90.     mode = [self selectMode:QVisionModeTable count:QVisionModeTableCount
  91.     valid:validModes];
  92.  
  93.     if (mode < 0) {
  94.     IOLog("%s: Sorry, cannot use requested display mode.\n", [self name]);
  95.     switch (adapter) {
  96.     case Orion12Adapter:
  97.         mode = DEFAULT_ORION12_MODE;
  98.         break;
  99.     case OrionAdapter:
  100.         mode = DEFAULT_ORION_MODE;
  101.         break;
  102.     case QVisionAdapter:
  103.     default:
  104.         mode = DEFAULT_QVISION_MODE;
  105.         break;
  106.     }
  107.     }
  108.     *[self displayInfo] = QVisionModeTable[mode];
  109.     return self;
  110. }
  111.  
  112. - initializeMode
  113. {
  114.     unsigned int i;
  115.     const QVisionMode *mode;
  116.     const IODisplayInfo *displayInfo;
  117.  
  118.     displayInfo = [self displayInfo];
  119.     mode = displayInfo->parameters;
  120.  
  121.     /* Turn off video while setting all of the registers. */
  122.     inb(VGA_INPUT_STATUS_1);
  123.     outb(VGA_ATTR_INDEX, 0x00);
  124.     
  125.     /* Set the sequencer registers. */
  126.     for (i = 0; i < VGA_SEQ_COUNT; i++) {
  127.     outb(VGA_SEQ_INDEX, i);
  128.     outb(VGA_SEQ_DATA, mode->vgaData.seqx[i]);
  129.     }
  130.     outb(VGA_SEQ_INDEX, 0x00);
  131.     outb(VGA_SEQ_DATA, 0x03);    /* Restart the sequencer. */
  132.     
  133.     /* Unlock extended graphics registers. */
  134.     outw(VGA_GRFX_INDEX, 0x050f);
  135.  
  136.     /* Unlock more extended registers. */
  137.     outb(VGA_GRFX_INDEX, 0x10);
  138.     outb(VGA_GRFX_DATA, 0x08);
  139.  
  140.     /* Set Advanced VGA mode (set bit 0 of Ctrl Reg 0). */
  141.     outb(VGA_GRFX_INDEX, 0x40);
  142.     outb(VGA_GRFX_DATA, 0x01);
  143.     
  144.     /* Fix sequencer pixel mask for 8 bits. */
  145.     outb(VGA_SEQ_INDEX, SEQ_PIXEL_WR_MSK);
  146.     outb(VGA_SEQ_DATA, 0xff);
  147.     
  148.     outb(CTRL_REG_1, mode->ctrlReg1);
  149.     if (mode->adapter >= OrionAdapter) {
  150.     /* Set access level & enable high address map. */
  151.     outb(QVGA_CTL_2, 0x14);
  152.     /* Select 2 Meg mode. */
  153.     outb(QVGA_CTL_3, 0x05);
  154.     }
  155.     
  156.     /* Set miscellaneous output register. */
  157.     outb(VGA_MISC_OUTPUT, mode->vgaData.miscOutput);
  158.     
  159.     [self programDAC];
  160.  
  161.     /* Load CRTC registers. */
  162.     outb(VGA_CRTC_INDEX, 0x11);        /* Unlock CRTC regs 0-7. */
  163.     outb(VGA_CRTC_DATA, 0x00);
  164.     for (i = 0; i < VGA_CRTC_COUNT; i++) {
  165.     outb(VGA_CRTC_INDEX, i);
  166.     outb(VGA_CRTC_DATA, mode->vgaData.crtc[i]);
  167.     }
  168.  
  169.     /* Load overflow registers. */
  170.     outb(VGA_GRFX_INDEX, 0x42);
  171.     outb(VGA_GRFX_DATA, mode->overflow1);
  172.     outb(VGA_GRFX_INDEX, 0x51);
  173.     outb(VGA_GRFX_DATA, mode->overflow2);
  174.     
  175.     /* Load attribute registers. */
  176.  
  177.     inb(VGA_INPUT_STATUS_1);    /* Reset latch. */
  178.     for (i = 0; i < VGA_ATTR_COUNT; i++) {
  179.     outb(VGA_ATTR_INDEX, i);
  180.     outb(VGA_ATTR_DATA, mode->vgaData.attr[i]);
  181.     }
  182.     
  183.     /* Load graphics registers. */
  184.     for (i = 0; i < VGA_GRFX_COUNT; i++) {
  185.     outb(VGA_GRFX_INDEX, i);
  186.     outb(VGA_GRFX_DATA, mode->vgaData.grfx[i]);
  187.     }
  188.     
  189.     [self setGammaTable];
  190.     
  191.     /* Re-enable video display. */
  192.     inb(VGA_INPUT_STATUS_1);
  193.     outb(VGA_ATTR_INDEX, 0x20);
  194.  
  195.     return self;
  196. }
  197.  
  198. - enableLinearFrameBuffer
  199. {
  200.     const IODisplayInfo *displayInfo;
  201.     unsigned char tmp;
  202.     
  203.     /* Override the high address map disable, thus allowing access to
  204.      * the high address map of the current board, even when the board
  205.      * is disabled. */
  206.  
  207.     outb(VGA_GRFX_INDEX, HI_ADDR_MAP+1);
  208.     tmp = inb(VGA_GRFX_DATA);
  209.     outb(VGA_GRFX_DATA, tmp | 0x80);
  210.  
  211.     /* Map VRAM.  Tell the adapter where to decode the framebuffer. */
  212.  
  213.     /* Set low 8 bits */
  214.     outb(VGA_GRFX_INDEX, HI_ADDR_MAP);
  215.     outb(VGA_GRFX_DATA, (videoRamAddress >> 20) & 0xFF);
  216.  
  217.     /* Set upper 4 bits */
  218.     outb(VGA_GRFX_INDEX, HI_ADDR_MAP + 1);
  219.     outb(VGA_GRFX_DATA, (videoRamAddress >> 28) & 0x0F);
  220.  
  221.     /* Leave them with a nice clear screen. */
  222.  
  223.     displayInfo = [self displayInfo];
  224.     memset(displayInfo->frameBuffer, 0, 
  225.        displayInfo->rowBytes * displayInfo->height);
  226.  
  227.     return self;
  228. }
  229.  
  230. - resetVGA
  231. {
  232.     const IODisplayInfo *displayInfo;
  233.     const QVisionMode *mode;
  234.  
  235.     displayInfo = [self displayInfo];
  236.     mode = displayInfo->parameters;
  237.  
  238.     /* Clear the QVision extended mode bit. This is bit 0 of CTRL_REG_1. */
  239.  
  240.     outb(CTRL_REG_1, inb(CTRL_REG_1) & 0xFE);
  241.  
  242.     if (mode != 0 && mode->adapter >= OrionAdapter) {
  243.     /* Select 1 meg mode. */
  244.     outb(QVGA_CTL_3, 0x00);
  245.     /* Reset access level & disable high address map. */
  246.     outb(QVGA_CTL_2, 0x00);
  247.     }
  248.     
  249.     /* Clear the extended 256 color bit. This is bit 0 of 3CF.40. */
  250.     outb(VGA_GRFX_INDEX, 0x40);
  251.     outb(VGA_GRFX_DATA, (inb(VGA_GRFX_DATA) & 0xFE));
  252.     
  253.     /* Clear the page registers - 3CF.45 and 3CF.46. */
  254.     outb(VGA_GRFX_INDEX, PAGE_REG_0);
  255.     outb(VGA_GRFX_DATA, 0x00);
  256.     outb(VGA_GRFX_INDEX, PAGE_REG_1);
  257.     outb(VGA_GRFX_DATA, 0x00);
  258.     
  259.     [self resetDAC];
  260.  
  261.     /* Clear the overflow registers. */
  262.     outb(VGA_GRFX_INDEX, 0x42);
  263.     outb(VGA_GRFX_DATA, 0x00);
  264.     outb(VGA_GRFX_INDEX, 0x51);
  265.     outb(VGA_GRFX_DATA, 0x00);
  266.  
  267.     VGASetMode(0x03);
  268.  
  269.     return self;
  270. }
  271. @end
  272.