Annotation of ntddk/src/video/displays/vga/hardware.c, revision 1.1.1.1

1.1       root        1: /******************************Module*Header*******************************\
                      2: * Module Name: hardware.c
                      3: *
                      4: * Hardware dependent initialization
                      5: *
                      6: * Copyright (c) 1992 Microsoft Corporation
                      7: *
                      8: \**************************************************************************/
                      9: 
                     10: 
                     11: #include "driver.h"
                     12: 
                     13: 
                     14: /******************************Module*Header*******************************\
                     15: * Color tables
                     16: *
                     17: \**************************************************************************/
                     18: 
                     19: // Values for the internal, EGA-compatible palette.
                     20: 
                     21: static WORD PaletteBuffer[] = {
                     22: 
                     23:         16, // 16 entries
                     24:         0,  // start with first palette register
                     25: 
                     26: // On the VGA, the palette contains indices into the array of color DACs.
                     27: // Since we can program the DACs as we please, we'll just put all the indices
                     28: // down at the beginning of the DAC array (that is, pass pixel values through
                     29: // the internal palette unchanged).
                     30: 
                     31:         0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
                     32: };
                     33: 
                     34: 
                     35: // These are the values for the first 16 DAC registers, the only ones we'll
                     36: // work with. These correspond to the RGB colors (6 bits for each primary, with
                     37: // the fourth entry unused) for pixel values 0-15.
                     38: 
                     39: static BYTE ColorBuffer[] = {
                     40: 
                     41:       16, // 16 entries
                     42:       0,
                     43:       0,
                     44:       0,  // start with first palette register
                     45:                 0x00, 0x00, 0x00, 0x00, // black
                     46:                 0x2A, 0x00, 0x15, 0x00, // red
                     47:                 0x00, 0x2A, 0x15, 0x00, // green
                     48:                 0x2A, 0x2A, 0x15, 0x00, // mustard/brown
                     49:                 0x00, 0x00, 0x2A, 0x00, // blue
                     50:                 0x2A, 0x15, 0x2A, 0x00, // magenta
                     51:                 0x15, 0x2A, 0x2A, 0x00, // cyan
                     52:                 0x21, 0x22, 0x23, 0x00, // dark gray   2A
                     53:                 0x30, 0x31, 0x32, 0x00, // light gray  39
                     54:                 0x3F, 0x00, 0x00, 0x00, // bright red
                     55:                 0x00, 0x3F, 0x00, 0x00, // bright green
                     56:                 0x3F, 0x3F, 0x00, 0x00, // bright yellow
                     57:                 0x00, 0x00, 0x3F, 0x00, // bright blue
                     58:                 0x3F, 0x00, 0x3F, 0x00, // bright magenta
                     59:                 0x00, 0x3F, 0x3F, 0x00, // bright cyan
                     60:                 0x3F, 0x3F, 0x3F, 0x00  // bright white
                     61: };
                     62: 
                     63: /******************************Public*Routine******************************\
                     64: * bInitPDEV
                     65: *
                     66: * Determine the mode we should be in based on the DEVMODE passed in.
                     67: * Query mini-port to get information needed to fill in the DevInfo and the
                     68: * GdiInfo .
                     69: *
                     70: \**************************************************************************/
                     71: 
                     72: BOOL bInitPDEV(
                     73: PPDEV ppdev,
                     74: DEVMODEW *pDevMode,
                     75: GDIINFO *pGdiInfo,
                     76: DEVINFO *pDevInfo)
                     77: {
                     78:     ULONG cModes;
                     79:     PVIDEO_MODE_INFORMATION pVideoBuffer, pVideoModeSelected, pVideoTemp;
                     80:     VIDEO_COLOR_CAPABILITIES colorCapabilities;
                     81:     ULONG ulTemp;
                     82:     BOOL bSelectDefault;
                     83:     ULONG cbModeSize;
                     84: 
                     85:     //
                     86:     // calls the miniport to get mode information.
                     87:     //
                     88: 
                     89:     cModes = getAvailableModes(ppdev->hDriver, &pVideoBuffer, &cbModeSize);
                     90: 
                     91:     if (cModes == 0)
                     92:     {
                     93:         DISPDBG((0, "DISP VGA: no available modes\n"));
                     94:         return(FALSE);
                     95:     }
                     96: 
                     97:     //
                     98:     // Determine if we are looking for a default mode.
                     99:     //
                    100: 
                    101:     if ( ((pDevMode->dmPelsWidth) ||
                    102:           (pDevMode->dmPelsHeight) ||
                    103:           (pDevMode->dmBitsPerPel) ||
                    104:           (pDevMode->dmDisplayFlags) ||
                    105:           (pDevMode->dmDisplayFrequency)) == 0)
                    106:     {
                    107:         bSelectDefault = TRUE;
                    108:     }
                    109:     else
                    110:     {
                    111:         bSelectDefault = FALSE;
                    112:     }
                    113: 
                    114:     //
                    115:     // Now see if the requested mode has a match in that table.
                    116:     //
                    117: 
                    118:     pVideoModeSelected = NULL;
                    119:     pVideoTemp = pVideoBuffer;
                    120: 
                    121:     //
                    122:     // Note: Not all vga minports support the frequency field. Those
                    123:     // that do not support fill it in with zero. Also, if the registry
                    124:     // entry is set to 0, we will ignore the freq.
                    125:     //
                    126: 
                    127:     while (cModes--)
                    128:     {
                    129:         if (pVideoTemp->Length != 0)
                    130:         {
                    131:             if (bSelectDefault ||
                    132:                 ((pVideoTemp->VisScreenWidth  == pDevMode->dmPelsWidth) &&
                    133:                  (pVideoTemp->VisScreenHeight == pDevMode->dmPelsHeight) &&
                    134:                  (pVideoTemp->BitsPerPlane *
                    135:                     pVideoTemp->NumberOfPlanes  == pDevMode->dmBitsPerPel) &&
                    136:                  ((pVideoTemp->Frequency  == pDevMode->dmDisplayFrequency) ||
                    137:                     (pDevMode->dmDisplayFrequency == 0)) &&
                    138:                  (((pVideoTemp->AttributeFlags &
                    139:                             VIDEO_MODE_INTERLACED) ? 1:0) ==
                    140:                     ((pDevMode->dmDisplayFlags & DM_INTERLACED) ? 1:0)) ) )
                    141: 
                    142:             {
                    143:                 pVideoModeSelected = pVideoTemp;
                    144:                 DISPDBG((1, "VGA: Found a match\n")) ;
                    145:                 break;
                    146:             }
                    147:         }
                    148: 
                    149:         pVideoTemp = (PVIDEO_MODE_INFORMATION)
                    150:             (((PUCHAR)pVideoTemp) + cbModeSize);
                    151:     }
                    152: 
                    153:     //
                    154:     // If no mode has been found, return an error
                    155:     //
                    156: 
                    157:     if (pVideoModeSelected == NULL)
                    158:     {
                    159:         DISPDBG((0, "DISP VGA: no valid modes\n"));
                    160:         LocalFree(pVideoBuffer);
                    161:         return(FALSE);
                    162:     }
                    163: 
                    164:     //
                    165:     // Save the mode number we selected
                    166:     //
                    167: 
                    168:     ppdev->ulModeNum = pVideoModeSelected->ModeIndex;
                    169: 
                    170:     //
                    171:     // Set the displayed surface dimensions from the DEVMODE
                    172:     //
                    173: 
                    174:     ppdev->sizlSurf.cx = pVideoModeSelected->VisScreenWidth;
                    175:     ppdev->sizlSurf.cy = pVideoModeSelected->VisScreenHeight;
                    176: 
                    177:     //
                    178:     // Set the GDI info that varies with resolution
                    179:     //
                    180: 
                    181:     pGdiInfo->ulHorzRes = pVideoModeSelected->VisScreenWidth;
                    182:     pGdiInfo->ulVertRes = pVideoModeSelected->VisScreenHeight;
                    183:     pGdiInfo->ulDevicePelsDPI = (pVideoModeSelected->VisScreenWidth * 254)/2400;
                    184: 
                    185:     pGdiInfo->ulLogPixelsX = 96;
                    186:     pGdiInfo->ulLogPixelsY = 96;
                    187: 
                    188:     if (!(pVideoModeSelected->AttributeFlags & VIDEO_MODE_NO_OFF_SCREEN))
                    189:     {
                    190:         ppdev->fl |= DRIVER_USE_OFFSCREEN;
                    191:     }
                    192: 
                    193:     LocalFree(pVideoBuffer);
                    194:     return TRUE;
                    195: }
                    196: 
                    197: /******************************Public*Routine******************************\
                    198: * PBYTE pjInitVGA(PPDEV ppdev)
                    199: *
                    200: * Initializes the VGA display to the mode specified in the ppdev
                    201: * If
                    202: *
                    203: \**************************************************************************/
                    204: 
                    205: BOOL bInitVGA(PPDEV ppdev, BOOL bFirst)
                    206: {
                    207:     VIDEO_MEMORY VideoMemory;
                    208:     VIDEO_MEMORY_INFORMATION VideoMemoryInfo;
                    209:     UINT ReturnedDataLength;
                    210: 
                    211:     //
                    212:     // Set the desired mode. (Must come before IOCTL_VIDEO_MAP_VIDEO_MEMORY;
                    213:     // that IOCTL returns information for the current mode, so there must be a
                    214:     // current mode for which to return information.)
                    215:     //
                    216: 
                    217:     if (!DeviceIoControl(ppdev->hDriver,
                    218:                          IOCTL_VIDEO_SET_CURRENT_MODE,
                    219:                          &ppdev->ulModeNum,  // input buffer
                    220:                          sizeof(VIDEO_MODE),
                    221:                          NULL,
                    222:                          0,
                    223:                          &ReturnedDataLength,
                    224:                          NULL)) {
                    225: 
                    226:         return(FALSE);
                    227: 
                    228:     }
                    229: 
                    230:     //
                    231:     // Set up the internal palette.
                    232:     //
                    233: 
                    234:     if (!DeviceIoControl(ppdev->hDriver,
                    235:                          IOCTL_VIDEO_SET_PALETTE_REGISTERS,
                    236:                          (PVOID) PaletteBuffer, // input buffer
                    237:                          sizeof (PaletteBuffer),
                    238:                          NULL,    // output buffer
                    239:                          0,
                    240:                          &ReturnedDataLength,
                    241:                          NULL)) {
                    242: 
                    243:         return(FALSE);
                    244: 
                    245:     }
                    246: 
                    247:     //
                    248:     // Set up the DAC.
                    249:     //
                    250: 
                    251:     if (!DeviceIoControl(ppdev->hDriver,
                    252:                          IOCTL_VIDEO_SET_COLOR_REGISTERS,
                    253:                          (PVOID) ColorBuffer, // input buffer
                    254:                          sizeof (ColorBuffer),
                    255:                          NULL,    // output buffer
                    256:                          0,
                    257:                          &ReturnedDataLength,
                    258:                          NULL)) {
                    259: 
                    260:         return(FALSE);
                    261: 
                    262:     }
                    263: 
                    264: 
                    265: 
                    266:     if (bFirst) {
                    267: 
                    268:         //
                    269:         // Map video memory into virtual memory.
                    270:         //
                    271: 
                    272:         VideoMemory.RequestedVirtualAddress = NULL;
                    273: 
                    274:         if (!DeviceIoControl(ppdev->hDriver,
                    275:                              IOCTL_VIDEO_MAP_VIDEO_MEMORY,
                    276:                              (PVOID) &VideoMemory, // input buffer
                    277:                              sizeof (VIDEO_MEMORY),
                    278:                              (PVOID) &VideoMemoryInfo, // output buffer
                    279:                              sizeof (VideoMemoryInfo),
                    280:                              &ReturnedDataLength,
                    281:                              NULL)) {
                    282: 
                    283:             DISPDBG((0, "Win32 Status = %x\n", GetLastError() ));
                    284:             RIP("VGA.DLL: Initialization error-Map buffer address");
                    285:             return (FALSE);
                    286: 
                    287:         }
                    288: 
                    289:         ppdev->pjScreen = VideoMemoryInfo.FrameBufferBase;
                    290: 
                    291:     }
                    292: 
                    293:     //
                    294:     // Initialize the VGA/EGA sequencer and graphics controller to their
                    295:     // default states, so that we can be sure of drawing properly even if the
                    296:     // miniport didn't happen to set these registers the way we like them.
                    297:     //
                    298: 
                    299:     vInitRegs();
                    300: 
                    301: 
                    302:     return(TRUE);
                    303: }
                    304: 
                    305: 
                    306: /******************************Public*Routine******************************\
                    307: * getAvailableModes
                    308: *
                    309: * Calls the miniport to get the list of modes supported by the kernel driver,
                    310: * and returns the list of modes supported by the diplay driver among those
                    311: *
                    312: * returns the number of entries in the videomode buffer.
                    313: * 0 means no modes are supported by the miniport or that an error occured.
                    314: *
                    315: * NOTE: the buffer must be freed up by the caller.
                    316: *
                    317: \**************************************************************************/
                    318: 
                    319: DWORD getAvailableModes(
                    320: HANDLE hDriver,
                    321: PVIDEO_MODE_INFORMATION *modeInformation,
                    322: DWORD *cbModeSize)
                    323: {
                    324:     ULONG ulTemp;
                    325:     VIDEO_NUM_MODES modes;
                    326:     PVIDEO_MODE_INFORMATION pVideoTemp;
                    327: 
                    328:     //
                    329:     // Get the number of modes supported by the mini-port
                    330:     //
                    331: 
                    332:     if (!DeviceIoControl(hDriver,
                    333:             IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES,
                    334:             NULL,
                    335:             0,
                    336:             &modes,
                    337:             sizeof(VIDEO_NUM_MODES),
                    338:             &ulTemp,
                    339:             NULL))
                    340:     {
                    341:         DISPDBG((0, "vga.dll getAvailableModes failed VIDEO_QUERY_NUM_AVAIL_MODES\n"));
                    342:         DISPDBG((0, "Win32 Status = %x\n", GetLastError() ));
                    343:         return(0);
                    344:     }
                    345: 
                    346:     *cbModeSize = modes.ModeInformationLength;
                    347: 
                    348:     //
                    349:     // Allocate the buffer for the mini-port to write the modes in.
                    350:     //
                    351: 
                    352:     *modeInformation = (PVIDEO_MODE_INFORMATION)
                    353:                         LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT,
                    354:                                    modes.NumModes *
                    355:                                    modes.ModeInformationLength);
                    356: 
                    357:     if (*modeInformation == (PVIDEO_MODE_INFORMATION) NULL)
                    358:     {
                    359:         DISPDBG((0, "vga.dll getAvailableModes failed LocalAlloc\n"));
                    360: 
                    361:         return 0;
                    362:     }
                    363: 
                    364:     //
                    365:     // Ask the mini-port to fill in the available modes.
                    366:     //
                    367: 
                    368:     if (!DeviceIoControl(hDriver,
                    369:             IOCTL_VIDEO_QUERY_AVAIL_MODES,
                    370:             NULL,
                    371:             0,
                    372:             *modeInformation,
                    373:             modes.NumModes * modes.ModeInformationLength,
                    374:             &ulTemp,
                    375:             NULL))
                    376:     {
                    377: 
                    378:         DISPDBG((0, "vga.dll getAvailableModes failed VIDEO_QUERY_AVAIL_MODES\n"));
                    379:         DISPDBG((0, "Win32 Status = %x\n", GetLastError() ));
                    380: 
                    381:         LocalFree(*modeInformation);
                    382:         *modeInformation = (PVIDEO_MODE_INFORMATION) NULL;
                    383: 
                    384:         return(0);
                    385:     }
                    386: 
                    387:     //
                    388:     // Now see which of these modes are supported by the display driver.
                    389:     // As an internal mechanism, set the length to 0 for the modes we
                    390:     // DO NOT support.
                    391:     //
                    392: 
                    393:     ulTemp = modes.NumModes;
                    394:     pVideoTemp = *modeInformation;
                    395: 
                    396:     //
                    397:     // Mode is rejected if it is not 4 planes, or not graphics, or is not
                    398:     // one of 1 bits per pel.
                    399:     //
                    400: 
                    401:     while (ulTemp--)
                    402:     {
                    403:         if ((pVideoTemp->NumberOfPlanes != 4 ) ||
                    404:             !(pVideoTemp->AttributeFlags & VIDEO_MODE_GRAPHICS) ||
                    405:             (pVideoTemp->BitsPerPlane != 1))
                    406:         {
                    407:             pVideoTemp->Length = 0;
                    408:         }
                    409: 
                    410:         pVideoTemp = (PVIDEO_MODE_INFORMATION)
                    411:             (((PUCHAR)pVideoTemp) + modes.ModeInformationLength);
                    412:     }
                    413: 
                    414:     return modes.NumModes;
                    415: 
                    416: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.