diff options
Diffstat (limited to 'driver')
| -rw-r--r-- | driver/mouse.c | 1 | ||||
| -rw-r--r-- | driver/vesa.c | 347 | ||||
| -rw-r--r-- | driver/vesa.h | 57 |
3 files changed, 0 insertions, 405 deletions
diff --git a/driver/mouse.c b/driver/mouse.c index 14782f7..c292d97 100644 --- a/driver/mouse.c +++ b/driver/mouse.c @@ -10,7 +10,6 @@ #include "interrupts.h" #include "kernel/kernel.h" #include "log.h" -#include "driver/vesa.h" #include "asm_x86.h" static volatile uint8_t mouse_cycle; diff --git a/driver/vesa.c b/driver/vesa.c deleted file mode 100644 index bd5c53d..0000000 --- a/driver/vesa.c +++ /dev/null @@ -1,347 +0,0 @@ -#include "kernel/kernel.h" -#include "log.h" - -#include <stdarg.h> -#include "kernel/mem.h" -#include "vesa.h" - -#include "lib/printf/printf.h" - -static foolfont *deffont; -//static vbemodeinfo *VbeModeInfoBlock; - -static int console_x; -static int console_y; - -static int console_lines; -static int console_cols; - -static uint8_t* buffer; -static uint8_t* physbase; - -void PutConsoleNL(); -void PutPixel(int x,int y, int color); - -// we need to obtain this from somewhere else.. -static uint32_t vesaXres; -static uint32_t vesaYres; -static uint32_t vesaPitch; -static uint32_t vesaBpp; -static uint32_t vesaAddr; - -//static char buf[80][24]; - -void vesa_update_cursor(uint32_t col,uint32_t row) -{ - console_x=col; - console_y=row; -} - -// helper_funcs -/* -static void vesa_print_char_col(int x, int y, char c, char col_fg, char col_bg) -{ - // uint16_t attrib = (col_bg << 4) | (col_fg & 0x0F); - // uint16_t* video_mem=(uint16_t *)SCR_VIDEOMEM+(x+y*SCR_REAL_WIDTH); - // *video_mem=c | (attrib << 8) ; -} -*/ - -// same colors as in screen.h -static uint32_t cols[] = { - 0x0, // black - 0x0066cc, //blue - 0x009900, //green - 0x33ffff, //cyan - 0xff3333, //red - 0xcc00cc, //magenta - 0x994c00, //brown - 0xa0a0a0, //light gray - 0x404040, //dark gray - 0x3399ff, //light blue - 0x99ff33, //light green - 0x99ffff, //cyan light - 0xff9999, //red light - 0xff99ff, //magenta light - 0xffff00, //yellow - 0xffffff, //white -}; - -// glue func for terminal -void vesa_console_put_char(uint8_t c,uint8_t color_bg, uint8_t color_fg, uint32_t x, uint32_t y) -{ -// print_char_col(x,y,c, color_bg, color_fg); - //PutFont(c, console_x*10,console_y*12, cols[color_fg],cols[color_bg]); - - //PutFont(c, x*10,y*12, cols[color_bg],cols[color_fg]); - PutFont(c, x*8,y*11, cols[color_bg],cols[color_fg]); - -// buf[console_x][console_y]=c; - -// console_x++; - -// #ifdef FOOLOS_CONSOLE_AUTOBREAK -// if(console_x>=console_cols)PutConsoleNL(); -// #endif -} - -void vesa_switch_buffers() -{ - for(int i=0;i<800*600*2;i++)physbase[i]=buffer[i]; -} - -void vesa_put_rect(int x, int y, int w , int h, int color) -{ - for(int i=x;i<x+w;i++) - for(int j=y;j<y+h;j++) - PutPixel(i,j,color); -} - -void vesa_clear_screen() -{ - vesa_put_rect(0,0,vesaXres, vesaYres, 0xffffff); -} - -void vesa_set_physbase(uint32_t addr) -{ - vesaAddr=addr; -} - - // - // We want to get output to the screen as fast as possible! - // - // Our Fool-Boot-Loader did set up VESA already for us. - // The desired VESA mode is hardcoded in [boot/mbr.asm]. - // - // The [vesa_init(...)] function requires: - // - // * the addresses of the vbeinfo struct - // * the address of the vbemodeinfo struct (for selected mode). - // * Fool Font loaded inside ramimage - // - // The first two paramters are hardcoded in [boot/mbr.asm], - // while the last one is set in the Makefile. The font binary - // is integrated in the kernel image. - // - // this function returns the physical base address of - // our video memory - // - -uint32_t vesa_init(multiboot_information *inf, foolfont *rawfont) -{ -//inf->framebuffer_type - - vesaXres=inf->framebuffer_width; - vesaYres=inf->framebuffer_height; - vesaPitch=inf->framebuffer_pitch; - vesaBpp=inf->framebuffer_bpp; - vesaAddr=inf->framebuffer_addr; - - // virtual screen - vesaXres=640; - vesaYres=480; - vesaPitch=640*4; - vesaBpp=32; - vesaAddr=VMEM_USER_FRAMEBUFFER; - - //the only functionallu important init lines! (rest is log) - //VbeModeInfoBlock=mode; - deffont=rawfont; - console_x=0; - console_y=0; - - int line_height=12; - int col_width=10; - - console_lines=vesaYres/line_height; - console_cols=vesaXres/col_width; - - //TODO dynamic (but need to sync with terminal!) - console_cols=80; - console_lines=24; - /* - // vesa info - klog("vbe version: 0x%x / video mode ptr: 0x%x 0x%x", - info->VbeVersion, info->VideoModePtr[1], info->VideoModePtr[0]); - - // vesa info on selected mode: - klog("colors r:%d 0x%x g:%d 0x%x b:%d 0x%x", - mode->red_position,mode->red_mask, - mode->green_position,mode->green_mask, - mode->blue_position,mode->blue_mask); - - klog("res: %d * %d / banks: %d / attr: 0x%x", - mode->Xres, mode->Yres, mode->banks, mode->attributes); - klog("bpp: %d / physbase: 0x%x", - mode->bpp,mode->physbase); - - // vesa modes - // todo: take segment from vbeinfo! -#ifdef FOOLSOS_SHOW_VESAMODES - uint16_t *modeptr=info->VideoModePtr[0]; - - while(*modeptr!=0xffff&&*modeptr!=0) - { - klog("mode supported : 0x%X", (*modeptr)); - modeptr++; - } -#endif -*/ - - - return vesaAddr; -} - - -// TODO: what will happen in 24bit mode? -void PutPixel(int x,int y, int color) -{ - //do not write memory outside the screen buffer, check parameters against the VBE mode info - if (x<0 || x>vesaXres|| y<0 || y>vesaYres) return; - if (x) x = (x*(vesaBpp>>3)); // get bytes (divide by 8) - if (y) y = (y*vesaPitch); - //uint8_t *cTemp=VbeModeInfoBlock->physbase; - uint8_t *cTemp=VMEM_USER_FRAMEBUFFER; - - cTemp[x+y] = (uint8_t)(color & 0xff); - cTemp[x+y+1] = (uint8_t)((color>>8) & 0xff); - cTemp[x+y+2] = (uint8_t)((color>>16) & 0xff); -} - - -void PutFont(char c, int x,int y, int color_fg,int color_bg) -{ - - int fnt=0x126-0x20; - - if(c>=0x20&&c<=0x126)fnt=c-0x20; - - int posx, posy, sizex=8, sizey=10; - - for(posx=x;posx<x+sizex;posx++) - { - PutPixel(posx,y-1,color_bg); - } - for(posy=y;posy<y+sizey;posy++) - { - PutPixel(x-1,posy,color_bg); - } - - for(posx=x;posx<x+sizex;posx++) - { - - for(posy=y;posy<y+sizey;posy++) - { - if(deffont[fnt].line[posy-y]&1<<(7-(posx-x))) - { - PutPixel(posx,posy,color_fg); - } - else - { - PutPixel(posx,posy,color_bg); - } - - } - } - -} - -void PutString(char *str, int x,int y, int color, va_list va) -{ - - char buff[256]; - tfp_sprintf(buff,str,va); - str=buff; - - int i=x; - while((*str)!=0) - { - PutFont(*str, i,y, color,0x0); - i+=9; // spacing - str++; - } - -} - -void PutConsoleChar(char c, int color) -{ - if(c=='\n') - { - PutConsoleNL(); - return; - } - //PutFont(c, console_x*10,console_y*12, color); - console_x++; - - - #ifdef FOOLOS_CONSOLE_AUTOBREAK - if(console_x>=console_cols)PutConsoleNL(); - #endif -} - -void PutConsole(char *str, int color) -{ - - while((*str)!=0) - { - PutConsoleChar(*str,color); - str++; - } - -} -void PutConsoleNL() -{ - console_y++; - if(console_y<console_lines)return; - - for(int line=0;line<24;line++) - { - for(int j=0;j<console_cols;j++) - { -// buf[j][line]=buf[j][line+1]; -// PutFont(buf[j][line],j*10,line*12,0x33ff66,0); -// PutFont(buf[j][line+1],j*10,line*12,0x33ff66,0); - } - } - - for(int i=0;i<console_cols;i++) - { - PutFont(' ',i*10,23*12,0x33ff66,0); - //buf[i][23]=' '; - } - - console_x=0; - console_y--; -} - -static int boxx; -static int boxy; -//////////////// -void vesa_render() -{ - vesa_clear_screen(); - vesa_put_rect(100,100,vesaXres-200,vesaYres-200,0xff); - vesa_put_rect(boxx-10,boxy-10,20,20,0x999999); - - boxx++; -// boxy+=boxx; - if(boxx>vesaXres-100)boxx=100; - // if(boxy>VbeModeInfoBlock->Yres-200)boxy=200; - - vesa_switch_buffers(); -} - -/* -void vesa_init_doublebuff() -{ - boxx=300; - boxy=300; - - int blocks=800*600*2/4096+1; - physbase=VbeModeInfoBlock->physbase; - buffer=pmmngr_alloc_blocks(blocks); - klog("Init buffer of %d blocks at 0x%08X",blocks,buffer); - - VbeModeInfoBlock->physbase=buffer; -} -*/ diff --git a/driver/vesa.h b/driver/vesa.h deleted file mode 100644 index 63fbd55..0000000 --- a/driver/vesa.h +++ /dev/null @@ -1,57 +0,0 @@ -//http://wiki.osdev.org/GUI - -#include <stdint.h> -#include "lib/printf/printf.h" -#include "multiboot.h" - -void vesa_update_cursor(uint32_t col,uint32_t row); -void vesa_console_put_char(uint8_t c,uint8_t color_bg, uint8_t color_fg, uint32_t x, uint32_t y); - -typedef struct foolfont_struct -{ - uint8_t line[10]; //every single fool font consists of 10 lines a 8 bit - -}foolfont; - -typedef struct vbeinfo_struct{ - char VbeSignature[4]; // == "VESA" - uint16_t VbeVersion; // == 0x0300 for VBE 3.0 - uint16_t OemStringPtr[2]; // isa vbeFarPtr - uint8_t Capabilities[4]; - uint16_t VideoModePtr[2]; // isa vbeFarPtr - uint16_t TotalMemory; // as # of 64KB blocks -}vbeinfo; - -typedef struct ModeInfoBlock { - uint16_t attributes; - uint8_t winA,winB; - uint16_t granularity; - uint16_t winsize; - uint16_t segmentA, segmentB; - uint16_t realFctPtr[2]; -// VBE_FAR(realFctPtr); - uint16_t pitch; // bytes per scanline - - uint16_t Xres, Yres; - uint8_t Wchar, Ychar, planes, bpp, banks; - uint8_t memory_model, bank_size, image_pages; - uint8_t reserved0; - - uint8_t red_mask, red_position; - uint8_t green_mask, green_position; - uint8_t blue_mask, blue_position; - uint8_t rsv_mask, rsv_position; - uint8_t directcolor_attributes; - - volatile uint32_t physbase; // your LFB (Linear Framebuffer) address ;) - uint32_t reserved1; - uint16_t reserved2; -}vbemodeinfo; - -uint32_t vesa_init(multiboot_information *info,foolfont *); - -void PutConsoleChar(char c, int color); -void PutConsole(char *str, int color); -void vesa_put_rect(int x, int y, int w , int h, int color); -void PutFont(char c, int x,int y, int color_fg,int color_bg); -void PutString(char *str, int x,int y, int color, va_list va); |
