mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-21 23:02:40 +00:00
Define framebuffer video independently of VBE video
This commit is contained in:
1 parent
b711494093
commit
4f12af3748
4 files changed
+180
-56
No files matched your search
+13
-3
@@ -30,9 +30,9 @@
|
|||||||
|
|
||||||
/* The flags for the Multiboot header. */
|
/* The flags for the Multiboot header. */
|
||||||
#ifdef __ELF__
|
#ifdef __ELF__
|
||||||
# define MULTIBOOT_HEADER_FLAGS 0x00000003
|
# define MULTIBOOT_HEADER_FLAGS 0x00000007
|
||||||
#else
|
#else
|
||||||
# define MULTIBOOT_HEADER_FLAGS 0x00010003
|
# define MULTIBOOT_HEADER_FLAGS 0x00010007
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.text
|
.text
|
||||||
@@ -64,7 +64,17 @@ multiboot_header:
|
|||||||
.long _end
|
.long _end
|
||||||
/* entry_addr */
|
/* entry_addr */
|
||||||
.long multiboot_entry
|
.long multiboot_entry
|
||||||
#endif /* ! __ELF__ */
|
#else /* ! __ELF__ */
|
||||||
|
.long 0
|
||||||
|
.long 0
|
||||||
|
.long 0
|
||||||
|
.long 0
|
||||||
|
.long 0
|
||||||
|
#endif /* __ELF__ */
|
||||||
|
.long 0
|
||||||
|
.long 1024
|
||||||
|
.long 768
|
||||||
|
.long 32
|
||||||
|
|
||||||
multiboot_entry:
|
multiboot_entry:
|
||||||
/* Initialize the stack pointer. */
|
/* Initialize the stack pointer. */
|
||||||
|
|||||||
@@ -150,6 +150,87 @@ cmain (unsigned long magic, unsigned long addr)
|
|||||||
mmap->len & 0xffffffff,
|
mmap->len & 0xffffffff,
|
||||||
(unsigned) mmap->type);
|
(unsigned) mmap->type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Draw diagonal blue line. */
|
||||||
|
if (CHECK_FLAG (mbi->flags, 12))
|
||||||
|
{
|
||||||
|
multiboot_uint32_t color;
|
||||||
|
unsigned i;
|
||||||
|
void *fb = (void *) (unsigned long) mbi->framebuffer_addr;
|
||||||
|
|
||||||
|
switch (mbi->framebuffer_type)
|
||||||
|
{
|
||||||
|
case MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED:
|
||||||
|
{
|
||||||
|
unsigned best_distance, distance;
|
||||||
|
struct multiboot_color *palette;
|
||||||
|
|
||||||
|
palette = (struct multiboot_color *) mbi->framebuffer_palette_addr;
|
||||||
|
|
||||||
|
color = 0;
|
||||||
|
best_distance = 4*256*256;
|
||||||
|
|
||||||
|
for (i = 0; i < mbi->framebuffer_palette_num_colors; i++)
|
||||||
|
{
|
||||||
|
distance = (0xff - palette[i].blue) * (0xff - palette[i].blue)
|
||||||
|
+ palette[i].red * palette[i].red
|
||||||
|
+ palette[i].green * palette[i].green;
|
||||||
|
if (distance < best_distance)
|
||||||
|
{
|
||||||
|
color = i;
|
||||||
|
best_distance = distance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MULTIBOOT_FRAMEBUFFER_TYPE_RGB:
|
||||||
|
color = ((1 << mbi->framebuffer_blue_mask_size) - 1)
|
||||||
|
<< mbi->framebuffer_blue_field_position;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
color = 0xffffffff;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (i = 0; i < mbi->framebuffer_width
|
||||||
|
&& i < mbi->framebuffer_height; i++)
|
||||||
|
{
|
||||||
|
switch (mbi->framebuffer_bpp)
|
||||||
|
{
|
||||||
|
case 8:
|
||||||
|
{
|
||||||
|
multiboot_uint8_t *pixel = fb + mbi->framebuffer_pitch * i + i;
|
||||||
|
*pixel = color;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 15:
|
||||||
|
case 16:
|
||||||
|
{
|
||||||
|
multiboot_uint16_t *pixel
|
||||||
|
= fb + mbi->framebuffer_pitch * i + 2 * i;
|
||||||
|
*pixel = color;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 24:
|
||||||
|
{
|
||||||
|
multiboot_uint32_t *pixel
|
||||||
|
= fb + mbi->framebuffer_pitch * i + 3 * i;
|
||||||
|
*pixel = (color & 0xffffff) | (*pixel & 0xff000000);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 32:
|
||||||
|
{
|
||||||
|
multiboot_uint32_t *pixel
|
||||||
|
= fb + mbi->framebuffer_pitch * i + 4 * i;
|
||||||
|
*pixel = color;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear the screen and initialize VIDEO, XPOS and YPOS. */
|
/* Clear the screen and initialize VIDEO, XPOS and YPOS. */
|
||||||
|
|||||||
+38
-2
@@ -32,7 +32,7 @@
|
|||||||
#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
|
#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
|
||||||
|
|
||||||
/* The bits in the required part of flags field we don't support. */
|
/* The bits in the required part of flags field we don't support. */
|
||||||
#define MULTIBOOT_UNSUPPORTED 0x0000fffc
|
#define MULTIBOOT_UNSUPPORTED 0x0000fff8
|
||||||
|
|
||||||
/* Alignment of multiboot modules. */
|
/* Alignment of multiboot modules. */
|
||||||
#define MULTIBOOT_MOD_ALIGN 0x00001000
|
#define MULTIBOOT_MOD_ALIGN 0x00001000
|
||||||
@@ -88,10 +88,12 @@
|
|||||||
#define MULTIBOOT_INFO_APM_TABLE 0x00000400
|
#define MULTIBOOT_INFO_APM_TABLE 0x00000400
|
||||||
|
|
||||||
/* Is there video information? */
|
/* Is there video information? */
|
||||||
#define MULTIBOOT_INFO_VIDEO_INFO 0x00000800
|
#define MULTIBOOT_INFO_VBE_INFO 0x00000800
|
||||||
|
#define MULTIBOOT_INFO_FRAMEBUFFER_INFO 0x00001000
|
||||||
|
|
||||||
#ifndef ASM_FILE
|
#ifndef ASM_FILE
|
||||||
|
|
||||||
|
typedef unsigned char multiboot_uint8_t;
|
||||||
typedef unsigned short multiboot_uint16_t;
|
typedef unsigned short multiboot_uint16_t;
|
||||||
typedef unsigned int multiboot_uint32_t;
|
typedef unsigned int multiboot_uint32_t;
|
||||||
typedef unsigned long long multiboot_uint64_t;
|
typedef unsigned long long multiboot_uint64_t;
|
||||||
@@ -190,9 +192,43 @@ struct multiboot_info
|
|||||||
multiboot_uint16_t vbe_interface_seg;
|
multiboot_uint16_t vbe_interface_seg;
|
||||||
multiboot_uint16_t vbe_interface_off;
|
multiboot_uint16_t vbe_interface_off;
|
||||||
multiboot_uint16_t vbe_interface_len;
|
multiboot_uint16_t vbe_interface_len;
|
||||||
|
|
||||||
|
multiboot_uint64_t framebuffer_addr;
|
||||||
|
multiboot_uint32_t framebuffer_pitch;
|
||||||
|
multiboot_uint32_t framebuffer_width;
|
||||||
|
multiboot_uint32_t framebuffer_height;
|
||||||
|
multiboot_uint8_t framebuffer_bpp;
|
||||||
|
multiboot_uint8_t framebuffer_type;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
multiboot_uint32_t framebuffer_palette_addr;
|
||||||
|
multiboot_uint16_t framebuffer_palette_num_colors;
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
multiboot_uint8_t framebuffer_red_field_position;
|
||||||
|
multiboot_uint8_t framebuffer_red_mask_size;
|
||||||
|
multiboot_uint8_t framebuffer_green_field_position;
|
||||||
|
multiboot_uint8_t framebuffer_green_mask_size;
|
||||||
|
multiboot_uint8_t framebuffer_blue_field_position;
|
||||||
|
multiboot_uint8_t framebuffer_blue_mask_size;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_color
|
||||||
|
{
|
||||||
|
multiboot_uint8_t red;
|
||||||
|
multiboot_uint8_t green;
|
||||||
|
multiboot_uint8_t blue;
|
||||||
};
|
};
|
||||||
typedef struct multiboot_info multiboot_info_t;
|
typedef struct multiboot_info multiboot_info_t;
|
||||||
|
|
||||||
|
#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0
|
||||||
|
#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1
|
||||||
|
|
||||||
struct multiboot_mmap_entry
|
struct multiboot_mmap_entry
|
||||||
{
|
{
|
||||||
multiboot_uint32_t size;
|
multiboot_uint32_t size;
|
||||||
|
|||||||
+48
-51
@@ -638,6 +638,15 @@ follows:
|
|||||||
84 | vbe_interface_off |
|
84 | vbe_interface_off |
|
||||||
86 | vbe_interface_len |
|
86 | vbe_interface_len |
|
||||||
+-------------------+
|
+-------------------+
|
||||||
|
88 | framebuffer_addr | (present if flags[12] is set)
|
||||||
|
96 | framebuffer_pitch |
|
||||||
|
100 | framebuffer_width |
|
||||||
|
104 | framebuffer_height|
|
||||||
|
108 | framebuffer_bpp |
|
||||||
|
109 | framebuffer_type |
|
||||||
|
110-115 | color_info |
|
||||||
|
+-------------------+
|
||||||
|
|
||||||
@end group
|
@end group
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@@ -914,63 +923,15 @@ bytes, and the others are 2 bytes. See
|
|||||||
@uref{http://www.microsoft.com/hwdev/busbios/amp_12.htm, Advanced Power
|
@uref{http://www.microsoft.com/hwdev/busbios/amp_12.htm, Advanced Power
|
||||||
Management (APM) BIOS Interface Specification}, for more information.
|
Management (APM) BIOS Interface Specification}, for more information.
|
||||||
|
|
||||||
If bit 11 in the @samp{flags} is set, the graphics table is available.
|
If bit 11 in the @samp{flags} is set, the @sc{vbe} table is available.
|
||||||
|
|
||||||
The fields @samp{vbe_control_info} and @samp{vbe_mode_info} contain
|
The fields @samp{vbe_control_info} and @samp{vbe_mode_info} contain
|
||||||
the physical addresses of @sc{vbe} control information returned by the
|
the physical addresses of @sc{vbe} control information returned by the
|
||||||
@sc{vbe} Function 00h and @sc{vbe} mode information returned by the
|
@sc{vbe} Function 00h and @sc{vbe} mode information returned by the
|
||||||
@sc{vbe} Function 01h, respectively. In case of non-@sc{vbe} video driver
|
@sc{vbe} Function 01h, respectively.
|
||||||
@samp{vbe_control_info} contains zero and @samp{vbe_mode_info} points to the
|
|
||||||
following 256-byte structure:
|
|
||||||
|
|
||||||
@example
|
|
||||||
@group
|
|
||||||
+----------------------+
|
|
||||||
0 | flags |
|
|
||||||
2 | zeros |
|
|
||||||
16 | pitch |
|
|
||||||
18 | width |
|
|
||||||
20 | height |
|
|
||||||
22 | zeros |
|
|
||||||
25 | bits per pixel |
|
|
||||||
26 | zeros |
|
|
||||||
27 | memory model |
|
|
||||||
28 | zeros |
|
|
||||||
31 | red mask size |
|
|
||||||
32 | red field position |
|
|
||||||
33 | green mask size |
|
|
||||||
34 | green field position |
|
|
||||||
35 | blue mask size |
|
|
||||||
36 | blue field position |
|
|
||||||
37 | alpha mask size |
|
|
||||||
38 | alpha field position |
|
|
||||||
39 | zero |
|
|
||||||
40 | framebuffer address |
|
|
||||||
44 | zero |
|
|
||||||
50 | pitch |
|
|
||||||
52 | zero |
|
|
||||||
54 | red mask size |
|
|
||||||
55 | red field position |
|
|
||||||
56 | green mask size |
|
|
||||||
57 | green field position |
|
|
||||||
58 | blue mask size |
|
|
||||||
59 | blue field position |
|
|
||||||
60 | alpha mask size |
|
|
||||||
61 | alpha field position |
|
|
||||||
62 | zeros |
|
|
||||||
+----------------------+
|
|
||||||
@end group
|
|
||||||
@end example
|
|
||||||
|
|
||||||
All fields have the same meaning as the corresponding VBE mode info
|
|
||||||
structure except fields marked as zeros which are zero-filled.
|
|
||||||
|
|
||||||
If video is a linear framebuffer boot loader has to ensure that
|
|
||||||
displayed region starts at offset @samp{0} of linear framebuffer.
|
|
||||||
|
|
||||||
The field @samp{vbe_mode} indicates current video mode in the format
|
The field @samp{vbe_mode} indicates current video mode in the format
|
||||||
specified in @sc{vbe} 3.0. In case of non-@sc{vbe} video driver
|
specified in @sc{vbe} 3.0.
|
||||||
@samp{vbe_mode} contains 0xffff.
|
|
||||||
|
|
||||||
The rest fields @samp{vbe_interface_seg}, @samp{vbe_interface_off}, and
|
The rest fields @samp{vbe_interface_seg}, @samp{vbe_interface_off}, and
|
||||||
@samp{vbe_interface_len} contain the table of a protected mode interface
|
@samp{vbe_interface_len} contain the table of a protected mode interface
|
||||||
@@ -984,6 +945,42 @@ The fields for the graphics table are designed for @sc{vbe}, but
|
|||||||
Multiboot boot loaders may simulate @sc{vbe} on non-@sc{vbe} modes, as
|
Multiboot boot loaders may simulate @sc{vbe} on non-@sc{vbe} modes, as
|
||||||
if they were @sc{vbe} modes.
|
if they were @sc{vbe} modes.
|
||||||
|
|
||||||
|
If bit 12 in the @samp{flags} is set, the @sc{Framebuffer} table is available.
|
||||||
|
|
||||||
|
The field @samp{framebuffer_addr} contains framebuffer physical address. This field is 64-bit wide but bootloader @dfn{should} set it under 4GiB if possible for compatibility with payloads which aren't aware of PAE or amd64. The field @samp{framebuffer_pitch} contains pitch in bytes. The fields @samp{framebuffer_width}, @samp{framebuffer_height} contain framebuffer dimensions in pixels. The field @samp{framebuffer_bpp} contains number of bits per pixel. If @samp{framebuffer_type} is set to 0 it means indexed color. In this case color_info is defined as following:
|
||||||
|
@example
|
||||||
|
@group
|
||||||
|
+----------------------------------+
|
||||||
|
110 | framebuffer_palette_addr |
|
||||||
|
114 | framebuffer_palette_num_colors |
|
||||||
|
+----------------------------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
@samp{framebuffer_palette_addr} contains address of array of @samp{framebuffer_palette_num_colors} following structures:
|
||||||
|
@example
|
||||||
|
@group
|
||||||
|
+-------------+
|
||||||
|
0 | red_value |
|
||||||
|
1 | green_value |
|
||||||
|
2 | blue_value |
|
||||||
|
+-------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
If @samp{framebuffer_type} is set to 1 it direct RGB color. Then color_type is defined as following:
|
||||||
|
|
||||||
|
@example
|
||||||
|
@group
|
||||||
|
+----------------------------------+
|
||||||
|
110 | framebuffer_red_field_position |
|
||||||
|
111 | framebuffer_red_mask_size |
|
||||||
|
112 | framebuffer_green_field_position |
|
||||||
|
113 | framebuffer_green_mask_size |
|
||||||
|
114 | framebuffer_blue_field_position |
|
||||||
|
115 | framebuffer_blue_mask_size |
|
||||||
|
+----------------------------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
All further values of @samp{framebuffer_type} are reserved for future expansion
|
||||||
|
|
||||||
@node Examples
|
@node Examples
|
||||||
@chapter Examples
|
@chapter Examples
|
||||||
|
|||||||
Reference in new issue
Block a user