273 lines
5.2 KiB
C
273 lines
5.2 KiB
C
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
vesa.h
|
|
|
|
Abstract:
|
|
|
|
This module implements VESA support.
|
|
|
|
Author:
|
|
|
|
Erick Smith (ericks) Sep. 2000
|
|
|
|
Environment:
|
|
|
|
kernel mode only
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#define VBE_GET_CONTROLLER_INFO 0x4F00
|
|
#define VBE_GET_MODE_INFO 0x4F01
|
|
#define VBE_SET_MODE 0x4F02
|
|
#define VBE_GET_MODE 0x4F03
|
|
#define VBE_SAVE_RESTORE_STATE 0x4F04
|
|
#define VBE_WINDOW_CONTROL 0x4F05
|
|
#define VBE_SCANLINE 0x4F06
|
|
#define VBE_DISPLAY_START 0x4F07
|
|
#define VBE_PALLET_FORMAT 0x4F08
|
|
#define VBE_PALLET_DATA 0x4F09
|
|
#define VBE_PROTECTED_MODE 0x4F0A
|
|
#define VBE_PIXEL_CLOCK 0x4F0B
|
|
|
|
#define VESA_STATUS_SUCCESS 0x004F
|
|
|
|
//
|
|
// VESA SuperVGA structures
|
|
//
|
|
|
|
#pragma pack(1)
|
|
typedef struct _VGA_INFO_BLOCK
|
|
{
|
|
ULONG VesaSignature;
|
|
USHORT VbeVersion;
|
|
ULONG OemStringPtr;
|
|
ULONG Capabilities;
|
|
ULONG VideoModePtr;
|
|
USHORT TotalMemory;
|
|
|
|
//
|
|
// VBE 2.0
|
|
//
|
|
|
|
USHORT OemSoftwareRev;
|
|
ULONG OemVendorNamePtr;
|
|
ULONG OemProductNamePtr;
|
|
ULONG OemProductRevPtr;
|
|
UCHAR Reserved[222];
|
|
|
|
UCHAR OemData[256];
|
|
|
|
} VGA_INFO_BLOCK, *PVGA_INFO_BLOCK;
|
|
|
|
typedef struct _MODE_INFO_BLOCK
|
|
{
|
|
USHORT ModeAttributes;
|
|
UCHAR WinAAttributes;
|
|
UCHAR WinBAttributes;
|
|
USHORT WinGranularity;
|
|
USHORT WinSize;
|
|
USHORT WinASegment;
|
|
USHORT WinBSegment;
|
|
ULONG WinFuncPtr;
|
|
USHORT BytesPerScanLine;
|
|
|
|
USHORT XResolution;
|
|
USHORT YResolution;
|
|
UCHAR XCharSize;
|
|
UCHAR YCharSize;
|
|
UCHAR NumberOfPlanes;
|
|
UCHAR BitsPerPixel;
|
|
UCHAR NumberOfBanks;
|
|
UCHAR MemoryModel;
|
|
UCHAR BankSize;
|
|
UCHAR NumberOfImagePages;
|
|
UCHAR Reserved1;
|
|
|
|
UCHAR RedMaskSize;
|
|
UCHAR RedFieldPosition;
|
|
UCHAR GreenMaskSize;
|
|
UCHAR GreenFieldPosition;
|
|
UCHAR BlueMaskSize;
|
|
UCHAR BlueFieldPosition;
|
|
UCHAR RsvdMaskSize;
|
|
UCHAR RsvdFieldPosition;
|
|
UCHAR DirectColorModeInfo;
|
|
|
|
//
|
|
// VBE 2.0
|
|
//
|
|
|
|
ULONG PhysBasePtr;
|
|
ULONG Reserved2;
|
|
USHORT Reserved3;
|
|
|
|
//
|
|
// VBE 3.0
|
|
//
|
|
|
|
USHORT LinBytesPerScanLine;
|
|
UCHAR BnkNumberOfImagePages;
|
|
UCHAR LinNumberOfImagePages;
|
|
UCHAR LinRedMaskSize;
|
|
UCHAR LinRedFieldPosition;
|
|
UCHAR LinGreenMaskSize;
|
|
UCHAR LinGreenFieldPosition;
|
|
UCHAR LinBlueMaskSize;
|
|
UCHAR LinBlueFieldPosition;
|
|
UCHAR LinRsvdMaskSize;
|
|
UCHAR LinRsvdFieldPosition;
|
|
ULONG MaxPixelClock;
|
|
|
|
UCHAR Reserved4[190];
|
|
|
|
} MODE_INFO_BLOCK, *PMODE_INFO_BLOCK;
|
|
|
|
typedef struct _PALETTE_ENTRY
|
|
{
|
|
UCHAR Blue;
|
|
UCHAR Green;
|
|
UCHAR Red;
|
|
UCHAR Alignment;
|
|
} PALETTE_ENTRY, *PPALETTE_ENTRY;
|
|
|
|
#pragma pack()
|
|
|
|
typedef struct _VESA_INFO
|
|
{
|
|
USHORT ModeNumber;
|
|
ULONG FrameBufferSize;
|
|
MODE_INFO_BLOCK ModeInfoBlock;
|
|
ULONG HardwareStateSize;
|
|
UCHAR HardwareState[];
|
|
} VESA_INFO, *PVESA_INFO;
|
|
|
|
|
|
#define VDM_TRANSFER_SEGMENT 0x2000
|
|
#define VDM_TRANSFER_OFFSET 0x0000
|
|
|
|
#define VBE_CAP_DAC_WIDTH_8BPP 0x01
|
|
#define VBE_CAP_NOT_VGA 0x02
|
|
#define VBE_CAP_VSYNC_ON_PALETTE_UPDATE 0x04
|
|
#define VBE_CAP_STEREO_SIGNAL 0x08
|
|
#define VBE_CAP_STEREO_EVC_CONNECTOR 0x10
|
|
|
|
#define SEG(x) ((x) >> 16)
|
|
#define OFF(x) ((x) & 0xffff)
|
|
|
|
#define TRANSFER_ADDRESS ((VDM_TRANSFER_SEGMENT << 4) + VDM_TRANSFER_OFFSET)
|
|
#define INFOBLOCK_OFFSET(x) ((SEG((x)) << 4) + OFF((x)) - TRANSFER_ADDRESS)
|
|
|
|
#define IS_LINEAR_MODE(x) ((x)->bitsPerPlane >= 8)
|
|
|
|
VOID
|
|
InitializeModeTable(
|
|
PVOID HwDeviceExtension
|
|
);
|
|
|
|
BOOLEAN
|
|
ValidateVbeInfo(
|
|
PHW_DEVICE_EXTENSION hwDeviceExtension,
|
|
PVGA_INFO_BLOCK InfoBlock
|
|
);
|
|
|
|
VOID
|
|
UpdateRegistry(
|
|
PHW_DEVICE_EXTENSION hwDeviceExtension,
|
|
PWSTR ValueName,
|
|
PUCHAR Value
|
|
);
|
|
|
|
ULONG
|
|
GetVideoMemoryBaseAddress(
|
|
PHW_DEVICE_EXTENSION hwDeviceExtension,
|
|
PVIDEOMODE pRequestedMode
|
|
);
|
|
|
|
VP_STATUS
|
|
VBESetMode(
|
|
PHW_DEVICE_EXTENSION HwDeviceExtension,
|
|
USHORT VesaModeNumber
|
|
);
|
|
|
|
USHORT
|
|
VBEGetMode(
|
|
PHW_DEVICE_EXTENSION HwDeviceExtension
|
|
);
|
|
|
|
VP_STATUS
|
|
VBEGetModeInfo(
|
|
PHW_DEVICE_EXTENSION hwDeviceExtension,
|
|
USHORT ModeNumber,
|
|
PMODE_INFO_BLOCK ModeInfoBlock
|
|
);
|
|
|
|
ULONG
|
|
VBESaveState(
|
|
PHW_DEVICE_EXTENSION HwDeviceExtension,
|
|
PCHAR StateBuffer
|
|
);
|
|
|
|
VP_STATUS
|
|
VBERestoreState(
|
|
PHW_DEVICE_EXTENSION HwDeviceExtension,
|
|
PCHAR StateBuffer,
|
|
ULONG Size
|
|
);
|
|
|
|
VP_STATUS
|
|
VBESetDisplayWindow(
|
|
PHW_DEVICE_EXTENSION hwDeviceExtension,
|
|
UCHAR WindowSelect,
|
|
USHORT WindowNumber
|
|
);
|
|
|
|
USHORT
|
|
VBEGetDisplayWindow(
|
|
PHW_DEVICE_EXTENSION hwDeviceExtension,
|
|
UCHAR WindowSelect
|
|
);
|
|
|
|
USHORT
|
|
VBEGetScanLineLength(
|
|
PHW_DEVICE_EXTENSION HwDeviceExtension
|
|
);
|
|
|
|
VP_STATUS
|
|
VesaSaveHardwareState(
|
|
PHW_DEVICE_EXTENSION HwDeviceExtension,
|
|
PVIDEO_HARDWARE_STATE HardwareState,
|
|
ULONG HardwareStateSize,
|
|
USHORT ModeNumber
|
|
);
|
|
|
|
PCHAR
|
|
SaveFrameBuffer(
|
|
PHW_DEVICE_EXTENSION hwDeviceExtension,
|
|
PVESA_INFO pVesaInfo
|
|
);
|
|
|
|
BOOLEAN
|
|
IsSavedModeVesa(
|
|
PVIDEO_HARDWARE_STATE HardwareState
|
|
);
|
|
|
|
VP_STATUS
|
|
VesaRestoreHardwareState(
|
|
PHW_DEVICE_EXTENSION HwDeviceExtension,
|
|
PVIDEO_HARDWARE_STATE HardwareState,
|
|
ULONG HardwareStateSize
|
|
);
|
|
|
|
ULONG
|
|
RestoreFrameBuffer(
|
|
PHW_DEVICE_EXTENSION hwDeviceExtension,
|
|
PVESA_INFO pVesaInfo,
|
|
PCHAR FrameBufferData
|
|
);
|