From 38f87f12c59b16467181c410e180087b5ec0d828 Mon Sep 17 00:00:00 2001 From: Aaron Lindsay Date: Fri, 7 Sep 2012 23:54:04 -0400 Subject: [PATCH] Add basic framebuffer support (probably not working right yet?) Possibly (probably) calculating wrong pixel values, addresses. --- include/framebuffer.h | 27 +++++++++++++++++++++++++++ kernel/framebuffer.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 include/framebuffer.h create mode 100644 kernel/framebuffer.c diff --git a/include/framebuffer.h b/include/framebuffer.h new file mode 100644 index 0000000..ba91b03 --- /dev/null +++ b/include/framebuffer.h @@ -0,0 +1,27 @@ +#ifndef FRAMEBUFFER_H +#define FRAMEBUFFER_H + +// 1, 2, and 4 bit color are currently unsupported +//#define FB_COLOR_DEPTH_1 1 +//#define FB_COLOR_DEPTH_2 2 +//#define FB_COLOR_DEPTH_4 4 +#define FB_COLOR_DEPTH_8 8 +#define FB_COLOR_DEPTH_16 16 +#define FB_COLOR_DEPTH_24 24 + +struct fbdev { + unsigned int pixelwidth, pixelheight; + unsigned int color_depth; + void *fbaddr; //start address of the frame buffer in memory + void *device_ptr; //passed into device +}; + +struct fb { + unsigned int width, height; + unsigned int color_depth; + struct fbdev *device; +}; + +int fb_write_pixel(struct fb *f, unsigned int x, unsigned int y, unsigned int r, unsigned int g, unsigned int b); + +#endif /* FRAMEBUFFER_H */ diff --git a/kernel/framebuffer.c b/kernel/framebuffer.c new file mode 100644 index 0000000..ef6f175 --- /dev/null +++ b/kernel/framebuffer.c @@ -0,0 +1,31 @@ +#include + +int fb_write_pixel_8bit(struct fb *f, unsigned int x, unsigned int y, unsigned int r, unsigned int g, unsigned int b) { + unsigned char pixel = (((r >> 6) << 4) & 0x30) | (((b >> 6) << 2) & 0xC) | ((g >> 6) & 0x3); + ((char*) (f->device->fbaddr))[y*f->device->pixelwidth + x] = pixel; + return 0; +} + +int fb_write_pixel_16bit(struct fb *f, unsigned int x, unsigned int y, unsigned int r, unsigned int g, unsigned int b) { + unsigned int pixel = (((r >> 3) << 10) & 0x7BF6) | (((b >> 3) << 5) & 0x3E0) | ((g >> 3) & 0x1F); + ((char*)f->device->fbaddr)[(y*f->device->pixelwidth + x) << 1] = (char)pixel; + ((char*)f->device->fbaddr)[((y*f->device->pixelwidth + x) << 1) + 1] = (char)(pixel >> 8); + return 0; +} + +int fb_write_pixel_24bit(struct fb *f, unsigned int x, unsigned int y, unsigned int r, unsigned int g, unsigned int b) { + ((char*)f->device->fbaddr)[(y*f->device->pixelwidth + x)*3] = (char)r; + ((char*)f->device->fbaddr)[(y*f->device->pixelwidth + x)*3 + 1] = (char)b; + ((char*)f->device->fbaddr)[(y*f->device->pixelwidth + x)*3 + 2] = (char)g; + return 0; +} + +int fb_write_pixel(struct fb *f, unsigned int x, unsigned int y, unsigned int r, unsigned int g, unsigned int b) { + if (f->device->color_depth == FB_COLOR_DEPTH_8) + return fb_write_pixel_8bit(f, x, y, r, g, b); + else if (f->device->color_depth == FB_COLOR_DEPTH_16) + return fb_write_pixel_16bit(f, x, y, r, g, b); + else if (f->device->color_depth == FB_COLOR_DEPTH_24) + return fb_write_pixel_24bit(f, x, y, r, g, b); + return -1; +}