x86: video: Add support for CONFIG_CONSOLE_SCROLL_LINES

Some machines are very slow to scroll their displays. To cope with this,
support the CONFIG_CONSOLE_SCROLL_LINES option. Setting this to 5 allows
the display to operate at an acceptable speed by scrolling 5 lines at
a time.

This same option is available for LCDs so when these systems are unified
this code can be unified also.

Signed-off-by: Simon Glass <sjg@chromium.org>
Acked-by: Anatolij Gustschin <agust@denx.de>
This commit is contained in:
Simon Glass
2015-01-01 16:17:57 -07:00
parent 4a2708a097
commit 3c0b668f66

View File

@@ -299,7 +299,11 @@ void console_cursor(int state);
#define CONSOLE_ROW_SECOND (video_console_address + CONSOLE_ROW_SIZE) #define CONSOLE_ROW_SECOND (video_console_address + CONSOLE_ROW_SIZE)
#define CONSOLE_ROW_LAST (video_console_address + CONSOLE_SIZE - CONSOLE_ROW_SIZE) #define CONSOLE_ROW_LAST (video_console_address + CONSOLE_SIZE - CONSOLE_ROW_SIZE)
#define CONSOLE_SIZE (CONSOLE_ROW_SIZE * CONSOLE_ROWS) #define CONSOLE_SIZE (CONSOLE_ROW_SIZE * CONSOLE_ROWS)
#define CONSOLE_SCROLL_SIZE (CONSOLE_SIZE - CONSOLE_ROW_SIZE)
/* By default we scroll by a single line */
#ifndef CONFIG_CONSOLE_SCROLL_LINES
#define CONFIG_CONSOLE_SCROLL_LINES 1
#endif
/* Macros */ /* Macros */
#ifdef VIDEO_FB_LITTLE_ENDIAN #ifdef VIDEO_FB_LITTLE_ENDIAN
@@ -740,26 +744,33 @@ static void console_clear_line(int line, int begin, int end)
static void console_scrollup(void) static void console_scrollup(void)
{ {
const int rows = CONFIG_CONSOLE_SCROLL_LINES;
int i;
/* copy up rows ignoring the first one */ /* copy up rows ignoring the first one */
#ifdef VIDEO_HW_BITBLT #ifdef VIDEO_HW_BITBLT
video_hw_bitblt(VIDEO_PIXEL_SIZE, /* bytes per pixel */ video_hw_bitblt(VIDEO_PIXEL_SIZE, /* bytes per pixel */
0, /* source pos x */ 0, /* source pos x */
video_logo_height + video_logo_height +
VIDEO_FONT_HEIGHT, /* source pos y */ VIDEO_FONT_HEIGHT * rows, /* source pos y */
0, /* dest pos x */ 0, /* dest pos x */
video_logo_height, /* dest pos y */ video_logo_height, /* dest pos y */
VIDEO_VISIBLE_COLS, /* frame width */ VIDEO_VISIBLE_COLS, /* frame width */
VIDEO_VISIBLE_ROWS VIDEO_VISIBLE_ROWS
- video_logo_height - video_logo_height
- VIDEO_FONT_HEIGHT /* frame height */ - VIDEO_FONT_HEIGHT * rows /* frame height */
); );
#else #else
memcpyl(CONSOLE_ROW_FIRST, CONSOLE_ROW_SECOND, memcpyl(CONSOLE_ROW_FIRST, CONSOLE_ROW_FIRST + rows * CONSOLE_ROW_SIZE,
CONSOLE_SCROLL_SIZE >> 2); (CONSOLE_SIZE - CONSOLE_ROW_SIZE * rows) >> 2);
#endif #endif
/* clear the last one */ /* clear the last one */
console_clear_line(CONSOLE_ROWS - 1, 0, CONSOLE_COLS - 1); for (i = 1; i <= rows; i++)
console_clear_line(CONSOLE_ROWS - i, 0, CONSOLE_COLS - 1);
/* Decrement row number */
console_row -= rows;
} }
static void console_back(void) static void console_back(void)
@@ -871,9 +882,6 @@ static void console_newline(int n)
if (console_row >= CONSOLE_ROWS) { if (console_row >= CONSOLE_ROWS) {
/* Scroll everything up */ /* Scroll everything up */
console_scrollup(); console_scrollup();
/* Decrement row number */
console_row = CONSOLE_ROWS - 1;
} }
} }