Compare commits
	
		
			4 Commits
		
	
	
		
			37542b736f
			...
			BasicGraph
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| f0651ef972 | |||
| 405b9468d5 | |||
| 006c902200 | |||
| 2eca761edc | 
							
								
								
									
										17
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								Makefile
									
									
									
									
									
								
							| @ -5,7 +5,7 @@ CC = ${HOME}/opt/cross/bin/i686-elf-gcc | |||||||
| CPP = ${HOME}/opt/cross/bin/i686-elf-g++  | CPP = ${HOME}/opt/cross/bin/i686-elf-g++  | ||||||
| CFLAGS =  -ffreestanding -O2 -Wall -Wextra | CFLAGS =  -ffreestanding -O2 -Wall -Wextra | ||||||
|  |  | ||||||
| OFILES =  $(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o  $(BUILD_DIR)/PhysicalMemoryManager.o $(BUILD_DIR)/io.o $(BUILD_DIR)/PageDirectory.o $(BUILD_DIR)/gdtc.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/string.o | OFILES =  $(BUILD_DIR)/boot.o $(BUILD_DIR)/window.o $(BUILD_DIR)/cursor.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o  $(BUILD_DIR)/PhysicalMemoryManager.o $(BUILD_DIR)/io.o  $(BUILD_DIR)/vesa.o $(BUILD_DIR)/PageDirectory.o $(BUILD_DIR)/gdtc.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/string.o | ||||||
|  |  | ||||||
| SRC_DIR = src | SRC_DIR = src | ||||||
| BUILD_DIR = build | BUILD_DIR = build | ||||||
| @ -36,7 +36,9 @@ iso: clean_iso clean build | |||||||
| 	grub-mkrescue -o build/barinkOS.iso root | 	grub-mkrescue -o build/barinkOS.iso root | ||||||
| 	 | 	 | ||||||
| test: | test: | ||||||
| 	$(EMULATOR)  -kernel $(BUILD_DIR)/myos.bin -serial stdio -vga std -monitor stdio -display gtk -m 2G -cpu core2duo  | 	$(EMULATOR)  -kernel $(BUILD_DIR)/myos.bin -serial mon:stdio -vga std  -display gtk -m 2G -cpu core2duo # -monitor stdio | ||||||
|  | test_iso: | ||||||
|  | 	$(EMULATOR) -cdrom build/barinkOS.iso -serial mon:stdio -vga std -display gtk -m 2G -cpu core2duo | ||||||
|  |  | ||||||
| build_kernel: $(OBJ_LINK_LIST) | build_kernel: $(OBJ_LINK_LIST) | ||||||
| 	$(CC) -T $(SRC_DIR)/kernel//linker.ld -o $(BUILD_DIR)/myos.bin \ | 	$(CC) -T $(SRC_DIR)/kernel//linker.ld -o $(BUILD_DIR)/myos.bin \ | ||||||
| @ -50,7 +52,7 @@ clean: | |||||||
| 	rm -f $(BUILD_DIR)/myos.bin $(INTERNAL_OBJS) | 	rm -f $(BUILD_DIR)/myos.bin $(INTERNAL_OBJS) | ||||||
|  |  | ||||||
| $(BUILD_DIR)/kernel.o: | $(BUILD_DIR)/kernel.o: | ||||||
| 	$(CPP) -c $(SRC_DIR)/kernel/kernel.cpp -o $(BUILD_DIR)/kernel.o $(CFLAGS) -fno-exceptions -fno-rtti | 	$(CPP) -c $(SRC_DIR)/kernel/kernel.cpp -o $(BUILD_DIR)/kernel.o $(CFLAGS) -fno-exceptions -fno-rtti -fpermissive | ||||||
|  |  | ||||||
| $(BUILD_DIR)/kterm.o: | $(BUILD_DIR)/kterm.o: | ||||||
| 	$(CPP) -c $(SRC_DIR)/kernel/tty/kterm.cpp  -o $(BUILD_DIR)/kterm.o $(CFLAGS) -fno-exceptions -fno-rtti | 	$(CPP) -c $(SRC_DIR)/kernel/tty/kterm.cpp  -o $(BUILD_DIR)/kterm.o $(CFLAGS) -fno-exceptions -fno-rtti | ||||||
| @ -85,3 +87,12 @@ $(BUILD_DIR)/string.o: | |||||||
|  |  | ||||||
| $(BUILD_DIR)/PhysicalMemoryManager.o: | $(BUILD_DIR)/PhysicalMemoryManager.o: | ||||||
| 	$(CPP) -c $(SRC_DIR)/kernel/memory/PhysicalMemoryManager.cpp  -o $(BUILD_DIR)/PhysicalMemoryManager.o $(CFLAGS) -fno-exceptions -fno-rtti | 	$(CPP) -c $(SRC_DIR)/kernel/memory/PhysicalMemoryManager.cpp  -o $(BUILD_DIR)/PhysicalMemoryManager.o $(CFLAGS) -fno-exceptions -fno-rtti | ||||||
|  |  | ||||||
|  | $(BUILD_DIR)/vesa.o: | ||||||
|  | 	$(CPP) -c $(SRC_DIR)/kernel/drivers/vesa/vesa.cpp  -o $(BUILD_DIR)/vesa.o $(CFLAGS) -fno-exceptions -fno-rtti | ||||||
|  |  | ||||||
|  | $(BUILD_DIR)/window.o: | ||||||
|  | 	$(CPP) -c $(SRC_DIR)/gui/window.cpp  -o $(BUILD_DIR)/window.o $(CFLAGS) -fno-exceptions -fno-rtti | ||||||
|  |  | ||||||
|  | $(BUILD_DIR)/cursor.o: | ||||||
|  | 	$(CPP) -c $(SRC_DIR)/gui/cursor.cpp  -o $(BUILD_DIR)/cursor.o $(CFLAGS) -fno-exceptions -fno-rtti | ||||||
|  | |||||||
| @ -6,6 +6,9 @@ | |||||||
|  |  | ||||||
| ________________________ | ________________________ | ||||||
| ### Screenshot(s) | ### Screenshot(s) | ||||||
|  |  \ | ||||||
|  | It may not look like much but I am proud of it! We are in graphics mode. | ||||||
|  |  | ||||||
|    \ |    \ | ||||||
| The first scrolling boot screen. 😲 | The first scrolling boot screen. 😲 | ||||||
|  |  | ||||||
|  | |||||||
							
								
								
									
										
											BIN
										
									
								
								screenshots/BarinkOS_VBE_GRAPHICS.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								screenshots/BarinkOS_VBE_GRAPHICS.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										5
									
								
								src/gui/Graphics.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/gui/Graphics.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | |||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | class Graphics { | ||||||
|  |  | ||||||
|  | }; | ||||||
							
								
								
									
										7
									
								
								src/gui/Widget.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/gui/Widget.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Widget{ | ||||||
|  |     virtual void draw(); | ||||||
|  |  | ||||||
|  | }; | ||||||
							
								
								
									
										17
									
								
								src/gui/cursor.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/gui/cursor.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | #include "cursor.h" | ||||||
|  |  | ||||||
|  |     void Cursor::draw(){ | ||||||
|  |         for(int i = 0; i <  this->width; i++){ | ||||||
|  |             for(int j = 0; j <  this->height; j++){ | ||||||
|  |                 if(this->bitmap[j * this->width + i] == 1 ){ | ||||||
|  |                         putPixel(i + this->x,j + this->y, 0xFF000000); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     Cursor::Cursor(int x, int y){ | ||||||
|  |         this->x = x; | ||||||
|  |         this->y = y; | ||||||
|  |     } | ||||||
							
								
								
									
										38
									
								
								src/gui/cursor.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/gui/cursor.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | |||||||
|  | #pragma once  | ||||||
|  | #include "../kernel/drivers/vesa/vesa.h" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Cursor{ | ||||||
|  |     public: | ||||||
|  |     void draw(); | ||||||
|  |     Cursor(int x, int y); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |         int x; | ||||||
|  |         int y; | ||||||
|  |         const int width= 16; | ||||||
|  |         const int height= 10; | ||||||
|  |         const int bitmap [160] = { | ||||||
|  |             0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | ||||||
|  |  | ||||||
|  |             0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, | ||||||
|  |  | ||||||
|  |             0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0, | ||||||
|  |  | ||||||
|  |             0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0, | ||||||
|  |  | ||||||
|  |             0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0, | ||||||
|  |  | ||||||
|  |             0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0, | ||||||
|  |  | ||||||
|  |             0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0, | ||||||
|  |  | ||||||
|  |             0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0, | ||||||
|  |  | ||||||
|  |             0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0, | ||||||
|  |  | ||||||
|  |             0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | ||||||
|  |         }; | ||||||
|  | }; | ||||||
							
								
								
									
										33
									
								
								src/gui/window.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/gui/window.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | |||||||
|  | #include "window.h" | ||||||
|  |  | ||||||
|  | int Window::getWidth(){ | ||||||
|  |     return this->rect.width; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int Window::getHeight(){ | ||||||
|  |     return this->rect.height; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Window::setWidth(int& width){ | ||||||
|  |     this->rect.width = width; | ||||||
|  | } | ||||||
|  | void Window::setHeight(int& height){ | ||||||
|  |     this->rect.height = height; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int Window::getX(){ | ||||||
|  |     return this->rect.x; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int Window::getY(){ | ||||||
|  |     return this->rect.y; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Window::Window (Rect& rect , uint32_t colour){ | ||||||
|  |     this->rect = rect; | ||||||
|  |     this->Background_colour = colour; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Window::draw(){ | ||||||
|  |     drawRect(this->getX() , this->getY() , this->getWidth() , this->getHeight() ,this->Background_colour ); | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								src/gui/window.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/gui/window.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | |||||||
|  | #pragma once | ||||||
|  | #include "../kernel/drivers/vesa/vesa.h" | ||||||
|  | #include "Widget.h" | ||||||
|  |  | ||||||
|  | struct Rect { | ||||||
|  |     int width; | ||||||
|  |     int height; | ||||||
|  |     int x; | ||||||
|  |     int y; | ||||||
|  |  | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Window : Widget{ | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |     int getX(); | ||||||
|  |     int getY(); | ||||||
|  |  | ||||||
|  |     int getWidth(); | ||||||
|  |     int getHeight(); | ||||||
|  |     void setWidth(int&); | ||||||
|  |     void setHeight(int&); | ||||||
|  |  | ||||||
|  |     Window (Rect& rect , uint32_t colour); | ||||||
|  |     void draw(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     Rect rect; | ||||||
|  |     uint32_t Background_colour; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | }; | ||||||
| @ -3,7 +3,8 @@ | |||||||
|  */ |  */ | ||||||
| .set ALIGN,    1<<0             		/* align loaded modules on page boundaries */ | .set ALIGN,    1<<0             		/* align loaded modules on page boundaries */ | ||||||
| .set MEMINFO,  1<<1             		/* provide memory map */ | .set MEMINFO,  1<<1             		/* provide memory map */ | ||||||
| .set FLAGS,    ALIGN | MEMINFO  /* this is the Multiboot 'flag' field */ | .set VIDEO,	   1<<2						/* provide video mode */ | ||||||
|  | .set FLAGS,    ALIGN | MEMINFO | VIDEO  /* this is the Multiboot 'flag' field */ | ||||||
| .set MAGIC,    0x1BADB002       		/* 'magic number' lets bootloader find the header */ | .set MAGIC,    0x1BADB002       		/* 'magic number' lets bootloader find the header */ | ||||||
| .set CHECKSUM, -(MAGIC + FLAGS) 		/* checksum of above, to prove we are multiboot */ | .set CHECKSUM, -(MAGIC + FLAGS) 		/* checksum of above, to prove we are multiboot */ | ||||||
|  |  | ||||||
| @ -12,7 +13,15 @@ | |||||||
| .long MAGIC | .long MAGIC | ||||||
| .long FLAGS | .long FLAGS | ||||||
| .long CHECKSUM | .long CHECKSUM | ||||||
|   | .long 0 # unused | ||||||
|  | .long 0 # . | ||||||
|  | .long 0 # . | ||||||
|  | .long 0 # . | ||||||
|  | .long 0 # unused | ||||||
|  | .long 0 # set graphics mode | ||||||
|  | .long 800 # screen witdh | ||||||
|  | .long 600 # screen height | ||||||
|  | .long 32 # bpp | ||||||
|  |  | ||||||
| .section .bss | .section .bss | ||||||
| .align 16 | .align 16 | ||||||
|  | |||||||
| @ -1,17 +1,17 @@ | |||||||
| #pragma once  | #pragma once  | ||||||
| #include "bootloader/multiboot.h" | #include "bootloader/multiboot.h" | ||||||
| #define CHECK_FLAG(flags, bit) ((flags) & (1 <<(bit))) | #define CHECK_FLAG(flags, bit) ((flags) & (1 <<(bit))) | ||||||
|  | #include "../gui/window.h" | ||||||
|  | #include "../gui/cursor.h" | ||||||
| #include "tty/kterm.h" | #include "tty/kterm.h" | ||||||
|  | #include "drivers/vesa/vesa.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| void CheckMBT ( multiboot_info_t*  mbt  ){ | void CheckMBT ( multiboot_info_t*  mbt  ){ | ||||||
|   /* Set MBI to the addresss of the multiboot information structure*/ |   /* Set MBI to the addresss of the multiboot information structure*/ | ||||||
|   multiboot_info_t * mbi = (multiboot_info_t *) mbt; |   multiboot_info_t * mbi = (multiboot_info_t *) mbt; | ||||||
|  |  | ||||||
|   /* Print out the flags */ |   /* Print out the flags */ | ||||||
|         printf("flags = 0x%x\n", (unsigned) mbi->flags); |   printf("flags = 0x%8x\n", (unsigned) mbi->flags); | ||||||
|  |  | ||||||
|   /* Are mem_* valid? */ |   /* Are mem_* valid? */ | ||||||
|   if ( CHECK_FLAG(mbi->flags,0)){ |   if ( CHECK_FLAG(mbi->flags,0)){ | ||||||
| @ -68,9 +68,41 @@ void CheckMBT ( multiboot_info_t*  mbt  ){ | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* Draw diagonal blue line */ |   /* Draw diagonal blue line */ | ||||||
|         if (CHECK_FLAG (mbt->flags, 12)){ |   if (CHECK_FLAG (mbt->flags, 11)){ | ||||||
|     printf("Can draw!"); |     printf("Can draw!"); | ||||||
|         }  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     // Init vesa driver | ||||||
|  |     initVBEDevice(mbt);  | ||||||
|  |  | ||||||
|  |     // Fill screen with blue | ||||||
|  |                                                 // colours AARRGGBB | ||||||
|  |     drawRect(0, 0 , VbeModeInfo->width,VbeModeInfo->height, 0xFF0000FF); | ||||||
|  |  | ||||||
|  |     // Create two windows | ||||||
|  |     Rect rect_window1 {}; | ||||||
|  |     Rect rect_window2 {}; | ||||||
|  |     rect_window1.height =200; | ||||||
|  |     rect_window1.width = 300; | ||||||
|  |     rect_window1.x = 50; | ||||||
|  |     rect_window1.y = 50; | ||||||
|  |  | ||||||
|  |     rect_window2.height =200; | ||||||
|  |     rect_window2.width = 300; | ||||||
|  |     rect_window2.x = 300; | ||||||
|  |     rect_window2.y = 200; | ||||||
|  |  | ||||||
|  |     Window window_1 ( rect_window1, 0xFF00F0FF); | ||||||
|  |     Window window_2 (rect_window2, 0xFFAACCDD); | ||||||
|  |  | ||||||
|  |     window_1.draw(); | ||||||
|  |     window_2.draw(); | ||||||
|  |  | ||||||
|  |     Cursor cursor (70,100); | ||||||
|  |  | ||||||
|  |     cursor.draw(); | ||||||
|  |  | ||||||
|  |  | ||||||
|   } |   } | ||||||
|  | } | ||||||
							
								
								
									
										136
									
								
								src/kernel/drivers/vesa/vesa.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								src/kernel/drivers/vesa/vesa.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,136 @@ | |||||||
|  | #include "vesa.h" | ||||||
|  | VbeInfoBlock* vbeInfo; | ||||||
|  | vbe_mode_info_structure* VbeModeInfo; | ||||||
|  |  | ||||||
|  | void initVBEDevice(multiboot_info_t* mbt){ | ||||||
|  |     print_serial("initVBEDevice"); | ||||||
|  |  | ||||||
|  |     vbeInfo = (VbeInfoBlock*) mbt->vbe_control_info; | ||||||
|  |     printf_serial("Signature: %s, V0x%x\n", vbeInfo->VbeSignature, vbeInfo->VbeVersion); | ||||||
|  |  | ||||||
|  |     VbeModeInfo = (vbe_mode_info_structure*) mbt->vbe_mode_info; | ||||||
|  |  | ||||||
|  |     printf_serial("VESA video mode info: Width: %d Height: %d BPP: %d\n", VbeModeInfo->width, VbeModeInfo->height , VbeModeInfo->bpp); | ||||||
|  |     printf_serial("VideoMemory Location: 0x%x \n", VbeModeInfo->framebuffer ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void putPixel( int x, int y , uint32_t colour){ | ||||||
|  |    // printf_serial("putPixel x: %d, y: %d\n", x, y); | ||||||
|  |                     ///fb + mbt->framebuffer_pitch * y + 4 * x ,NOTE: this calculation is very important  | ||||||
|  |     *(uint32_t*) (  VbeModeInfo->framebuffer + VbeModeInfo->pitch * y + 4  * x ) = colour; | ||||||
|  | } | ||||||
|  | void drawLine(int x1, int y1, int x2, int y2, uint32_t colour ){ | ||||||
|  |     print_serial("drawline\n"); | ||||||
|  |     // See Bresenham's line algorithm | ||||||
|  |     int deltaX = x2 - x1; | ||||||
|  |     int deltaY = y2 - y1; | ||||||
|  |     int D = 2 * deltaY - deltaX; | ||||||
|  |     int y = y1; | ||||||
|  |  | ||||||
|  |     for ( int x = x1; x < x2; x++){ | ||||||
|  |       putPixel(x,y, colour); | ||||||
|  |       if( D > 0){ | ||||||
|  |         y +=1; | ||||||
|  |         D = D - 2 * deltaX; | ||||||
|  |       } | ||||||
|  |       D = D + 2 * deltaY; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
|  | void drawRect ( int x, int y, int width, int height, uint32_t colour ){ | ||||||
|  |     print_serial("drawRect\n"); | ||||||
|  |     for ( int i = x; i < x + width; i ++) | ||||||
|  |     { | ||||||
|  |       for(int j = y; j < y + height; j++){ | ||||||
|  |          | ||||||
|  |         putPixel(i,j, colour); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void blueDiagnalLineTest(multiboot_info_t* mbt){ | ||||||
|  |     multiboot_uint32_t color; | ||||||
|  |     unsigned i; | ||||||
|  |     void *fb = (void *) (unsigned long) mbt->framebuffer_addr; | ||||||
|  |  | ||||||
|  |      switch (mbt->framebuffer_type) | ||||||
|  |         { | ||||||
|  |         case MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED: | ||||||
|  |           { | ||||||
|  |             unsigned best_distance, distance; | ||||||
|  |             struct multiboot_color *palette; | ||||||
|  |              | ||||||
|  |             palette = (struct multiboot_color *) mbt->framebuffer_palette_addr; | ||||||
|  |  | ||||||
|  |             color = 0; | ||||||
|  |             best_distance = 4*256*256; | ||||||
|  |              | ||||||
|  |             for (i = 0; i < mbt->framebuffer_palette_num_colors; i++) | ||||||
|  |               { | ||||||
|  |                 distance = (0xff - palette[i].blue) * (0xff - palette[i].blue) | ||||||
|  |                   + palette[i].red * palette[i].red | ||||||
|  |                   + palette[i].green * palette[i].green; | ||||||
|  |                 if (distance < best_distance) | ||||||
|  |                   { | ||||||
|  |                     color = i; | ||||||
|  |                     best_distance = distance; | ||||||
|  |                   } | ||||||
|  |               } | ||||||
|  |           } | ||||||
|  |           break; | ||||||
|  |  | ||||||
|  |         case MULTIBOOT_FRAMEBUFFER_TYPE_RGB: | ||||||
|  |           color = ((1 << mbt->framebuffer_blue_mask_size) - 1)  | ||||||
|  |             << mbt->framebuffer_blue_field_position; | ||||||
|  |           break; | ||||||
|  |  | ||||||
|  |         case MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT: | ||||||
|  |           color = '\\' | 0x0100; | ||||||
|  |           break; | ||||||
|  |  | ||||||
|  |         default: | ||||||
|  |           color = 0xffffffff; | ||||||
|  |           break; | ||||||
|  |         } | ||||||
|  |       for (i = 0; i < mbt->framebuffer_width | ||||||
|  |              && i < mbt->framebuffer_height; i++) | ||||||
|  |         { | ||||||
|  |           switch (mbt->framebuffer_bpp) | ||||||
|  |             { | ||||||
|  |             case 8: | ||||||
|  |               { | ||||||
|  |                 multiboot_uint8_t *pixel = (multiboot_uint8_t*)fb + mbt->framebuffer_pitch * i + i; | ||||||
|  |                 *pixel = color; | ||||||
|  |               } | ||||||
|  |               break; | ||||||
|  |             case 15: | ||||||
|  |             case 16: | ||||||
|  |               { | ||||||
|  |                 multiboot_uint16_t *pixel | ||||||
|  |                   = (multiboot_uint16_t*)fb + mbt->framebuffer_pitch * i + 2 * i; | ||||||
|  |                 *pixel = color; | ||||||
|  |               } | ||||||
|  |               break; | ||||||
|  |             case 24: | ||||||
|  |               { | ||||||
|  |                 multiboot_uint32_t *pixel | ||||||
|  |                   = (multiboot_uint32_t*)fb + mbt->framebuffer_pitch * i + 3 * i; | ||||||
|  |                 *pixel = (color & 0xffffff) | (*pixel & 0xff000000); | ||||||
|  |               } | ||||||
|  |               break; | ||||||
|  |  | ||||||
|  |             case 32: | ||||||
|  |               { | ||||||
|  |                 multiboot_uint32_t *pixel | ||||||
|  |                   = (multiboot_uint32_t*)fb + mbt->framebuffer_pitch * i + 4 * i; | ||||||
|  |                 *pixel = color; | ||||||
|  |               } | ||||||
|  |               break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										66
									
								
								src/kernel/drivers/vesa/vesa.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								src/kernel/drivers/vesa/vesa.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,66 @@ | |||||||
|  | #pragma once  | ||||||
|  | #include <stdint.h> | ||||||
|  | #include "../../bootloader/multiboot.h" | ||||||
|  | #include "../../serial.h" | ||||||
|  |  | ||||||
|  | struct vbe_mode_info_structure{ | ||||||
|  |         uint16_t attributes; | ||||||
|  |         uint8_t window_a; | ||||||
|  |         uint8_t window_b; | ||||||
|  |         uint16_t granularity; | ||||||
|  |         uint16_t window_size; | ||||||
|  |         uint16_t segment_a; | ||||||
|  |         uint16_t segment_b; | ||||||
|  |         uint32_t win_func_ptr; | ||||||
|  |         uint16_t pitch; | ||||||
|  |         uint16_t width; | ||||||
|  |         uint16_t height; | ||||||
|  |         uint8_t w_char; | ||||||
|  |         uint8_t y_char; | ||||||
|  |         uint8_t planes; | ||||||
|  |         uint8_t bpp; | ||||||
|  |         uint8_t banks; | ||||||
|  |         uint8_t memory_model; | ||||||
|  |         uint8_t bank_size; | ||||||
|  |         uint8_t image_pages; | ||||||
|  |         uint8_t reserved0; | ||||||
|  |  | ||||||
|  |         uint8_t red_mask; | ||||||
|  |         uint8_t red_position; | ||||||
|  |         uint8_t green_mask; | ||||||
|  |         uint8_t green_position; | ||||||
|  |         uint8_t blue_mask; | ||||||
|  |         uint8_t blue_position; | ||||||
|  |         uint8_t reserved_mask; | ||||||
|  |         uint8_t reserved_position; | ||||||
|  |         uint8_t direct_color_attributes; | ||||||
|  |  | ||||||
|  |         uint32_t framebuffer; | ||||||
|  |         uint32_t off_screen_mem_off; | ||||||
|  |         uint16_t off_screen_mem_size; | ||||||
|  |         uint8_t reserved1[206]; | ||||||
|  |       }__attribute__((packed)); | ||||||
|  |  | ||||||
|  | struct VbeInfoBlock { | ||||||
|  |         char VbeSignature[4]; | ||||||
|  |         uint16_t VbeVersion; | ||||||
|  |         uint16_t OemStringPtr; | ||||||
|  |         uint8_t Capabilities; | ||||||
|  |         uint16_t VideoModePtr; | ||||||
|  |         uint16_t TotalMemory; | ||||||
|  |       }__attribute__((packed)); | ||||||
|  |  | ||||||
|  | extern VbeInfoBlock* vbeInfo; | ||||||
|  | extern vbe_mode_info_structure* VbeModeInfo; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void initVBEDevice(multiboot_info_t* mbt); | ||||||
|  |  | ||||||
|  | void blueDiagnalLineTest(multiboot_info_t* mbt); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Primitive drawing functions   | ||||||
|  | void putPixel( int x, int y , uint32_t colour); | ||||||
|  | void drawLine(int x1, int y1, int x2, int y2, uint32_t colour ); | ||||||
|  | void drawRect ( int x, int y, int width, int height, uint32_t colour ); | ||||||
| @ -48,12 +48,13 @@ void initGDT(){ | |||||||
|       gdtDescriptor.limit = ((sizeof(SegmentDescriptor ) * 5 ) - 1); |       gdtDescriptor.limit = ((sizeof(SegmentDescriptor ) * 5 ) - 1); | ||||||
|       gdtDescriptor.base = (unsigned int) &GlobalDescriptorTable; |       gdtDescriptor.base = (unsigned int) &GlobalDescriptorTable; | ||||||
|  |  | ||||||
|  |       printf("Hello GDT!\n"); | ||||||
|  |  | ||||||
|  |  | ||||||
|       LoadGlobalDescriptorTable(); |       LoadGlobalDescriptorTable(); | ||||||
|  |  | ||||||
|       while (true) | //      while (true) | ||||||
|          asm volatile("hlt"); | //         asm volatile("hlt"); | ||||||
|        |        | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
| @ -1,12 +1,18 @@ | |||||||
| #include "kernel.h" | #include "kernel.h" | ||||||
| #define GB4 524288 | #define GB4 524288 | ||||||
| #define GB2 262144 | #define GB2 262144 | ||||||
|  | extern "C" void kernel_main (void); | ||||||
|  | extern "C" void putPixel(int pos_x, int pos_y, unsigned char VGA_COLOR , unsigned char addr , unsigned char pixelWidth, unsigned pitch ); | ||||||
|  |  | ||||||
|  |  | ||||||
|     extern "C" void early_main(unsigned long magic, unsigned long addr){ |     extern "C" void early_main(unsigned long magic, unsigned long addr){ | ||||||
|         /** initialize terminal interface */  |         /** initialize terminal interface */  | ||||||
|         kterm_init(); |        // kterm_init(); | ||||||
|          |          | ||||||
|  |         printf("Magic flag 0x%8x\n", magic); | ||||||
|  |         printf("Magic must be 0x%8x\n", MULTIBOOT_BOOTLOADER_MAGIC); | ||||||
|         if (magic != MULTIBOOT_BOOTLOADER_MAGIC){ |         if (magic != MULTIBOOT_BOOTLOADER_MAGIC){ | ||||||
|             printf("Invalid magic number: 0x%x\n",  magic); |             printf("Invalid magic number: 0x%8x\n",  magic); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @ -29,6 +35,9 @@ | |||||||
|         initGDT(); |         initGDT(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |       kernel_main(); | ||||||
|  |  | ||||||
|  |         | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     extern "C" void kernel_main (void) { |     extern "C" void kernel_main (void) { | ||||||
| @ -36,6 +45,7 @@ | |||||||
|         printf("call to init serial\n"); |         printf("call to init serial\n"); | ||||||
|         init_serial(); |         init_serial(); | ||||||
|  |  | ||||||
|  |  | ||||||
|         while (true){ |         while (true){ | ||||||
|             //Read time indefinetely  |             //Read time indefinetely  | ||||||
|             read_rtc(); |             read_rtc(); | ||||||
|  | |||||||
| @ -1,9 +1,10 @@ | |||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "tty/kterm.h" | #include "tty/kterm.h" | ||||||
| #include "io.h" | #include "io.h" | ||||||
|  |  | ||||||
| #define PORT 0x3f8  | #define PORT 0x3f8  | ||||||
| static int init_serial() { |  | ||||||
|  | inline static int init_serial() { | ||||||
|    outb(PORT + 1, 0x00);    // Disable all interrupts |    outb(PORT + 1, 0x00);    // Disable all interrupts | ||||||
|    outb(PORT + 3, 0x80);    // Enable DLAB (set baud rate divisor) |    outb(PORT + 3, 0x80);    // Enable DLAB (set baud rate divisor) | ||||||
|    outb(PORT + 0, 0x03);    // Set divisor to 3 (lo byte) 38400 baud |    outb(PORT + 0, 0x03);    // Set divisor to 3 (lo byte) 38400 baud | ||||||
| @ -25,33 +26,95 @@ static int init_serial() { | |||||||
|    return 0; |    return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| int is_transmit_empty() { | inline int is_transmit_empty() { | ||||||
|    return inb(PORT + 5) & 0x20; |    return inb(PORT + 5) & 0x20; | ||||||
| } | } | ||||||
|   |   | ||||||
| void write_serial(char a) { | inline void write_serial(char a) { | ||||||
|    while (is_transmit_empty() == 0); |    while (is_transmit_empty() == 0); | ||||||
|   |   | ||||||
|    outb(PORT,a); |    outb(PORT,a); | ||||||
| } | } | ||||||
|  |  | ||||||
| int serial_received() { | inline int serial_received() { | ||||||
|    return inb(PORT + 5) & 1; |    return inb(PORT + 5) & 1; | ||||||
| } | } | ||||||
|   |   | ||||||
| char read_serial() { | inline char read_serial() { | ||||||
|    while (serial_received() == 0); |    while (serial_received() == 0); | ||||||
|   |   | ||||||
|    return inb(PORT); |    return inb(PORT); | ||||||
| } | } | ||||||
|  |  | ||||||
| void print_serial(const char* string ){ | inline void print_serial(const char* string ){ | ||||||
|     for(size_t i = 0; i < strlen(string); i ++){ |     for(size_t i = 0; i < strlen(string); i ++){ | ||||||
|         write_serial(string[i]); |         write_serial(string[i]); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void test_serial(){ |  | ||||||
|  | inline void printf_serial ( const char *format, ...) { | ||||||
|  |     | ||||||
|  |     char **arg = (char **)&format; | ||||||
|  |     int c; | ||||||
|  |     char buf[20]; | ||||||
|  |  | ||||||
|  |     arg++; | ||||||
|  |      | ||||||
|  |     while ((c = *format++) != 0){ | ||||||
|  |         if( c != '%') | ||||||
|  |             write_serial(c); | ||||||
|  |         else{ | ||||||
|  |             char *p, *p2; | ||||||
|  |             int pad0 = 0, pad = 0; | ||||||
|  |  | ||||||
|  |             c = *format++; | ||||||
|  |             if(c =='0'){ | ||||||
|  |                 pad0 = 1; | ||||||
|  |                 c = *format++; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if ( c >= '0' && c <= '9'){ | ||||||
|  |                 pad = c - '0'; | ||||||
|  |                 c = *format++; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             switch (c) | ||||||
|  |             { | ||||||
|  |             case 'd': | ||||||
|  |               | ||||||
|  |             case 'u': | ||||||
|  |             case 'x': | ||||||
|  |                 itoa(buf, c, *((int *) arg++)); | ||||||
|  |  | ||||||
|  |                 p = buf; | ||||||
|  |                 goto string; | ||||||
|  |                 break; | ||||||
|  |              | ||||||
|  |             case 's': | ||||||
|  |                 p = *arg++; | ||||||
|  |                 if(!p) | ||||||
|  |                     p = "(null)"; | ||||||
|  |                  | ||||||
|  |                 string:  | ||||||
|  |                     for (p2 = p; *p2; p2++); | ||||||
|  |                     for (; p2 < p + pad; p2++) | ||||||
|  |                         write_serial(pad0 ? '0': ' '); | ||||||
|  |                     while (*p) | ||||||
|  |                         write_serial(*p++); | ||||||
|  |                     break; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |             default: | ||||||
|  |                 write_serial(*((int *)arg++)); | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline void test_serial(){ | ||||||
|         /** Serial test **/ |         /** Serial test **/ | ||||||
|         kterm_writestring("Writing to COM1 serial port:"); |         kterm_writestring("Writing to COM1 serial port:"); | ||||||
|         init_serial(); |         init_serial(); | ||||||
|  | |||||||
| @ -137,7 +137,7 @@ void kterm_writestring(const char* data ){ | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| static void itoa (char *buf, int base, int d) { | void itoa (char *buf, int base, int d) { | ||||||
|     char *p = buf; |     char *p = buf; | ||||||
|     char *p1, *p2; |     char *p1, *p2; | ||||||
|     unsigned long ud = d; |     unsigned long ud = d; | ||||||
| @ -174,7 +174,7 @@ static void itoa (char *buf, int base, int d) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void printf ( const char *format, ...) { | void printf ( const char *format, ...) { | ||||||
|      |     return; | ||||||
|     char **arg = (char **)&format; |     char **arg = (char **)&format; | ||||||
|     int c; |     int c; | ||||||
|     char buf[20]; |     char buf[20]; | ||||||
|  | |||||||
| @ -33,10 +33,9 @@ uint16_t get_cursor_position(); | |||||||
| int get_cursor_x (uint16_t cursor_pos); | int get_cursor_x (uint16_t cursor_pos); | ||||||
| int get_cursor_y (uint16_t cursor_pos); | int get_cursor_y (uint16_t cursor_pos); | ||||||
|  |  | ||||||
|  | extern "C"  void itoa (char *buf, int base, int d); | ||||||
| void printf ( const char *format, ...); | void printf ( const char *format, ...); | ||||||
|  |  | ||||||
| //static void itoa (char *buf, int base, int d); |  | ||||||
|  |  | ||||||
| #define KernelTag "[Kernel]: " | #define KernelTag "[Kernel]: " | ||||||
| #define AS_KERNEL() (  kterm_setcolor(VGA_COLOR_LIGHT_BLUE),\ | #define AS_KERNEL() (  kterm_setcolor(VGA_COLOR_LIGHT_BLUE),\ | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user