3 * modified from linuxbios code
4 * by Cai Qiang <rimy2000@hotmail.com>
11 #include <ipxe/console.h>
12 #include <ipxe/init.h>
14 #include <config/console.h>
16 /* Set default console usage if applicable */
17 #if ! ( defined ( CONSOLE_DIRECT_VGA ) && \
18 CONSOLE_EXPLICIT ( CONSOLE_DIRECT_VGA ) )
19 #undef CONSOLE_DIRECT_VGA
20 #define CONSOLE_DIRECT_VGA ( CONSOLE_USAGE_ALL & ~CONSOLE_USAGE_LOG )
23 struct console_driver vga_console __console_driver;
25 static char *vidmem; /* The video buffer */
26 static int video_line, video_col;
28 #define VIDBUFFER 0xB8000
30 static void memsetw(void *s, int c, unsigned int n)
35 for (i = 0; i < n; i++) {
40 static void video_init(void)
44 vidmem = (char *)phys_to_virt(VIDBUFFER);
50 memsetw(vidmem, VGA_ATTR_CLR_WHT, 2*1024); //
56 static void video_scroll(void)
60 memcpy(vidmem, vidmem + COLS * 2, (LINES - 1) * COLS * 2);
61 for (i = (LINES - 1) * COLS * 2; i < LINES * COLS * 2; i += 2)
65 static void vga_putc(int byte)
71 } else if (byte == '\r') {
74 } else if (byte == '\b') {
77 } else if (byte == '\t') {
80 } else if (byte == '\a') {
85 vidmem[((video_col + (video_line *COLS)) * 2)] = byte;
86 vidmem[((video_col + (video_line *COLS)) * 2) +1] = VGA_ATTR_CLR_WHT;
92 if (video_col >= COLS) {
96 if (video_line >= LINES) {
101 write_crtc((video_col + (video_line *COLS)) >> 8, CRTC_CURSOR_HI);
102 write_crtc((video_col + (video_line *COLS)) & 0x0ff, CRTC_CURSOR_LO);
105 struct console_driver vga_console __console_driver = {
107 .disabled = CONSOLE_DISABLED,
108 .usage = CONSOLE_DIRECT_VGA,
111 struct init_fn video_init_fn __init_fn ( INIT_EARLY ) = {
112 .initialise = video_init,