b2a75cf56c
device is not compatible, after all. * No longer accept color changes if the mode is not an 8 bit one. I think that BWindowScreen does that after changing the mode, so that is messes up the colors, at least that's the theory, will test on real iron now. * Use VGA as a fallback if setting the palette via VBE failed. This brings back the colors for ParticlesII in Qemu (but not in VirtualBox, which seems to be completely broken in this regard). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@32359 a95241bf-73f2-0310-859d-f6bbb57e9c96
178 lines
3.9 KiB
C
178 lines
3.9 KiB
C
/*
|
|
* Copyright 2004-2009, Axel Dörfler, axeld@pinc-software.de.
|
|
* Distributed under the terms of the MIT License.
|
|
*/
|
|
#ifndef VESA_H
|
|
#define VESA_H
|
|
|
|
|
|
#include <SupportDefs.h>
|
|
|
|
|
|
/* VBE info block structure */
|
|
|
|
#define VESA_SIGNATURE 'ASEV'
|
|
#define VBE2_SIGNATURE '2EBV'
|
|
|
|
struct vbe_info_block {
|
|
// VBE 1.x fields
|
|
uint32 signature;
|
|
struct {
|
|
uint8 minor;
|
|
uint8 major;
|
|
} version;
|
|
uint32 oem_string;
|
|
uint32 capabilities;
|
|
uint32 mode_list;
|
|
uint16 total_memory; // in 64k blocks
|
|
// VBE 2.0+ fields only
|
|
// Note, the block is 256 bytes in size for VBE 1.x as well,
|
|
// but doesn't define these fields. VBE 3 doesn't define
|
|
// any additional fields.
|
|
uint16 oem_software_revision;
|
|
uint32 oem_vendor_name_string;
|
|
uint32 oem_product_name_string;
|
|
uint32 oem_product_revision_string;
|
|
uint8 reserved[222];
|
|
uint8 oem_data[256];
|
|
} _PACKED;
|
|
|
|
// capabilities
|
|
#define CAPABILITY_DAC_WIDTH 0x01
|
|
#define CAPABILITY_NOT_VGA_COMPATIBLE 0x02
|
|
|
|
|
|
/* VBE mode info structure */
|
|
|
|
struct vbe_mode_info {
|
|
uint16 attributes;
|
|
uint8 window_a_attributes;
|
|
uint8 window_b_attributes;
|
|
uint16 window_granularity;
|
|
uint16 window_size;
|
|
uint16 window_a_segment;
|
|
uint16 window_b_segment;
|
|
uint32 window_function; // real mode pointer
|
|
uint16 bytes_per_row;
|
|
|
|
// VBE 1.2 and above
|
|
uint16 width;
|
|
uint16 height;
|
|
uint8 char_width;
|
|
uint8 char_height;
|
|
uint8 num_planes;
|
|
uint8 bits_per_pixel;
|
|
uint8 num_banks;
|
|
uint8 memory_model;
|
|
uint8 bank_size;
|
|
uint8 num_image_pages;
|
|
uint8 _reserved0;
|
|
|
|
// direct color fields
|
|
uint8 red_mask_size;
|
|
uint8 red_field_position;
|
|
uint8 green_mask_size;
|
|
uint8 green_field_position;
|
|
uint8 blue_mask_size;
|
|
uint8 blue_field_position;
|
|
uint8 reserved_mask_size;
|
|
uint8 reserved_field_position;
|
|
uint8 direct_color_mode_info;
|
|
|
|
// VBE 2.0 and above
|
|
uint32 physical_base;
|
|
uint32 _reserved1;
|
|
uint16 _reserved2;
|
|
|
|
// VBE 3.0 and above
|
|
uint16 linear_bytes_per_row;
|
|
uint8 banked_num_image_pages;
|
|
uint8 linear_num_image_pages;
|
|
|
|
uint8 linear_red_mask_size;
|
|
uint8 linear_red_field_position;
|
|
uint8 linear_green_mask_size;
|
|
uint8 linear_green_field_position;
|
|
uint8 linear_blue_mask_size;
|
|
uint8 linear_blue_field_position;
|
|
uint8 linear_reserved_mask_size;
|
|
uint8 linear_reserved_field_position;
|
|
|
|
uint32 max_pixel_clock; // in Hz
|
|
|
|
uint8 _reserved[189];
|
|
} _PACKED;
|
|
|
|
// definitions of mode info attributes
|
|
#define MODE_ATTR_AVAILABLE 1
|
|
#define MODE_ATTR_COLOR_MODE 8
|
|
#define MODE_ATTR_GRAPHICS_MODE 16
|
|
#define MODE_ATTR_LINEAR_BUFFER 128
|
|
|
|
// memory models
|
|
#define MODE_MEMORY_TEXT 0
|
|
#define MODE_MEMORY_PLANAR 3
|
|
#define MODE_MEMORY_PACKED_PIXEL 4
|
|
#define MODE_MEMORY_DIRECT_COLOR 6
|
|
#define MODE_MEMORY_YUV 7
|
|
|
|
// set mode flags
|
|
#define SET_MODE_MASK 0x01ff
|
|
#define SET_MODE_SPECIFY_CRTC (1 << 11)
|
|
#define SET_MODE_LINEAR_BUFFER (1 << 14)
|
|
#define SET_MODE_DONT_CLEAR_MEMORY (1 << 15)
|
|
|
|
|
|
/* CRTC info block structure */
|
|
|
|
struct crtc_info_block {
|
|
uint16 horizontal_total;
|
|
uint16 horizontal_sync_start;
|
|
uint16 horizontal_sync_end;
|
|
uint16 vertical_total;
|
|
uint16 vertical_sync_start;
|
|
uint16 vertical_sync_end;
|
|
uint8 flags;
|
|
uint32 pixel_clock; // in Hz
|
|
uint16 refresh_rate; // in 0.01 Hz
|
|
|
|
uint8 _reserved[40];
|
|
} _PACKED;
|
|
|
|
#define CRTC_DOUBLE_SCAN 0x01
|
|
#define CRTC_INTERLACED 0x02
|
|
#define CRTC_NEGATIVE_HSYNC 0x04
|
|
#define CRTC_NEGATIVE_VSYNC 0x08
|
|
|
|
|
|
/* Power Management */
|
|
|
|
#define DPMS_ON 0x00
|
|
#define DPMS_STANDBY 0x01
|
|
#define DPMS_SUSPEND 0x02
|
|
#define DPMS_OFF 0x04
|
|
#define DPMS_REDUCED_ON 0x08
|
|
|
|
|
|
/* VBE 3.0 protected mode interface
|
|
* The BIOS area can be scanned for the protected mode
|
|
* signature that identifies the structure below.
|
|
*/
|
|
|
|
#define VBE_PM_SIGNATURE 'DIMP'
|
|
|
|
struct vbe_protected_mode_info {
|
|
uint32 signature;
|
|
int16 entry_offset;
|
|
int16 init_offset;
|
|
uint16 data_selector;
|
|
uint16 a000_selector;
|
|
uint16 b000_selector;
|
|
uint16 b800_selector;
|
|
uint16 c000_selector;
|
|
uint8 in_protected_mode;
|
|
uint8 checksum;
|
|
} _PACKED;
|
|
|
|
#endif /* VESA_H */
|