Add basic framebuffer support (probably not working right yet?)
Possibly (probably) calculating wrong pixel values, addresses.
This commit is contained in:
		
							
								
								
									
										27
									
								
								include/framebuffer.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								include/framebuffer.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 */ | ||||||
							
								
								
									
										31
									
								
								kernel/framebuffer.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								kernel/framebuffer.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | #include <framebuffer.h> | ||||||
|  |  | ||||||
|  | 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; | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user