boot_loader: Add a video_text_console for potential use by bootloaders.
This uses the frame buffer console that KDL uses. It needs some work, though, as the frame_buffer_console colors system is not quite compatible.
This commit is contained in:
parent
c80ba94c64
commit
0d66d8d486
@ -34,6 +34,9 @@ void uncompress_8bit_RLE(const uint8 compressed[], uint8 *uncompressed);
|
|||||||
/* default splash display */
|
/* default splash display */
|
||||||
status_t video_display_splash(addr_t frameBuffer);
|
status_t video_display_splash(addr_t frameBuffer);
|
||||||
|
|
||||||
|
/* video text console */
|
||||||
|
status_t video_text_console_init(addr_t frameBuffer);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
160
src/system/boot/platform/generic/video_text_console.cpp
Normal file
160
src/system/boot/platform/generic/video_text_console.cpp
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021, Haiku, Inc. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <boot/stage2.h>
|
||||||
|
#include <boot/platform/generic/text_console.h>
|
||||||
|
#include <boot/platform/generic/video.h>
|
||||||
|
|
||||||
|
#include <frame_buffer_console.h>
|
||||||
|
|
||||||
|
|
||||||
|
extern console_module_info gFrameBufferConsoleModule;
|
||||||
|
|
||||||
|
|
||||||
|
class Console : public ConsoleNode {
|
||||||
|
public:
|
||||||
|
Console();
|
||||||
|
|
||||||
|
virtual ssize_t ReadAt(void *cookie, off_t pos, void *buffer,
|
||||||
|
size_t bufferSize);
|
||||||
|
virtual ssize_t WriteAt(void *cookie, off_t pos, const void *buffer,
|
||||||
|
size_t bufferSize);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static uint16 sColor = 0x0f00;
|
||||||
|
static bool sShowCursor;
|
||||||
|
static int32 sCursorX, sCursorY;
|
||||||
|
static int32 sScreenWidth, sScreenHeight;
|
||||||
|
|
||||||
|
static Console sInput, sOutput;
|
||||||
|
FILE *stdin, *stdout, *stderr;
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
|
Console::Console()
|
||||||
|
: ConsoleNode()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
Console::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
|
||||||
|
{
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
Console::WriteAt(void *cookie, off_t /*pos*/, const void *buffer,
|
||||||
|
size_t bufferSize)
|
||||||
|
{
|
||||||
|
const char *string = (const char *)buffer;
|
||||||
|
for (size_t i = 0; i < bufferSize; i++) {
|
||||||
|
const char c = string[i];
|
||||||
|
if (c == '\n' || sCursorX >= sScreenWidth) {
|
||||||
|
sCursorX = 0;
|
||||||
|
if (sCursorY == (sScreenHeight - 1)) {
|
||||||
|
// Move the screen up and clear the bottom line.
|
||||||
|
gFrameBufferConsoleModule.blit(0, 1, sScreenWidth, 0,
|
||||||
|
0, sScreenHeight - 1);
|
||||||
|
gFrameBufferConsoleModule.fill_glyph(0, sCursorY, sScreenWidth,
|
||||||
|
1, ' ', sColor);
|
||||||
|
} else {
|
||||||
|
sCursorY++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case '\n':
|
||||||
|
// already handled above
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
gFrameBufferConsoleModule.put_glyph(sCursorX, sCursorY, c, sColor);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sCursorX++;
|
||||||
|
}
|
||||||
|
return bufferSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
console_clear_screen(void)
|
||||||
|
{
|
||||||
|
gFrameBufferConsoleModule.clear(sColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32
|
||||||
|
console_width(void)
|
||||||
|
{
|
||||||
|
return sScreenWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32
|
||||||
|
console_height()
|
||||||
|
{
|
||||||
|
return sScreenHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
console_set_cursor(int32 x, int32 y)
|
||||||
|
{
|
||||||
|
sCursorX = x;
|
||||||
|
sCursorY = y;
|
||||||
|
if (sShowCursor)
|
||||||
|
console_show_cursor();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
console_show_cursor()
|
||||||
|
{
|
||||||
|
sShowCursor = true;
|
||||||
|
gFrameBufferConsoleModule.move_cursor(sCursorX, sCursorY);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
console_hide_cursor()
|
||||||
|
{
|
||||||
|
sShowCursor = false;
|
||||||
|
gFrameBufferConsoleModule.move_cursor(-1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
console_set_color(int32 foreground, int32 background)
|
||||||
|
{
|
||||||
|
sColor = (background & 0xf) << 4 | (foreground & 0xf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
video_text_console_init(addr_t frameBuffer)
|
||||||
|
{
|
||||||
|
frame_buffer_update(frameBuffer, gKernelArgs.frame_buffer.width,
|
||||||
|
gKernelArgs.frame_buffer.height, gKernelArgs.frame_buffer.depth,
|
||||||
|
gKernelArgs.frame_buffer.bytes_per_row);
|
||||||
|
gFrameBufferConsoleModule.get_size(&sScreenWidth, &sScreenHeight);
|
||||||
|
|
||||||
|
console_hide_cursor();
|
||||||
|
console_clear_screen();
|
||||||
|
|
||||||
|
// enable stdio functionality
|
||||||
|
stdin = (FILE *)&sInput;
|
||||||
|
stdout = stderr = (FILE *)&sOutput;
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
@ -568,7 +568,6 @@ parse_character(char c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifndef _BOOT_MODE
|
|
||||||
static int
|
static int
|
||||||
set_paging(int argc, char **argv)
|
set_paging(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -589,7 +588,6 @@ set_paging(int argc, char **argv)
|
|||||||
kprintf("paging is turned %s now.\n", sScreen.paging ? "on" : "off");
|
kprintf("paging is turned %s now.\n", sScreen.paging ? "on" : "off");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif // !_BOOT_MODE
|
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
@ -606,15 +604,11 @@ blue_screen_init(void)
|
|||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
sModule = &gFrameBufferConsoleModule;
|
sModule = &gFrameBufferConsoleModule;
|
||||||
#ifdef _BOOT_MODE
|
|
||||||
sScreen.paging = false;
|
|
||||||
#else
|
|
||||||
sScreen.paging = !get_safemode_boolean(
|
sScreen.paging = !get_safemode_boolean(
|
||||||
"disable_onscreen_paging", false);
|
"disable_onscreen_paging", false);
|
||||||
sScreen.paging_timeout = false;
|
sScreen.paging_timeout = false;
|
||||||
|
|
||||||
add_debugger_command("paging", set_paging, "Enable or disable paging");
|
add_debugger_command("paging", set_paging, "Enable or disable paging");
|
||||||
#endif
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -665,7 +659,6 @@ blue_screen_clear_screen(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifndef _BOOT_MODE
|
|
||||||
int
|
int
|
||||||
blue_screen_try_getchar(void)
|
blue_screen_try_getchar(void)
|
||||||
{
|
{
|
||||||
@ -678,7 +671,6 @@ blue_screen_getchar(void)
|
|||||||
{
|
{
|
||||||
return arch_debug_blue_screen_getchar();
|
return arch_debug_blue_screen_getchar();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -24,6 +24,13 @@
|
|||||||
#include <vesa_info.h>
|
#include <vesa_info.h>
|
||||||
|
|
||||||
#include <edid.h>
|
#include <edid.h>
|
||||||
|
#else
|
||||||
|
#define mutex_lock(...)
|
||||||
|
#define mutex_unlock(...)
|
||||||
|
#undef set_ac
|
||||||
|
#undef clear_ac
|
||||||
|
#define set_ac()
|
||||||
|
#define clear_ac()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user