Created
July 28, 2017 21:04
-
-
Save podhrmic/51f42dbe20f9f27c61c94325d742bcc3 to your computer and use it in GitHub Desktop.
camkes vga driver
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright 2017, Data61 | |
* Commonwealth Scientific and Industrial Research Organisation (CSIRO) | |
* ABN 41 687 119 230. | |
* | |
* This software may be distributed and modified according to the terms of | |
* the BSD 2-Clause license. Note that NO WARRANTY is provided. | |
* See "LICENSE_BSD2.txt" for details. | |
* | |
* @TAG(DATA61_BSD) | |
*/ | |
/* CAmkES provides a generated header that prototypes all the relevant | |
* generated symbols. | |
*/ | |
#include <camkes.h> | |
#include <stdbool.h> | |
#include <stdlib.h> | |
#include <string.h> | |
/* Hardware text mode color constants. */ | |
enum vga_color { | |
VGA_COLOR_BLACK = 0, | |
VGA_COLOR_BLUE = 1, | |
VGA_COLOR_GREEN = 2, | |
VGA_COLOR_CYAN = 3, | |
VGA_COLOR_RED = 4, | |
VGA_COLOR_MAGENTA = 5, | |
VGA_COLOR_BROWN = 6, | |
VGA_COLOR_LIGHT_GREY = 7, | |
VGA_COLOR_DARK_GREY = 8, | |
VGA_COLOR_LIGHT_BLUE = 9, | |
VGA_COLOR_LIGHT_GREEN = 10, | |
VGA_COLOR_LIGHT_CYAN = 11, | |
VGA_COLOR_LIGHT_RED = 12, | |
VGA_COLOR_LIGHT_MAGENTA = 13, | |
VGA_COLOR_LIGHT_BROWN = 14, | |
VGA_COLOR_WHITE = 15, | |
}; | |
static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg) { | |
return fg | bg << 4; | |
} | |
static inline uint16_t vga_entry(unsigned char uc, uint8_t color) { | |
return (uint16_t) uc | (uint16_t) color << 8; | |
} | |
size_t strlen(const char* str) { | |
size_t len = 0; | |
while (str[len]) | |
len++; | |
return len; | |
} | |
static const size_t VGA_WIDTH = 80; | |
static const size_t VGA_HEIGHT = 25; | |
size_t terminal_row; | |
size_t terminal_column; | |
uint8_t terminal_color; | |
uint16_t* terminal_buffer; | |
void terminal_initialize(void) { | |
terminal_row = 0; | |
terminal_column = 0; | |
terminal_color = vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK); | |
printf("Casting a buffer pointer\n"); | |
terminal_buffer = (uint16_t*) 0xB8000; | |
printf("Writing to buffer\n"); | |
for (size_t y = 0; y < VGA_HEIGHT; y++) { | |
for (size_t x = 0; x < VGA_WIDTH; x++) { | |
const size_t index = y * VGA_WIDTH + x; | |
terminal_buffer[index] = vga_entry(' ', terminal_color); | |
} | |
} | |
printf("Terminal initialized\n"); | |
} | |
void terminal_setcolor(uint8_t color) { | |
terminal_color = color; | |
} | |
void terminal_putentryat(char c, uint8_t color, size_t x, size_t y) { | |
const size_t index = y * VGA_WIDTH + x; | |
terminal_buffer[index] = vga_entry(c, color); | |
} | |
void terminal_putchar(char c) { | |
terminal_putentryat(c, terminal_color, terminal_column, terminal_row); | |
if (++terminal_column == VGA_WIDTH) { | |
terminal_column = 0; | |
if (++terminal_row == VGA_HEIGHT) | |
terminal_row = 0; | |
} | |
} | |
void terminal_write(const char* data, size_t size) { | |
for (size_t i = 0; i < size; i++) | |
terminal_putchar(data[i]); | |
} | |
void terminal_writestring(const char* data) { | |
terminal_write(data, strlen(data)); | |
} | |
/* This function is invoked by the main CAmkES thread in this component. */ | |
int run(void) { | |
printf("&mem[0]= 0x%x\n",&mem[0]); | |
/* Initialize terminal interface */ | |
terminal_initialize(); | |
/* Newline support is left as an exercise. */ | |
terminal_writestring("Hello, kernel World!\n"); | |
printf("Hello world"); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment